libstdc++: Define std::basic_stringbuf::view() for old std::string ABI

Unlike the new str()&& members in <sstream>, there is no real difficulty
in supporting the new view() members for the old std::string ABI.
Enabling it fixes errors in <chrono> where std::ostringstream::view() is
used by ostream insertion operators for calendar types.

We just need to use [[gnu::always_inline]] on the view() members for the
old ABI, because the library doesn't contain instantiations of them for
the old ABI. Making them always inline avoids needing to add those
instantiations and export them.

libstdc++-v3/ChangeLog:

	* include/std/sstream  (basic_stringbuf::view): Define for old
	std::string ABI.
	(basic_istringstream::view, basic_0stringstream::view)
	(basic_stringstream::view): Likewise.
	* testsuite/27_io/basic_istringstream/view/char/1.cc: Remove
	{ dg-require-effective-target cxx11_abi }.
	* testsuite/27_io/basic_istringstream/view/wchar_t/1.cc:
	Likewise.
	* testsuite/27_io/basic_ostringstream/view/char/1.cc: Likewise.
	* testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc:
	Likewise.
	* testsuite/27_io/basic_stringbuf/view/char/1.cc: Likewise.
	* testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc: Likewise.
	* testsuite/27_io/basic_stringstream/view/char/1.cc: Likewise.
	* testsuite/27_io/basic_stringstream/view/wchar_t/1.cc:
	Likewise.
This commit is contained in:
Jonathan Wakely 2023-01-31 22:32:15 +00:00
parent db8d6fc572
commit 331b4f168a
9 changed files with 25 additions and 15 deletions

View file

@ -43,10 +43,15 @@
#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
# define _GLIBCXX_LVAL_REF_QUAL &
# define _GLIBCXX_SSTREAM_ALWAYS_INLINE
#else
# define _GLIBCXX_LVAL_REF_QUAL
// For symbols that are not exported from libstdc++.so for the COW string ABI.
# define _GLIBCXX_SSTREAM_ALWAYS_INLINE [[__gnu__::__always_inline__]]
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@ -251,7 +256,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
return __ret;
}
#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
#if __cplusplus > 201703L
#if _GLIBCXX_USE_CXX11_ABI
#if __cpp_concepts
template<__allocator_like _SAlloc>
basic_string<_CharT, _Traits, _SAlloc>
@ -275,7 +281,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
_M_sync(_M_string.data(), 0, 0);
return __str;
}
#endif // cxx11 ABI
_GLIBCXX_SSTREAM_ALWAYS_INLINE
basic_string_view<char_type, traits_type>
view() const noexcept
{
@ -698,7 +706,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
str() const _GLIBCXX_LVAL_REF_QUAL
{ return _M_stringbuf.str(); }
#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
#if __cplusplus > 201703L
#if _GLIBCXX_USE_CXX11_ABI
#if __cpp_concepts
template<__allocator_like _SAlloc>
basic_string<_CharT, _Traits, _SAlloc>
@ -709,11 +718,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
__string_type
str() &&
{ return std::move(_M_stringbuf).str(); }
#endif // cxx11 ABI
_GLIBCXX_SSTREAM_ALWAYS_INLINE
basic_string_view<char_type, traits_type>
view() const noexcept
{ return _M_stringbuf.view(); }
#endif
#endif // C++20
/**
* @brief Setting a new buffer.
@ -919,7 +930,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
str() const _GLIBCXX_LVAL_REF_QUAL
{ return _M_stringbuf.str(); }
#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
#if __cplusplus > 201703L
#if _GLIBCXX_USE_CXX11_ABI
#if __cpp_concepts
template<__allocator_like _SAlloc>
basic_string<_CharT, _Traits, _SAlloc>
@ -930,11 +942,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
__string_type
str() &&
{ return std::move(_M_stringbuf).str(); }
#endif // cxx11 ABI
_GLIBCXX_SSTREAM_ALWAYS_INLINE
basic_string_view<char_type, traits_type>
view() const noexcept
{ return _M_stringbuf.view(); }
#endif
#endif // C++20
/**
* @brief Setting a new buffer.
@ -1138,7 +1152,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
str() const _GLIBCXX_LVAL_REF_QUAL
{ return _M_stringbuf.str(); }
#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
#if __cplusplus > 201703L
#if _GLIBCXX_USE_CXX11_ABI
#if __cpp_concepts
template<__allocator_like _SAlloc>
basic_string<_CharT, _Traits, _SAlloc>
@ -1149,11 +1164,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
__string_type
str() &&
{ return std::move(_M_stringbuf).str(); }
#endif // cxx11 ABI
_GLIBCXX_SSTREAM_ALWAYS_INLINE
basic_string_view<char_type, traits_type>
view() const noexcept
{ return _M_stringbuf.view(); }
#endif
#endif // C++20
/**
* @brief Setting a new buffer.
@ -1215,6 +1232,7 @@ _GLIBCXX_END_NAMESPACE_CXX11
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
#undef _GLIBCXX_SSTREAM_ALWAYS_INLINE
#undef _GLIBCXX_LVAL_REF_QUAL
#include <bits/sstream.tcc>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>

View file

@ -19,7 +19,6 @@
// { dg-options "-std=gnu++2a" }
// { dg-do run { target c++2a } }
// { dg-require-effective-target cxx11_abi }
#include <sstream>
#include <string_view>