re PR libstdc++/12232 (Incorrect handling of openmode argument in filebuf::seekoff...
authorPaolo Carlini <pcarlini@unitus.it>
Thu, 2 Oct 2003 20:37:06 +0000 (22:37 +0200)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 2 Oct 2003 20:37:06 +0000 (20:37 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/config/io/basic_file_stdio.cc
libstdc++-v3/config/io/basic_file_stdio.h
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc
libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc
libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc
libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc

index 7224004..2cc15ac 100644 (file)
@@ -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.
index b531906..b3223f5 100644 (file)
@@ -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 
index 2b1a987..2ff2ba4 100644 (file)
@@ -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();
index 3117555..4a7ad85 100644 (file)
@@ -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 (file)
index 0000000..4301831
--- /dev/null
@@ -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;
+}
index 2a798db..3d28f6f 100644 (file)
@@ -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
index d803e55..fda7be2 100644 (file)
@@ -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
index 39f18de..e18030a 100644 (file)
@@ -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
index 9dd1ab8..ecd8433 100644 (file)
@@ -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