]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Add debug assertions to std::list and std::forward_list
authorJonathan Wakely <jwakely@redhat.com>
Fri, 15 Nov 2024 22:03:20 +0000 (22:03 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 27 Nov 2024 12:30:01 +0000 (12:30 +0000)
While working on fancy pointer support for the linked lists I noticed
they didn't have any debug assertions. This adds the obvious non-empty
assertions to front() and back().

libstdc++-v3/ChangeLog:

* include/bits/forward_list.h (forward_list::front): Add
non-empty assertions.
* include/bits/stl_list.h (list::front, list::back): Add
non-empty assertions.

libstdc++-v3/include/bits/forward_list.h
libstdc++-v3/include/bits/stl_list.h

index ac1b3593c79489d5b04d2d732b4c2d048d2506e8..f6d4e6bd3d266e021b74ba60a7246fb32e6ab618 100644 (file)
@@ -42,6 +42,7 @@
 #include <bits/allocator.h>
 #include <ext/alloc_traits.h>
 #include <ext/aligned_buffer.h>
+#include <debug/assertions.h>
 #if __glibcxx_ranges_to_container // C++ >= 23
 # include <bits/ranges_base.h> // ranges::begin, ranges::distance etc.
 # include <bits/ranges_util.h> // ranges::subrange
@@ -950,6 +951,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       reference
       front()
       {
+       __glibcxx_requires_nonempty();
        _Node* __front = static_cast<_Node*>(this->_M_impl._M_head._M_next);
        return *__front->_M_valptr();
       }
@@ -962,6 +964,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       const_reference
       front() const
       {
+       __glibcxx_requires_nonempty();
        _Node* __front = static_cast<_Node*>(this->_M_impl._M_head._M_next);
        return *__front->_M_valptr();
       }
index 3f92de42996e3b55581daa2a73ae221b6f0de407..df7f388ede5a9b334e61314fc49e31cf8ee4f672 100644 (file)
@@ -59,6 +59,7 @@
 
 #include <bits/concept_check.h>
 #include <ext/alloc_traits.h>
+#include <debug/assertions.h>
 #if __cplusplus >= 201103L
 #include <initializer_list>
 #include <bits/allocated_ptr.h>
@@ -1271,7 +1272,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       _GLIBCXX_NODISCARD
       reference
       front() _GLIBCXX_NOEXCEPT
-      { return *begin(); }
+      {
+       __glibcxx_requires_nonempty();
+       return *begin();
+      }
 
       /**
        *  Returns a read-only (constant) reference to the data at the first
@@ -1280,7 +1284,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       _GLIBCXX_NODISCARD
       const_reference
       front() const _GLIBCXX_NOEXCEPT
-      { return *begin(); }
+      {
+       __glibcxx_requires_nonempty();
+       return *begin();
+      }
 
       /**
        *  Returns a read/write reference to the data at the last element
@@ -1290,6 +1297,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       reference
       back() _GLIBCXX_NOEXCEPT
       {
+       __glibcxx_requires_nonempty();
        iterator __tmp = end();
        --__tmp;
        return *__tmp;
@@ -1303,6 +1311,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       const_reference
       back() const _GLIBCXX_NOEXCEPT
       {
+       __glibcxx_requires_nonempty();
        const_iterator __tmp = end();
        --__tmp;
        return *__tmp;