aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2023-01-31 22:32:15 +0000
committerJonathan Wakely <jwakely@redhat.com>2023-02-02 16:57:27 +0000
commit331b4f168a06cd85fe40fd03b48b128cc8af399c (patch)
tree39eb6d6ff508e4d9acc74c3aa7f8d941fc13713c
parentdb8d6fc572ec316ccfcf70b1dffe3be0b1b37212 (diff)
downloadgcc-331b4f168a06cd85fe40fd03b48b128cc8af399c.zip
gcc-331b4f168a06cd85fe40fd03b48b128cc8af399c.tar.gz
gcc-331b4f168a06cd85fe40fd03b48b128cc8af399c.tar.bz2
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.
-rw-r--r--libstdc++-v3/include/std/sstream32
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc1
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc1
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc1
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc1
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc1
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc1
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc1
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc1
9 files changed, 25 insertions, 15 deletions
diff --git a/libstdc++-v3/include/std/sstream b/libstdc++-v3/include/std/sstream
index 4f0c50f..6b31397 100644
--- a/libstdc++-v3/include/std/sstream
+++ b/libstdc++-v3/include/std/sstream
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc
index 5309c44..04aae81 100644
--- a/libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc
index 774bef1..06b04b3 100644
--- a/libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc
index 3200861..4127908 100644
--- a/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc
index 1b9b851..2f177d4 100644
--- a/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc
index 998ad5c..138f4b1 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc
index 5833408..30b8f05 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc
index bd14bc5..91d329d 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc
@@ -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>
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc
index d179f4e..7af53dc 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc
@@ -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>