From: Fariborz Jahanian Date: Tue, 9 Oct 2007 17:05:22 +0000 (+0000) Subject: Prevent memory leak by not creating a category object when there is a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=22d71d6805de7e5da53006e6941ab62ebb3d6156;p=clang Prevent memory leak by not creating a category object when there is a fatal error of category's undefined interface. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42790 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index 3eb50ff08f..2a006d87e6 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -1063,17 +1063,17 @@ Sema::DeclTy *Sema::ActOnStartCategoryInterface(Scope* S, IdentifierInfo *CategoryName, SourceLocation CategoryLoc, IdentifierInfo **ProtoRefNames, unsigned NumProtoRefs) { ObjcInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName); - ObjcCategoryDecl *CDecl = new ObjcCategoryDecl(AtInterfaceLoc, NumProtoRefs, - CategoryName); - bool err = false; - CDecl->setClassInterface(IDecl); - + ObjcCategoryDecl *CDecl; + /// Check that class of this category is already completely declared. if (!IDecl || IDecl->isForwardDecl()) { Diag(ClassLoc, diag::err_undef_interface, ClassName->getName()); - err = true; + return 0; } else { + CDecl = new ObjcCategoryDecl(AtInterfaceLoc, NumProtoRefs, + CategoryName); + CDecl->setClassInterface(IDecl); /// Check for duplicate interface declaration for this category ObjcCategoryDecl *CDeclChain; for (CDeclChain = IDecl->getListCategories(); CDeclChain; @@ -1081,7 +1081,6 @@ Sema::DeclTy *Sema::ActOnStartCategoryInterface(Scope* S, if (CDeclChain->getIdentifier() == CategoryName) { Diag(CategoryLoc, diag::err_dup_category_def, ClassName->getName(), CategoryName->getName()); - err = true; break; } } @@ -1097,12 +1096,11 @@ Sema::DeclTy *Sema::ActOnStartCategoryInterface(Scope* S, Diag(CategoryLoc, diag::err_undef_protocolref, ProtoRefNames[i]->getName(), CategoryName->getName()); - err = true; } CDecl->setCatReferencedProtocols((int)i, RefPDecl); } - return err ? 0 : CDecl; + return CDecl; } /// ActOnStartCategoryImplementation - Perform semantic checks on the