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 // int stoi(const string& str, size_t *idx = 0, int base = 10);
125a83710eSEric Fiselier // int stoi(const wstring& str, size_t *idx = 0, int base = 10);
135a83710eSEric Fiselier 
145a83710eSEric Fiselier #include <string>
155a83710eSEric Fiselier #include <cassert>
16ed2f9a60SBilly Robert O'Neal III #include <stdexcept>
175a83710eSEric Fiselier 
1884c152a1SRoger Ferrer Ibanez #include "test_macros.h"
1984c152a1SRoger Ferrer Ibanez 
main(int,char **)202df59c50SJF Bastien int main(int, char**)
215a83710eSEric Fiselier {
225a83710eSEric Fiselier     assert(std::stoi("0") == 0);
235a83710eSEric Fiselier     assert(std::stoi("-0") == 0);
245a83710eSEric Fiselier     assert(std::stoi("-10") == -10);
255a83710eSEric Fiselier     assert(std::stoi(" 10") == 10);
26f4c1258dSLouis Dionne     {
275a83710eSEric Fiselier         size_t idx = 0;
285a83710eSEric Fiselier         assert(std::stoi("10g", &idx, 16) == 16);
295a83710eSEric Fiselier         assert(idx == 2);
30f4c1258dSLouis Dionne     }
3184c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
32f4c1258dSLouis Dionne     if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max()) {
33f4c1258dSLouis Dionne         size_t idx = 0;
34f4c1258dSLouis Dionne         try {
35*844a320cSIgor Zhukov             (void)std::stoi("0x100000000", &idx, 16);
365a83710eSEric Fiselier             assert(false);
37f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
38f4c1258dSLouis Dionne 
395a83710eSEric Fiselier         }
40f4c1258dSLouis Dionne     }
415a83710eSEric Fiselier     {
42f4c1258dSLouis Dionne         size_t idx = 0;
43f4c1258dSLouis Dionne         try {
44*844a320cSIgor Zhukov             (void)std::stoi("", &idx);
455a83710eSEric Fiselier             assert(false);
46f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
475a83710eSEric Fiselier             assert(idx == 0);
485a83710eSEric Fiselier         }
495a83710eSEric Fiselier     }
505a83710eSEric Fiselier     {
51f4c1258dSLouis Dionne         size_t idx = 0;
52f4c1258dSLouis Dionne         try {
53*844a320cSIgor Zhukov             (void)std::stoi("  - 8", &idx);
545a83710eSEric Fiselier             assert(false);
55f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
565a83710eSEric Fiselier             assert(idx == 0);
575a83710eSEric Fiselier         }
585a83710eSEric Fiselier     }
595a83710eSEric Fiselier     {
60f4c1258dSLouis Dionne         size_t idx = 0;
61f4c1258dSLouis Dionne         try {
62*844a320cSIgor Zhukov             (void)std::stoi("a1", &idx);
635a83710eSEric Fiselier             assert(false);
64f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
655a83710eSEric Fiselier             assert(idx == 0);
665a83710eSEric Fiselier         }
67f4c1258dSLouis Dionne     }
68f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
69f4c1258dSLouis Dionne 
70f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
71f4c1258dSLouis Dionne     assert(std::stoi(L"0") == 0);
72f4c1258dSLouis Dionne     assert(std::stoi(L"-0") == 0);
73f4c1258dSLouis Dionne     assert(std::stoi(L"-10") == -10);
74f4c1258dSLouis Dionne     assert(std::stoi(L" 10") == 10);
755a83710eSEric Fiselier     {
76f4c1258dSLouis Dionne         size_t idx = 0;
77f4c1258dSLouis Dionne         assert(std::stoi(L"10g", &idx, 16) == 16);
78f4c1258dSLouis Dionne         assert(idx == 2);
79f4c1258dSLouis Dionne     }
80f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
81f4c1258dSLouis Dionne     if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max()) {
82f4c1258dSLouis Dionne         size_t idx = 0;
83f4c1258dSLouis Dionne         try {
84*844a320cSIgor Zhukov             (void)std::stoi(L"0x100000000", &idx, 16);
85f4c1258dSLouis Dionne             assert(false);
86f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
87f4c1258dSLouis Dionne 
88f4c1258dSLouis Dionne         }
89f4c1258dSLouis Dionne     }
90f4c1258dSLouis Dionne     {
91f4c1258dSLouis Dionne         size_t idx = 0;
92f4c1258dSLouis Dionne         try {
93*844a320cSIgor Zhukov             (void)std::stoi(L"", &idx);
94f4c1258dSLouis Dionne             assert(false);
95f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
96f4c1258dSLouis Dionne             assert(idx == 0);
97f4c1258dSLouis Dionne         }
98f4c1258dSLouis Dionne     }
99f4c1258dSLouis Dionne     {
100f4c1258dSLouis Dionne         size_t idx = 0;
101f4c1258dSLouis Dionne         try {
102*844a320cSIgor Zhukov             (void)std::stoi(L"  - 8", &idx);
103f4c1258dSLouis Dionne             assert(false);
104f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
105f4c1258dSLouis Dionne             assert(idx == 0);
106f4c1258dSLouis Dionne         }
107f4c1258dSLouis Dionne     }
108f4c1258dSLouis Dionne     {
109f4c1258dSLouis Dionne         size_t idx = 0;
110f4c1258dSLouis Dionne         try {
111*844a320cSIgor Zhukov             (void)std::stoi(L"a1", &idx);
1125a83710eSEric Fiselier             assert(false);
113f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
1145a83710eSEric Fiselier             assert(idx == 0);
1155a83710eSEric Fiselier         }
116f4c1258dSLouis Dionne     }
117f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
118f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
1192df59c50SJF Bastien 
1202df59c50SJF Bastien   return 0;
1215a83710eSEric Fiselier }
122