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

--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jan Kratochvil from comment #6)
> (In reply to Jonathan Wakely from comment #5)
> > I think it's simply wrong to automatically dereference iterators. GDB
> > doesn't do that when printing pointers, so why do the pretty printers do it
> > for iterators?
> 
> The difference is that pointer is memory-unmanaged and this is not fixable. 
> But C++ data structures have memory management (at least they should have).

That doesn't help:

  std::vector<int>::iterator it;
  {
    std::vector<int> v{1};
    it = v.begin();
  }

The iterator is safely initialized, safely updated to a valid value, but is not
dereferenceable after the last statement.

"print it" should not automatically dereference.

> > There are loads of cases where it does the wrong thing, not only for
> > past-the-end iterators but also for default-constructed ones that might
> > contain uninitialized pointers.
> 
> Default-constructed iterators can be detected by _M_sequence==nullptr
> (-D_GLIBCXX_DEBUG).

It works for the example above as well, and I'll make the printers do that. But
most code isn't compiled with debug mode enabled.

Reply via email to