[multiple changes]
authorPaolo Carlini <paolo@gcc.gnu.org>
Tue, 4 Feb 2003 18:08:45 +0000 (18:08 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 4 Feb 2003 18:08:45 +0000 (18:08 +0000)
2003-02-04  Paolo Carlini  <pcarlini@unitus.it>

PR libstdc++/9538
* include/bits/streambuf.tcc (sputbackc): Access
this->gptr()[-1] only if _M_in_beg < _M_in_cur.
* testsuite/27_io/filebuf_virtuals.cc (test08): Add.

2003-02-04  Paolo Carlini  <pcarlini@unitus.it>

PR libstdc++/9507
* include/bits/fstream.tcc (open): If the 'ate' repositioning
operation fails, calls close _and_ returns a null pointer
to indicate failure (27.8.1.3,4).
* testsuite/27_io/filebuf_members.cc (test_06): Add.

2003-02-04  Petur Runolfsson  <peturr02@ru.is>

* testsuite/27_io/filebuf_members.cc (test_04): Remove exit(0).

From-SVN: r62388

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/include/bits/streambuf.tcc
libstdc++-v3/testsuite/27_io/filebuf_members.cc
libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc

index d9c4f4ce7f154ab5ea0fba253918e3ac6044ae71..ac010126b70f945f8275d47e58cba36c8a492fae 100644 (file)
@@ -1,3 +1,22 @@
+2003-02-04  Paolo Carlini  <pcarlini@unitus.it>
+
+       PR libstdc++/9538
+       * include/bits/streambuf.tcc (sputbackc): Access
+       this->gptr()[-1] only if _M_in_beg < _M_in_cur.
+       * testsuite/27_io/filebuf_virtuals.cc (test08): Add.
+
+2003-02-04  Paolo Carlini  <pcarlini@unitus.it>
+
+       PR libstdc++/9507
+       * include/bits/fstream.tcc (open): If the 'ate' repositioning
+       operation fails, calls close _and_ returns a null pointer
+       to indicate failure (27.8.1.3,4).
+       * testsuite/27_io/filebuf_members.cc (test_06): Add.
+
+2003-02-04  Petur Runolfsson  <peturr02@ru.is>
+
+       * testsuite/27_io/filebuf_members.cc (test_04): Remove exit(0).
+
 2002-02-04  Jonathan Wakely  <redi@gcc.gnu.org>
 
        * docs/html/27_io/howto.html: New section on stdio_filebuf.
index bf1c42e8ce2247a4b3d8195764d7caaa908655cc..c5f9758da278966fc7e5df82e8ce616844e3b91f 100644 (file)
@@ -103,7 +103,11 @@ namespace std
              
              if ((__mode & ios_base::ate)
                  && this->seekoff(0, ios_base::end, __mode) < 0)
-               this->close();
+               {
+                 // 27.8.1.3,4
+                 this->close();
+                 return __ret;
+               }
 
              __ret = this;
            }
index 73db2cdebfd0a2bb0c4b76900e8eeedfb15556a5..cb6f95deea4d8db30a9133652f9593534018355d 100644 (file)
@@ -67,8 +67,7 @@ namespace std
     {
       int_type __ret;
       bool __testpos = _M_in_cur && _M_in_beg < _M_in_cur;
-      bool __testne = _M_in_cur && !traits_type::eq(__c, this->gptr()[-1]);
-      if (!__testpos || __testne)
+      if (!__testpos || !traits_type::eq(__c, this->gptr()[-1]))
        __ret = this->pbackfail(traits_type::to_int_type(__c));
       else 
        {
index 9f48229f67afb2baf1d7b42d7b53c01e228dd17e..88b05358e7fd2c1deafadd60d735c11dac6fa908 100644 (file)
@@ -172,7 +172,6 @@ test_04()
     }
 
   unlink("xxx");
-  exit(0);
 }
 
 // Charles Leggett <CGLeggett@lbl.gov>
@@ -191,6 +190,33 @@ void test_05()
   scratch_file.close();
 }
 
+// libstdc++/9507
+void test_06()
+{
+  bool test = true;
+
+  signal(SIGPIPE, SIG_IGN);
+
+  unlink("yyy");
+  mkfifo("yyy", S_IRWXU);
+       
+  if (!fork())
+    {
+      std::filebuf fbuf;
+      fbuf.open("yyy", std::ios_base::in);
+      fbuf.sgetc();
+      fbuf.close();
+
+      exit(0);
+    }
+
+  std::filebuf fbuf;
+  std::filebuf* r =
+    fbuf.open("yyy", std::ios_base::out | std::ios_base::ate);
+  VERIFY( !fbuf.is_open() );
+  VERIFY( r == NULL );
+}
+
 int
 main()
 {
@@ -199,6 +225,7 @@ main()
   test_03();
   test_04();
   test_05();
+  test_06();
   return 0;
 }
 
index c02e1a77be90b16a6f6678e2a661d834ecfb1b43..75c2e1cac77c0354980b5cfe18116b24d88db0c0 100644 (file)
@@ -537,6 +537,39 @@ void test07()
   VERIFY( ob.getloc() == loc_de );
 }
 
+class MyTraits : public std::char_traits<char>
+{
+public:
+  static bool eq(char c1, char c2)
+  {
+    VERIFY( c1 >= 0 );
+    VERIFY( c2 >= 0 );
+    return std::char_traits<char>::eq(c1, c2);
+  }
+};
+
+class MyBuf : public std::basic_streambuf<char, MyTraits>
+{
+  char buffer[8];
+
+public:
+  MyBuf()
+  {
+    std::memset(buffer, -1, sizeof(buffer));
+    std::memset(buffer + 2, 0, 4);
+    setg(buffer + 2, buffer + 2, buffer + 6);
+  }
+};
+
+// libstdc++/9538
+void test08()
+{
+  bool test = true;
+
+  MyBuf mb;
+  mb.sputbackc(0);  
+}
+
 main() 
 {
   test01();
@@ -548,5 +581,6 @@ main()
   test06();
 
   test07();
+  test08();
   return 0;
 }