]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorPaolo Carlini <paolo@gcc.gnu.org>
Thu, 6 Feb 2003 13:36:39 +0000 (13:36 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 6 Feb 2003 13:36:39 +0000 (13:36 +0000)
2003-02-06  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-06  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-06  Petur Runolfsson  <peturr02@ru.is>

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

From-SVN: r62491

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 002c8f3c7735040e6267eb2d2fff1009344affa3..c1d98eabc5b0fda5e398a63707b1ef83704202e6 100644 (file)
@@ -1,3 +1,22 @@
+2003-02-06  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-06  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-06  Petur Runolfsson  <peturr02@ru.is>
+
+       * testsuite/27_io/filebuf_members.cc (test_04): Remove exit(0).
+       
 2003-02-05  Benjamin Kosnik  <bkoz@redhat.com>
 
        * configure.in (libtool_VERSION): To 5:3:0.
index 0b3bec1c26308cec44bb1e338099c12dbee23294..e9919896914da97953376cb1e6d05ae5f9224d72 100644 (file)
@@ -94,7 +94,12 @@ 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 5f57df583a7b6bc680f4d94b8abcbf097c5b712a..3f675e9e0463f55c98d57b1b15bca1d5d8cabd68 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;
 }