[LLVMdev] Iterator issue in BranchFolder::RemoveBlocksWithHash?
Dale Johannesen
dalej at apple.com
Fri May 23 10:19:53 PDT 2008
On May 23, 2008, at 4:10 AM, Nicolas Capens wrote:
> Hi all,
>
> I updated from 2.2 to the latest SVN head and I now get a debug
> assert in BranchFolder::RemoveBlocksWithHash: “vector iterators
> incompatible”. I’m using Visual C++ 2005. I think this is the
> culprit code:
>
> MergePotentials.erase(CurMPIter);
> if (CurMPIter==B)
> break;
>
> The erase clears the _Mycont field (i.e. the iterator’s container),
> while the == expects CurMPIter and B to have the same container. I’m
> no STL guru but it seems wrong to first erase an element and then
> try to compare it. I traced it back to revision 50921 made on May
> 10’th. I rewrote it like following, which I’m not entirely sure is
> the intended behavior but it ‘works for me’:
>
> CurMPIter = MergePotentials.erase(CurMPIter);
> if (CurMPIter==B)
> break;
Thanks for analyzing the problem.
I also am not a STL guru; the standard says erase
"Invalidates all the iterators and references after the point of the
erase"
which is not wonderfully worded, but I take it to mean an iterator
referring to the point of the erase remains valid....But if it doesn't
work that way on VC++, it doesn't. Now I know.
It's clearly better to call erase only once, so I've rewritten it that
way. Please make sure it works for you.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080523/2bdb4ccf/attachment.html>
More information about the llvm-dev
mailing list