[cfe-commits] r166188 - /cfe/trunk/lib/Sema/SemaInit.cpp

Rafael EspĂ­ndola rafael.espindola at gmail.com
Thu Oct 18 10:24:57 PDT 2012


I still think this should include a testcase.

On 18 October 2012 12:57, David Blaikie <dblaikie at gmail.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list