[LLVMdev] Iterator issue in BranchFolder::RemoveBlocksWithHash?

Mike Stump mrs at apple.com
Tue May 27 13:40:22 PDT 2008


On May 23, 2008, at 10:19 AM, Dale Johannesen wrote:
> On May 23, 2008, at 4:10 AM, Nicolas Capens wrote:
>
>> 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....

 From n2461:

> 8 The insert members shall not affect the validity of iterators and  
> references to the container, and the erase members shall invalidate  
> only iterators and references to the erased elements.


Pretty clear.

If you play with --i, be careful of iterators that point to the  
beginning.



More information about the llvm-dev mailing list