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