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//===----------------------------------------------------------------------===//
9d7cddf651933c246f4b2c4b3de4a4751a9a050dbHoward Hinnant//
104dc5b2198d1aa4ab585a3d4a87ee9626d681f9f7Dan Albert// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
114dc5b2198d1aa4ab585a3d4a87ee9626d681f9f7Dan Albert// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
12a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
13a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// <string>
14a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
15a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10);
16a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// unsigned long long stoull(const wstring& str, size_t *idx = 0, int base = 10);
17a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
18a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include <string>
19a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include <cassert>
20a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant
21a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantint main()
22a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{
23a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull("0") == 0);
24a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull(L"0") == 0);
25a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull("-0") == 0);
26a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull(L"-0") == 0);
27a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull(" 10") == 10);
28a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull(L" 10") == 10);
29a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    size_t idx = 0;
30a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull("10g", &idx, 16) == 16);
31a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(idx == 2);
32a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
33a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(std::stoull(L"10g", &idx, 16) == 16);
34a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    assert(idx == 2);
35a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
36a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
37a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
38a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stoull("", &idx);
39a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
40a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
41a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
42a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
43a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
44a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
45a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    idx = 0;
46a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
47a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
48a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stoull(L"", &idx);
49a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
50a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
51a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
52a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
53a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
54a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
55a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
56a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
57a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stoull("  - 8", &idx);
58a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
59a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
60a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
61a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
62a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
63a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
64a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
65a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
66a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stoull(L"  - 8", &idx);
67a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
68a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
69a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
70a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
71a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
72a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
73a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
74a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
75a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stoull("a1", &idx);
76a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
77a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
78a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
79a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
80a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
81a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
82a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    try
83a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
84a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        std::stoull(L"a1", &idx);
85a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(false);
86a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
87a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    catch (const std::invalid_argument&)
88a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    {
89a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant        assert(idx == 0);
90a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant    }
91bf6eda0b1e50f1194ed07df89840e4e9c5f05fddMarshall Clow//  LWG issue #2009
928634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    try
938634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    {
948634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow        std::stoull("9999999999999999999999999999999999999999999999999", &idx);
958634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow        assert(false);
968634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    }
978634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    catch (const std::out_of_range&)
988634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    {
998634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow        assert(idx == 0);
1008634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    }
1018634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    try
1028634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    {
1038634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow        std::stoull(L"9999999999999999999999999999999999999999999999999", &idx);
1048634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow        assert(false);
1058634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    }
1068634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    catch (const std::out_of_range&)
1078634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    {
1088634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow        assert(idx == 0);
1098634fc5494641850c89eab7a1f2357a55d694c0cMarshall Clow    }
110a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant}
111