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