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 // float stof(const string& str, size_t *idx = 0);
125a83710eSEric Fiselier // float stof(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 {
235a83710eSEric Fiselier assert(std::stof("0") == 0);
245a83710eSEric Fiselier assert(std::stof("-0") == 0);
255a83710eSEric Fiselier assert(std::stof("-10") == -10);
265a83710eSEric Fiselier assert(std::stof(" 10") == 10);
27f4c1258dSLouis Dionne {
285a83710eSEric Fiselier size_t idx = 0;
295a83710eSEric Fiselier assert(std::stof("10g", &idx) == 10);
305a83710eSEric Fiselier assert(idx == 2);
315a83710eSEric Fiselier }
325a83710eSEric Fiselier {
33f4c1258dSLouis Dionne size_t idx = 0;
345a83710eSEric Fiselier assert(std::stof("INF", &idx) == INFINITY);
355a83710eSEric Fiselier assert(idx == 3);
365a83710eSEric Fiselier }
375a83710eSEric Fiselier {
38f4c1258dSLouis Dionne size_t idx = 0;
395a83710eSEric Fiselier assert(std::isnan(std::stof("NAN", &idx)));
405a83710eSEric Fiselier assert(idx == 3);
415a83710eSEric Fiselier }
4284c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
435a83710eSEric Fiselier {
44f4c1258dSLouis Dionne size_t idx = 0;
45f4c1258dSLouis Dionne try {
46f4c1258dSLouis Dionne assert(std::stof("1.e60", &idx) == INFINITY);
475a83710eSEric Fiselier assert(false);
48f4c1258dSLouis Dionne } catch (const std::out_of_range&) {
49f4c1258dSLouis Dionne assert(idx == 0);
505a83710eSEric Fiselier }
51f4c1258dSLouis Dionne }
525a83710eSEric Fiselier {
53f4c1258dSLouis Dionne size_t idx = 0;
54f4c1258dSLouis Dionne try {
55f4c1258dSLouis Dionne assert(std::stof("1.e360", &idx) == INFINITY);
56f4c1258dSLouis Dionne assert(false);
57f4c1258dSLouis Dionne } catch (const std::out_of_range&) {
58f4c1258dSLouis Dionne assert(idx == 0);
59f4c1258dSLouis Dionne }
60f4c1258dSLouis Dionne }
61f4c1258dSLouis Dionne {
62f4c1258dSLouis Dionne size_t idx = 0;
63f4c1258dSLouis Dionne try {
64*844a320cSIgor Zhukov (void)std::stof("", &idx);
65f4c1258dSLouis Dionne assert(false);
66f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
67f4c1258dSLouis Dionne assert(idx == 0);
68f4c1258dSLouis Dionne }
69f4c1258dSLouis Dionne }
70f4c1258dSLouis Dionne {
71f4c1258dSLouis Dionne size_t idx = 0;
72f4c1258dSLouis Dionne try {
73*844a320cSIgor Zhukov (void)std::stof(" - 8", &idx);
74f4c1258dSLouis Dionne assert(false);
75f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
76f4c1258dSLouis Dionne assert(idx == 0);
77f4c1258dSLouis Dionne }
78f4c1258dSLouis Dionne }
79f4c1258dSLouis Dionne {
80f4c1258dSLouis Dionne size_t idx = 0;
81f4c1258dSLouis Dionne try {
82*844a320cSIgor Zhukov (void)std::stof("a1", &idx);
83f4c1258dSLouis Dionne assert(false);
84f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
85f4c1258dSLouis Dionne assert(idx == 0);
86f4c1258dSLouis Dionne }
87f4c1258dSLouis Dionne }
88f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
89f4c1258dSLouis Dionne
90f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
91f4c1258dSLouis Dionne assert(std::stof(L"0") == 0);
92f4c1258dSLouis Dionne assert(std::stof(L"-0") == 0);
93f4c1258dSLouis Dionne assert(std::stof(L"-10.5") == -10.5);
94f4c1258dSLouis Dionne assert(std::stof(L" 10") == 10);
95f4c1258dSLouis Dionne {
96f4c1258dSLouis Dionne size_t idx = 0;
97f4c1258dSLouis Dionne assert(std::stof(L"10g", &idx) == 10);
98f4c1258dSLouis Dionne assert(idx == 2);
99f4c1258dSLouis Dionne }
100f4c1258dSLouis Dionne {
101f4c1258dSLouis Dionne size_t idx = 0;
102f4c1258dSLouis Dionne assert(std::stof(L"INF", &idx) == INFINITY);
103f4c1258dSLouis Dionne assert(idx == 3);
104f4c1258dSLouis Dionne }
105f4c1258dSLouis Dionne {
106f4c1258dSLouis Dionne size_t idx = 0;
1075a83710eSEric Fiselier assert(std::isnan(std::stof(L"NAN", &idx)));
1085a83710eSEric Fiselier assert(idx == 3);
1095a83710eSEric Fiselier }
11084c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
1115a83710eSEric Fiselier {
112f4c1258dSLouis Dionne size_t idx = 0;
113f4c1258dSLouis Dionne try {
114f4c1258dSLouis Dionne assert(std::stof(L"1.e60", &idx) == INFINITY);
1155a83710eSEric Fiselier assert(false);
116f4c1258dSLouis Dionne } catch (const std::out_of_range&) {
1175a83710eSEric Fiselier assert(idx == 0);
1185a83710eSEric Fiselier }
119f4c1258dSLouis Dionne }
1205a83710eSEric Fiselier {
121f4c1258dSLouis Dionne size_t idx = 0;
122f4c1258dSLouis Dionne try {
123f4c1258dSLouis Dionne assert(std::stof(L"1.e360", &idx) == INFINITY);
124f4c1258dSLouis Dionne assert(false);
125f4c1258dSLouis Dionne } catch (const std::out_of_range&) {
126f4c1258dSLouis Dionne assert(idx == 0);
127f4c1258dSLouis Dionne }
128f4c1258dSLouis Dionne }
129f4c1258dSLouis Dionne {
130f4c1258dSLouis Dionne size_t idx = 0;
131f4c1258dSLouis Dionne try {
132*844a320cSIgor Zhukov (void)std::stof(L"", &idx);
1335a83710eSEric Fiselier assert(false);
134f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
1355a83710eSEric Fiselier assert(idx == 0);
1365a83710eSEric Fiselier }
1375a83710eSEric Fiselier }
1385a83710eSEric Fiselier {
139f4c1258dSLouis Dionne size_t idx = 0;
140f4c1258dSLouis Dionne try {
141*844a320cSIgor Zhukov (void)std::stof(L" - 8", &idx);
1425a83710eSEric Fiselier assert(false);
143f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
1445a83710eSEric Fiselier assert(idx == 0);
1455a83710eSEric Fiselier }
1465a83710eSEric Fiselier }
1475a83710eSEric Fiselier {
148f4c1258dSLouis Dionne size_t idx = 0;
149f4c1258dSLouis Dionne try {
150*844a320cSIgor Zhukov (void)std::stof(L"a1", &idx);
1515a83710eSEric Fiselier assert(false);
152f4c1258dSLouis Dionne } catch (const std::invalid_argument&) {
1535a83710eSEric Fiselier assert(idx == 0);
1545a83710eSEric Fiselier }
155f4c1258dSLouis Dionne }
156f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
157f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
1582df59c50SJF Bastien
1592df59c50SJF Bastien return 0;
1605a83710eSEric Fiselier }
161