From: David Blaikie Date: Wed, 7 May 2014 06:18:00 +0000 (+0000) Subject: PR19562: Fix memory leak when ObjC interface types cause the creation of further... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=941635575ff6afeae4439ce08bdcfbb19b6f15f7;p=clang PR19562: Fix memory leak when ObjC interface types cause the creation of further interfaces. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208161 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index b62cc2546f..5aeeaa4143 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -3332,11 +3332,15 @@ void CGDebugInfo::finalize() { Ty.replaceAllUsesWith(CGM.getLLVMContext(), RepTy); } - for (auto E : ObjCInterfaceCache) + // Creating types might create further types - invalidating the current + // element and the size(), so don't cache/reference them. + for (size_t i = 0; i != ObjCInterfaceCache.size(); ++i) { + ObjCInterfaceCacheEntry E = ObjCInterfaceCache[i]; E.Decl.replaceAllUsesWith(CGM.getLLVMContext(), E.Type->getDecl()->getDefinition() ? CreateTypeDefinition(E.Type, E.Unit) : E.Decl); + } // We keep our own list of retained types, because we need to look // up the final type in the type cache.