15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <string>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // long double stold(const string& str, size_t *idx = 0);
125a83710eSEric Fiselier // long double stold(const wstring& str, size_t *idx = 0);
135a83710eSEric Fiselier 
145a83710eSEric Fiselier #include <cassert>
154c1581e2SBilly Robert O'Neal III #include <cmath>
164c1581e2SBilly Robert O'Neal III #include <stdexcept>
174c1581e2SBilly Robert O'Neal III #include <string>
185a83710eSEric Fiselier 
1984c152a1SRoger Ferrer Ibanez #include "test_macros.h"
2084c152a1SRoger Ferrer Ibanez 
main(int,char **)212df59c50SJF Bastien int main(int, char**)
225a83710eSEric Fiselier {
235a83710eSEric Fiselier     assert(std::stold("0") == 0);
245a83710eSEric Fiselier     assert(std::stold("-0") == 0);
255a83710eSEric Fiselier     assert(std::stold("-10") == -10);
265a83710eSEric Fiselier     assert(std::stold(" 10") == 10);
27f4c1258dSLouis Dionne     {
285a83710eSEric Fiselier         size_t idx = 0;
295a83710eSEric Fiselier         assert(std::stold("10g", &idx) == 10);
305a83710eSEric Fiselier         assert(idx == 2);
31f4c1258dSLouis Dionne     }
325a83710eSEric Fiselier     {
33f4c1258dSLouis Dionne         size_t idx = 0;
345a83710eSEric Fiselier         assert(std::stold("1.e60", &idx) == 1.e60L);
355a83710eSEric Fiselier         assert(idx == 5);
365a83710eSEric Fiselier     }
375a83710eSEric Fiselier     {
38f4c1258dSLouis Dionne         size_t idx = 0;
395a83710eSEric Fiselier         assert(std::stold("INF", &idx) == INFINITY);
405a83710eSEric Fiselier         assert(idx == 3);
415a83710eSEric Fiselier     }
425a83710eSEric Fiselier     {
43f4c1258dSLouis Dionne         size_t idx = 0;
445a83710eSEric Fiselier         assert(std::isnan(std::stold("NAN", &idx)));
455a83710eSEric Fiselier         assert(idx == 3);
465a83710eSEric Fiselier     }
47f4c1258dSLouis Dionne 
4884c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
495a83710eSEric Fiselier     {
50f4c1258dSLouis Dionne         size_t idx = 0;
51f4c1258dSLouis Dionne         try {
52*844a320cSIgor Zhukov             (void)std::stold("", &idx);
535a83710eSEric Fiselier             assert(false);
54f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
55f4c1258dSLouis Dionne             assert(idx == 0);
565a83710eSEric Fiselier         }
57f4c1258dSLouis Dionne     }
585a83710eSEric Fiselier     {
59f4c1258dSLouis Dionne         size_t idx = 0;
60f4c1258dSLouis Dionne         try {
61*844a320cSIgor Zhukov             (void)std::stold("  - 8", &idx);
62f4c1258dSLouis Dionne             assert(false);
63f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
64f4c1258dSLouis Dionne             assert(idx == 0);
65f4c1258dSLouis Dionne         }
66f4c1258dSLouis Dionne     }
67f4c1258dSLouis Dionne     {
68f4c1258dSLouis Dionne         size_t idx = 0;
69f4c1258dSLouis Dionne         try {
70*844a320cSIgor Zhukov             (void)std::stold("a1", &idx);
71f4c1258dSLouis Dionne             assert(false);
72f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
73f4c1258dSLouis Dionne             assert(idx == 0);
74f4c1258dSLouis Dionne         }
75f4c1258dSLouis Dionne     }
76f4c1258dSLouis Dionne     {
77f4c1258dSLouis Dionne         size_t idx = 0;
78f4c1258dSLouis Dionne         try {
79f4c1258dSLouis Dionne             assert(std::stold("1.e6000", &idx) == INFINITY);
80f4c1258dSLouis Dionne             assert(false);
81f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
82f4c1258dSLouis Dionne             assert(idx == 0);
83f4c1258dSLouis Dionne         }
84f4c1258dSLouis Dionne     }
85f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
86f4c1258dSLouis Dionne 
87f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
88f4c1258dSLouis Dionne     assert(std::stold(L"0") == 0);
89f4c1258dSLouis Dionne     assert(std::stold(L"-0") == 0);
90f4c1258dSLouis Dionne     assert(std::stold(L"-10.5") == -10.5);
91f4c1258dSLouis Dionne     assert(std::stold(L" 10") == 10);
92f4c1258dSLouis Dionne     {
93f4c1258dSLouis Dionne         size_t idx = 0;
94f4c1258dSLouis Dionne         assert(std::stold(L"10g", &idx) == 10);
95f4c1258dSLouis Dionne         assert(idx == 2);
96f4c1258dSLouis Dionne     }
97f4c1258dSLouis Dionne     {
98f4c1258dSLouis Dionne         size_t idx = 0;
99f4c1258dSLouis Dionne         assert(std::stold(L"1.e60", &idx) == 1.e60L);
100f4c1258dSLouis Dionne         assert(idx == 5);
101f4c1258dSLouis Dionne     }
102f4c1258dSLouis Dionne     {
103f4c1258dSLouis Dionne         size_t idx = 0;
104f4c1258dSLouis Dionne         assert(std::stold(L"INF", &idx) == INFINITY);
105f4c1258dSLouis Dionne         assert(idx == 3);
106f4c1258dSLouis Dionne     }
107f4c1258dSLouis Dionne     {
108f4c1258dSLouis Dionne         size_t idx = 0;
1095a83710eSEric Fiselier         assert(std::isnan(std::stold(L"NAN", &idx)));
1105a83710eSEric Fiselier         assert(idx == 3);
1115a83710eSEric Fiselier     }
11284c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
1135a83710eSEric Fiselier     {
114f4c1258dSLouis Dionne         size_t idx = 0;
115f4c1258dSLouis Dionne         try {
116*844a320cSIgor Zhukov             (void)std::stold(L"", &idx);
1175a83710eSEric Fiselier             assert(false);
118f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
1195a83710eSEric Fiselier             assert(idx == 0);
1205a83710eSEric Fiselier         }
1215a83710eSEric Fiselier     }
1225a83710eSEric Fiselier     {
123f4c1258dSLouis Dionne         size_t idx = 0;
124f4c1258dSLouis Dionne         try {
125*844a320cSIgor Zhukov             (void)std::stold(L"  - 8", &idx);
1265a83710eSEric Fiselier             assert(false);
127f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
1285a83710eSEric Fiselier             assert(idx == 0);
1295a83710eSEric Fiselier         }
1305a83710eSEric Fiselier     }
1315a83710eSEric Fiselier     {
132f4c1258dSLouis Dionne         size_t idx = 0;
133f4c1258dSLouis Dionne         try {
134*844a320cSIgor Zhukov             (void)std::stold(L"a1", &idx);
1355a83710eSEric Fiselier             assert(false);
136f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
1375a83710eSEric Fiselier             assert(idx == 0);
1385a83710eSEric Fiselier         }
139f4c1258dSLouis Dionne     }
140f4c1258dSLouis Dionne     {
141f4c1258dSLouis Dionne         size_t idx = 0;
142f4c1258dSLouis Dionne         try {
143f4c1258dSLouis Dionne             assert(std::stold(L"1.e6000", &idx) == INFINITY);
144f4c1258dSLouis Dionne             assert(false);
145f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
146f4c1258dSLouis Dionne             assert(idx == 0);
147f4c1258dSLouis Dionne         }
148f4c1258dSLouis Dionne     }
149f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
150f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
1512df59c50SJF Bastien 
1522df59c50SJF Bastien   return 0;
1535a83710eSEric Fiselier }
154