This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RE: RE: [v3] fix libstdc++/9827
- From: Jerry Quinn <jlquinn at optonline dot net>
- To: Pétur Runólfsson <peturr02 at ru dot is>
- Cc: libstdc++ at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Wed, 26 Feb 2003 09:40:22 -0500
- Subject: RE: RE: [v3] fix libstdc++/9827
- References: <07D05A69A3D0C14FAEA60C3ACE8E5564028F5532@nike.hir.is>
=?Windows-1252?Q?P=E9tur_Run=F3lfsson?= writes:
> Jerry Quinn wrote:
> > No, failed() is used to test if the sputn succeeded
> > or not.
> > The original working code within num_put::put
> > (called by ostream::operator<<(int)) looked like:
> >
> > *__s = c; ++__s
> >
> > with __s being the ostream_iterator. The code
> > iterated over the string to be output. In this
> > case, it made N calls to operator=. Operator= tries
> > to write the char to the streambuf and sets
> > _M_failed if it can't. This is analogous, except it
> > writes a full string at once, and again, sets
> > _M_failed if it isn't able to write the string.
>
> But ostreambuf_iterator::operator=(CharT) only writes to the
> streambuf if failed() returns false, see 24.5.4.2
> [lib.ostreambuf.iter.ops] p1.
Ah. I see. I didn't copy enough from operator=(). OK, here's the
revised patch:
2003-02-26 Jerry Quinn <jlquinn at optonline dot net>
* include/bits/streambuf_iterator.h (_M_put): Set _M_failed if sputn
fails.
* testsuite/27_io/ostream_fail.cc: New test.
diff -r -u -N libstdc++.prev/include/bits/streambuf_iterator.h libstdc++-v3/include/bits/streambuf_iterator.h
--- libstdc++.prev/include/bits/streambuf_iterator.h Tue Feb 25 09:45:55 2003
+++ libstdc++-v3/include/bits/streambuf_iterator.h Wed Feb 26 08:47:47 2003
@@ -202,7 +202,9 @@
ostreambuf_iterator&
_M_put(const _CharT* __ws, streamsize __len)
{
- this->_M_sbuf->sputn(__ws, __len);
+ if (__builtin_expect(!_M_failed, true)
+ && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len, false))
+ _M_failed = true;
return *this;
}
diff -r -u -N libstdc++.prev/testsuite/27_io/ostream_fail.cc libstdc++-v3/testsuite/27_io/ostream_fail.cc
--- libstdc++.prev/testsuite/27_io/ostream_fail.cc Wed Dec 31 19:00:00 1969
+++ libstdc++-v3/testsuite/27_io/ostream_fail.cc Tue Feb 25 09:06:56 2003
@@ -0,0 +1,52 @@
+// 2003-02-24 Petur Runolfsson <peturr02 at ru dot is>
+
+// 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.
+
+#include <ostream>
+#include <streambuf>
+#include <testsuite_hooks.h>
+
+class Buf : public std::streambuf
+{
+};
+
+bool test01()
+{
+ using namespace std;
+ bool test = true;
+
+ Buf buf;
+ ostream stream (&buf);
+
+ stream << 1;
+ VERIFY(!stream.good());
+
+#ifdef DEBUG_ASSERT
+ assert(test);
+#endif
+
+ return test;
+}
+
+
+int main()
+{
+ test01();
+ return 0;
+}