This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] Fix libstdc++/9761
- From: Paolo Carlini <pcarlini at unitus dot it>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 02 Jun 2003 18:56:25 +0200
- Subject: [v3] Fix libstdc++/9761
Hi,
tested x86-linux, approved by Benjamin, committed.
Paolo.
/////////
2003-06-02 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/9761
* include/bits/fstream.tcc (pbackfail): If the pback buffer
is already active don't try to store in it a second char.
* testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc: New.
* include/bits/fstream.tcc (pbackfail): Add unbuffered bits.
diff -prN libstdc++-v3-orig/include/bits/fstream.tcc libstdc++-v3/include/bits/fstream.tcc
*** libstdc++-v3-orig/include/bits/fstream.tcc Mon Jun 2 17:39:33 2003
--- libstdc++-v3/include/bits/fstream.tcc Mon Jun 2 18:22:25 2003
*************** namespace std
*** 268,321 ****
if (__testin)
{
! const bool __testpb = this->_M_in_beg < this->_M_in_cur;
! char_type __c = traits_type::to_char_type(__i);
const bool __testeof = traits_type::eq_int_type(__i, __ret);
!
! if (__testpb)
{
! const bool __testout = this->_M_mode & ios_base::out;
! const bool __testeq = traits_type::eq(__c, this->_M_in_cur[-1]);
!
! --this->_M_in_cur;
! if (__testout)
! --this->_M_out_cur;
! // Try to put back __c into input sequence in one of three ways.
! // Order these tests done in is unspecified by the standard.
! if (!__testeof && __testeq)
! __ret = __i;
! else if (__testeof)
! __ret = traits_type::not_eof(__i);
! else
! {
! _M_create_pback();
! *this->_M_in_cur = __c;
! __ret = __i;
! }
}
- else
- {
- // At the beginning of the buffer, need to make a
- // putback position available.
- // But the seek may fail (f.i., at the beginning of
- // a file, see libstdc++/9439) and in that case
- // we return traits_type::eof()
- if (this->seekoff(-1, ios_base::cur) >= 0)
- {
- this->underflow();
- if (!__testeof)
- {
- if (!traits_type::eq(__c, *this->_M_in_cur))
- {
- _M_create_pback();
- *this->_M_in_cur = __c;
- }
- __ret = __i;
- }
- else
- __ret = traits_type::not_eof(__i);
- }
- }
}
_M_last_overflowed = false;
return __ret;
--- 268,306 ----
if (__testin)
{
! // Remember whether the pback buffer is active, otherwise below
! // we may try to store in it a second char (libstdc++/9761).
! const bool __testpb = this->_M_pback_init;
const bool __testeof = traits_type::eq_int_type(__i, __ret);
!
! int_type __tmp;
! if (this->_M_in_beg < this->_M_in_cur)
{
! _M_move_in_cur(-1);
! __tmp = traits_type::to_int_type(*this->_M_in_cur);
! }
! // At the beginning of the buffer, need to make a
! // putback position available.
! // But the seek may fail (f.i., at the beginning of
! // a file, see libstdc++/9439) and in that case
! // we return traits_type::eof().
! else if (this->seekoff(-1, ios_base::cur) < 0
! || traits_type::eq_int_type(__tmp = this->underflow(),
! traits_type::eof()))
! return __ret;
!
! // Try to put back __i into input sequence in one of three ways.
! // Order these tests done in is unspecified by the standard.
! if (!__testeof && traits_type::eq_int_type(__i, __tmp))
! __ret = __i;
! else if (__testeof)
! __ret = traits_type::not_eof(__i);
! else if (!__testpb)
! {
! _M_create_pback();
! *this->_M_in_cur = traits_type::to_char_type(__i);
! __ret = __i;
}
}
_M_last_overflowed = false;
return __ret;
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc libstdc++-v3/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc Thu Jan 1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc Mon Jun 2 18:08:10 2003
***************
*** 0 ****
--- 1,55 ----
+ // 2003-06-02 Paolo Carlini <pcarlini@unitus.it>
+
+ // 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.
+
+ // 27.8.1.4 Overridden virtual functions
+
+ #include <fstream>
+ #include <testsuite_hooks.h>
+
+ const char name_01[] = "filebuf_virtuals-1.txt"; // file with data in it
+
+ // libstdc++/9761
+ void test01()
+ {
+ using namespace std;
+ bool test = true;
+
+ filebuf fbuf;
+ filebuf::int_type r1, r2;
+
+ fbuf.open(name_01, ios_base::in);
+
+ fbuf.sbumpc();
+ fbuf.sbumpc();
+
+ r1 = fbuf.sputbackc('a');
+ r2 = fbuf.sputbackc('b');
+
+ fbuf.close();
+
+ VERIFY( r1 != filebuf::traits_type::eof() );
+ VERIFY( r2 == filebuf::traits_type::eof() );
+ }
+
+ main()
+ {
+ test01();
+ return 0;
+ }