LWG 3075 basic_string needs deduction guides from basic_string_view

Message ID 20180614202652.GA9787@redhat.com
State New
Headers show
Series
  • LWG 3075 basic_string needs deduction guides from basic_string_view
Related show

Commit Message

Jonathan Wakely June 14, 2018, 8:26 p.m.
* testsuite/21_strings/basic_string/cons/char/deduction.cc: Test
	deduction from string views.
	* testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc:
	Likewise.

Tested powerpc64le-linux, committed to trunk. This is probably worth
backporting to gcc-8-branch too.
commit 5246fd69a47d96b48e1dcdd33c18246c2336af8e
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Jun 14 20:51:00 2018 +0100

    LWG 3075 basic_string needs deduction guides from basic_string_view
    
            * testsuite/21_strings/basic_string/cons/char/deduction.cc: Test
            deduction from string views.
            * testsuite/21_strings/basic_string/cons/wchar_t/deduction.cc:
            Likewise.

Patch

diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index 5bffa1c72a1..fbac38ae973 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -5873,6 +5873,23 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
 	   typename = _RequireAllocator<_Allocator>>
     basic_string(_InputIterator, _InputIterator, _Allocator = _Allocator())
       -> basic_string<_CharT, char_traits<_CharT>, _Allocator>;
+
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // 3075. basic_string needs deduction guides from basic_string_view
+  template<typename _CharT, typename _Traits,
+	   typename _Allocator = allocator<_CharT>,
+	   typename = _RequireAllocator<_Allocator>>
+    basic_string(basic_string_view<_CharT, _Traits>, const _Allocator& = _Allocator())
+      -> basic_string<_CharT, _Traits, _Allocator>;
+
+  template<typename _CharT, typename _Traits,
+	   typename _Allocator = allocator<_CharT>,
+	   typename = _RequireAllocator<_Allocator>>
+    basic_string(basic_string_view<_CharT, _Traits>,
+		 typename basic_string<_CharT, _Traits, _Allocator>::size_type,
+		 typename basic_string<_CharT, _Traits, _Allocator>::size_type,
+		 const _Allocator& = _Allocator())
+      -> basic_string<_CharT, _Traits, _Allocator>;
 _GLIBCXX_END_NAMESPACE_CXX11
 #endif
 
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 f7dee1e6141..cf6857c6678 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
@@ -118,3 +118,23 @@  test04()
   std::basic_string s4((char32_t)1, U'a', std::allocator<char32_t>());
   check_type<std::u32string>(s4);
 }
+
+void
+test05()
+{
+  // LWG 3075 basic_string needs deduction guides from basic_string_view
+  std::string_view sv{"A View to a Kill"};
+  const std::allocator<char> a;
+
+  std::basic_string s1(sv);
+  check_type<std::string>(s1);
+
+  std::basic_string s2(sv, a);
+  check_type<std::string>(s2);
+
+  std::basic_string s3(sv, 2u, 6u);
+  check_type<std::string>(s3);
+
+  std::basic_string s4(sv, 2u, 6u, a);
+  check_type<std::string>(s4);
+}
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 7fe367b56dd..ea312ff653e 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
@@ -77,3 +77,23 @@  test02()
   std::basic_string s4((wchar_t)1, L'a', std::allocator<wchar_t>());
   check_type<std::wstring>(s4);
 }
+
+void
+test05()
+{
+  // LWG 3075 basic_string needs deduction guides from basic_string_view
+  std::wstring_view sv{L"A View to a Kill"};
+  const std::allocator<wchar_t> a;
+
+  std::basic_string s1(sv);
+  check_type<std::wstring>(s1);
+
+  std::basic_string s2(sv, a);
+  check_type<std::wstring>(s2);
+
+  std::basic_string s3(sv, 2u, 6u);
+  check_type<std::wstring>(s3);
+
+  std::basic_string s4(sv, 2u, 6u, a);
+  check_type<std::wstring>(s4);
+}