diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c439e2ed261..ad9db7c662c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,17 @@ +2003-04-17 Benjamin Kosnik + + PR libstdc++/9555 + * include/bits/ostream.tcc: Catch all exceptions for formatted + output, instead of std::exception and derivatives. + * include/bits/istream.tcc: Same. + * testsuite/27_io/basic_ostream/inserters_arithmetic/char/9555-oa.cc: + * testsuite/27_io/basic_ostream/inserters_character/char/9555-oc.cc: + * testsuite/27_io/basic_ostream/inserters_other/char/9555-oo.cc: + * testsuite/27_io/basic_istream/extractors_arithmetic/char/9555-ia.cc: + * testsuite/27_io/basic_istream/extractors_character/char/9555-ic.cc: + * testsuite/27_io/basic_istream/extractors_other/char/9555-io.cc: + New. + 2003-04-17 Phil Edwards * include/bits/c++config: Minor cosmetic tweaks. diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index 89a84f59f7f..713c7bb6f87 100644 --- a/libstdc++-v3/include/bits/istream.tcc +++ b/libstdc++-v3/include/bits/istream.tcc @@ -118,7 +118,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -155,7 +155,7 @@ namespace std #endif this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -182,7 +182,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -219,7 +219,7 @@ namespace std #endif this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -246,7 +246,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -273,7 +273,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -300,7 +300,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -328,7 +328,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -355,7 +355,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -383,7 +383,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -410,7 +410,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -437,7 +437,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -464,7 +464,7 @@ namespace std this->_M_fnumget->get(*this, 0, *this, __err, __n); this->setstate(__err); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -495,7 +495,7 @@ namespace std if (!__sbout || !__xtrct) this->setstate(ios_base::failbit); } - catch(exception& __fail) + catch(...) { // 27.6.2.5.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -527,7 +527,7 @@ namespace std else this->setstate(ios_base::eofbit | ios_base::failbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -561,7 +561,7 @@ namespace std else this->setstate(ios_base::eofbit | ios_base::failbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -600,7 +600,7 @@ namespace std if (traits_type::eq_int_type(__c, __eof)) this->setstate(ios_base::eofbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -643,7 +643,7 @@ namespace std if (traits_type::eq_int_type(__c, __eof)) this->setstate(ios_base::eofbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -694,7 +694,7 @@ namespace std this->setstate(ios_base::failbit); } } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -735,7 +735,7 @@ namespace std if (traits_type::eq_int_type(__c, __eof)) this->setstate(ios_base::eofbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -759,7 +759,7 @@ namespace std { try { __c = this->rdbuf()->sgetc(); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -786,7 +786,7 @@ namespace std if (_M_gcount != __n) this->setstate(ios_base::eofbit | ios_base::failbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -822,7 +822,7 @@ namespace std else this->setstate(ios_base::eofbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -853,7 +853,7 @@ namespace std || traits_type::eq_int_type(__sb->sputbackc(__c), __eof)) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -884,7 +884,7 @@ namespace std || traits_type::eq_int_type(__sb->sungetc(), __eof)) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -919,7 +919,7 @@ namespace std __ret = 0; } } - catch(exception& __fail) + catch(...) { // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. @@ -995,7 +995,7 @@ namespace std { try { __in.get(__c); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -1052,7 +1052,7 @@ namespace std #endif __in.width(0); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. diff --git a/libstdc++-v3/include/bits/ostream.tcc b/libstdc++-v3/include/bits/ostream.tcc index 64b37a48826..fc7d08a1b6e 100644 --- a/libstdc++-v3/include/bits/ostream.tcc +++ b/libstdc++-v3/include/bits/ostream.tcc @@ -66,7 +66,7 @@ namespace std { try { __pf(*this); } - catch(exception& __fail) + catch(...) { // 27.6.2.5.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -88,7 +88,7 @@ namespace std { try { __pf(*this); } - catch(exception& __fail) + catch(...) { // 27.6.2.5.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -110,7 +110,7 @@ namespace std { try { __pf(*this); } - catch(exception& __fail) + catch(...) { // 27.6.2.5.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -134,7 +134,7 @@ namespace std if (!__copy_streambufs(*this, __sbin, this->rdbuf())) this->setstate(ios_base::failbit); } - catch(exception& __fail) + catch(...) { // 27.6.2.5.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -162,7 +162,7 @@ namespace std this->fill(), __n).failed()) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -201,7 +201,7 @@ namespace std this->setstate(ios_base::badbit); } } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -227,7 +227,7 @@ namespace std this->fill(), __n).failed()) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -268,7 +268,7 @@ namespace std this->setstate(ios_base::badbit); } } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -294,7 +294,7 @@ namespace std this->fill(), __n).failed()) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -321,7 +321,7 @@ namespace std this->fill(), __n).failed()) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -347,7 +347,7 @@ namespace std this->fill(), __n).failed()) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -373,7 +373,7 @@ namespace std this->fill(), __n).failed()) this->setstate(ios_base::badbit); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -495,7 +495,7 @@ namespace std __out._M_write(__pads, __len); __out.width(0); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -531,7 +531,7 @@ namespace std __out._M_write(__pads, __len); __out.width(0); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -566,7 +566,7 @@ namespace std __out._M_write(__s, __len); __out.width(0); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -615,7 +615,7 @@ namespace std __out._M_write(__str, __len); __out.width(0); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. @@ -654,7 +654,7 @@ namespace std __out._M_write(__s, __len); __out.width(0); } - catch(exception& __fail) + catch(...) { // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/9555-ia.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/9555-ia.cc new file mode 100644 index 00000000000..5a87fb98582 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/9555-ia.cc @@ -0,0 +1,86 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include +#include +#include + +struct buf: std::streambuf +{ + virtual int_type overflow(int_type) + { throw 0; } +}; + +template +void testthrow(T arg) +{ + bool test = true; + buf b; + std::istream is(&b); + is.exceptions(std::ios::badbit); + + try + { + is >> arg; + } + catch(int) + { + // Expected return is zero. + VERIFY( is.bad() ); + } + catch(...) + { + VERIFY( false ); + } +} + +int main() +{ + bool b = true; + short s = -4; + unsigned short us = 4; + int i = -45; + unsigned int ui = 45; + long l = -456; + unsigned long ul = 456; + float f = 3.4; + double d = 3.45; + long double ld = 3.456; + + testthrow(b); + testthrow(s); + testthrow(us); + testthrow(i); + testthrow(ui); + testthrow(l); + testthrow(ul); + testthrow(f); + testthrow(d); + testthrow(ld); + + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/9555-ic.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/9555-ic.cc new file mode 100644 index 00000000000..ba2e8d3c5f4 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/9555-ic.cc @@ -0,0 +1,79 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include +#include +//#include +#define VERIFY(x) x + +struct buf: std::streambuf +{ + virtual int_type overflow(int_type) + { throw 0; } +}; + +template +void testthrow(T arg) +{ + bool test = true; + buf b; + std::istream is(&b); + is.exceptions(std::ios::badbit); + + try + { + is >> arg; + } + catch(int) + { + // Expected return is zero. + VERIFY( is.bad() ); + } + catch(...) + { + VERIFY( false ); + } +} + +int main() +{ + char c = 'a'; + unsigned char uc = 'a'; + signed char sc = 'a'; + char* cp = &c; + signed char* scp = ≻ + unsigned char* ucp = &uc; + + testthrow(c); + testthrow(uc); + testthrow(sc); + testthrow(cp); + testthrow(scp); + testthrow(ucp); + + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/9555-io.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/9555-io.cc new file mode 100644 index 00000000000..50ba27c15f8 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/9555-io.cc @@ -0,0 +1,68 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include +#include +#include + +struct buf: std::streambuf +{ + virtual int_type overflow(int_type) + { throw 0; } +}; + +template +void testthrow(T arg) +{ + bool test = true; + buf b; + std::istream is(&b); + is.exceptions(std::ios::badbit); + + try + { + is >> arg; + } + catch(int) + { + // Expected return is zero. + VERIFY( is.bad() ); + } + catch(...) + { + VERIFY( false ); + } +} + +int main() +{ + buf b; + + testthrow(&b); + + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/9555-oa.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/9555-oa.cc new file mode 100644 index 00000000000..caf716061d9 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/9555-oa.cc @@ -0,0 +1,86 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include +#include +#include + +struct buf: std::streambuf +{ + virtual int_type overflow(int_type) + { throw 0; } +}; + +template +void testthrow(T arg) +{ + bool test = true; + buf b; + std::ostream os(&b); + os.exceptions(std::ios::badbit); + + try + { + os << arg; + } + catch(int) + { + // Expected return is zero. + VERIFY( os.bad() ); + } + catch(...) + { + VERIFY( false ); + } +} + +int main() +{ + bool b = true; + short s = -4; + unsigned short us = 4; + int i = -45; + unsigned int ui = 45; + long l = -456; + unsigned long ul = 456; + float f = 3.4; + double d = 3.45; + long double ld = 3.456; + + testthrow(b); + testthrow(s); + testthrow(us); + testthrow(i); + testthrow(ui); + testthrow(l); + testthrow(ul); + testthrow(f); + testthrow(d); + testthrow(ld); + + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_character/char/9555-oc.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_character/char/9555-oc.cc new file mode 100644 index 00000000000..f1e24f35bd2 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_character/char/9555-oc.cc @@ -0,0 +1,78 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include +#include +#include + +struct buf: std::streambuf +{ + virtual int_type overflow(int_type) + { throw 0; } +}; + +template +void testthrow(T arg) +{ + bool test = true; + buf b; + std::ostream os(&b); + os.exceptions(std::ios::badbit); + + try + { + os << arg; + } + catch(int) + { + // Expected return is zero. + VERIFY( os.bad() ); + } + catch(...) + { + VERIFY( false ); + } +} + +int main() +{ + char c = 'a'; + unsigned char uc = 'a'; + signed char sc = 'a'; + const char* ccp = "governor ann richards"; + const signed char* cscp = reinterpret_cast(ccp); + const unsigned char* cucp = reinterpret_cast(ccp); + + testthrow(c); + testthrow(uc); + testthrow(sc); + testthrow(ccp); + testthrow(cscp); + testthrow(cucp); + + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/9555-oo.cc b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/9555-oo.cc new file mode 100644 index 00000000000..42ad89cbd1d --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/9555-oo.cc @@ -0,0 +1,68 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include +#include +#include + +struct buf: std::streambuf +{ + virtual int_type overflow(int_type) + { throw 0; } +}; + +template +void testthrow(T arg) +{ + bool test = true; + buf b; + std::ostream os(&b); + os.exceptions(std::ios::badbit); + + try + { + os << arg; + } + catch(int) + { + // Expected return is zero. + VERIFY( os.bad() ); + } + catch(...) + { + VERIFY( false ); + } +} + +int main() +{ + buf b; + + testthrow(&b); + + return 0; +}