1// 2000-12-19 bkoz 2 3// Copyright (C) 2000, 2002, 2003 Free Software Foundation 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 2, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING. If not, write to the Free 18// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 19// USA. 20 21// 27.4.2.5 ios_base storage functions 22 23// XXX This test will not work for some versions of irix6 because of 24// XXX bug(s) in libc malloc for very large allocations. However 25// XXX -lmalloc seems to work. 26// See http://gcc.gnu.org/ml/gcc/2002-05/msg01012.html 27// { dg-options "-lmalloc" { target mips*-*-irix6* } } 28 29#include <sstream> 30#include <iostream> 31 32#include <testsuite_hooks.h> 33 34// http://gcc.gnu.org/ml/gcc-bugs/2000-12/msg00413.html 35void test01() 36{ 37 bool test = true; 38 39 using namespace std; 40 41 long x1 = ios::xalloc(); 42 long x2 = ios::xalloc(); 43 long x3 = ios::xalloc(); 44 long x4 = ios::xalloc(); 45 46 ostringstream out("the element of crime, lars von trier"); 47 out.pword(++x4); // should not crash 48} 49 50// libstdc++/3129 51void test02() 52{ 53 bool test = true; 54 int max = std::numeric_limits<int>::max() - 1; 55 std::stringbuf strbuf; 56 std::ios ios(&strbuf); 57 58 ios.exceptions(std::ios::badbit); 59 60 long l = 0; 61 void* v = 0; 62 63 // pword 64 ios.pword(1) = v; 65 VERIFY( ios.pword(1) == v ); 66 67 try 68 { 69 v = ios.pword(max); 70 } 71 catch(std::ios_base::failure& obj) 72 { 73 // Ok. 74 VERIFY( ios.bad() ); 75 } 76 catch(...) 77 { 78 VERIFY( test = false ); 79 } 80 VERIFY( v == 0 ); 81 82 VERIFY( ios.pword(1) == v ); 83 84 // max is different code path from max-1 85 v = &test; 86 try 87 { 88 v = ios.pword(std::numeric_limits<int>::max()); 89 } 90 catch(std::ios_base::failure& obj) 91 { 92 // Ok. 93 VERIFY( ios.bad() ); 94 } 95 catch(...) 96 { 97 VERIFY( test = false ); 98 } 99 VERIFY( v == &test ); 100 101 // iword 102 ios.iword(1) = 1; 103 VERIFY( ios.iword(1) == 1 ); 104 105 try 106 { 107 l = ios.iword(max); 108 } 109 catch(std::ios_base::failure& obj) 110 { 111 // Ok. 112 VERIFY( ios.bad() ); 113 } 114 catch(...) 115 { 116 VERIFY( test = false ); 117 } 118 VERIFY( l == 0 ); 119 120 VERIFY( ios.iword(1) == 1 ); 121 122 // max is different code path from max-1 123 l = 1; 124 try 125 { 126 l = ios.iword(std::numeric_limits<int>::max()); 127 } 128 catch(std::ios_base::failure& obj) 129 { 130 // Ok. 131 VERIFY( ios.bad() ); 132 } 133 catch(...) 134 { 135 VERIFY( test = false ); 136 } 137 VERIFY( l == 1 ); 138 139} 140 141class derived : public std::ios_base 142{ 143public: 144 derived() {} 145}; 146 147void test03() 148{ 149 derived d; 150 151 d.pword(0) = &d; 152 d.iword(0) = 1; 153} 154 155int main(void) 156{ 157 __gnu_cxx_test::set_memory_limits(); 158 test01(); 159 test02(); 160 test03(); 161 return 0; 162} 163