I still think this should include a testcase.
On 18 October 2012 12:57, David Blaikie <[email protected]> wrote: > Author: dblaikie > Date: Thu Oct 18 11:57:32 2012 > New Revision: 166188 > > URL: http://llvm.org/viewvc/llvm-project?rev=166188&view=rev > Log: > PR14021: Copy lookup results to ensure safe iteration. > > Within the body of the loop the underlying map may be modified via > > Sema::AddOverloadCandidate > -> Sema::CompareReferenceRelationship > -> Sema::RequireCompleteType > > to avoid the use of invalid iterators the sequence is copied first. > > A reliable, though large, test case is available - it will be reduced and > committed shortly. > > Patch by Robert Muth. Review by myself, Nico Weber, and Rafael Espindola. > > Modified: > cfe/trunk/lib/Sema/SemaInit.cpp > > Modified: cfe/trunk/lib/Sema/SemaInit.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=166188&r1=166187&r2=166188&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaInit.cpp (original) > +++ cfe/trunk/lib/Sema/SemaInit.cpp Thu Oct 18 11:57:32 2012 > @@ -3700,8 +3700,14 @@ > > // Try to complete the type we're converting to. > if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) { > - DeclContext::lookup_iterator Con, ConEnd; > - for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl); > + DeclContext::lookup_iterator ConOrig, ConEndOrig; > + llvm::tie(ConOrig, ConEndOrig) = S.LookupConstructors(DestRecordDecl); > + // The container holding the constructors can under certain conditions > + // be changed while iterating. To be safe we copy the lookup results > + // to a new container. > + SmallVector<NamedDecl*, 8> CopyOfCon(ConOrig, ConEndOrig); > + for (SmallVector<NamedDecl*, 8>::iterator > + Con = CopyOfCon.begin(), ConEnd = CopyOfCon.end(); > Con != ConEnd; ++Con) { > NamedDecl *D = *Con; > DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess()); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
