mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-16 17:30:58 +08:00
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…
x
Reference in New Issue
Block a user