mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-30 07:14:09 +08:00
re PR libstdc++/12232 (Incorrect handling of openmode argument in filebuf::seekoff and seekpos)
2003-10-02 Paolo Carlini <pcarlini@unitus.it> PR libstdc++/12232 * include/bits/fstream.tcc (seekoff): Ignore the openmode argument; simplify. * config/io/basic_file_stdio.h (__basic_file<char>::seekoff, seekpos): Remove the openmode argument. * config/io/basic_file_stdio.cc (__basic_file<char>::seekoff, seekpos): Remove redundant placeholder for the openmode argument. * testsuite/27_io/basic_filebuf/seekoff/char/12232.cc: New. * testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc: Tweak. * testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc: Likewise. * testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc: Likewise. * testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc: Likewise. From-SVN: r72048
This commit is contained in:
parent
d1aa479583
commit
8dcaff2850
@ -1,3 +1,18 @@
|
||||
2003-10-02 Paolo Carlini <pcarlini@unitus.it>
|
||||
|
||||
PR libstdc++/12232
|
||||
* include/bits/fstream.tcc (seekoff): Ignore the openmode
|
||||
argument; simplify.
|
||||
* config/io/basic_file_stdio.h (__basic_file<char>::seekoff,
|
||||
seekpos): Remove the openmode argument.
|
||||
* config/io/basic_file_stdio.cc (__basic_file<char>::seekoff,
|
||||
seekpos): Remove redundant placeholder for the openmode argument.
|
||||
* testsuite/27_io/basic_filebuf/seekoff/char/12232.cc: New.
|
||||
* testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc: Tweak.
|
||||
* testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc: Likewise.
|
||||
* testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc: Likewise.
|
||||
* testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc: Likewise.
|
||||
|
||||
2003-10-02 Benjamin Kosnik <bkoz@redhat.com>
|
||||
|
||||
* src/locale.cc (locale::_S_initialize): Use __gthread_active_p.
|
||||
|
@ -261,12 +261,11 @@ namespace std
|
||||
}
|
||||
|
||||
streampos
|
||||
__basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way,
|
||||
ios_base::openmode /*__mode*/)
|
||||
__basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way)
|
||||
{ return lseek(this->fd(), __off, __way); }
|
||||
|
||||
streampos
|
||||
__basic_file<char>::seekpos(streampos __pos, ios_base::openmode /*__mode*/)
|
||||
__basic_file<char>::seekpos(streampos __pos)
|
||||
{ return lseek(this->fd(), __pos, ios_base::beg); }
|
||||
|
||||
int
|
||||
|
@ -98,12 +98,10 @@ namespace std
|
||||
xsgetn(char* __s, streamsize __n);
|
||||
|
||||
streampos
|
||||
seekoff(streamoff __off, ios_base::seekdir __way,
|
||||
ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||
seekoff(streamoff __off, ios_base::seekdir __way);
|
||||
|
||||
streampos
|
||||
seekpos(streampos __pos,
|
||||
ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||
seekpos(streampos __pos);
|
||||
|
||||
int
|
||||
sync();
|
||||
|
@ -572,15 +572,18 @@ namespace std
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// According to 27.8.1.4 p11 - 13 (for seekoff) and the resolution of
|
||||
// DR 171 (for seekpos), both functions should ignore the last argument
|
||||
// (of type openmode).
|
||||
template<typename _CharT, typename _Traits>
|
||||
typename basic_filebuf<_CharT, _Traits>::pos_type
|
||||
basic_filebuf<_CharT, _Traits>::
|
||||
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
|
||||
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode)
|
||||
{
|
||||
pos_type __ret = pos_type(off_type(-1));
|
||||
const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
|
||||
const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
|
||||
|
||||
|
||||
int __width = 0;
|
||||
if (_M_codecvt)
|
||||
__width = _M_codecvt->encoding();
|
||||
@ -588,7 +591,7 @@ namespace std
|
||||
__width = 0;
|
||||
|
||||
const bool __testfail = __off != 0 && __width <= 0;
|
||||
if (this->is_open() && !__testfail && (__testin || __testout))
|
||||
if (this->is_open() && !__testfail)
|
||||
{
|
||||
// Ditch any pback buffers to avoid confusion.
|
||||
_M_destroy_pback();
|
||||
@ -618,7 +621,7 @@ namespace std
|
||||
}
|
||||
|
||||
// Returns pos_type(off_type(-1)) in case of failure.
|
||||
__ret = _M_file.seekoff(__computed_off, __way, __mode);
|
||||
__ret = _M_file.seekoff(__computed_off, __way);
|
||||
|
||||
_M_reading = false;
|
||||
_M_writing = false;
|
||||
|
@ -0,0 +1,72 @@
|
||||
// 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[] = "tmp_12232";
|
||||
|
||||
// libstdc++/12232
|
||||
void test01()
|
||||
{
|
||||
using namespace std;
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
filebuf fbout;
|
||||
fbout.open(name, ios_base::out);
|
||||
fbout.sputn("abc", 3);
|
||||
|
||||
streampos p1 = fbout.pubseekoff(0, ios_base::cur, ios_base::in);
|
||||
VERIFY( p1 != streampos(-1) );
|
||||
fbout.sputn("de", 2);
|
||||
|
||||
streampos p2 = fbout.pubseekpos(p1, ios_base::openmode());
|
||||
VERIFY( p2 != streampos(-1) );
|
||||
fbout.sputn("34", 2);
|
||||
|
||||
streampos p3 = fbout.pubseekoff(0, ios_base::beg, ios_base::ate);
|
||||
VERIFY( p3 != streampos(-1) );
|
||||
fbout.sputn("012", 3);
|
||||
|
||||
fbout.close();
|
||||
|
||||
filebuf fbin;
|
||||
fbin.open(name, ios_base::in);
|
||||
|
||||
streampos p4 = fbin.pubseekoff(0, ios_base::beg, ios_base::ate);
|
||||
VERIFY( p4 != streampos(-1) );
|
||||
VERIFY( fbin.sgetc() == '0' );
|
||||
|
||||
streampos p5 = fbin.pubseekoff(-1, ios_base::end, ios_base::out);
|
||||
VERIFY( p5 != streampos(-1) );
|
||||
VERIFY( fbin.sbumpc() == '4' );
|
||||
|
||||
streampos p6 = fbin.pubseekpos(p4, ios_base::binary);
|
||||
VERIFY( p6 != streampos(-1) );
|
||||
VERIFY( fbin.sbumpc() == '0' );
|
||||
|
||||
fbin.close();
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
void test01();
|
||||
return 0;
|
||||
}
|
@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
|
||||
|
||||
// seekoff
|
||||
p = in.pubseekoff(0, ios_base::beg, ios_base::in);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
VERIFY( pass == (p != bad) );
|
||||
|
||||
p = in.pubseekoff(0, ios_base::beg, ios_base::out);
|
||||
VERIFY( p == bad );
|
||||
p = in.pubseekoff(0, ios_base::beg, ios_base::out);
|
||||
VERIFY( pass == (p != bad) ); // See libstdc++/12232
|
||||
|
||||
p = in.pubseekoff(0, ios_base::beg);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
VERIFY( pass == (p != bad) );
|
||||
}
|
||||
|
||||
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
|
||||
|
@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
|
||||
|
||||
// seekoff
|
||||
p = in.pubseekoff(0, ios_base::beg, ios_base::in);
|
||||
VERIFY( p == bad );
|
||||
VERIFY( pass == (p != bad) ); // See libstdc++/12232
|
||||
|
||||
p = in.pubseekoff(0, ios_base::beg, ios_base::out);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
VERIFY( pass == (p != bad) );
|
||||
|
||||
p = in.pubseekoff(0, ios_base::beg);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
VERIFY( pass == (p != bad) );
|
||||
}
|
||||
|
||||
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
|
||||
|
@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
|
||||
|
||||
// seekpos
|
||||
p = in.pubseekpos(0, ios_base::in);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
VERIFY( pass == (p != bad) );
|
||||
|
||||
p = in.pubseekpos(0, ios_base::out);
|
||||
VERIFY( p == bad );
|
||||
p = in.pubseekpos(0, ios_base::out);
|
||||
VERIFY( pass == (p != bad) ); // See libstdc++/12232
|
||||
|
||||
p = in.pubseekpos(0);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
VERIFY( pass == (p != bad) );
|
||||
}
|
||||
|
||||
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
|
||||
|
@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
|
||||
|
||||
// seekpos
|
||||
p = in.pubseekpos(0, ios_base::in);
|
||||
VERIFY( p == bad );
|
||||
VERIFY( pass == (p != bad) ); // See libstdc++/12232
|
||||
|
||||
p = in.pubseekpos(0, ios_base::out);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
VERIFY( pass == (p != bad) );
|
||||
|
||||
p = in.pubseekpos(0);
|
||||
if (pass)
|
||||
VERIFY( p != bad );
|
||||
p = in.pubseekpos(0);
|
||||
VERIFY( pass == (p != bad) );
|
||||
}
|
||||
|
||||
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
|
||||
|
Loading…
Reference in New Issue
Block a user