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