On 21/02/14 01:00 +0100, Lars Gullik Bjønnes wrote:
* include/std/iomanip (_Quoted_string operator>>): Do not clear string if input is not quoted. Currently the string is cleared regardless of how the string is handled. This patch just moves the clearing down so that we do not clear it if we are not going to quote the string (i.e. let operator>> handle the clearing if needed) and also not if we encounter any stream error. This has been reported as (bug 60270). I have no GCC paperwork in order, but I expect this change to be simple enough to not require that.
I'm committing this (Lars's patch and my testcase) now since it's a necessary fix for a new, experimental feature, so I don't see any point in releasing it broken then having to fix it in two branches. Tested x86_64-linux, committed to trunk.
commit d5c77024ad042628249dc0c38c87a75f2cde5f36 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon Mar 31 19:27:33 2014 +0100 2014-03-31 Lars Gullik Bjønnes <lar...@gullik.org> Jonathan Wakely <jwak...@redhat.com> PR libstdc++/60270 * include/std/iomanip (_Quoted_string operator>>): Do not clear string if input is not quoted. * testsuite/27_io/manipulators/standard/char/60270.cc: New. diff --git a/libstdc++-v3/include/std/iomanip b/libstdc++-v3/include/std/iomanip index b2c7b95..73822db 100644 --- a/libstdc++-v3/include/std/iomanip +++ b/libstdc++-v3/include/std/iomanip @@ -415,8 +415,6 @@ _GLIBCXX_END_NAMESPACE_VERSION const _Quoted_string<basic_string<_CharT, _Traits, _Alloc>&, _CharT>& __str) { - __str._M_string.clear(); - _CharT __c; __is >> __c; if (!__is.good()) @@ -427,6 +425,7 @@ _GLIBCXX_END_NAMESPACE_VERSION __is >> __str._M_string; return __is; } + __str._M_string.clear(); std::ios_base::fmtflags __flags = __is.flags(__is.flags() & ~std::ios_base::skipws); do diff --git a/libstdc++-v3/testsuite/27_io/manipulators/standard/char/60270.cc b/libstdc++-v3/testsuite/27_io/manipulators/standard/char/60270.cc new file mode 100644 index 0000000..b2b213b --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/manipulators/standard/char/60270.cc @@ -0,0 +1,38 @@ +// { dg-do run } +// { dg-options "-std=gnu++14" } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// 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/>. + +// 27.7.6 - Quoted manipulators [quoted.manip] + +// libstdc++/60270 + +#include <string> +#include <sstream> +#include <iomanip> +#include <testsuite_hooks.h> + +int main() +{ + std::istringstream in; + std::string s = "xxx"; + in >> s; + VERIFY( !s.empty() ); + in >> std::quoted(s); + VERIFY( !s.empty() ); +}