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>
|
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
|
||||||
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
|
||||||
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
|
||||||
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()
|
||||||
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)
|
||||||
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)
|
||||||
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()
|
||||||
|
|
||||||
test04();
|
test04();
|
||||||
test05();
|
test05();
|
||||||
|
|
||||||
|
test06();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue