diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7224004a186a83a9900c75760d807de21eebf884..2cc15acf19a91abc1de2b7f8d5793d0b1d5f338a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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. diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index b531906a3f817c3e82d3e529f4fa7b8380b5bf8f..b3223f50ca76b1e977ff15ce734f84acc4976839 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -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 diff --git a/libstdc++-v3/config/io/basic_file_stdio.h b/libstdc++-v3/config/io/basic_file_stdio.h index 2b1a9871c32c7ce4bdbc827f556a7f27bba907fb..2ff2ba464fcc17a02b034b26025dc3a014009df0 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.h +++ b/libstdc++-v3/config/io/basic_file_stdio.h @@ -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(); diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index 31175559bb96e8e377d8f883249349be832ff2ca..4a7ad850f38a44fa6060a376abb4b78996c04c03 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -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; diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc new file mode 100644 index 0000000000000000000000000000000000000000..430183162fc534649382bcebc5fc1efb5fa77f5a --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc @@ -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; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc index 2a798dbbf16cf0e4c6ea8a0c75ec0ab934808c5a..3d28f6f5dae892e73202f714cf1c9639249ac8cd 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc @@ -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 diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc index d803e5551fffe964ab3ca84e8542cd0de13ee70f..fda7be2f45c2c5d431e2c862c5a24266c7e07201 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc @@ -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 diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc index 39f18de3b05ebf982d4c8e2560069ae6d117aafd..e18030a5ace022dd740cdce4c38b4609f262b1a0 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc @@ -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 diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc index 9dd1ab8a0669b8df388d8a5ace5ec5dc4616ed88..ecd8433f3fba05687247814452874905d9b8d2cb 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc @@ -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