diff options
author | Patrick Palka <ppalka@redhat.com> | 2020-09-21 20:53:17 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2020-09-21 23:21:34 -0400 |
commit | 37edf28c24b7bd198c27d266af9aefad417635fd (patch) | |
tree | c147da811dc76f898741530ace441b2084670680 | |
parent | 813ad9c4dd5a779f12ad2abf710c6e75a3117ef0 (diff) | |
download | gcc-37edf28c24b7bd198c27d266af9aefad417635fd.zip gcc-37edf28c24b7bd198c27d266af9aefad417635fd.tar.gz gcc-37edf28c24b7bd198c27d266af9aefad417635fd.tar.bz2 |
libstdc++: Remove overzealous static_asserts from std::span
For a span with statically empty extent, we currently model the
preconditions of front(), back(), and operator[] as if they are
mandates, by using a static_assert to verify that extent != 0. This
causes us to reject valid programs that would instantiate these member
functions and at runtime never call them.
Since they are already followed by more general runtime asserts, this
patch just removes these static_asserts altogether,
libstdc++-v3/ChangeLog:
* include/std/span (span::front): Remove static_assert.
(span::back): Likewise.
(span::operator[]): Likewise.
* testsuite/23_containers/span/back_neg.cc: Rewrite to verify
that we check the preconditions of back() only when it's called.
* testsuite/23_containers/span/front_neg.cc: Likewise for
front().
* testsuite/23_containers/span/index_op_neg.cc: Likewise for
operator[].
-rw-r--r-- | libstdc++-v3/include/std/span | 3 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/span/back_neg.cc | 14 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/span/front_neg.cc | 14 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc | 14 |
4 files changed, 30 insertions, 15 deletions
diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span index f658adb..1cdc058 100644 --- a/libstdc++-v3/include/std/span +++ b/libstdc++-v3/include/std/span @@ -264,7 +264,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr reference front() const noexcept { - static_assert(extent != 0); __glibcxx_assert(!empty()); return *this->_M_ptr; } @@ -272,7 +271,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr reference back() const noexcept { - static_assert(extent != 0); __glibcxx_assert(!empty()); return *(this->_M_ptr + (size() - 1)); } @@ -280,7 +278,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr reference operator[](size_type __idx) const noexcept { - static_assert(extent != 0); __glibcxx_assert(__idx < size()); return *(this->_M_ptr + __idx); } diff --git a/libstdc++-v3/testsuite/23_containers/span/back_neg.cc b/libstdc++-v3/testsuite/23_containers/span/back_neg.cc index c451ed1..f777edf 100644 --- a/libstdc++-v3/testsuite/23_containers/span/back_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/back_neg.cc @@ -20,10 +20,16 @@ #include <span> -void -test01() +constexpr bool +test01(bool b) { std::span<int, 0> s; - s.back(); // { dg-error "here" } + if (b || !s.empty()) + s.back(); + return true; } -// { dg-error "static assertion failed" "" { target *-*-* } 0 } + +static_assert(test01(false)); +static_assert(test01(true)); // { dg-error "non-constant" } +// { dg-error "assert" "" { target *-*-* } 0 } +// { dg-prune-output "in 'constexpr' expansion" } diff --git a/libstdc++-v3/testsuite/23_containers/span/front_neg.cc b/libstdc++-v3/testsuite/23_containers/span/front_neg.cc index 38f87aa..14e5bc1 100644 --- a/libstdc++-v3/testsuite/23_containers/span/front_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/front_neg.cc @@ -20,10 +20,16 @@ #include <span> -void -test01() +constexpr bool +test01(bool b) { std::span<int, 0> s; - s.front(); // { dg-error "here" } + if (b || !s.empty()) + s.front(); + return true; } -// { dg-error "static assertion failed" "" { target *-*-* } 0 } + +static_assert(test01(false)); +static_assert(test01(true)); // { dg-error "non-constant" } +// { dg-error "assert" "" { target *-*-* } 0 } +// { dg-prune-output "in 'constexpr' expansion" } diff --git a/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc b/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc index 1e8b2d8..6a3bb88 100644 --- a/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc @@ -20,10 +20,16 @@ #include <span> -void -test01() +constexpr bool +test01(bool b) { std::span<int, 0> s; - s[99]; // { dg-error "here" } + if (b || !s.empty()) + s[99]; + return true; } -// { dg-error "static assertion failed" "" { target *-*-* } 0 } + +static_assert(test01(false)); +static_assert(test01(true)); // { dg-error "non-constant" } +// { dg-error "assert" "" { target *-*-* } 0 } +// { dg-prune-output "in 'constexpr' expansion" } |