1 // { dg-do run { target c++11 } } 2 // { dg-require-string-conversions "" } 3 // { dg-xfail-run-if "broken long double IO" { newlib_broken_long_double_io } } 4 5 // 2008-06-15 Paolo Carlini <paolo.carlini@oracle.com> 6 7 // Copyright (C) 2008-2021 Free Software Foundation, Inc. 8 // 9 // This file is part of the GNU ISO C++ Library. This library is free 10 // software; you can redistribute it and/or modify it under the 11 // terms of the GNU General Public License as published by the 12 // Free Software Foundation; either version 3, or (at your option) 13 // any later version. 14 15 // This library is distributed in the hope that it will be useful, 16 // but WITHOUT ANY WARRANTY; without even the implied warranty of 17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 // GNU General Public License for more details. 19 20 // You should have received a copy of the GNU General Public License along 21 // with this library; see the file COPYING3. If not see 22 // <http://www.gnu.org/licenses/>. 23 24 // 21.4 Numeric Conversions [string.conversions] 25 26 #include <string> 27 #include <limits> 28 #include <stdexcept> 29 #include <testsuite_hooks.h> 30 31 void test01()32test01() 33 { 34 bool test = false; 35 using namespace std; 36 37 try 38 { 39 string one; 40 stold(one); 41 } 42 catch(const std::invalid_argument&) 43 { 44 test = true; 45 } 46 catch(...) 47 { 48 } 49 VERIFY( test ); 50 51 test = false; 52 try 53 { 54 string one("a"); 55 stold(one); 56 } 57 catch(const std::invalid_argument&) 58 { 59 test = true; 60 } 61 catch(...) 62 { 63 } 64 VERIFY( test ); 65 66 long double ld1 = 0.0L; 67 size_t idx1 = 0; 68 try 69 { 70 string one("2.0a"); 71 ld1 = stold(one, &idx1); 72 } 73 catch(...) 74 { 75 test = false; 76 } 77 VERIFY( test ); 78 VERIFY( ld1 == 2.0L ); 79 VERIFY( idx1 == 3 ); 80 81 test = false; 82 try 83 { 84 string one("1e"); 85 one.append(2 * numeric_limits<long double>::max_exponent10, '9'); 86 ld1 = stold(one); 87 } 88 catch(const std::out_of_range&) 89 { 90 test = true; 91 } 92 catch(...) 93 { 94 } 95 VERIFY( test ); 96 VERIFY( ld1 == 2.0L ); 97 98 try 99 { 100 long double ld0 = numeric_limits<long double>::max() / 100.0L; 101 string one(to_string(ld0)); 102 stold(one); 103 } 104 catch(...) 105 { 106 test = false; 107 } 108 VERIFY( test ); 109 } 110 main()111int main() 112 { 113 test01(); 114 return 0; 115 } 116