]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/8348 (fail() flag is set in istringstream when eof() flag is set !)
authorBenjamin Kosnik <bkoz@redhat.com>
Fri, 1 Nov 2002 16:27:30 +0000 (16:27 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Fri, 1 Nov 2002 16:27:30 +0000 (16:27 +0000)
2002-11-01  Benjamin Kosnik  <bkoz@redhat.com>

PR libstdc++/8348
* include/bits/istream.tcc (istream::tellg): Remove sentry bits.
(istream::seekg): Same.
* testsuite/27_io/istream_seeks.cc (test06): New.

From-SVN: r58719

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/istream.tcc
libstdc++-v3/testsuite/27_io/istream_seeks.cc

index 0bf34cbaef08215808397deaba3285d63b023ef2..5c2f1c06b45d628bc005ca11083e7ee4d3b9db05 100644 (file)
@@ -1,3 +1,10 @@
+2002-11-01  Benjamin Kosnik  <bkoz@redhat.com>
+
+       PR libstdc++/8348
+       * include/bits/istream.tcc (istream::tellg): Remove sentry bits.
+       (istream::seekg): Same.
+       * testsuite/27_io/istream_seeks.cc (test06): New.
+
 2002-11-01  John Carter  <john.carter@tait.co.nz>
 
        PR libstdc++/7961
index 58e2caf02cdfcbd61dbeb0a02617f7824fc95d47..617110d953b8f4c804c2f7159ca64f3939724089 100644 (file)
@@ -935,23 +935,8 @@ namespace std
     tellg(void)
     {
       pos_type __ret = pos_type(-1);
-      _M_gcount = 0;
-      sentry __cerb(*this, true);
-      if (__cerb) 
-       {
-         try 
-           {
-            __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
-           }
-         catch(exception& __fail)
-           {
-             // 27.6.1.3 paragraph 1
-             // Turn this on without causing an ios::failure to be thrown.
-             this->setstate(ios_base::badbit);
-             if ((this->exceptions() & ios_base::badbit) != 0)
-               __throw_exception_again;
-           }
-       }
+      if (!this->fail())
+       __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
       return __ret;
     }
 
@@ -962,28 +947,16 @@ namespace std
     seekg(pos_type __pos)
     {
       _M_gcount = 0;
-      sentry __cerb(*this, true);
-      if (__cerb) 
+      if (!this->fail())
        {
-         try 
-           {
 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
 // 136.  seekp, seekg setting wrong streams?
-             pos_type __err = this->rdbuf()->pubseekpos(__pos, ios_base::in);
+         pos_type __err = this->rdbuf()->pubseekpos(__pos, ios_base::in);
 
 // 129. Need error indication from seekp() and seekg()
-             if (__err == pos_type(off_type(-1)))
-               this->setstate(ios_base::failbit);
+         if (__err == pos_type(off_type(-1)))
+           this->setstate(ios_base::failbit);
 #endif
-           }
-         catch(exception& __fail)
-           {
-             // 27.6.1.3 paragraph 1
-             // Turn this on without causing an ios::failure to be thrown.
-             this->setstate(ios_base::badbit);
-             if ((this->exceptions() & ios_base::badbit) != 0)
-               __throw_exception_again;
-           }
        }
       return *this;
     }
@@ -994,29 +967,17 @@ namespace std
     seekg(off_type __off, ios_base::seekdir __dir)
     {
       _M_gcount = 0;
-      sentry __cerb(*this, true);
-      if (__cerb) 
+      if (!this->fail())
        {
-         try 
-           {
 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
 // 136.  seekp, seekg setting wrong streams?
-             pos_type __err = this->rdbuf()->pubseekoff(__off, __dir, 
-                                                        ios_base::in);
+         pos_type __err = this->rdbuf()->pubseekoff(__off, __dir, 
+                                                    ios_base::in);
 
 // 129. Need error indication from seekp() and seekg()
-             if (__err == pos_type(off_type(-1)))
-               this->setstate(ios_base::failbit);
+         if (__err == pos_type(off_type(-1)))
+           this->setstate(ios_base::failbit);
 #endif
-           }
-         catch(exception& __fail)
-           {
-             // 27.6.1.3 paragraph 1
-             // Turn this on without causing an ios::failure to be thrown.
-             this->setstate(ios_base::badbit);
-             if ((this->exceptions() & ios_base::badbit) != 0)
-               __throw_exception_again;
-           }
        }
       return *this;
     }
index cd0e0656748b32d982c8fdbe75b4b65299eb51eb..892e10bcb1ee61cf7a7388cb850643fc9fa333bc 100644 (file)
@@ -55,11 +55,6 @@ bool test01()
   p4 = ifs2.tellg();
 
   VERIFY( p3 == p4 );
-
-#ifdef DEBUG_ASSERT
-  assert(test);
-#endif
-
   return test;
 }
 
@@ -237,10 +232,6 @@ void test04(void)
   if01.peek();
   pos02 = if01.tellg();
   VERIFY( pos02 == pos01 );
-
-#ifdef DEBUG_ASSERT
-  assert(test);
-#endif
 }
 
 // stringstreams
@@ -351,10 +342,50 @@ void test05(void)
   VERIFY( state01 == state02 );
   pos06 = is03.tellg(); 
   VERIFY( pos05 == pos06 ); 
+}
 
-#ifdef DEBUG_ASSERT
-  assert(test);
-#endif
+// libstdc++/8348
+void test06(void)
+{
+  using namespace std;
+  bool test = true;
+  string num1("555");
+
+  // tellg
+  {
+    istringstream iss(num1);
+    istream::pos_type pos1 = iss.tellg();
+    int asNum = 0;
+    iss >> asNum;
+    VERIFY( test = iss.eof() );
+    VERIFY( test = !iss.fail() );
+    iss.tellg();
+    VERIFY( test = !iss.fail() );
+  }
+
+  // seekg
+  {
+    istringstream iss(num1);
+    istream::pos_type pos1 = iss.tellg();
+    int asNum = 0;
+    iss >> asNum;
+    VERIFY( test = iss.eof() );
+    VERIFY( test = !iss.fail() );
+    iss.seekg(0, ios_base::beg);
+    VERIFY( test = !iss.fail() );
+  }
+
+  // seekg
+  {
+    istringstream iss(num1);
+    istream::pos_type pos1 = iss.tellg();
+    int asNum = 0;
+    iss >> asNum;
+    VERIFY( test = iss.eof() );
+    VERIFY( test = !iss.fail() );
+    iss.seekg(pos1);
+    VERIFY( test = !iss.fail() );
+  }
 }
 
 int main()
@@ -366,6 +397,8 @@ int main()
 
   test04();
   test05();
+
+  test06();
   return 0;
 }