+2003-12-01 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/basic_ios.h (basic_ios::setstate): Revert.
+ * include/bits/istream.tcc: Only call setstate if __err != goodbit.
+ * include/bits/ostream.tcc: Same.
+ * testsuite/27_io/basic_ios/exceptions/char/2.cc: New.
+
+ * testsuite/testsuite_io.h (__gnu_test::fail_streambuf): Make
+ internal buffer non-static.
+
2003-12-01 Benjamin Kosnik <bkoz@redhat.com>
* docs/html/17_intro/C++STYLE: Add exception bits.
*/
void
setstate(iostate __state)
- {
- if (__state != ios_base::goodbit)
- this->clear(this->rdstate() | __state);
- }
+ { this->clear(this->rdstate() | __state); }
// Flip the internal state on for the proper state bits, then re
// throws the propagated exception if bit also set in
{
_M_ok = false;
__err |= ios_base::failbit;
+ __in.setstate(__err);
}
- __in.setstate(__err);
}
template<typename _CharT, typename _Traits>
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
else if (!__sbout)
__err |= ios_base::failbit;
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
if (!_M_gcount)
__err |= ios_base::failbit;
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return __c;
}
}
if (!_M_gcount)
__err |= ios_base::failbit;
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
*__s = char_type();
if (!_M_gcount)
__err |= ios_base::failbit;
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
if (!_M_gcount)
__err |= ios_base::failbit;
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
*__s = char_type();
if (!_M_gcount)
__err |= ios_base::failbit;
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return __c;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return _M_gcount;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return __ret;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
catch(...)
{ __in._M_setstate(ios_base::badbit); }
- __in.setstate(__err);
+ if (__err)
+ __in.setstate(__err);
}
return __in;
}
}
if (!__extracted)
__err |= ios_base::failbit;
- __in.setstate(__err);
+ if (__err)
+ __in.setstate(__err);
return __in;
}
// 211. operator>>(istream&, string&) doesn't set failbit
if (!__extracted)
__err |= ios_base::failbit;
- __in.setstate(__err);
+ if (__err)
+ __in.setstate(__err);
return __in;
}
}
if ((!__extracted && !__testdelim) || __extracted == __n)
__err |= ios_base::failbit;
- __in.setstate(__err);
+ if (__err)
+ __in.setstate(__err);
return __in;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
else if (!__sbin)
__err |= ios_base::badbit;
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
catch (...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
}
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
- this->setstate(__err);
+ if (__err)
+ this->setstate(__err);
return *this;
}
--- /dev/null
+// 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.
+
+// 27.4.4.2 basic_ios member functions
+
+#include <sstream>
+#include <testsuite_hooks.h>
+
+int main()
+{
+ using namespace std;
+ ostringstream stream;
+
+ try
+ {
+ stream.setstate(ios_base::failbit);
+ stream.exceptions(ios_base::failbit);
+ assert(false);
+ }
+ catch (...)
+ {
+ // Don't clear.
+ }
+
+ try
+ {
+ // Calls clear(rdstate()), which throws in this case.
+ stream.setstate(ios_base::goodbit);
+ assert(false);
+ }
+ catch (...)
+ { }
+
+ return 0;
+}
struct fail_streambuf : std::streambuf
{
+ private:
+ char p[2];
+
+ public:
fail_streambuf()
{
- static char p[] = "s";
- setg(p, p, p + 1);
+ p[0] = 's';
+ p[1] = char();
+ setg(p, p, p + 1);
}
virtual int_type underflow()