From a109beccd84bf255d1b298d8c09d88022d06d4f3 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 14 Oct 2020 11:52:26 +0100 Subject: [PATCH] libstdc++: Implement LWG 3706 for COW strings The basic_string deduction guides are defined for the old ABI, but the tests are currently disabled. This is because a single case fails when using the old ABI, which is just because LWG 3706 isn't implemented for the old ABI. That can be done easily, and the tests can be enabled. libstdc++-v3/ChangeLog: * include/bits/basic_string.h [!_GLIBCXX_USE_CXX11_ABI] (basic_string(const _CharT*, const _Alloc&)): Constrain to require an allocator-like type to fix CTAD ambiguity (LWG 3706). Define inline. * include/bits/basic_string.tcc [!_GLIBCXX_USE_CXX11_ABI] (basic_string(const _CharT*, const _Alloc&)): Remove non-inline definition. * testsuite/21_strings/basic_string/cons/char/deduction.cc: Remove dg-skip-if. * testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc: Likewise. (cherry picked from commit dc38e255242192303ae463a913c060b426eb06c0) --- libstdc++-v3/include/bits/basic_string.h | 12 +++++++++++- libstdc++-v3/include/bits/basic_string.tcc | 8 -------- .../21_strings/basic_string/cons/char/deduction.cc | 1 - .../basic_string/cons/wchar_t/deduction.cc | 1 - 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index bc0c256b65e4..bbab7b9d4d22 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -3605,12 +3605,22 @@ _GLIBCXX_END_NAMESPACE_CXX11 */ basic_string(const _CharT* __s, size_type __n, const _Alloc& __a = _Alloc()); + /** * @brief Construct string as copy of a C string. * @param __s Source C string. * @param __a Allocator to use (default is default allocator). */ - basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()); +#if __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3076. basic_string CTAD ambiguity + template> +#endif + basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()) + : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) : + __s + npos, __a), __a) + { } + /** * @brief Construct string as multiple characters. * @param __n Number of characters. diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index e370f439390f..204a140a7354 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -659,14 +659,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : _M_dataplus(_S_construct(__s, __s + __n, __a), __a) { } - // TBD: DPG annotate - template - basic_string<_CharT, _Traits, _Alloc>:: - basic_string(const _CharT* __s, const _Alloc& __a) - : _M_dataplus(_S_construct(__s, __s ? __s + traits_type::length(__s) : - __s + npos, __a), __a) - { } - template basic_string<_CharT, _Traits, _Alloc>:: basic_string(size_type __n, _CharT __c, const _Alloc& __a) diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/deduction.cc b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/deduction.cc index 6484ed434533..d05c4b776c32 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/deduction.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/cons/char/deduction.cc @@ -17,7 +17,6 @@ // { dg-options "-std=gnu++17" } // { dg-do compile { target c++17 } } -// { dg-xfail-if "COW string missing deduction guides" { ! cxx11-abi } } #include #include diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc b/libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc index 373b2b24bdd9..1773be28e377 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc @@ -17,7 +17,6 @@ // { dg-options "-std=gnu++17" } // { dg-do compile { target c++17 } } -// { dg-xfail-if "COW string missing deduction guides" { ! cxx11-abi } } #include #include -- 2.47.2