]> granicus.if.org Git - clang/commitdiff
Prevent memory leak by not creating a category object when there is a
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 9 Oct 2007 17:05:22 +0000 (17:05 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 9 Oct 2007 17:05:22 +0000 (17:05 +0000)
fatal error of category's undefined interface.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42790 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaDecl.cpp

index 3eb50ff08f3e3aa12219f1e77f075e84eab977eb..2a006d87e638e45cc43b601fb16aaeade3431ce0 100644 (file)
@@ -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