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 + * 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 - requires __is_compatible_array<_Tp, _ArrayExtent>::value + template + requires (_Extent == dynamic_extent || _ArrayExtent == _Extent) constexpr - span(_Tp (&__arr)[_ArrayExtent]) noexcept + span(type_identity_t (&__arr)[_ArrayExtent]) noexcept : span(static_cast(__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(s9) ); - std::span s10(const_cast&>(s2)); + std::span s10(const_cast&>(s2)); static_assert( is_static_span(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, const array static_assert( is_constructible_v, int(&)[2]> ); static_assert( is_constructible_v, int(&)[2]> ); static_assert( is_constructible_v, const int(&)[2]> ); +static_assert( is_constructible_v, int[2]> ); +static_assert( is_constructible_v, const int[2]> ); static_assert( is_constructible_v, array&> ); static_assert( is_constructible_v, array&> ); static_assert( is_constructible_v, array&> ); +static_assert( is_constructible_v, array> ); +static_assert( is_constructible_v, array> ); static_assert( is_constructible_v, const array&> ); static_assert( is_constructible_v, const array&> );