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