[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