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 // double stod(const string& str, size_t *idx = 0);
125a83710eSEric Fiselier // double stod(const wstring& str, size_t *idx = 0);
135a83710eSEric Fiselier
145a83710eSEric Fiselier #include <string>
155a83710eSEric Fiselier #include <cmath>
165a83710eSEric Fiselier #include <cassert>
17ed2f9a60SBilly Robert O'Neal III #include <stdexcept>
185a83710eSEric Fiselier
1984c152a1SRoger Ferrer Ibanez #include "test_macros.h"
2084c152a1SRoger Ferrer Ibanez
main(int,char **)212df59c50SJF Bastien int main(int, char**)
225a83710eSEric Fiselier {
23f4c1258dSLouis Dionne // char
24f4c1258dSLouis Dionne {
255a83710eSEric Fiselier assert(std::stod("0") == 0);
265a83710eSEric Fiselier assert(std::stod("-0") == 0);
275a83710eSEric Fiselier assert(std::stod("-10") == -10);
285a83710eSEric Fiselier assert(std::stod(" 10") == 10);
29f4c1258dSLouis Dionne {
305a83710eSEric Fiselier size_t idx = 0;
315a83710eSEric Fiselier assert(std::stod("10g", &idx) == 10);
325a83710eSEric Fiselier assert(idx == 2);
33f4c1258dSLouis Dionne }
345a83710eSEric Fiselier {
35f4c1258dSLouis Dionne size_t idx = 0;
365a83710eSEric Fiselier assert(std::stod("1.e60", &idx) == 1.e60);
375a83710eSEric Fiselier assert(idx == 5);
385a83710eSEric Fiselier }
395a83710eSEric Fiselier {
40f4c1258dSLouis Dionne size_t idx = 0;
415a83710eSEric Fiselier assert(std::stod("INF", &idx) == INFINITY);
425a83710eSEric Fiselier assert(idx == 3);
435a83710eSEric Fiselier }
445a83710eSEric Fiselier {
45f4c1258dSLouis Dionne size_t idx = 0;
465a83710eSEric Fiselier assert(std::isnan(std::stod("NAN", &idx)));
475a83710eSEric Fiselier assert(idx == 3);
485a83710eSEric Fiselier }
49f4c1258dSLouis Dionne
5084c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
515a83710eSEric Fiselier {
52f4c1258dSLouis Dionne size_t idx = 0;
53f4c1258dSLouis Dionne try {
54f4c1258dSLouis Dionne assert(std::stod("1.e360", &idx) == INFINITY);
555a83710eSEric Fiselier assert(false);
56f4c1258dSLouis Dionne } catch (const std::out_of_range&) {
57f4c1258dSLouis Dionne assert(idx == 0);
585a83710eSEric Fiselier }
59f4c1258dSLouis Dionne }
605a83710eSEric Fiselier {
61f4c1258dSLouis Dionne size_t idx = 0;
62f4c1258dSLouis Dionne try {
63*844a320cSIgor Zhukov (void)std::stod("", &idx);
64f4c1258dSLouis Dionne assert(false);
65f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
66f4c1258dSLouis Dionne assert(idx == 0);
67f4c1258dSLouis Dionne }
68f4c1258dSLouis Dionne }
69f4c1258dSLouis Dionne {
70f4c1258dSLouis Dionne size_t idx = 0;
71f4c1258dSLouis Dionne try {
72*844a320cSIgor Zhukov (void)std::stod(" - 8", &idx);
73f4c1258dSLouis Dionne assert(false);
74f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
75f4c1258dSLouis Dionne assert(idx == 0);
76f4c1258dSLouis Dionne }
77f4c1258dSLouis Dionne }
78f4c1258dSLouis Dionne {
79f4c1258dSLouis Dionne size_t idx = 0;
80f4c1258dSLouis Dionne try {
81*844a320cSIgor Zhukov (void)std::stod("a1", &idx);
82f4c1258dSLouis Dionne assert(false);
83f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
84f4c1258dSLouis Dionne assert(idx == 0);
85f4c1258dSLouis Dionne }
86f4c1258dSLouis Dionne }
87f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
88f4c1258dSLouis Dionne }
89f4c1258dSLouis Dionne
90f4c1258dSLouis Dionne // wchar_t
91f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
92f4c1258dSLouis Dionne {
93f4c1258dSLouis Dionne assert(std::stod(L"0") == 0);
94f4c1258dSLouis Dionne assert(std::stod(L"-0") == 0);
95f4c1258dSLouis Dionne assert(std::stod(L"-10.5") == -10.5);
96f4c1258dSLouis Dionne assert(std::stod(L" 10") == 10);
97f4c1258dSLouis Dionne {
98f4c1258dSLouis Dionne size_t idx = 0;
99f4c1258dSLouis Dionne assert(std::stod(L"10g", &idx) == 10);
100f4c1258dSLouis Dionne assert(idx == 2);
101f4c1258dSLouis Dionne }
102f4c1258dSLouis Dionne {
103f4c1258dSLouis Dionne size_t idx = 0;
104f4c1258dSLouis Dionne assert(std::stod(L"1.e60", &idx) == 1.e60);
105f4c1258dSLouis Dionne assert(idx == 5);
106f4c1258dSLouis Dionne }
107f4c1258dSLouis Dionne {
108f4c1258dSLouis Dionne size_t idx = 0;
109f4c1258dSLouis Dionne assert(std::stod(L"INF", &idx) == INFINITY);
110f4c1258dSLouis Dionne assert(idx == 3);
111f4c1258dSLouis Dionne }
112f4c1258dSLouis Dionne {
113f4c1258dSLouis Dionne size_t idx = 0;
1145a83710eSEric Fiselier assert(std::isnan(std::stod(L"NAN", &idx)));
1155a83710eSEric Fiselier assert(idx == 3);
1165a83710eSEric Fiselier }
11784c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
1185a83710eSEric Fiselier {
119f4c1258dSLouis Dionne size_t idx = 0;
120f4c1258dSLouis Dionne try {
121f4c1258dSLouis Dionne assert(std::stod(L"1.e360", &idx) == INFINITY);
1225a83710eSEric Fiselier assert(false);
123f4c1258dSLouis Dionne } catch (const std::out_of_range&) {
1245a83710eSEric Fiselier assert(idx == 0);
1255a83710eSEric Fiselier }
126f4c1258dSLouis Dionne }
1275a83710eSEric Fiselier {
128f4c1258dSLouis Dionne size_t idx = 0;
129f4c1258dSLouis Dionne try {
130*844a320cSIgor Zhukov (void)std::stod(L"", &idx);
1315a83710eSEric Fiselier assert(false);
132f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
1335a83710eSEric Fiselier assert(idx == 0);
1345a83710eSEric Fiselier }
1355a83710eSEric Fiselier }
1365a83710eSEric Fiselier {
137f4c1258dSLouis Dionne size_t idx = 0;
138f4c1258dSLouis Dionne try {
139*844a320cSIgor Zhukov (void)std::stod(L" - 8", &idx);
1405a83710eSEric Fiselier assert(false);
141f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
1425a83710eSEric Fiselier assert(idx == 0);
1435a83710eSEric Fiselier }
1445a83710eSEric Fiselier }
1455a83710eSEric Fiselier {
146f4c1258dSLouis Dionne size_t idx = 0;
147f4c1258dSLouis Dionne try {
148*844a320cSIgor Zhukov (void)std::stod(L"a1", &idx);
1495a83710eSEric Fiselier assert(false);
150f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
1515a83710eSEric Fiselier assert(idx == 0);
1525a83710eSEric Fiselier }
153f4c1258dSLouis Dionne }
154f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
155f4c1258dSLouis Dionne }
156f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
1572df59c50SJF Bastien
1582df59c50SJF Bastien return 0;
1595a83710eSEric Fiselier }
160