Fix tests that fail with _GLIBCXX_USE_CXX11_ABI=0

The pmr::string typedef isn't available for the old COW string, so some
tests that use it were failing.

	* testsuite/20_util/variant/run.cc: Use a new Hashable type to test
	hashing, because pmr::string depends on _GLIBCXX_USE_CXX11_ABI==1.
	* testsuite/21_strings/basic_string/hash/hash.cc
	[!_GLIBCXX_USE_CXX11_ABI]: Don't test pmr strings.
	* testsuite/21_strings/basic_string/hash/hash_char8_t.cc
	[!_GLIBCXX_USE_CXX11_ABI]: Likewise.

From-SVN: r270604
This commit is contained in:
Jonathan Wakely 2019-04-26 16:02:02 +01:00 committed by Jonathan Wakely
parent 69dad6faf9
commit 53e6927367
4 changed files with 47 additions and 8 deletions

View File

@ -1,5 +1,12 @@
2019-04-26 Jonathan Wakely <jwakely@redhat.com> 2019-04-26 Jonathan Wakely <jwakely@redhat.com>
* testsuite/20_util/variant/run.cc: Use a new Hashable type to test
hashing, because pmr::string depends on _GLIBCXX_USE_CXX11_ABI==1.
* testsuite/21_strings/basic_string/hash/hash.cc
[!_GLIBCXX_USE_CXX11_ABI]: Don't test pmr strings.
* testsuite/21_strings/basic_string/hash/hash_char8_t.cc
[!_GLIBCXX_USE_CXX11_ABI]: Likewise.
* config/abi/pre/gnu.ver (GLIBCXX_3.4): Replace wildcard that matches * config/abi/pre/gnu.ver (GLIBCXX_3.4): Replace wildcard that matches
wstring::_M_replace_dispatch with more specific patterns. wstring::_M_replace_dispatch with more specific patterns.
* include/bits/fs_path.h (path::_S_convert_loc<_InputIterator>): * include/bits/fs_path.h (path::_S_convert_loc<_InputIterator>):

View File

@ -22,7 +22,6 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include <unordered_set> #include <unordered_set>
#include <memory_resource>
#include <ext/throw_allocator.h> #include <ext/throw_allocator.h>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
@ -433,9 +432,30 @@ void test_visit()
} }
} }
struct Hashable
{
Hashable(const char* s) : s(s) { }
// Non-trivial special member functions:
Hashable(const Hashable&) { }
Hashable(Hashable&&) noexcept { }
~Hashable() { }
string s;
bool operator==(const Hashable& rhs) const noexcept
{ return s == rhs.s; }
};
namespace std {
template<> struct hash<Hashable> {
size_t operator()(const Hashable& h) const noexcept
{ return hash<std::string>()(h.s); }
};
}
void test_hash() void test_hash()
{ {
unordered_set<variant<int, pmr::string>> s; unordered_set<variant<int, Hashable>> s;
VERIFY(s.emplace(3).second); VERIFY(s.emplace(3).second);
VERIFY(s.emplace("asdf").second); VERIFY(s.emplace("asdf").second);
VERIFY(s.emplace().second); VERIFY(s.emplace().second);
@ -447,12 +467,12 @@ void test_hash()
{ {
struct A struct A
{ {
operator pmr::string() operator Hashable()
{ {
throw nullptr; throw nullptr;
} }
}; };
variant<int, pmr::string> v; variant<int, Hashable> v;
try try
{ {
v.emplace<1>(A{}); v.emplace<1>(A{});

View File

@ -39,19 +39,29 @@ void
test01() test01()
{ {
VERIFY( test(std::string("a narrow string")) ); VERIFY( test(std::string("a narrow string")) );
VERIFY( test(std::pmr::string("a narrow string, but with PMR!")) );
VERIFY( test(std::u16string(u"a utf-16 string")) ); VERIFY( test(std::u16string(u"a utf-16 string")) );
VERIFY( test(std::pmr::u16string(u"a utf-16 string, but with PMR!")) );
VERIFY( test(std::u32string(U"a utf-32 string")) ); VERIFY( test(std::u32string(U"a utf-32 string")) );
VERIFY( test(std::pmr::u32string(U"a utf-32 string, but with PMR!")) );
#if _GLIBCXX_USE_WCHAR_T #if _GLIBCXX_USE_WCHAR_T
VERIFY( test(std::wstring(L"a wide string")) ); VERIFY( test(std::wstring(L"a wide string")) );
#endif
}
void
test02()
{
#if _GLIBCXX_USE_CXX11_ABI
VERIFY( test(std::pmr::string("a narrow string, but with PMR!")) );
VERIFY( test(std::pmr::u16string(u"a utf-16 string, but with PMR!")) );
VERIFY( test(std::pmr::u32string(U"a utf-32 string, but with PMR!")) );
#if _GLIBCXX_USE_WCHAR_T
VERIFY( test(std::pmr::wstring(L"a wide string, but with PMR!")) ); VERIFY( test(std::pmr::wstring(L"a wide string, but with PMR!")) );
#endif #endif
#endif
} }
int int
main() main()
{ {
test01(); test01();
test02();
} }

View File

@ -39,9 +39,11 @@ void
test01() test01()
{ {
VERIFY( test(std::string("a narrow string")) ); VERIFY( test(std::string("a narrow string")) );
VERIFY( test(std::pmr::string("a narrow string, but with PMR!")) );
VERIFY( test(std::u8string(u8"a utf-8 string")) ); VERIFY( test(std::u8string(u8"a utf-8 string")) );
#if _GLIBCXX_USE_CXX11_ABI
VERIFY( test(std::pmr::string("a narrow string, but with PMR!")) );
VERIFY( test(std::pmr::u8string(u8"a utf-8 string, but with PMR!")) ); VERIFY( test(std::pmr::u8string(u8"a utf-8 string, but with PMR!")) );
#endif
} }
void void