+2010-11-18 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR libstdc++/26211 + N3168
+ * include/bits/istream.tcc (basic_istream<>::tellg, seekg(pos_type),
+ seekg(off_type, ios_base::seekdir)): Construct a sentry.
+ (basic_istream<>::tellg, seekg(pos_type), seekg(off_type,
+ ios_base::seekdir, putback, unget)): Clear eofbit first, per N3168.
+ * testsuite/27_io/basic_istream/seekg/char/26211.cc: New.
+ * testsuite/27_io/basic_istream/seekg/wchar_t/26211.cc: Likewise.
+ * testsuite/27_io/basic_istream/tellg/char/26211.cc: Likewise.
+ * testsuite/27_io/basic_istream/tellg/wchar_t/26211.cc: Likewise.
+ * testsuite/27_io/basic_istream/tellg/char/8348.cc: Tweak.
+ * testsuite/27_io/basic_istream/tellg/wchar_t/8348.cc: Likewise.
+
2010-11-18 H.J. Lu <hongjiu.lu@intel.com>
PR other/42670
// istream classes -*- C++ -*-
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-// 2006, 2007, 2008, 2009
+// 2006, 2007, 2008, 2009, 2010
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 60. What is a formatted input function?
_M_gcount = 0;
+ // Clear eofbit per N3168.
+ this->clear(this->rdstate() & ~ios_base::eofbit);
sentry __cerb(*this, true);
if (__cerb)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 60. What is a formatted input function?
_M_gcount = 0;
+ // Clear eofbit per N3168.
+ this->clear(this->rdstate() & ~ios_base::eofbit);
sentry __cerb(*this, true);
if (__cerb)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR60. Do not change _M_gcount.
pos_type __ret = pos_type(-1);
- __try
- {
- if (!this->fail())
- __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
- ios_base::in);
- }
- __catch(__cxxabiv1::__forced_unwind&)
+ sentry __cerb(*this, true);
+ if (__cerb)
{
- this->_M_setstate(ios_base::badbit);
- __throw_exception_again;
+ __try
+ {
+ if (!this->fail())
+ __ret = this->rdbuf()->pubseekoff(0, ios_base::cur,
+ ios_base::in);
+ }
+ __catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ __throw_exception_again;
+ }
+ __catch(...)
+ { this->_M_setstate(ios_base::badbit); }
}
- __catch(...)
- { this->_M_setstate(ios_base::badbit); }
return __ret;
}
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR60. Do not change _M_gcount.
- ios_base::iostate __err = ios_base::goodbit;
- __try
+ // Clear eofbit per N3168.
+ this->clear(this->rdstate() & ~ios_base::eofbit);
+ sentry __cerb(*this, true);
+ if (__cerb)
{
- if (!this->fail())
+ ios_base::iostate __err = ios_base::goodbit;
+ __try
{
- // 136. seekp, seekg setting wrong streams?
- const pos_type __p = this->rdbuf()->pubseekpos(__pos,
- ios_base::in);
-
- // 129. Need error indication from seekp() and seekg()
- if (__p == pos_type(off_type(-1)))
- __err |= ios_base::failbit;
+ if (!this->fail())
+ {
+ // 136. seekp, seekg setting wrong streams?
+ const pos_type __p = this->rdbuf()->pubseekpos(__pos,
+ ios_base::in);
+
+ // 129. Need error indication from seekp() and seekg()
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
}
+ __catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ __throw_exception_again;
+ }
+ __catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
}
- __catch(__cxxabiv1::__forced_unwind&)
- {
- this->_M_setstate(ios_base::badbit);
- __throw_exception_again;
- }
- __catch(...)
- { this->_M_setstate(ios_base::badbit); }
- if (__err)
- this->setstate(__err);
return *this;
}
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR60. Do not change _M_gcount.
- ios_base::iostate __err = ios_base::goodbit;
- __try
+ // Clear eofbit per N3168.
+ this->clear(this->rdstate() & ~ios_base::eofbit);
+ sentry __cerb(*this, true);
+ if (__cerb)
{
- if (!this->fail())
+ ios_base::iostate __err = ios_base::goodbit;
+ __try
{
- // 136. seekp, seekg setting wrong streams?
- const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
- ios_base::in);
+ if (!this->fail())
+ {
+ // 136. seekp, seekg setting wrong streams?
+ const pos_type __p = this->rdbuf()->pubseekoff(__off, __dir,
+ ios_base::in);
- // 129. Need error indication from seekp() and seekg()
- if (__p == pos_type(off_type(-1)))
- __err |= ios_base::failbit;
+ // 129. Need error indication from seekp() and seekg()
+ if (__p == pos_type(off_type(-1)))
+ __err |= ios_base::failbit;
+ }
}
+ __catch(__cxxabiv1::__forced_unwind&)
+ {
+ this->_M_setstate(ios_base::badbit);
+ __throw_exception_again;
+ }
+ __catch(...)
+ { this->_M_setstate(ios_base::badbit); }
+ if (__err)
+ this->setstate(__err);
}
- __catch(__cxxabiv1::__forced_unwind&)
- {
- this->_M_setstate(ios_base::badbit);
- __throw_exception_again;
- }
- __catch(...)
- { this->_M_setstate(ios_base::badbit); }
- if (__err)
- this->setstate(__err);
return *this;
}
--- /dev/null
+// 2010-11-18 Paolo Carlini <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <istream>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// libstdc++/26211
+void test01()
+{
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ typedef istringstream::pos_type pos_type;
+
+ istringstream iss("Duos for Doris");
+ ostringstream oss;
+
+ const pos_type p0 = iss.tellg();
+ VERIFY( p0 == pos_type(0) );
+
+ iss >> oss.rdbuf();
+ VERIFY( iss.rdstate() == iss.eofbit );
+
+ iss.seekg(0, ios_base::beg);
+ VERIFY( iss.good() );
+
+ iss.seekg(0, ios_base::beg);
+ VERIFY( !iss.fail() );
+ VERIFY( iss.tellg() == p0 );
+
+ iss >> oss.rdbuf();
+ VERIFY( iss.rdstate() == iss.eofbit );
+
+ iss.seekg(p0);
+ VERIFY( iss.good() );
+
+ iss.seekg(p0);
+ VERIFY( !iss.fail() );
+ VERIFY( iss.tellg() == p0 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// 2010-11-18 Paolo Carlini <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <istream>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// libstdc++/26211
+void test01()
+{
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ typedef wistringstream::pos_type pos_type;
+
+ wistringstream iss(L"Duos for Doris");
+ wostringstream oss;
+
+ const pos_type p0 = iss.tellg();
+ VERIFY( p0 == pos_type(0) );
+
+ iss >> oss.rdbuf();
+ VERIFY( iss.rdstate() == iss.eofbit );
+
+ iss.seekg(0, ios_base::beg);
+ VERIFY( iss.good() );
+
+ iss.seekg(0, ios_base::beg);
+ VERIFY( !iss.fail() );
+ VERIFY( iss.tellg() == p0 );
+
+ iss >> oss.rdbuf();
+ VERIFY( iss.rdstate() == iss.eofbit );
+
+ iss.seekg(p0);
+ VERIFY( iss.good() );
+
+ iss.seekg(p0);
+ VERIFY( !iss.fail() );
+ VERIFY( iss.tellg() == p0 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// 2010-11-18 Paolo Carlini <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <istream>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// libstdc++/26211
+void test01()
+{
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ typedef istringstream::pos_type pos_type;
+
+ istringstream iss("Duos for Doris");
+ ostringstream oss;
+
+ VERIFY( iss.tellg() == pos_type(0) );
+
+ iss >> oss.rdbuf();
+ VERIFY( iss.rdstate() == iss.eofbit );
+ VERIFY( iss.tellg() == pos_type(-1) );
+
+ iss.clear();
+ VERIFY( iss.tellg() == pos_type(14) );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
iss >> asNum;
VERIFY( test = iss.eof() );
VERIFY( test = !iss.fail() );
+ iss.clear();
iss.tellg();
VERIFY( test = !iss.fail() );
}
--- /dev/null
+// 2010-11-18 Paolo Carlini <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <istream>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// libstdc++/26211
+void test01()
+{
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ typedef wistringstream::pos_type pos_type;
+
+ wistringstream iss(L"Duos for Doris");
+ wostringstream oss;
+
+ VERIFY( iss.tellg() == pos_type(0) );
+
+ iss >> oss.rdbuf();
+ VERIFY( iss.rdstate() == iss.eofbit );
+ VERIFY( iss.tellg() == pos_type(-1) );
+
+ iss.clear();
+ VERIFY( iss.tellg() == pos_type(14) );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
iss >> asNum;
VERIFY( test = iss.eof() );
VERIFY( test = !iss.fail() );
+ iss.clear();
iss.tellg();
VERIFY( test = !iss.fail() );
}