[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