aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-02-19 14:41:46 +0000
committerJonathan Wakely <jwakely@redhat.com>2020-02-19 15:28:33 +0000
commit66ae31eb308e5bc90ce6dfd0a67381a0929a6aa0 (patch)
treeb33c676794c3d8adaac4007d12201db29a5b38f9
parent247f410b83797a1840573840cc2a539ef9d7f96b (diff)
downloadgcc-66ae31eb308e5bc90ce6dfd0a67381a0929a6aa0.zip
gcc-66ae31eb308e5bc90ce6dfd0a67381a0929a6aa0.tar.gz
gcc-66ae31eb308e5bc90ce6dfd0a67381a0929a6aa0.tar.bz2
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.
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/std/span6
-rw-r--r--libstdc++-v3/testsuite/23_containers/span/deduction.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/span/lwg3255.cc4
4 files changed, 15 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index f5f8b6f..18085f3 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 ccfd7db..16b09a1 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 66e955e..2fe1ac4 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 91edf6a..03ced2c 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>&> );