public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/ranger] libstdc++: span's deduction-guide for built-in arrays doesn't work (LWG 3369)
@ 2020-06-17 19:01 Aldy Hernandez
  0 siblings, 0 replies; only message in thread
From: Aldy Hernandez @ 2020-06-17 19:01 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:66ae31eb308e5bc90ce6dfd0a67381a0929a6aa0

commit 66ae31eb308e5bc90ce6dfd0a67381a0929a6aa0
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Feb 19 14:41:46 2020 +0000

    libstdc++: span's deduction-guide for built-in arrays doesn't work (LWG 3369)
    
    The 23_containers/span/deduction.cc test was already passing, but only
    because I had previously implemented the original proposed resolution of
    3255. As pointed out in 3255 that original P/R was incorrect because it
    broke construction from array xvalues. This reverts the incorrect part
    of 3255 (and adds tests for the case it broke), and implements the
    resolution of 3369 instead.
    
            * include/std/span (span(T (&)[N])): Use non-deduced context to
            prevent first parameter from interfering with class template argument
            deduction (LWG 3369).
            * testsuite/23_containers/span/deduction.cc: Add missing 'const'.
            * testsuite/23_containers/span/lwg3255.cc: Check for construction from
            rvalues.

Diff:
---
 libstdc++-v3/ChangeLog                                 | 7 +++++++
 libstdc++-v3/include/std/span                          | 6 +++---
 libstdc++-v3/testsuite/23_containers/span/deduction.cc | 2 +-
 libstdc++-v3/testsuite/23_containers/span/lwg3255.cc   | 4 ++++
 4 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f5f8b6fd500..18085f3d9bd 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,12 @@
 2020-02-19  Jonathan Wakely  <jwakely@redhat.com>
 
+	* include/std/span (span(T (&)[N])): Use non-deduced context to
+	prevent first parameter from interfering with class template argument
+	deduction (LWG 3369).
+	* testsuite/23_containers/span/deduction.cc: Add missing 'const'.
+	* testsuite/23_containers/span/lwg3255.cc: Check for construction from
+	rvalues.
+
 	* include/std/span (span::const_iterator, span::const_reverse_iterator)
 	(span::cbegin(), span::cend(), span::crbegin(), span::crend()):
 	Remove (LWG 3320).
diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span
index ccfd7db39fe..16b09a1e50c 100644
--- a/libstdc++-v3/include/std/span
+++ b/libstdc++-v3/include/std/span
@@ -182,10 +182,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	    }
 	}
 
-      template<typename _Tp, size_t _ArrayExtent>
-	requires __is_compatible_array<_Tp, _ArrayExtent>::value
+      template<size_t _ArrayExtent>
+	requires (_Extent == dynamic_extent || _ArrayExtent == _Extent)
 	constexpr
-	span(_Tp (&__arr)[_ArrayExtent]) noexcept
+	span(type_identity_t<element_type> (&__arr)[_ArrayExtent]) noexcept
 	: span(static_cast<pointer>(__arr), _ArrayExtent)
 	{ }
 
diff --git a/libstdc++-v3/testsuite/23_containers/span/deduction.cc b/libstdc++-v3/testsuite/23_containers/span/deduction.cc
index 66e955e961b..2fe1ac477c8 100644
--- a/libstdc++-v3/testsuite/23_containers/span/deduction.cc
+++ b/libstdc++-v3/testsuite/23_containers/span/deduction.cc
@@ -73,7 +73,7 @@ test01()
   std::span s9(s2);
   static_assert( is_static_span<int, 2>(s9) );
 
-  std::span s10(const_cast<std::span<int, 2>&>(s2));
+  std::span s10(const_cast<const std::span<int, 2>&>(s2));
   static_assert( is_static_span<int, 2>(s10) );
 
   std::span s11(s5);
diff --git a/libstdc++-v3/testsuite/23_containers/span/lwg3255.cc b/libstdc++-v3/testsuite/23_containers/span/lwg3255.cc
index 91edf6a04fd..03ced2c8710 100644
--- a/libstdc++-v3/testsuite/23_containers/span/lwg3255.cc
+++ b/libstdc++-v3/testsuite/23_containers/span/lwg3255.cc
@@ -57,10 +57,14 @@ static_assert( !is_constructible_v<span<const int, 1>, const array<const int, 2>
 static_assert( is_constructible_v<span<int>, int(&)[2]> );
 static_assert( is_constructible_v<span<const int>, int(&)[2]> );
 static_assert( is_constructible_v<span<const int>, const int(&)[2]> );
+static_assert( is_constructible_v<span<const int>, int[2]> );
+static_assert( is_constructible_v<span<const int>, const int[2]> );
 
 static_assert( is_constructible_v<span<int>, array<int, 2>&> );
 static_assert( is_constructible_v<span<const int>, array<int, 2>&> );
 static_assert( is_constructible_v<span<const int>, array<const int, 2>&> );
+static_assert( is_constructible_v<span<const int>, array<int, 2>> );
+static_assert( is_constructible_v<span<const int>, array<const int, 2>> );
 
 static_assert( is_constructible_v<span<const int>, const array<int, 2>&> );
 static_assert( is_constructible_v<span<const int>, const array<const int, 2>&> );


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-17 19:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-17 19:01 [gcc/devel/ranger] libstdc++: span's deduction-guide for built-in arrays doesn't work (LWG 3369) Aldy Hernandez

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).