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