1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// PR14919 was fixed in r172447, out_of_range wasn't thrown before.
11// XFAIL: with_system_cxx_lib=macosx10.7
12// XFAIL: with_system_cxx_lib=macosx10.8
13
14// <string>
15
16// long stol(const string& str, size_t *idx = 0, int base = 10);
17// long stol(const wstring& str, size_t *idx = 0, int base = 10);
18
19#include <string>
20#include <cassert>
21
22#include "test_macros.h"
23
24int main()
25{
26    assert(std::stol("0") == 0);
27    assert(std::stol(L"0") == 0);
28    assert(std::stol("-0") == 0);
29    assert(std::stol(L"-0") == 0);
30    assert(std::stol("-10") == -10);
31    assert(std::stol(L"-10") == -10);
32    assert(std::stol(" 10") == 10);
33    assert(std::stol(L" 10") == 10);
34    size_t idx = 0;
35    assert(std::stol("10g", &idx, 16) == 16);
36    assert(idx == 2);
37    idx = 0;
38    assert(std::stol(L"10g", &idx, 16) == 16);
39    assert(idx == 2);
40#ifndef TEST_HAS_NO_EXCEPTIONS
41    idx = 0;
42    try
43    {
44        std::stol("", &idx);
45        assert(false);
46    }
47    catch (const std::invalid_argument&)
48    {
49        assert(idx == 0);
50    }
51    try
52    {
53        std::stol(L"", &idx);
54        assert(false);
55    }
56    catch (const std::invalid_argument&)
57    {
58        assert(idx == 0);
59    }
60    try
61    {
62        std::stol("  - 8", &idx);
63        assert(false);
64    }
65    catch (const std::invalid_argument&)
66    {
67        assert(idx == 0);
68    }
69    try
70    {
71        std::stol(L"  - 8", &idx);
72        assert(false);
73    }
74    catch (const std::invalid_argument&)
75    {
76        assert(idx == 0);
77    }
78    try
79    {
80        std::stol("a1", &idx);
81        assert(false);
82    }
83    catch (const std::invalid_argument&)
84    {
85        assert(idx == 0);
86    }
87    try
88    {
89        std::stol(L"a1", &idx);
90        assert(false);
91    }
92    catch (const std::invalid_argument&)
93    {
94        assert(idx == 0);
95    }
96//  LWG issue #2009
97    try
98    {
99        std::stol("9999999999999999999999999999999999999999999999999", &idx);
100        assert(false);
101    }
102    catch (const std::out_of_range&)
103    {
104        assert(idx == 0);
105    }
106    try
107    {
108        std::stol(L"9999999999999999999999999999999999999999999999999", &idx);
109        assert(false);
110    }
111    catch (const std::out_of_range&)
112    {
113        assert(idx == 0);
114    }
115#endif
116}
117