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 // unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10);
125a83710eSEric Fiselier // unsigned long long stoull(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::stoull("0") == 0);
235a83710eSEric Fiselier     assert(std::stoull("-0") == 0);
245a83710eSEric Fiselier     assert(std::stoull(" 10") == 10);
25f4c1258dSLouis Dionne     {
265a83710eSEric Fiselier         size_t idx = 0;
275a83710eSEric Fiselier         assert(std::stoull("10g", &idx, 16) == 16);
285a83710eSEric Fiselier         assert(idx == 2);
29f4c1258dSLouis Dionne     }
3084c152a1SRoger Ferrer Ibanez #ifndef TEST_HAS_NO_EXCEPTIONS
315a83710eSEric Fiselier     {
32f4c1258dSLouis Dionne         size_t idx = 0;
33f4c1258dSLouis Dionne         try {
34*844a320cSIgor Zhukov             (void)std::stoull("", &idx);
355a83710eSEric Fiselier             assert(false);
36f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
375a83710eSEric Fiselier             assert(idx == 0);
385a83710eSEric Fiselier         }
395a83710eSEric Fiselier     }
405a83710eSEric Fiselier     {
41f4c1258dSLouis Dionne         size_t idx = 0;
42f4c1258dSLouis Dionne         try {
43*844a320cSIgor Zhukov             (void)std::stoull("  - 8", &idx);
445a83710eSEric Fiselier             assert(false);
45f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
465a83710eSEric Fiselier             assert(idx == 0);
475a83710eSEric Fiselier         }
485a83710eSEric Fiselier     }
495a83710eSEric Fiselier     {
50f4c1258dSLouis Dionne         size_t idx = 0;
51f4c1258dSLouis Dionne         try {
52*844a320cSIgor Zhukov             (void)std::stoull("a1", &idx);
535a83710eSEric Fiselier             assert(false);
54f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
555a83710eSEric Fiselier             assert(idx == 0);
565a83710eSEric Fiselier         }
575a83710eSEric Fiselier     }
585a83710eSEric Fiselier     {
59f4c1258dSLouis Dionne         size_t idx = 0;
60f4c1258dSLouis Dionne         try {
617149bb70SLouis Dionne             // LWG#2009 and PR14919
62*844a320cSIgor Zhukov             (void)std::stoull("9999999999999999999999999999999999999999999999999", &idx);
635a83710eSEric Fiselier             assert(false);
64f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
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::stoull(L"0") == 0);
72f4c1258dSLouis Dionne     assert(std::stoull(L"-0") == 0);
73f4c1258dSLouis Dionne     assert(std::stoull(L" 10") == 10);
745a83710eSEric Fiselier     {
75f4c1258dSLouis Dionne         size_t idx = 0;
76f4c1258dSLouis Dionne         assert(std::stoull(L"10g", &idx, 16) == 16);
77f4c1258dSLouis Dionne         assert(idx == 2);
78f4c1258dSLouis Dionne     }
79f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
80f4c1258dSLouis Dionne     {
81f4c1258dSLouis Dionne         size_t idx = 0;
82f4c1258dSLouis Dionne         try {
83*844a320cSIgor Zhukov             (void)std::stoull(L"", &idx);
84f4c1258dSLouis Dionne             assert(false);
85f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
86f4c1258dSLouis Dionne             assert(idx == 0);
87f4c1258dSLouis Dionne         }
88f4c1258dSLouis Dionne     }
89f4c1258dSLouis Dionne     {
90f4c1258dSLouis Dionne         size_t idx = 0;
91f4c1258dSLouis Dionne         try {
92*844a320cSIgor Zhukov             (void)std::stoull(L"  - 8", &idx);
93f4c1258dSLouis Dionne             assert(false);
94f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
95f4c1258dSLouis Dionne             assert(idx == 0);
96f4c1258dSLouis Dionne         }
97f4c1258dSLouis Dionne     }
98f4c1258dSLouis Dionne     {
99f4c1258dSLouis Dionne         size_t idx = 0;
100f4c1258dSLouis Dionne         try {
101*844a320cSIgor Zhukov             (void)std::stoull(L"a1", &idx);
102f4c1258dSLouis Dionne             assert(false);
103f4c1258dSLouis Dionne         } catch (const std::invalid_argument&) {
104f4c1258dSLouis Dionne             assert(idx == 0);
105f4c1258dSLouis Dionne         }
106f4c1258dSLouis Dionne     }
107f4c1258dSLouis Dionne     {
108f4c1258dSLouis Dionne         size_t idx = 0;
109f4c1258dSLouis Dionne         try {
1107149bb70SLouis Dionne             // LWG#2009 and PR14919
111*844a320cSIgor Zhukov             (void)std::stoull(L"9999999999999999999999999999999999999999999999999", &idx);
1125a83710eSEric Fiselier             assert(false);
113f4c1258dSLouis Dionne         } catch (const std::out_of_range&) {
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