diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-11-16 21:00:50 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-11-16 22:48:15 +0000 |
commit | 73e4d9f1751fd6d3c182988b2f9d0199c86053c9 (patch) | |
tree | 132326ada854bdc758a27f765f7a32e57f72aa82 | |
parent | 395848255cfa88f6f0f33a9b14c79e584a05d6fc (diff) | |
download | gcc-73e4d9f1751fd6d3c182988b2f9d0199c86053c9.zip gcc-73e4d9f1751fd6d3c182988b2f9d0199c86053c9.tar.gz gcc-73e4d9f1751fd6d3c182988b2f9d0199c86053c9.tar.bz2 |
libstdc++: Fix tests for constexpr std::string
Some tests fail when run with -D_GLIBCXX_USE_CXX11_ABI or -stdgnu++20.
libstdc++-v3/ChangeLog:
* include/bits/basic_string.h (operator<=>): Use constexpr
unconditionally.
* testsuite/21_strings/basic_string/modifiers/constexpr.cc:
Require cxx11-abit effective target.
* testsuite/21_strings/headers/string/synopsis.cc: Add
conditional constexpr to declarations, and adjust relational
operators for C++20.
3 files changed, 33 insertions, 7 deletions
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index b6945f1..0b7d6c0 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -3546,8 +3546,7 @@ _GLIBCXX_END_NAMESPACE_CXX11 * greater than, or incomparable with `__rhs`. */ template<typename _CharT, typename _Traits, typename _Alloc> - _GLIBCXX20_CONSTEXPR - inline auto + constexpr auto operator<=>(const basic_string<_CharT, _Traits, _Alloc>& __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs) noexcept -> decltype(__detail::__char_traits_cmp_cat<_Traits>(0)) @@ -3561,8 +3560,7 @@ _GLIBCXX_END_NAMESPACE_CXX11 * greater than, or incomparable with `__rhs`. */ template<typename _CharT, typename _Traits, typename _Alloc> - _GLIBCXX20_CONSTEXPR - inline auto + constexpr auto operator<=>(const basic_string<_CharT, _Traits, _Alloc>& __lhs, const _CharT* __rhs) noexcept -> decltype(__detail::__char_traits_cmp_cat<_Traits>(0)) diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/constexpr.cc b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/constexpr.cc index c875a3a..a462771 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/constexpr.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/modifiers/constexpr.cc @@ -1,5 +1,6 @@ // { dg-options "-std=gnu++20" } // { dg-do compile { target c++20 } } +// { dg-require-effective-target cxx11-abi } #include <string> #include <testsuite_hooks.h> diff --git a/libstdc++-v3/testsuite/21_strings/headers/string/synopsis.cc b/libstdc++-v3/testsuite/21_strings/headers/string/synopsis.cc index f14c4ae..f12345e 100644 --- a/libstdc++-v3/testsuite/21_strings/headers/string/synopsis.cc +++ b/libstdc++-v3/testsuite/21_strings/headers/string/synopsis.cc @@ -26,6 +26,12 @@ # define NOTHROW #endif +#if __cplusplus >= 202002L +# define CONSTEXPR constexpr +#else +# define CONSTEXPR +#endif + namespace std { // lib.char.traits, character traits: template<class charT> @@ -40,33 +46,52 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 _GLIBCXX_END_NAMESPACE_CXX11 template<class charT, class traits, class Allocator> + CONSTEXPR basic_string<charT,traits,Allocator> operator+(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs); template<class charT, class traits, class Allocator> + CONSTEXPR basic_string<charT,traits,Allocator> operator+(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs); template<class charT, class traits, class Allocator> + CONSTEXPR basic_string<charT,traits,Allocator> operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs); template<class charT, class traits, class Allocator> + CONSTEXPR basic_string<charT,traits,Allocator> operator+(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs); template<class charT, class traits, class Allocator> + CONSTEXPR basic_string<charT,traits,Allocator> operator+(const basic_string<charT,traits,Allocator>& lhs, charT rhs); template<class charT, class traits, class Allocator> + CONSTEXPR bool operator==(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs) NOTHROW; template<class charT, class traits, class Allocator> - bool operator==(const charT* lhs, - const basic_string<charT,traits,Allocator>& rhs); - template<class charT, class traits, class Allocator> + CONSTEXPR bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs); + +#if __cpp_lib_three_way_comparison + template<class charT, class traits, class Allocator> + constexpr + bool operator<=>(const basic_string<charT,traits,Allocator>& lhs, + const basic_string<charT,traits,Allocator>& rhs) NOTHROW; + template<class charT, class traits, class Allocator> + constexpr + bool operator<=>(const basic_string<charT,traits,Allocator>& lhs, + const charT* rhs); +#else + template<class charT, class traits, class Allocator> + CONSTEXPR + bool operator==(const charT* lhs, + const basic_string<charT,traits,Allocator>& rhs); template<class charT, class traits, class Allocator> bool operator!=(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs) NOTHROW; @@ -114,9 +139,11 @@ _GLIBCXX_END_NAMESPACE_CXX11 template<class charT, class traits, class Allocator> bool operator>=(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs); +#endif // lib.string.special: template<class charT, class traits, class Allocator> + CONSTEXPR void swap(basic_string<charT,traits,Allocator>& lhs, basic_string<charT,traits,Allocator>& rhs) #if __cplusplus >= 201103L |