LWG 3076 basic_string CTAD ambiguity
authorJonathan Wakely <jwakely@redhat.com>
Fri, 15 Jun 2018 23:47:33 +0000 (00:47 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 15 Jun 2018 23:47:33 +0000 (00:47 +0100)
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

libstdc++-v3/ChangeLog
libstdc++-v3/doc/xml/manual/intro.xml
libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/src/c++11/string-inst.cc
libstdc++-v3/testsuite/21_strings/basic_string/cons/char/deduction.cc
libstdc++-v3/testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc

index fdb07ab58177992bd2b9cf411b748f8a65c0326e..2c3237a2ed222eaf0c5b26c3bbe93d9f73e64d08 100644 (file)
@@ -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
index 90d43903def2858af53c802b18055b43d537a242..fea07e2bb5f80f6e2a8ee541d9e000fdb59d1ce6 100644 (file)
@@ -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>
index 577ad5e2f7122ad7e3d97fed927f92e2d2c09c0b..2e6e1c6e5da31dfef57ef8fc673779827cf468ad 100644 (file)
@@ -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); }
index 567d817dd7b8043be5f1bc60417608c20b7a9ea1..47a1c9af3ab19a3b2f35142c50af0cdea7f6619d 100644 (file)
 # 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.
index cf6857c6678de27b1e23ab8ea60edf478f7ed802..fc28467e29b271b5f76b042457897a8d2af14b01 100644 (file)
@@ -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);
+}
index ea312ff653eb57b5501217e664197418a4b0974a..c40651f13dbd2c2e502c123856f35ae0fe20f7e0 100644 (file)
@@ -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);
+}