mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
487f2f61bb
commit
5d84e6c53e
|
|
@ -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>
|
2018-06-15 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
PR libstdc++/86169
|
PR libstdc++/86169
|
||||||
|
|
|
||||||
|
|
@ -1176,6 +1176,13 @@ requirements of the license of GCC.
|
||||||
they will allow conversions from other types to the value_type.
|
they will allow conversions from other types to the value_type.
|
||||||
</para></listitem></varlistentry>
|
</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>
|
</variablelist>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -506,6 +506,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
|
||||||
* @param __s Source C string.
|
* @param __s Source C string.
|
||||||
* @param __a Allocator to use (default is default allocator).
|
* @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())
|
basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
|
||||||
: _M_dataplus(_M_local_data(), __a)
|
: _M_dataplus(_M_local_data(), __a)
|
||||||
{ _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); }
|
{ _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 __c Character to use.
|
||||||
* @param __a Allocator to use (default is default allocator).
|
* @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())
|
basic_string(size_type __n, _CharT __c, const _Alloc& __a = _Alloc())
|
||||||
: _M_dataplus(_M_local_data(), __a)
|
: _M_dataplus(_M_local_data(), __a)
|
||||||
{ _M_construct(__n, __c); }
|
{ _M_construct(__n, __c); }
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,12 @@
|
||||||
# define _GLIBCXX_USE_CXX11_ABI 1
|
# define _GLIBCXX_USE_CXX11_ABI 1
|
||||||
#endif
|
#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>
|
#include <string>
|
||||||
|
|
||||||
// Instantiation configuration.
|
// Instantiation configuration.
|
||||||
|
|
|
||||||
|
|
@ -138,3 +138,20 @@ test05()
|
||||||
std::basic_string s4(sv, 2u, 6u, a);
|
std::basic_string s4(sv, 2u, 6u, a);
|
||||||
check_type<std::string>(s4);
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -97,3 +97,20 @@ test05()
|
||||||
std::basic_string s4(sv, 2u, 6u, a);
|
std::basic_string s4(sv, 2u, 6u, a);
|
||||||
check_type<std::wstring>(s4);
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue