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