[PATCH] libstdc++: Implement C++20 features for <sstream>

Jonathan Wakely jwakely@redhat.com
Wed Nov 4 23:41:42 GMT 2020


On 04/11/20 21:45 +0000, Jonathan Wakely wrote:
>On 04/11/20 12:43 -0800, Thomas Rodgers wrote:
>>https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97719
>>
>>>On Nov 4, 2020, at 11:54 AM, Stephan Bergmann <sbergman@redhat.com> wrote:
>>>
>>>On 07/10/2020 18:55, Thomas Rodgers wrote:
>>>>From: Thomas Rodgers <trodgers@redhat.com>
>>>>New ctors and ::view() accessor for -
>>>>  * basic_stingbuf
>>>>  * basic_istringstream
>>>>  * basic_ostringstream
>>>>  * basic_stringstreamm
>>>>New ::get_allocator() accessor for basic_stringbuf.
>>>I found that this <https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=a0e4d7b44c544c84cffc7ff9c64b6f1af14fb08d> "libstdc++: Implement C++20 features for <sstream>" changed the behavior of
>>>
>>>>$ cat test.cc
>>>>#include <iostream>
>>>>#include <iterator>
>>>>#include <sstream>
>>>>int main() {
>>>> std::stringstream s("a");
>>>> std::istreambuf_iterator<char> i(s);
>>>> if (i != std::istreambuf_iterator<char>()) std::cout << *i << '\n';
>>>>}
>>>>$ g++ -std=c++20 test.cc
>>>>$ ./a.out
>>>
>>>from printing "a" to printing nothing.  (The `i != ...` comparison appears to change i from pointing at "a" to pointing to null, and returns false.)
>>>
>>>I ran into this when building LibreOffice, and I hope test.cc is a faithfully minimized reproducer.  However, I know little about std::istreambuf_iterator, so it may well be that the code isn't even valid.
>>>
>
>I'm testing this patch.

Tested powerpc64le-linux. Pushed now.


>commit 1ca2fe0fc85403c6ea4e0775b5da051ff0eebc96
>Author: Jonathan Wakely <jwakely@redhat.com>
>Date:   Wed Nov 4 21:44:05 2020
>
>    libstdc++: Fix default mode of new basic_stringstream constructor [PR 97719]
>    
>    libstdc++-v3/ChangeLog:
>    
>            PR libstdc++/97719
>            * include/std/sstream (basic_stringstream(string_type&&, openmode)):
>            Fix default argument.
>            * testsuite/27_io/basic_stringstream/cons/char/97719.cc: New test.
>
>diff --git a/libstdc++-v3/include/std/sstream b/libstdc++-v3/include/std/sstream
>index 33a00486606c..8acf1eb259ab 100644
>--- a/libstdc++-v3/include/std/sstream
>+++ b/libstdc++-v3/include/std/sstream
>@@ -976,7 +976,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
> 
>       explicit
>       basic_stringstream(__string_type&& __str,
>-	                 ios_base::openmode __mode = ios_base::out
>+	                 ios_base::openmode __mode = ios_base::in
> 						     | ios_base::out)
>       : __iostream_type(), _M_stringbuf(std::move(__str), __mode)
>       { this->init(std::__addressof(_M_stringbuf)); }
>diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/97719.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/97719.cc
>new file mode 100644
>index 000000000000..fa523a803b6d
>--- /dev/null
>+++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/97719.cc
>@@ -0,0 +1,40 @@
>+// Copyright (C) 2020 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/>.
>+
>+// { dg-options "-std=gnu++2a" }
>+// { dg-do run { target c++2a } }
>+
>+#include <sstream>
>+#include <iterator>
>+#include <testsuite_hooks.h>
>+
>+void
>+test01()
>+{
>+  // PR libstdc++/97719
>+  std::string str = "a";
>+  std::stringstream s(std::move(str));
>+  std::istreambuf_iterator<char> i(s);
>+  VERIFY( i != std::istreambuf_iterator<char>() );
>+  VERIFY( *i == 'a' );
>+}
>+
>+int
>+main()
>+{
>+  test01();
>+}



More information about the Libstdc++ mailing list