From patchwork Thu Nov 18 17:23:34 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 72121 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 54913B71B9 for ; Fri, 19 Nov 2010 04:23:57 +1100 (EST) Received: (qmail 9181 invoked by alias); 18 Nov 2010 17:23:52 -0000 Received: (qmail 9164 invoked by uid 22791); 18 Nov 2010 17:23:50 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from vsmtp2.tin.it (HELO vsmtp2.tin.it) (212.216.176.222) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 18 Nov 2010 17:23:39 +0000 Received: from [192.168.0.4] (79.52.194.223) by vsmtp2.tin.it (8.0.022) id 49F5BE422D7E4349; Thu, 18 Nov 2010 18:23:36 +0100 Message-ID: <4CE56116.3070501@oracle.com> Date: Thu, 18 Nov 2010 18:23:34 +0100 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101026 SUSE/3.0.10 Thunderbird/3.0.10 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: libstdc++ Subject: [v3] libstdc++/26211 (again) + N3168 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, I'm reapplying the fix for 26211 together with the tweaks per N3168. Thanks, Paolo. ////////////////////////// 2010-11-18 Paolo Carlini 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. Index: include/bits/istream.tcc =================================================================== --- include/bits/istream.tcc (revision 166903) +++ include/bits/istream.tcc (working copy) @@ -1,7 +1,7 @@ // 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 @@ -713,6 +713,8 @@ // _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) { @@ -746,6 +748,8 @@ // _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) { @@ -815,19 +819,23 @@ // _GLIBCXX_RESOLVE_LIB_DEFECTS // DR60. Do not change _M_gcount. pos_type __ret = pos_type(-1); - __try + sentry __cerb(*this, true); + if (__cerb) { - if (!this->fail()) - __ret = this->rdbuf()->pubseekoff(0, ios_base::cur, - ios_base::in); + __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(__cxxabiv1::__forced_unwind&) - { - this->_M_setstate(ios_base::badbit); - __throw_exception_again; - } - __catch(...) - { this->_M_setstate(ios_base::badbit); } return __ret; } @@ -838,29 +846,35 @@ { // _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; } @@ -871,29 +885,35 @@ { // _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; } Index: testsuite/27_io/basic_istream/seekg/wchar_t/26211.cc =================================================================== --- testsuite/27_io/basic_istream/seekg/wchar_t/26211.cc (revision 0) +++ testsuite/27_io/basic_istream/seekg/wchar_t/26211.cc (revision 0) @@ -0,0 +1,63 @@ +// 2010-11-18 Paolo Carlini + +// 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 +// . + +#include +#include +#include + +// 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; +} Index: testsuite/27_io/basic_istream/seekg/char/26211.cc =================================================================== --- testsuite/27_io/basic_istream/seekg/char/26211.cc (revision 0) +++ testsuite/27_io/basic_istream/seekg/char/26211.cc (revision 0) @@ -0,0 +1,63 @@ +// 2010-11-18 Paolo Carlini + +// 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 +// . + +#include +#include +#include + +// 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; +} Index: testsuite/27_io/basic_istream/tellg/wchar_t/26211.cc =================================================================== --- testsuite/27_io/basic_istream/tellg/wchar_t/26211.cc (revision 0) +++ testsuite/27_io/basic_istream/tellg/wchar_t/26211.cc (revision 0) @@ -0,0 +1,49 @@ +// 2010-11-18 Paolo Carlini + +// 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 +// . + +#include +#include +#include + +// 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; +} Index: testsuite/27_io/basic_istream/tellg/wchar_t/8348.cc =================================================================== --- testsuite/27_io/basic_istream/tellg/wchar_t/8348.cc (revision 166903) +++ testsuite/27_io/basic_istream/tellg/wchar_t/8348.cc (working copy) @@ -37,6 +37,7 @@ iss >> asNum; VERIFY( test = iss.eof() ); VERIFY( test = !iss.fail() ); + iss.clear(); iss.tellg(); VERIFY( test = !iss.fail() ); } Index: testsuite/27_io/basic_istream/tellg/char/26211.cc =================================================================== --- testsuite/27_io/basic_istream/tellg/char/26211.cc (revision 0) +++ testsuite/27_io/basic_istream/tellg/char/26211.cc (revision 0) @@ -0,0 +1,49 @@ +// 2010-11-18 Paolo Carlini + +// 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 +// . + +#include +#include +#include + +// 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; +} Index: testsuite/27_io/basic_istream/tellg/char/8348.cc =================================================================== --- testsuite/27_io/basic_istream/tellg/char/8348.cc (revision 166903) +++ testsuite/27_io/basic_istream/tellg/char/8348.cc (working copy) @@ -40,6 +40,7 @@ iss >> asNum; VERIFY( test = iss.eof() ); VERIFY( test = !iss.fail() ); + iss.clear(); iss.tellg(); VERIFY( test = !iss.fail() ); }