diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-06-16 00:47:33 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-06-16 00:47:33 +0100 |
commit | 5d84e6c53e07763c20e5fcf0685893d8ef0506f5 (patch) | |
tree | 3832e99a38a93f602448cf201bcc0f32394479ca | |
parent | 487f2f61bb1bad721f41a7f767efe04df4b0b058 (diff) | |
download | gcc-5d84e6c53e07763c20e5fcf0685893d8ef0506f5.zip gcc-5d84e6c53e07763c20e5fcf0685893d8ef0506f5.tar.gz gcc-5d84e6c53e07763c20e5fcf0685893d8ef0506f5.tar.bz2 |
LWG 3076 basic_string CTAD ambiguity
When deduction guides are supported by the compiler (i.e. for C++17 and
later) replace two basic_string constructors by constrained function
templates as required by LWG 3075. In order to ensure that the pre-C++17
non-template constructors are still exported from the shared library
define a macro in src/c++11/string-inst.cc to force the non-template
declarations (this isn't strictly needed yet, because the string
instantiations are compiled with -std=gnu++11, but that is likely to
change).
LWG 3076 basic_string CTAD ambiguity
* doc/xml/manual/intro.xml: Document LWG 3076 change.
* include/bits/basic_string.h
[__cpp_deduction_guides && !_GLIBCXX_DEFINING_STRING_INSTANTIATIONS]
(basic_string(const _CharT*, const _Alloc&)): Turn into a function
template constrained by _RequireAllocator.
(basic_string(size_type, _CharT, const _Alloc&)): Likewise.
* src/c++11/string-inst.cc (_GLIBCXX_DEFINING_STRING_INSTANTIATIONS):
Define.
* testsuite/21_strings/basic_string/cons/char/deduction.cc: Test
deduction
* testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc:
Likewise.
From-SVN: r261670
-rw-r--r-- | libstdc++-v3/ChangeLog | 16 | ||||
-rw-r--r-- | libstdc++-v3/doc/xml/manual/intro.xml | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 10 | ||||
-rw-r--r-- | libstdc++-v3/src/c++11/string-inst.cc | 6 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/21_strings/basic_string/cons/char/deduction.cc | 17 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc | 17 |
6 files changed, 73 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index fdb07ab..2c3237a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,19 @@ +2018-06-16 Jonathan Wakely <jwakely@redhat.com> + + LWG 3076 basic_string CTAD ambiguity + * doc/xml/manual/intro.xml: Document LWG 3076 change. + * include/bits/basic_string.h + [__cpp_deduction_guides && !_GLIBCXX_DEFINING_STRING_INSTANTIATIONS] + (basic_string(const _CharT*, const _Alloc&)): Turn into a function + template constrained by _RequireAllocator. + (basic_string(size_type, _CharT, const _Alloc&)): Likewise. + * src/c++11/string-inst.cc (_GLIBCXX_DEFINING_STRING_INSTANTIATIONS): + Define. + * testsuite/21_strings/basic_string/cons/char/deduction.cc: Test + deduction + * testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc: + Likewise. + 2018-06-15 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/86169 diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml index 90d4390..fea07e2 100644 --- a/libstdc++-v3/doc/xml/manual/intro.xml +++ b/libstdc++-v3/doc/xml/manual/intro.xml @@ -1176,6 +1176,13 @@ requirements of the license of GCC. they will allow conversions from other types to the value_type. </para></listitem></varlistentry> + <varlistentry xml:id="manual.bugs.dr3076"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#3076">3076</link>: + <emphasis><code>basic_string</code> CTAD ambiguity + </emphasis> + </term> + <listitem><para>Change constructors to constrained templates. + </para></listitem></varlistentry> + </variablelist> </section> diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 577ad5e..2e6e1c6 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -506,6 +506,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 * @param __s Source C string. * @param __a Allocator to use (default is default allocator). */ +#if __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3076. basic_string CTAD ambiguity + template<typename = _RequireAllocator<_Alloc>> +#endif basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()) : _M_dataplus(_M_local_data(), __a) { _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); } @@ -516,6 +521,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 * @param __c Character to use. * @param __a Allocator to use (default is default allocator). */ +#if __cpp_deduction_guides && ! defined _GLIBCXX_DEFINING_STRING_INSTANTIATIONS + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3076. basic_string CTAD ambiguity + template<typename = _RequireAllocator<_Alloc>> +#endif basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc()) : _M_dataplus(_M_local_data(), __a) { _M_construct(__n, __c); } diff --git a/libstdc++-v3/src/c++11/string-inst.cc b/libstdc++-v3/src/c++11/string-inst.cc index 567d817..47a1c9a 100644 --- a/libstdc++-v3/src/c++11/string-inst.cc +++ b/libstdc++-v3/src/c++11/string-inst.cc @@ -35,6 +35,12 @@ # define _GLIBCXX_USE_CXX11_ABI 1 #endif +// Prevent the basic_string(const _CharT*, const _Alloc&) and +// basic_string(size_type, _CharT, const _Alloc&) constructors from being +// replaced by constrained function templates, so that we instantiate the +// pre-C++17 definitions. +#define _GLIBCXX_DEFINING_STRING_INSTANTIATIONS 1 + #include <string> // Instantiation configuration. 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 cf6857c..fc28467 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 @@ -138,3 +138,20 @@ test05() std::basic_string s4(sv, 2u, 6u, a); check_type<std::string>(s4); } + +void +test06() +{ + // LWG 3076 basic_string CTAD ambiguity + using namespace std; + string s0; + + basic_string s1(s0, 1, 1); + check_type<std::string>(s1); + + basic_string s2("cat"sv, 1, 1); + check_type<std::string>(s2); + + basic_string s3("cat", 1); + check_type<std::string>(s3); +} 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 ea312ff..c40651f 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 @@ -97,3 +97,20 @@ test05() std::basic_string s4(sv, 2u, 6u, a); check_type<std::wstring>(s4); } + +void +test06() +{ + // LWG 3076 basic_string CTAD ambiguity + using namespace std; + wstring s0; + + basic_string s1(s0, 1, 1); + check_type<std::wstring>(s1); + + basic_string s2(L"cat"sv, 1, 1); + check_type<std::wstring>(s2); + + basic_string s3(L"cat", 1); + check_type<std::wstring>(s3); +} |