Skip to content

Commit

Permalink
LWG 3076 basic_string CTAD ambiguity
Browse files Browse the repository at this point in the history
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@261670 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
redi committed Jun 15, 2018
1 parent 0245ae7 commit 95ca8ac
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 0 deletions.
16 changes: 16 additions & 0 deletions libstdc++-v3/ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
7 changes: 7 additions & 0 deletions libstdc++-v3/doc/xml/manual/intro.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
10 changes: 10 additions & 0 deletions libstdc++-v3/include/bits/basic_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -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); }
Expand All @@ -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); }
Expand Down
6 changes: 6 additions & 0 deletions libstdc++-v3/src/c++11/string-inst.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

0 comments on commit 95ca8ac

Please sign in to comment.