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 // long stol(const string& str, size_t *idx = 0, int base = 10);
125a83710eSEric Fiselier // long stol(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::stol("0") == 0);
235a83710eSEric Fiselier     assert(std::stol("-0") == 0);
245a83710eSEric Fiselier     assert(std::stol("-10") == -10);
255a83710eSEric Fiselier     assert(std::stol(" 10") == 10);
26f4c1258dSLouis Dionne     {
275a83710eSEric Fiselier         size_t idx = 0;
285a83710eSEric Fiselier         assert(std::stol("10g", &idx, 16) == 16);
295a83710eSEric Fiselier         assert(idx == 2);
30f4c1258dSLouis Dionne     }
3184c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
325a83710eSEric Fiselier     {
33f4c1258dSLouis Dionne         size_t idx = 0;
34f4c1258dSLouis Dionne         try {
35*844a320cSIgor Zhukov             (void)std::stol("", &idx);
365a83710eSEric Fiselier             assert(false);
37f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
385a83710eSEric Fiselier             assert(idx == 0);
395a83710eSEric Fiselier         }
405a83710eSEric Fiselier     }
415a83710eSEric Fiselier     {
42f4c1258dSLouis Dionne         size_t idx = 0;
43f4c1258dSLouis Dionne         try {
44*844a320cSIgor Zhukov             (void)std::stol("  - 8", &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::stol("a1", &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 {
627149bb70SLouis Dionne             // LWG#2009 and PR14919
63*844a320cSIgor Zhukov             (void)std::stol("9999999999999999999999999999999999999999999999999", &idx);
645a83710eSEric Fiselier             assert(false);
65f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
665a83710eSEric Fiselier             assert(idx == 0);
675a83710eSEric Fiselier         }
68f4c1258dSLouis Dionne     }
69f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
70f4c1258dSLouis Dionne 
71f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
72f4c1258dSLouis Dionne     assert(std::stol(L"0") == 0);
73f4c1258dSLouis Dionne     assert(std::stol(L"-0") == 0);
74f4c1258dSLouis Dionne     assert(std::stol(L"-10") == -10);
75f4c1258dSLouis Dionne     assert(std::stol(L" 10") == 10);
765a83710eSEric Fiselier     {
77f4c1258dSLouis Dionne         size_t idx = 0;
78f4c1258dSLouis Dionne         assert(std::stol(L"10g", &idx, 16) == 16);
79f4c1258dSLouis Dionne         assert(idx == 2);
80f4c1258dSLouis Dionne     }
81f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
82f4c1258dSLouis Dionne     {
83f4c1258dSLouis Dionne         size_t idx = 0;
84f4c1258dSLouis Dionne         try {
85*844a320cSIgor Zhukov             (void)std::stol(L"", &idx);
86f4c1258dSLouis Dionne             assert(false);
87f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
88f4c1258dSLouis Dionne             assert(idx == 0);
89f4c1258dSLouis Dionne         }
90f4c1258dSLouis Dionne     }
91f4c1258dSLouis Dionne     {
92f4c1258dSLouis Dionne         size_t idx = 0;
93f4c1258dSLouis Dionne         try {
94*844a320cSIgor Zhukov             (void)std::stol(L"  - 8", &idx);
95f4c1258dSLouis Dionne             assert(false);
96f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
97f4c1258dSLouis Dionne             assert(idx == 0);
98f4c1258dSLouis Dionne         }
99f4c1258dSLouis Dionne     }
100f4c1258dSLouis Dionne     {
101f4c1258dSLouis Dionne         size_t idx = 0;
102f4c1258dSLouis Dionne         try {
103*844a320cSIgor Zhukov             (void)std::stol(L"a1", &idx);
104f4c1258dSLouis Dionne             assert(false);
105f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
106f4c1258dSLouis Dionne             assert(idx == 0);
107f4c1258dSLouis Dionne         }
108f4c1258dSLouis Dionne     }
109f4c1258dSLouis Dionne     {
110f4c1258dSLouis Dionne         size_t idx = 0;
111f4c1258dSLouis Dionne         try {
1127149bb70SLouis Dionne             // LWG#2009 and PR14919
113*844a320cSIgor Zhukov             (void)std::stol(L"9999999999999999999999999999999999999999999999999", &idx);
1145a83710eSEric Fiselier             assert(false);
115f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
1165a83710eSEric Fiselier             assert(idx == 0);
1175a83710eSEric Fiselier         }
118f4c1258dSLouis Dionne     }
119f4c1258dSLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
120f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
1212df59c50SJF Bastien 
1222df59c50SJF Bastien   return 0;
1235a83710eSEric Fiselier }
124