1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // XFAIL: libcpp-no-exceptions
11 // <string>
12 
13 // double stod(const string& str, size_t *idx = 0);
14 // double stod(const wstring& str, size_t *idx = 0);
15 
16 #include <string>
17 #include <cmath>
18 #include <cassert>
19 
20 int main()
21 {
22     assert(std::stod("0") == 0);
23     assert(std::stod(L"0") == 0);
24     assert(std::stod("-0") == 0);
25     assert(std::stod(L"-0") == 0);
26     assert(std::stod("-10") == -10);
27     assert(std::stod(L"-10.5") == -10.5);
28     assert(std::stod(" 10") == 10);
29     assert(std::stod(L" 10") == 10);
30     size_t idx = 0;
31     assert(std::stod("10g", &idx) == 10);
32     assert(idx == 2);
33     idx = 0;
34     assert(std::stod(L"10g", &idx) == 10);
35     assert(idx == 2);
36     try
37     {
38         assert(std::stod("1.e60", &idx) == 1.e60);
39         assert(idx == 5);
40     }
41     catch (const std::out_of_range&)
42     {
43         assert(false);
44     }
45     try
46     {
47         assert(std::stod(L"1.e60", &idx) == 1.e60);
48         assert(idx == 5);
49     }
50     catch (const std::out_of_range&)
51     {
52         assert(false);
53     }
54     idx = 0;
55     try
56     {
57         assert(std::stod("1.e360", &idx) == INFINITY);
58         assert(false);
59     }
60     catch (const std::out_of_range&)
61     {
62         assert(idx == 0);
63     }
64     try
65     {
66         assert(std::stod(L"1.e360", &idx) == INFINITY);
67         assert(false);
68     }
69     catch (const std::out_of_range&)
70     {
71         assert(idx == 0);
72     }
73     try
74     {
75         assert(std::stod("INF", &idx) == INFINITY);
76         assert(idx == 3);
77     }
78     catch (const std::out_of_range&)
79     {
80         assert(false);
81     }
82     idx = 0;
83     try
84     {
85         assert(std::stod(L"INF", &idx) == INFINITY);
86         assert(idx == 3);
87     }
88     catch (const std::out_of_range&)
89     {
90         assert(false);
91     }
92     idx = 0;
93     try
94     {
95         assert(std::isnan(std::stod("NAN", &idx)));
96         assert(idx == 3);
97     }
98     catch (const std::out_of_range&)
99     {
100         assert(false);
101     }
102     idx = 0;
103     try
104     {
105         assert(std::isnan(std::stod(L"NAN", &idx)));
106         assert(idx == 3);
107     }
108     catch (const std::out_of_range&)
109     {
110         assert(false);
111     }
112     idx = 0;
113     try
114     {
115         std::stod("", &idx);
116         assert(false);
117     }
118     catch (const std::invalid_argument&)
119     {
120         assert(idx == 0);
121     }
122     try
123     {
124         std::stod(L"", &idx);
125         assert(false);
126     }
127     catch (const std::invalid_argument&)
128     {
129         assert(idx == 0);
130     }
131     try
132     {
133         std::stod("  - 8", &idx);
134         assert(false);
135     }
136     catch (const std::invalid_argument&)
137     {
138         assert(idx == 0);
139     }
140     try
141     {
142         std::stod(L"  - 8", &idx);
143         assert(false);
144     }
145     catch (const std::invalid_argument&)
146     {
147         assert(idx == 0);
148     }
149     try
150     {
151         std::stod("a1", &idx);
152         assert(false);
153     }
154     catch (const std::invalid_argument&)
155     {
156         assert(idx == 0);
157     }
158     try
159     {
160         std::stod(L"a1", &idx);
161         assert(false);
162     }
163     catch (const std::invalid_argument&)
164     {
165         assert(idx == 0);
166     }
167 }
168