diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-02-18 15:51:27 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-02-18 17:43:36 +0000 |
commit | 9b8e2dea783b3e67813b12c7cb3036b5a9892c65 (patch) | |
tree | 47744e82b548bf1f4bcc08509b58ce03a097c0a9 /libstdc++-v3/testsuite | |
parent | d6c9e372372ee78283a21651313fce965d22274d (diff) | |
download | gcc-9b8e2dea783b3e67813b12c7cb3036b5a9892c65.tar.gz |
libstdc++: P1976R2 Fixed-size span construction from dynamic range
This includes fixes for first, last, as_bytes and as_writable_bytes
which were missing from the paper.
* include/std/span (__cpp_lib_span): Update value.
(span(It, size_type), span(It, End)): Make conditionally explicit. Add
assertion.
(span(R&&), span(const span<OType, OExtent>&)): Likewise and relax
constraints.
(span::first<Count>(), span::last<Count>()): Use explicit type in
return statement.
(as_bytes, as_writable_bytes): Likewise.
* include/std/version (__cpp_lib_span): Update value.
* testsuite/23_containers/span/1.cc: Check new value.
* testsuite/23_containers/span/2.cc: Check new value.
* testsuite/23_containers/span/explicit.cc: New test.
Diffstat (limited to 'libstdc++-v3/testsuite')
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/span/1.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/span/2.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/span/explicit.cc | 48 |
3 files changed, 50 insertions, 2 deletions
diff --git a/libstdc++-v3/testsuite/23_containers/span/1.cc b/libstdc++-v3/testsuite/23_containers/span/1.cc index 7c02aade939..6c622f3e33d 100644 --- a/libstdc++-v3/testsuite/23_containers/span/1.cc +++ b/libstdc++-v3/testsuite/23_containers/span/1.cc @@ -22,6 +22,6 @@ #ifndef __cpp_lib_span # error "Feature-test macro for span missing in <span>" -#elif __cpp_lib_span != 201902L +#elif __cpp_lib_span != 202002L # error "Feature-test macro for span has wrong value in <span>" #endif diff --git a/libstdc++-v3/testsuite/23_containers/span/2.cc b/libstdc++-v3/testsuite/23_containers/span/2.cc index 4a9d1f07325..9e91b5084e0 100644 --- a/libstdc++-v3/testsuite/23_containers/span/2.cc +++ b/libstdc++-v3/testsuite/23_containers/span/2.cc @@ -22,6 +22,6 @@ #ifndef __cpp_lib_span # error "Feature-test macro for span missing in <version>" -#elif __cpp_lib_span != 201902L +#elif __cpp_lib_span != 202002L # error "Feature-test macro for span has wrong value in <version>" #endif diff --git a/libstdc++-v3/testsuite/23_containers/span/explicit.cc b/libstdc++-v3/testsuite/23_containers/span/explicit.cc new file mode 100644 index 00000000000..a763f8045af --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/span/explicit.cc @@ -0,0 +1,48 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include <span> + +struct Range +{ + int* begin(); + int* end(); + unsigned size() const; +} r; + +auto first = std::begin(r), last = std::end(r); + +// span(It, size_type) +std::span<int> s1 = {first, 2}; +std::span<int, 2> s2 = {first, 2}; // { dg-error "could not convert" } + +// span(It, End) +std::span<int> s3 = {first, last}; +std::span<int, 2> s4 = {first, last}; // { dg-error "could not convert" } + +// span(R&&) +std::span<int> s5 = r; +std::span<int, 2> s6 = r; // { dg-error "conversion from" } + +// span(const span<OtherElement, OtherExtent>&) +std::span<const int> s7 = s5; +std::span<const int> s8 = s6; +std::span<const int, 1> s9 = s5.first(1); // { dg-error "conversion from" } +std::span<const int, 1> s10 = s7.first(1); // { dg-error "conversion from" } |