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