Commit 04c7481e by Benjamin Kosnik Committed by Benjamin Kosnik

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
parent 5e81d5be
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> 2002-10-28 Jason Thorpe <thorpej@wasabisystems.com>
* testsuite/thread/pthread5.cc: Include <unistd.h> * testsuite/thread/pthread5.cc: Include <unistd.h>
......
...@@ -935,23 +935,8 @@ namespace std ...@@ -935,23 +935,8 @@ namespace std
tellg(void) tellg(void)
{ {
pos_type __ret = pos_type(-1); pos_type __ret = pos_type(-1);
_M_gcount = 0; if (!this->fail())
sentry __cerb(*this, true); __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
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;
}
}
return __ret; return __ret;
} }
...@@ -962,28 +947,16 @@ namespace std ...@@ -962,28 +947,16 @@ namespace std
seekg(pos_type __pos) seekg(pos_type __pos)
{ {
_M_gcount = 0; _M_gcount = 0;
sentry __cerb(*this, true); if (!this->fail())
if (__cerb)
{ {
try
{
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
// 136. seekp, seekg setting wrong streams? // 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() // 129. Need error indication from seekp() and seekg()
if (__err == pos_type(off_type(-1))) if (__err == pos_type(off_type(-1)))
this->setstate(ios_base::failbit); this->setstate(ios_base::failbit);
#endif #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; return *this;
} }
...@@ -994,29 +967,17 @@ namespace std ...@@ -994,29 +967,17 @@ namespace std
seekg(off_type __off, ios_base::seekdir __dir) seekg(off_type __off, ios_base::seekdir __dir)
{ {
_M_gcount = 0; _M_gcount = 0;
sentry __cerb(*this, true); if (!this->fail())
if (__cerb)
{ {
try
{
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
// 136. seekp, seekg setting wrong streams? // 136. seekp, seekg setting wrong streams?
pos_type __err = this->rdbuf()->pubseekoff(__off, __dir, pos_type __err = this->rdbuf()->pubseekoff(__off, __dir,
ios_base::in); ios_base::in);
// 129. Need error indication from seekp() and seekg() // 129. Need error indication from seekp() and seekg()
if (__err == pos_type(off_type(-1))) if (__err == pos_type(off_type(-1)))
this->setstate(ios_base::failbit); this->setstate(ios_base::failbit);
#endif #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; return *this;
} }
......
...@@ -55,11 +55,6 @@ bool test01() ...@@ -55,11 +55,6 @@ bool test01()
p4 = ifs2.tellg(); p4 = ifs2.tellg();
VERIFY( p3 == p4 ); VERIFY( p3 == p4 );
#ifdef DEBUG_ASSERT
assert(test);
#endif
return test; return test;
} }
...@@ -237,10 +232,6 @@ void test04(void) ...@@ -237,10 +232,6 @@ void test04(void)
if01.peek(); if01.peek();
pos02 = if01.tellg(); pos02 = if01.tellg();
VERIFY( pos02 == pos01 ); VERIFY( pos02 == pos01 );
#ifdef DEBUG_ASSERT
assert(test);
#endif
} }
// stringstreams // stringstreams
...@@ -351,10 +342,50 @@ void test05(void) ...@@ -351,10 +342,50 @@ void test05(void)
VERIFY( state01 == state02 ); VERIFY( state01 == state02 );
pos06 = is03.tellg(); pos06 = is03.tellg();
VERIFY( pos05 == pos06 ); VERIFY( pos05 == pos06 );
}
#ifdef DEBUG_ASSERT // libstdc++/8348
assert(test); void test06(void)
#endif {
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() int main()
...@@ -366,6 +397,8 @@ int main() ...@@ -366,6 +397,8 @@ int main()
test04(); test04();
test05(); test05();
test06();
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment