blob: 4677bd7d2eb45577f5b6dfdf297115ecc7840f20 [file] [log] [blame]
Howard Hinnantcbbf6332010-06-02 18:20:39 +00001//===----------------------------------------------------------------------===//
2//
Chandler Carruth57b08b02019-01-19 10:56:40 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantcbbf6332010-06-02 18:20:39 +00006//
7//===----------------------------------------------------------------------===//
8
Howard Hinnantcbbf6332010-06-02 18:20:39 +00009// <string>
10
11// long double stold(const string& str, size_t *idx = 0);
12// long double stold(const wstring& str, size_t *idx = 0);
13
14#include <iostream>
15
16#include <string>
17#include <cmath>
18#include <cassert>
19
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000020#include "test_macros.h"
21
Howard Hinnantcbbf6332010-06-02 18:20:39 +000022int main()
23{
24 assert(std::stold("0") == 0);
25 assert(std::stold(L"0") == 0);
26 assert(std::stold("-0") == 0);
27 assert(std::stold(L"-0") == 0);
28 assert(std::stold("-10") == -10);
29 assert(std::stold(L"-10.5") == -10.5);
30 assert(std::stold(" 10") == 10);
31 assert(std::stold(L" 10") == 10);
32 size_t idx = 0;
33 assert(std::stold("10g", &idx) == 10);
34 assert(idx == 2);
35 idx = 0;
36 assert(std::stold(L"10g", &idx) == 10);
37 assert(idx == 2);
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000038#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000039 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000040#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000041 {
42 assert(std::stold("1.e60", &idx) == 1.e60L);
43 assert(idx == 5);
44 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000045#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000046 catch (const std::out_of_range&)
47 {
48 assert(false);
49 }
50 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000051#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000052 {
53 assert(std::stold(L"1.e60", &idx) == 1.e60L);
54 assert(idx == 5);
55 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000056#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000057 catch (const std::out_of_range&)
58 {
59 assert(false);
60 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000061#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000062 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000063#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000064 try
65 {
66 assert(std::stold("1.e6000", &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::stold(L"1.e6000", &idx) == INFINITY);
76 assert(false);
77 }
78 catch (const std::out_of_range&)
79 {
80 assert(idx == 0);
81 }
82 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000083#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000084 {
85 assert(std::stold("INF", &idx) == INFINITY);
86 assert(idx == 3);
87 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000088#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000089 catch (const std::out_of_range&)
90 {
91 assert(false);
92 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000093#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000094 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000095#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000096 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000097#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000098 {
99 assert(std::stold(L"INF", &idx) == INFINITY);
100 assert(idx == 3);
101 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000102#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000103 catch (const std::out_of_range&)
104 {
105 assert(false);
106 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000107#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000108 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000109#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000110 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000111#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000112 {
113 assert(std::isnan(std::stold("NAN", &idx)));
114 assert(idx == 3);
115 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000116#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000117 catch (const std::out_of_range&)
118 {
119 assert(false);
120 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000121#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000122 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000123#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000124 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000125#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000126 {
127 assert(std::isnan(std::stold(L"NAN", &idx)));
128 assert(idx == 3);
129 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000130#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000131 catch (const std::out_of_range&)
132 {
133 assert(false);
134 }
135 idx = 0;
136 try
137 {
138 std::stold("", &idx);
139 assert(false);
140 }
141 catch (const std::invalid_argument&)
142 {
143 assert(idx == 0);
144 }
145 try
146 {
147 std::stold(L"", &idx);
148 assert(false);
149 }
150 catch (const std::invalid_argument&)
151 {
152 assert(idx == 0);
153 }
154 try
155 {
156 std::stold(" - 8", &idx);
157 assert(false);
158 }
159 catch (const std::invalid_argument&)
160 {
161 assert(idx == 0);
162 }
163 try
164 {
165 std::stold(L" - 8", &idx);
166 assert(false);
167 }
168 catch (const std::invalid_argument&)
169 {
170 assert(idx == 0);
171 }
172 try
173 {
174 std::stold("a1", &idx);
175 assert(false);
176 }
177 catch (const std::invalid_argument&)
178 {
179 assert(idx == 0);
180 }
181 try
182 {
183 std::stold(L"a1", &idx);
184 assert(false);
185 }
186 catch (const std::invalid_argument&)
187 {
188 assert(idx == 0);
189 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000190#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000191}