The recently-approved Standard Library Hardening proposal (P3471R4)
gives pop_front and pop_back member functions hardened preconditions,
but std::list was missing assertions on them. Our other sequence
containers do have assertions on those members.

libstdc++-v3/ChangeLog:

        * include/bits/stl_list.h (list::pop_front, list::pop_back):
        Add non-empty assertions.
---

Tested x86_64-linux.

Since it's a conformance requirement that we diagnose Hardened
Preconditions, we should probably have tests that verify these
assertions exist, but ... I ... haven't done that.

 libstdc++-v3/include/bits/stl_list.h | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/bits/stl_list.h 
b/libstdc++-v3/include/bits/stl_list.h
index f987d8b9d0a..82ccb50ff18 100644
--- a/libstdc++-v3/include/bits/stl_list.h
+++ b/libstdc++-v3/include/bits/stl_list.h
@@ -1784,7 +1784,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        */
       void
       pop_front() _GLIBCXX_NOEXCEPT
-      { this->_M_erase(begin()); }
+      {
+       __glibcxx_requires_nonempty();
+       this->_M_erase(begin());
+      }
 
       /**
        *  @brief  Add data to the end of the %list.
@@ -1833,7 +1836,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        */
       void
       pop_back() _GLIBCXX_NOEXCEPT
-      { this->_M_erase(iterator(this->_M_impl._M_node._M_prev)); }
+      {
+       __glibcxx_requires_nonempty();
+       this->_M_erase(iterator(this->_M_impl._M_node._M_prev));
+      }
 
 #if __cplusplus >= 201103L
       /**
-- 
2.48.1

Reply via email to