1a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//===----------------------------------------------------------------------===//
2a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//
3a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//                     The LLVM Compiler Infrastructure
4a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//
8a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//===----------------------------------------------------------------------===//
9a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
10a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// <string>
11a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
12a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// double stod(const string& str, size_t *idx = 0);
13a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// double stod(const wstring& str, size_t *idx = 0);
14a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
15a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include <string>
16a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include <cmath>
17a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include <cassert>
18a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
19bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#include "test_macros.h"
20bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez
21a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantint main()
22a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
23a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod("0") == 0);
24a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod(L"0") == 0);
25a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod("-0") == 0);
26a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod(L"-0") == 0);
27a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod("-10") == -10);
28a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod(L"-10.5") == -10.5);
29a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod(" 10") == 10);
30a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod(L" 10") == 10);
31a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    size_t idx = 0;
32a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod("10g", &idx) == 10);
33a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(idx == 2);
34a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
35a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stod(L"10g", &idx) == 10);
36a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(idx == 2);
37bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
38a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
39bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
40a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
41a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stod("1.e60", &idx) == 1.e60);
42a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 5);
43a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
44bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
45a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
46a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
47a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
48a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
49a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
50bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
51a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
52a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stod(L"1.e60", &idx) == 1.e60);
53a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 5);
54a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
55bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
56a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
57a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
58a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
59a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
60a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
61a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
62a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
63a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stod("1.e360", &idx) == INFINITY);
64a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
65a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
66a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
67a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
68a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
69a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
70a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
71a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
72a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stod(L"1.e360", &idx) == INFINITY);
73a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
74a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
75a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
76a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
77a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
78a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
79a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
80bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
81a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
82a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stod("INF", &idx) == INFINITY);
83a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
84a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
85bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
86a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
87a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
88a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
89a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
90bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
91a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
92bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
93a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
94bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
95a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
96a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stod(L"INF", &idx) == INFINITY);
97a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
98a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
99bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
100a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
101a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
102a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
103a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
104bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
105a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
106bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
107a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
108bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
109a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
110a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::isnan(std::stod("NAN", &idx)));
111a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
112a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
113bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
114a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
115a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
116a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
117a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
118bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
119a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
120bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
121a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
122bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
123a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
124a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::isnan(std::stod(L"NAN", &idx)));
125a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
126a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
127bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
128a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
129a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
130a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
131a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
132a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
133a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
134a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
135a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stod("", &idx);
136a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
137a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
138a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
139a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
140a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
141a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
142a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
143a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
144a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stod(L"", &idx);
145a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
146a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
147a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
148a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
149a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
150a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
151a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
152a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
153a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stod("  - 8", &idx);
154a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
155a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
156a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
157a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
158a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
159a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
160a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
161a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
162a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stod(L"  - 8", &idx);
163a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
164a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
165a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
166a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
167a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
168a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
169a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
170a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
171a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stod("a1", &idx);
172a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
173a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
174a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
175a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
176a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
177a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
178a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
179a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
180a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stod(L"a1", &idx);
181a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
182a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
183a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
184a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
185a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
186a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
187bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
188a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
189