https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104017

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Martin Sebor from comment #1)

> This test case also triggers a warning, for the same reason: GCC can't
> determine the relationship between a deque's internal node pointers and the
> result of std::deque::size() (which is a function of the node pointers).

Is the warning in this case coming from this function?

      void
      pop_back() _GLIBCXX_NOEXCEPT
      {
        __glibcxx_requires_nonempty();
        if (this->_M_impl._M_finish._M_cur
            != this->_M_impl._M_finish._M_first)
          {
            --this->_M_impl._M_finish._M_cur;
            _Alloc_traits::destroy(_M_get_Tp_allocator(),
                                   this->_M_impl._M_finish._M_cur);
          }
        else
          _M_pop_back_aux();
      }

I don't see what size() has got to do with anything, we explicitly check that
_M_cur is not the start of the node.

With -D_GLIBCXX_ASSERTIONS the first line of the function expands to:

  __glibcxx_assert(!this->empty())

but it still warns.

What else are we supposed to do there to let the compiler know the object we're
destroying is valid? Do we need to add a third way to check the deque is not
empty?

Reply via email to