Fix ObjCInterfaceDecl::Destroy and ObjCProtocolDecl::Destroy to iterate and destroy all contained ObjCMethodDecls in one sweep. This fixes a use-after-free error found by valgrind.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61943 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index 2263af7..b7c0cf7 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -73,11 +73,8 @@
for (ivar_iterator I=ivar_begin(), E=ivar_end(); I!=E; ++I)
if (*I) (*I)->Destroy(C);
- for (instmeth_iterator I=instmeth_begin(), E=instmeth_end(); I!=E; ++I)
- if (*I) (*I)->Destroy(C);
-
- for (classmeth_iterator I=classmeth_begin(), E=classmeth_end(); I!=E; ++I)
- if (*I) (*I)->Destroy(C);
+ for (method_iterator I=meth_begin(), E=meth_end(); I!=E; ++I)
+ if (*I) const_cast<ObjCMethodDecl*>((*I))->Destroy(C);
// FIXME: Because there is no clear ownership
// role between ObjCInterfaceDecls and the ObjCPropertyDecls that they
@@ -122,11 +119,8 @@
// Referenced Protocols are not owned, so don't Destroy them.
- for (instmeth_iterator I=instmeth_begin(), E=instmeth_end(); I!=E; ++I)
- if (*I) (*I)->Destroy(C);
-
- for (classmeth_iterator I=classmeth_begin(), E=classmeth_end(); I!=E; ++I)
- if (*I) (*I)->Destroy(C);
+ for (method_iterator I=meth_begin(), E=meth_end(); I!=E; ++I)
+ if (*I) const_cast<ObjCMethodDecl*>((*I))->Destroy(C);
// FIXME: Because there is no clear ownership
// role between ObjCProtocolDecls and the ObjCPropertyDecls that they