On Tue, May 20, 2025 at 11:26 AM Jonathan Wakely <jwakely....@gmail.com> wrote:
> On Tue, 20 May 2025 at 10:08, Jonathan Wakely <jwakely....@gmail.com> > wrote: > > > > On Tue, 20 May 2025 at 09:10, Tomasz Kaminski <tkami...@redhat.com> > wrote: > > > > > > > > > > > > On Mon, May 19, 2025 at 11:28 PM Nathan Myers <n...@cantrip.org> wrote: > > > In the title, we usually put link to bugzilla PR119741 in your case, > not the paper. > > > Then link the paper in commit descritpion. > > > > Right. When there's no bugzilla I'll sometimes put the paper number in > > parens, e.g. in https://gcc.gnu.org/g:91f4550e1700 which has this > > summary: > > libstdc++: Move std::monostate to <utility> for C++26 (P0472R2) > > > > But the paper number should not be in square brackets, that should be > > reserved for a bugzilla PR number if there is one (and for this > > feature, we do have a bugzilla PR). > > > > > > > > > >> Add constructors to stringbuf, stringstream, istringstream, > > >> and ostringstream, and a matching overload of str(sv) in each, > > >> that take anything convertible to a string_view where the > > >> existing functions take a string. > > > > > > > > > After you put bugzilla number, git gcc-verify will suggest you to add > following node: > > > <tab>PR libstdc++/119741 > > > > > >> > > >> > > >> libstdc++-v3/ChangeLog: > > >> > > >> P2495R3 stringstream to init from string_view-ish > > > > > > We usually put only the change files here. Did git gcc-verify accepted > it. > > >> > > >> * include/std/sstream: full implementation, really just > > >> decls, requires clause and plumbing. > > >> * include/std/bits/version.def, .h: new preprocessor symbol > > >> __cpp_lib_sstream_from_string_view. > > >> * testsuite/27_io/basic_stringbuf/cons/char/3.cc: New tests. > > >> * testsuite/27_io/basic_istringstream/cons/char/2.cc: New > tests. > > >> * testsuite/27_io/basic_ostringstream/cons/char/4.cc: New > tests. > > >> * testsuite/27_io/basic_stringstream/cons/char/2.cc: New > tests. > > >> --- > > >> libstdc++-v3/ChangeLog | 11 + > > >> libstdc++-v3/include/bits/version.def | 11 +- > > >> libstdc++-v3/include/bits/version.h | 10 + > > >> libstdc++-v3/include/std/sstream | 181 +++++++++++++-- > > >> .../27_io/basic_istringstream/cons/char/2.cc | 193 ++++++++++++++++ > > >> .../27_io/basic_ostringstream/cons/char/4.cc | 193 ++++++++++++++++ > > >> .../27_io/basic_stringbuf/cons/char/3.cc | 216 > ++++++++++++++++++ > > >> .../27_io/basic_stringstream/cons/char/2.cc | 194 ++++++++++++++++ > > >> 8 files changed, 990 insertions(+), 19 deletions(-) > > >> create mode 100644 > libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/2.cc > > >> create mode 100644 > libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/char/4.cc > > >> create mode 100644 > libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/3.cc > > >> create mode 100644 > libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/2.cc > > >> > > >> diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog > > >> index b45f8c2c7a5..ac0ff4a386f 100644 > > >> --- a/libstdc++-v3/ChangeLog > > >> +++ b/libstdc++-v3/ChangeLog > > >> @@ -41,6 +41,17 @@ > > >> PR libstdc++/119246 > > >> * include/std/format: Updated check for _GLIBCXX_FORMAT_F128. > > >> > > >> +2025-05-14 Nathan Myers <nmy...@redhat.com> > > >> + P2495R3 stringstream to init from string_view-ish > > >> + * include/std/sstream: full implementation, really just > > >> + decls, requires clause and plumbing. > > >> + * include/std/bits/version.def, .h: new preprocessor symbol > > >> + __cpp_lib_sstream_from_string_view. > > >> + * testsuite/27_io/basic_stringbuf/cons/char/3.cc: New tests. > > >> + * testsuite/27_io/basic_istringstream/cons/char/2.cc: New > tests. > > >> + * testsuite/27_io/basic_ostringstream/cons/char/4.cc: New > tests. > > >> + * testsuite/27_io/basic_stringstream/cons/char/2.cc: New > tests. > > >> + > > > > > > Changelogs are now automatically generated from commit messages, so > you do not > > > need to edit this file. > > >> > > >> 2025-05-14 Tomasz Kamiński <tkami...@redhat.com> > > >> > > >> PR libstdc++/119125 > > >> diff --git a/libstdc++-v3/include/bits/version.def > b/libstdc++-v3/include/bits/version.def > > >> index 6ca148f0488..567c56b4117 100644 > > >> --- a/libstdc++-v3/include/bits/version.def > > >> +++ b/libstdc++-v3/include/bits/version.def > > >> @@ -649,7 +649,7 @@ ftms = { > > >> }; > > >> values = { > > >> v = 1; > > >> - /* For when there's no gthread. */ > > >> + // For when there is no gthread. > > >> cxxmin = 17; > > >> hosted = yes; > > >> gthread = no; > > >> @@ -1961,6 +1961,15 @@ ftms = { > > >> }; > > >> }; > > >> > > >> +ftms = { > > >> + name = sstream_from_string_view; > > >> + values = { > > >> + v = 202302; > > >> + cxxmin = 26; > > >> + hosted = yes; > > >> + }; > > >> +}; > > >> + > > >> // Standard test specifications. > > >> stds[97] = ">= 199711L"; > > >> stds[03] = ">= 199711L"; > > >> diff --git a/libstdc++-v3/include/bits/version.h > b/libstdc++-v3/include/bits/version.h > > >> index 48a090c14a3..5d1beb83a25 100644 > > >> --- a/libstdc++-v3/include/bits/version.h > > >> +++ b/libstdc++-v3/include/bits/version.h > > >> @@ -2193,4 +2193,14 @@ > > >> #endif /* !defined(__cpp_lib_modules) && > defined(__glibcxx_want_modules) */ > > >> #undef __glibcxx_want_modules > > >> > > >> +#if !defined(__cpp_lib_sstream_from_string_view) > > >> +# if (__cplusplus > 202302L) && _GLIBCXX_HOSTED > > >> +# define __glibcxx_sstream_from_string_view 202302L > > >> +# if defined(__glibcxx_want_all) || > defined(__glibcxx_want_sstream_from_string_view) > > >> +# define __cpp_lib_sstream_from_string_view 202302L > > >> +# endif > > >> +# endif > > >> +#endif /* !defined(__cpp_lib_sstream_from_string_view) && > defined(__glibcxx_want_sstream_from_string_view) */ > > >> +#undef __glibcxx_want_sstream_from_string_view > > >> + > > >> #undef __glibcxx_want_all > > >> diff --git a/libstdc++-v3/include/std/sstream > b/libstdc++-v3/include/std/sstream > > >> index ad0c16a91e8..9b2b0eb53fc 100644 > > >> --- a/libstdc++-v3/include/std/sstream > > >> +++ b/libstdc++-v3/include/std/sstream > > >> @@ -38,9 +38,14 @@ > > >> #endif > > >> > > >> #include <bits/requires_hosted.h> // iostream > > >> +#include <bits/version.h> > > >> > > >> #include <istream> > > >> #include <ostream> > > >> +#ifdef __cpp_lib_sstream_from_string_view > > >> +# include <type_traits> // is_convertible_v > > >> +#endif > > >> + > > >> #include <bits/alloc_traits.h> // allocator_traits, __allocator_like > > >> > > >> #if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI > > >> @@ -52,8 +57,6 @@ > > >> # define _GLIBCXX_SSTREAM_ALWAYS_INLINE > [[__gnu__::__always_inline__]] > > >> #endif > > >> > > >> - > > >> - > > >> namespace std _GLIBCXX_VISIBILITY(default) > > >> { > > >> _GLIBCXX_BEGIN_NAMESPACE_VERSION > > >> @@ -159,6 +162,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> { > __rhs._M_sync(const_cast<char_type*>(__rhs._M_string.data()), 0, 0); } > > >> > > >> #if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI > > >> + // P0408 Efficient access to basic_stringbuf buffer > > >> explicit > > >> basic_stringbuf(const allocator_type& __a) > > >> : basic_stringbuf(ios_base::in | std::ios_base::out, __a) > > >> @@ -197,7 +201,35 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> | ios_base::out) > > >> : basic_stringbuf(__s, __mode, allocator_type{}) > > >> { } > > >> +#endif > > >> + > > >> +#ifdef __cpp_lib_sstream_from_string_view > > >> + template<typename _Tp> > > >> + explicit > > >> + basic_stringbuf(const _Tp& __t, ios_base::openmode __mode = > ios_base::in | ios_base::out) > > >> + requires (is_convertible_v<const _Tp&, > basic_string_view<_CharT, _Traits>>) > > >> + : basic_stringbuf(__t, __mode, allocator_type{}) > > >> + { } > > >> + > > >> + template<typename _Tp> > > >> + basic_stringbuf(const _Tp& __t, const allocator_type& __a) > > >> + requires (is_convertible_v<const _Tp&, > basic_string_view<_CharT, _Traits>>) > > >> + : basic_stringbuf(__t, ios_base::in | ios_base::out, __a) > > >> + { } > > >> > > >> + template<typename _Tp> > > >> + basic_stringbuf(const _Tp& __t, ios_base::openmode __mode, > const allocator_type& __a) > > >> + requires (is_convertible_v<const _Tp&, > basic_string_view<_CharT, _Traits>>) > > >> + : basic_stringbuf(__mode, __a) > > > > > > Any reason for not initializing _M_string(t, __a) directly here, > string has string_view constructor. > > > > More importantly, it has a "convertible to string_view" constructor, > > which matches the constraint on _Tp here. So it does look like we can > > just construct _M_string directly from __t and __a. > > > > >> > > >> + { > > >> + basic_string_view<_CharT, _Traits> __sv{__t}; > > >> + _M_string = __sv; > > >> + _M_stringbuf_init(__mode); > > >> + } > > >> +#endif // C++26 > > >> + > > >> +#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI > > >> + // P0408 Efficient access to basic_stringbuf buffer > > >> basic_stringbuf(basic_stringbuf&& __rhs, const allocator_type& > __a) > > >> : basic_stringbuf(std::move(__rhs), __a, __xfer_bufptrs(__rhs, > this)) > > >> { > __rhs._M_sync(const_cast<char_type*>(__rhs._M_string.data()), 0, 0); } > > >> @@ -262,6 +294,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> #if __cplusplus > 201703L > > >> #if _GLIBCXX_USE_CXX11_ABI > > >> #if __cpp_concepts > > >> + // P0407 Allocator-aware basic_streambuf > > >> template<__allocator_like _SAlloc> > > >> _GLIBCXX_NODISCARD > > >> basic_string<_CharT, _Traits, _SAlloc> > > >> @@ -317,6 +350,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> > > >> #if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI > > >> #if __cpp_concepts > > >> + // P0407 Allocator-aware basic_streambuf > > >> template<__allocator_like _SAlloc> > > >> requires (!is_same_v<_SAlloc, _Alloc>) > > >> void > > >> @@ -335,6 +369,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> } > > >> #endif > > >> > > >> +#ifdef __cpp_lib_sstream_from_string_view > > >> + template <typename _Tp> > > >> + void > > >> + str(const _Tp& __t) > > >> + requires (is_convertible_v<const _Tp&, > basic_string_view<_CharT, _Traits>>) > > >> + { > > >> + basic_string_view<_CharT, _Traits> __sv{__t}; > > >> + _M_string = __sv; > > >> + _M_stringbuf_init(_M_mode); > > >> + } > > >> +#endif // C++26 > > >> + > > >> protected: > > >> // Common initialization code goes here. > > >> void > > >> @@ -521,6 +567,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> { } > > >> > > >> #if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI > > >> + // P0408 Efficient access to basic_stringbuf buffer > > >> + > > >> // The move constructor initializes an __xfer_bufptrs > temporary then > > >> // delegates to this constructor to performs moves during its > lifetime. > > >> basic_stringbuf(basic_stringbuf&& __rhs, const allocator_type& > __a, > > >> @@ -584,7 +632,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> */ > > >> basic_istringstream() > > >> : __istream_type(), _M_stringbuf(ios_base::in) > > >> - { this->init(&_M_stringbuf); } > > >> + { this->init(std::__addressof(_M_stringbuf)); } > > >> > > >> /** > > >> * @brief Starts with an empty string buffer. > > >> @@ -601,7 +649,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> explicit > > >> basic_istringstream(ios_base::openmode __mode) > > >> : __istream_type(), _M_stringbuf(__mode | ios_base::in) > > >> - { this->init(&_M_stringbuf); } > > >> + { this->init(std::__addressof(_M_stringbuf)); } > > >> > > >> /** > > >> * @brief Starts with an existing string buffer. > > >> @@ -620,7 +668,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> basic_istringstream(const __string_type& __str, > > >> ios_base::openmode __mode = ios_base::in) > > >> : __istream_type(), _M_stringbuf(__str, __mode | ios_base::in) > > >> - { this->init(&_M_stringbuf); } > > >> + { this->init(std::__addressof(_M_stringbuf)); } > > >> > > >> /** > > >> * @brief The destructor does nothing. > > >> @@ -637,9 +685,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> basic_istringstream(basic_istringstream&& __rhs) > > >> : __istream_type(std::move(__rhs)), > > >> _M_stringbuf(std::move(__rhs._M_stringbuf)) > > >> - { __istream_type::set_rdbuf(&_M_stringbuf); } > > >> + { __istream_type::set_rdbuf(std::__addressof(_M_stringbuf)); } > > >> > > >> #if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI > > >> + // P0408 Efficient access to basic_stringbuf buffer > > >> basic_istringstream(ios_base::openmode __mode, const > allocator_type& __a) > > >> : __istream_type(), _M_stringbuf(__mode | ios_base::in, __a) > > >> { this->init(std::__addressof(_M_stringbuf)); } > > >> @@ -667,10 +716,33 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 > > >> explicit > > >> basic_istringstream(const basic_string<_CharT, _Traits, > _SAlloc>& __str, > > >> ios_base::openmode __mode = ios_base::in) > > >> +#ifdef __cpp_lib_sstream_from_string_view > > >> + requires (!is_same_v<_SAlloc, allocator_type>) > > >> +#endif // C++26 > > > > > > Standard have same constraint of ostringstream ( > https://eel.is/c++draft/string.streams#ostringstream.cons-6): > > > Constraints: is_same_v<SAlloc,Allocator> is false. > > > Do we miss some library issue? > > > > P2495R3 adds this to basic_istringstream with this note: > > > > [DRAFTING NOTE: Drive-by fix, this adds a missing constraint present > > in stringstream and ostringstream.] > > > > The constraints were added elsewhere by P0408 so I missed adding those > > constraints in https://gcc.gnu.org/g:95cb0fc8c51841 > > Nathan, could you please add that same !is_same_v constraint to the > > basic_stringbuf, basic_ostringstream and basic_stringstream > > constructors as part of this patch? > > > Do those constrains actually do anything, except slow down compilation? > > We have: > > explicit basic_stringbuf( > const basic_string<charT, traits, Allocator>& s, > ios_base::openmode which = ios_base::in | ios_base::out); > > And: > > template<class SAlloc> > explicit basic_stringbuf( > const basic_string<charT, traits, SAlloc>& s, > ios_base::openmode which = ios_base::in | ios_base::out); > > Constraints: is_same_v<SAlloc, Allocator> is false. > > > If Salloc is Allocator then the first one is a better match anyway, so > what's the constraint for? > I was also wondering about it, and also see no case where they will change the result of overload resolution.