https://gcc.gnu.org/g:8fd84bc009b3073666a24047c78a04c19eeab752
commit r15-1689-g8fd84bc009b3073666a24047c78a04c19eeab752 Author: Jonathan Wakely <jwak...@redhat.com> Date: Tue Jun 18 10:57:45 2024 +0100 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. Diff: --- libstdc++-v3/include/bits/stl_bvector.h | 30 +++++++++++++++++----- .../vector/bool/element_access/constexpr.cc | 2 +- 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 52153cadf8f..8685cc64cc4 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 bff9f7b4e0f..7c60e5db4d1 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() );