diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2002-11-01 05:38:27 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2002-11-01 05:38:27 +0000 |
commit | 04c7481ed28b3b2767735bd32bf44c01df3433e2 (patch) | |
tree | 5300fc4a8ade525eb2191e63aa079db2cc2b894e | |
parent | 5e81d5beff4813ceaa0133f1b272a38df8e9115a (diff) | |
download | gcc-04c7481ed28b3b2767735bd32bf44c01df3433e2.zip gcc-04c7481ed28b3b2767735bd32bf44c01df3433e2.tar.gz gcc-04c7481ed28b3b2767735bd32bf44c01df3433e2.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/istream.tcc | 61 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/istream_seeks.cc | 57 |
3 files changed, 63 insertions, 62 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 55b79be..3a2ee83 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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> diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index 58e2caf..617110d 100644 --- a/libstdc++-v3/include/bits/istream.tcc +++ b/libstdc++-v3/include/bits/istream.tcc @@ -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; } diff --git a/libstdc++-v3/testsuite/27_io/istream_seeks.cc b/libstdc++-v3/testsuite/27_io/istream_seeks.cc index cd0e065..892e10b 100644 --- a/libstdc++-v3/testsuite/27_io/istream_seeks.cc +++ b/libstdc++-v3/testsuite/27_io/istream_seeks.cc @@ -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; } |