mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			re PR libstdc++/8348 (fail() flag is set in istringstream when eof() flag is set !)
2002-10-31 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: r58703
This commit is contained in:
		
							parent
							
								
									5e81d5beff
								
							
						
					
					
						commit
						04c7481ed2
					
				|  | @ -1,3 +1,10 @@ | |||
| 2002-10-31  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-10-28  Jason Thorpe  <thorpej@wasabisystems.com> | ||||
| 
 | ||||
| 	* testsuite/thread/pthread5.cc: Include <unistd.h> | ||||
|  |  | |||
|  | @ -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; | ||||
|     } | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Benjamin Kosnik
						Benjamin Kosnik