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
main()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