1// { dg-options "-std=gnu++0x" }
2// { dg-require-string-conversions "" }
3// 2008-06-15  Paolo Carlini  <paolo.carlini@oracle.com>
4
5// Copyright (C) 2008, 2009 Free Software Foundation, Inc.
6//
7// This file is part of the GNU ISO C++ Library.  This library is free
8// software; you can redistribute it and/or modify it under the
9// terms of the GNU General Public License as published by the
10// Free Software Foundation; either version 3, or (at your option)
11// any later version.
12
13// This library is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17
18// You should have received a copy of the GNU General Public License along
19// with this library; see the file COPYING3.  If not see
20// <http://www.gnu.org/licenses/>.
21
22// 21.4 Numeric Conversions [string.conversions]
23
24#include <string>
25#include <limits>
26#include <stdexcept>
27#include <testsuite_hooks.h>
28
29void
30test01()
31{
32#ifdef _GLIBCXX_USE_C99
33
34  bool test __attribute__((unused)) = false;
35  using namespace std;
36
37  try
38    {
39      wstring one;
40      stoull(one);
41    }
42  catch(std::invalid_argument)
43    {
44      test = true;
45    }
46  catch(...)
47    {
48    }
49  VERIFY( test );
50
51  test = false;
52  try
53    {
54      wstring one(L"a");
55      stoull(one);
56    }
57  catch(std::invalid_argument)
58    {
59      test = true;
60    }
61  catch(...)
62    {
63    }
64  VERIFY( test );
65
66  unsigned long long ull1 = 0;
67  try
68    {
69      wstring one(L"a");
70      ull1 = stoull(one, 0, 16);
71    }
72  catch(...)
73    {
74      test = false;
75    }
76  VERIFY( test );
77  VERIFY( ull1 == 10 );
78
79  size_t idx1 = 0;
80  try
81    {
82      wstring one(L"78");
83      ull1 = stoull(one, &idx1, 8);
84    }
85  catch(...)
86    {
87      test = false;
88    }
89  VERIFY( test );
90  VERIFY( ull1 == 7 );
91  VERIFY( idx1 = 1 );
92
93  try
94    {
95      wstring one(L"10112");
96      ull1 = stoull(one, &idx1, 2);
97    }
98  catch(...)
99    {
100      test = false;
101    }
102  VERIFY( test );
103  VERIFY( ull1 == 11 );
104  VERIFY( idx1 == 4 );
105
106  try
107    {
108      wstring one(L"0XE");
109      ull1 = stoull(one, &idx1, 0);
110    }
111  catch(...)
112    {
113      test = false;
114    }
115  VERIFY( test );
116  VERIFY( ull1 == 14 );
117  VERIFY( idx1 == 3 );
118
119  test = false;
120  try
121    {
122      wstring one(1000, L'9');
123      ull1 = stoull(one);
124    }
125  catch(std::out_of_range)
126    {
127      test = true;
128    }
129  catch(...)
130    {
131    }
132  VERIFY( test );
133  VERIFY( ull1 == 14 );
134
135  try
136    {
137      ull1 = numeric_limits<unsigned long long>::max();
138      wstring one(to_wstring(ull1));
139      ull1 = stoull(one);
140    }
141  catch(...)
142    {
143      test = false;
144    }
145  VERIFY( test );
146  VERIFY( ull1 == numeric_limits<unsigned long long>::max() );
147
148#endif
149}
150
151int main()
152{
153  test01();
154  return 0;
155}
156