]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/9555 (ostream inserters fail to set badbit on exception)
authorBenjamin Kosnik <bkoz@redhat.com>
Fri, 18 Apr 2003 03:46:44 +0000 (03:46 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Fri, 18 Apr 2003 03:46:44 +0000 (03:46 +0000)
2003-04-17  Benjamin Kosnik  <bkoz@redhat.com>

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.

From-SVN: r65770

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/istream.tcc
libstdc++-v3/include/bits/ostream.tcc
libstdc++-v3/testsuite/27_io/basic_istream/extractors_arithmetic/char/9555-ia.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/9555-ic.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/9555-io.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_ostream/inserters_arithmetic/char/9555-oa.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_ostream/inserters_character/char/9555-oc.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/char/9555-oo.cc [new file with mode: 0644]

index c439e2ed26131033b71c527574cf9cbe1fd41880..ad9db7c662cd7014505de0e935af47c16f873b5d 100644 (file)
@@ -1,3 +1,17 @@
+2003-04-17  Benjamin Kosnik  <bkoz@redhat.com>
+
+       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  <pme@gcc.gnu.org>
 
        * include/bits/c++config:  Minor cosmetic tweaks.
index 89a84f59f7f10230a613fe9ee72f5581f4829efa..713c7bb6f8784f5666312ce3e51e8ce4d0139c7d 100644 (file)
@@ -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.
index 64b37a4882671d80e234db6ecb2187b985663bf5..fc7d08a1b6e0e5b444448d012bca3a33d4940579 100644 (file)
@@ -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 (file)
index 0000000..5a87fb9
--- /dev/null
@@ -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 <istream>
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+struct buf: std::streambuf
+{
+  virtual int_type overflow(int_type) 
+  { throw 0; }
+};
+
+template<typename T>
+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 (file)
index 0000000..ba2e8d3
--- /dev/null
@@ -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 <istream>
+#include <streambuf>
+//#include <testsuite_hooks.h>
+#define VERIFY(x) x
+
+struct buf: std::streambuf
+{
+  virtual int_type overflow(int_type) 
+  { throw 0; }
+};
+
+template<typename T>
+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 = &sc;
+  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 (file)
index 0000000..50ba27c
--- /dev/null
@@ -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 <istream>
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+struct buf: std::streambuf
+{
+  virtual int_type overflow(int_type) 
+  { throw 0; }
+};
+
+template<typename T>
+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 (file)
index 0000000..caf7160
--- /dev/null
@@ -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 <ostream>
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+struct buf: std::streambuf
+{
+  virtual int_type overflow(int_type) 
+  { throw 0; }
+};
+
+template<typename T>
+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 (file)
index 0000000..f1e24f3
--- /dev/null
@@ -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 <ostream>
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+struct buf: std::streambuf
+{
+  virtual int_type overflow(int_type) 
+  { throw 0; }
+};
+
+template<typename T>
+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<const signed char*>(ccp);
+  const unsigned char* cucp = reinterpret_cast<const unsigned char*>(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 (file)
index 0000000..42ad89c
--- /dev/null
@@ -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 <ostream>
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+struct buf: std::streambuf
+{
+  virtual int_type overflow(int_type) 
+  { throw 0; }
+};
+
+template<typename T>
+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;
+}