This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] Fix libstdc++/9988


Hi,

seems straightforward. Tested x86-linux, as usual.

Ok trunk and 3.3?

Paolo.

///////////
2003-03-09  Paolo Carlini  <pcarlini at unitus dot it>

	PR libstdc++/9988
	* include/bits/fstream.tcc (overflow): don't write EOF to file.
	* testsuite/27_io/filebuf_virtuals.cc (test15): Add.
diff -urN libstdc++-v3-curr/include/bits/fstream.tcc libstdc++-v3/include/bits/fstream.tcc
--- libstdc++-v3-curr/include/bits/fstream.tcc	2003-03-09 09:25:41.000000000 +0100
+++ libstdc++-v3/include/bits/fstream.tcc	2003-03-09 21:27:18.000000000 +0100
@@ -252,7 +252,9 @@
       
       if (__testout)
 	{
-	  if (__testput)
+	  if (traits_type::eq_int_type(__c, traits_type::eof()))
+	    __ret = traits_type::not_eof(__c);
+	  else if (__testput)
 	    {
 	      *this->_M_out_cur = traits_type::to_char_type(__c);
 	      _M_out_cur_move(1);
diff -urN libstdc++-v3-curr/testsuite/27_io/filebuf_virtuals.cc libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
--- libstdc++-v3-curr/testsuite/27_io/filebuf_virtuals.cc	2003-03-08 14:30:30.000000000 +0100
+++ libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc	2003-03-09 21:33:27.000000000 +0100
@@ -75,6 +75,7 @@
 const char name_05[] = "filebuf_virtuals-5.txt"; // empty file, need to create
 const char name_06[] = "filebuf_virtuals-6.txt"; // empty file, need to create
 const char name_07[] = "filebuf_virtuals-7.txt"; // empty file, need to create
+const char name_08[] = "filebuf_virtuals-8.txt"; // empty file, need to create
 
 class derived_filebuf: public std::filebuf
 {
@@ -759,6 +760,43 @@
   fbuf1.close();
 }
 
+
+class OverBuf : public std::filebuf
+{
+public:
+  int_type pub_overflow(int_type c = traits_type::eof())
+  { return std::filebuf::overflow(c); }
+};
+
+// libstdc++/9988
+void test15()
+{
+  using namespace std;
+  bool test = true;
+  
+  OverBuf fb;
+  fb.open(name_08, ios_base::out | ios_base::trunc);
+  
+  fb.sputc('a');
+  fb.pub_overflow('b');
+  fb.pub_overflow();
+  fb.sputc('c');
+  fb.close();
+
+  filebuf fbin;
+  fbin.open(name_08, ios_base::in);
+  filebuf::int_type c;
+  c = fbin.sbumpc();
+  VERIFY( c == 'a' );
+  c = fbin.sbumpc();
+  VERIFY( c == 'b' );
+  c = fbin.sbumpc();
+  VERIFY( c == 'c' );
+  c = fbin.sbumpc();
+  VERIFY( c == filebuf::traits_type::eof() );
+  fbin.close();
+}
+
 main() 
 {
   test01();
@@ -777,5 +815,6 @@
   test12();
   test13();
   test14();
+  test15();
   return 0;
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]