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
21bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#include "test_macros.h"
22bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez
23a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantint main()
24a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
25a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold("0") == 0);
26a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold(L"0") == 0);
27a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold("-0") == 0);
28a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold(L"-0") == 0);
29a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold("-10") == -10);
30a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold(L"-10.5") == -10.5);
31a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold(" 10") == 10);
32a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold(L" 10") == 10);
33a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    size_t idx = 0;
34a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold("10g", &idx) == 10);
35a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(idx == 2);
36a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
37a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stold(L"10g", &idx) == 10);
38a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(idx == 2);
39bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
40a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
41bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
42a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
43a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stold("1.e60", &idx) == 1.e60L);
44a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 5);
45a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
46bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
47a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
48a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
49a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
50a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
51a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
52bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
53a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
54a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stold(L"1.e60", &idx) == 1.e60L);
55a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 5);
56a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
57bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
58a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
59a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
60a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
61a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
62bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
63a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
64bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
65a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
66a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
67a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stold("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(L"1.e6000", &idx) == INFINITY);
77a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
78a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
79a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
80a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
81a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
82a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
83a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
84bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
85a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
86a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stold("INF", &idx) == INFINITY);
87a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
88a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
89bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
90a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
91a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
92a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
93a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
94bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
95a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
96bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
97a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
98bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
99a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
100a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::stold(L"INF", &idx) == INFINITY);
101a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
102a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
103bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
104a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
105a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
106a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
107a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
108bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
109a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
110bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
111a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
112bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
113a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
114a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::isnan(std::stold("NAN", &idx)));
115a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
116a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
117bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
118a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
119a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
120a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
121a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
122bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
123a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
124bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
125a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
126bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
127a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
128a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(std::isnan(std::stold(L"NAN", &idx)));
129a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 3);
130a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
131bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#ifndef TEST_HAS_NO_EXCEPTIONS
132a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::out_of_range&)
133a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
134a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
135a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
136a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
137a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
138a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
139a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stold("", &idx);
140a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
141a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
142a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
143a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
144a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
145a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
146a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
147a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
148a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stold(L"", &idx);
149a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
150a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
151a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
152a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
153a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
154a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
155a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
156a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
157a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stold("  - 8", &idx);
158a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
159a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
160a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
161a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
162a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
163a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
164a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
165a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
166a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stold(L"  - 8", &idx);
167a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
168a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
169a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
170a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
171a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
172a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
173a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
174a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
175a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stold("a1", &idx);
176a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
177a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
178a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
179a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
180a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
181a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
182a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
183a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
184a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stold(L"a1", &idx);
185a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
186a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
187a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
188a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
189a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
190a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
191bc464e50e9cc2a48010e83973de3c1e53eeb0d38Roger Ferrer Ibanez#endif
192a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
193