blob: 9d9dc3832ba68449149128aff82ea219a89d90d9 [file] [log] [blame]
Howard Hinnantcbbf6332010-06-02 18:20:39 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnant412dbeb2010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantcbbf6332010-06-02 18:20:39 +00007//
8//===----------------------------------------------------------------------===//
9
Howard Hinnantcbbf6332010-06-02 18:20:39 +000010// <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
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000021#include "test_macros.h"
22
Howard Hinnantcbbf6332010-06-02 18:20:39 +000023int 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);
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000039#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000040 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000041#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000042 {
43 assert(std::stold("1.e60", &idx) == 1.e60L);
44 assert(idx == 5);
45 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000046#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000047 catch (const std::out_of_range&)
48 {
49 assert(false);
50 }
51 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000052#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000053 {
54 assert(std::stold(L"1.e60", &idx) == 1.e60L);
55 assert(idx == 5);
56 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000057#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000058 catch (const std::out_of_range&)
59 {
60 assert(false);
61 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000062#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000063 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000064#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000065 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
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000084#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000085 {
86 assert(std::stold("INF", &idx) == INFINITY);
87 assert(idx == 3);
88 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000089#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000090 catch (const std::out_of_range&)
91 {
92 assert(false);
93 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000094#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000095 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000096#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000097 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000098#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000099 {
100 assert(std::stold(L"INF", &idx) == INFINITY);
101 assert(idx == 3);
102 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000103#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000104 catch (const std::out_of_range&)
105 {
106 assert(false);
107 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000108#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000109 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000110#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000111 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000112#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000113 {
114 assert(std::isnan(std::stold("NAN", &idx)));
115 assert(idx == 3);
116 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000117#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000118 catch (const std::out_of_range&)
119 {
120 assert(false);
121 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000122#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000123 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000124#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000125 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000126#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000127 {
128 assert(std::isnan(std::stold(L"NAN", &idx)));
129 assert(idx == 3);
130 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000131#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000132 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 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000191#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000192}