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