aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-06-18 10:57:45 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2024-06-27 09:39:41 +0100
commit8fd84bc009b3073666a24047c78a04c19eeab752 (patch)
tree93511f5b18b90fdcd28127a35b80b14c7a54c330
parentcfc9fa3bdddc1af59b7854937b99516067fd8c63 (diff)
downloadgcc-8fd84bc009b3073666a24047c78a04c19eeab752.zip
gcc-8fd84bc009b3073666a24047c78a04c19eeab752.tar.gz
gcc-8fd84bc009b3073666a24047c78a04c19eeab752.tar.bz2
libstdc++: Add debug assertions to std::vector<bool> [PR103191]
This adds debug assertions for std::vector<bool> element access. libstdc++-v3/ChangeLog: PR libstdc++/103191 * include/bits/stl_bvector.h (vector<bool>::operator[]) (vector<bool>::front, vector<bool>::back): Add debug assertions. * testsuite/23_containers/vector/bool/element_access/constexpr.cc: Remove dg-error that no longer triggers.
-rw-r--r--libstdc++-v3/include/bits/stl_bvector.h30
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/bool/element_access/constexpr.cc2
2 files changed, 25 insertions, 7 deletions
diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index 52153ca..8685cc6 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -1084,12 +1084,18 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
reference
operator[](size_type __n)
- { return begin()[__n]; }
+ {
+ __glibcxx_requires_subscript(__n);
+ return begin()[__n];
+ }
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
const_reference
operator[](size_type __n) const
- { return begin()[__n]; }
+ {
+ __glibcxx_requires_subscript(__n);
+ return begin()[__n];
+ }
protected:
_GLIBCXX20_CONSTEXPR
@@ -1133,22 +1139,34 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
reference
front()
- { return *begin(); }
+ {
+ __glibcxx_requires_nonempty();
+ return *begin();
+ }
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
const_reference
front() const
- { return *begin(); }
+ {
+ __glibcxx_requires_nonempty();
+ return *begin();
+ }
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
reference
back()
- { return *(end() - 1); }
+ {
+ __glibcxx_requires_nonempty();
+ return *(end() - 1);
+ }
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
const_reference
back() const
- { return *(end() - 1); }
+ {
+ __glibcxx_requires_nonempty();
+ return *(end() - 1);
+ }
_GLIBCXX20_CONSTEXPR
void
diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/element_access/constexpr.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/element_access/constexpr.cc
index bff9f7b..7c60e5d 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/bool/element_access/constexpr.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/bool/element_access/constexpr.cc
@@ -115,4 +115,4 @@ template<typename T = bool>
constexpr std::true_type
access_empty_front() { return {}; }
-static_assert( ! access_empty_front() ); // { dg-error "ambiguous" "PR 103191" { target { ! debug_mode } } }
+static_assert( ! access_empty_front() );