[committed] libstdc++: Define std::basic_stringbuf::view() for old std::string ABI
Checks
Commit Message
Tested powerpc64le-linux. Pushed to trunk.
This could be backported to gcc-11 and gcc-12 but I have no immediate
plans to do that (it's needed on trunk because of the new stuff in
<chrono> and that stuff isn't on the branches).
-- >8 --
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.
---
libstdc++-v3/include/std/sstream | 32 +++++++++++++++----
.../27_io/basic_istringstream/view/char/1.cc | 1 -
.../basic_istringstream/view/wchar_t/1.cc | 1 -
.../27_io/basic_ostringstream/view/char/1.cc | 1 -
.../basic_ostringstream/view/wchar_t/1.cc | 1 -
.../27_io/basic_stringbuf/view/char/1.cc | 1 -
.../27_io/basic_stringbuf/view/wchar_t/1.cc | 1 -
.../27_io/basic_stringstream/view/char/1.cc | 1 -
.../basic_stringstream/view/wchar_t/1.cc | 1 -
9 files changed, 25 insertions(+), 15 deletions(-)
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>