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