[cfe-commits] r64668 - /cfe/trunk/lib/Sema/SemaDeclObjC.cpp

Chris Lattner sabre at nondot.org
Mon Feb 16 13:26:43 PST 2009


Author: lattner
Date: Mon Feb 16 15:26:43 2009
New Revision: 64668

URL: http://llvm.org/viewvc/llvm-project?rev=64668&view=rev
Log:
early exit on error.  This code is creating an invalid decl on error.  This is
dubious, but at least mark it as an invalid decl.

Modified:
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=64668&r1=64667&r2=64668&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Mon Feb 16 15:26:43 2009
@@ -325,8 +325,7 @@
 /// declarations in base and its super class, if any, and issues
 /// diagnostics in a variety of inconsistant situations.
 ///
-void 
-Sema::ComparePropertiesInBaseAndSuper(ObjCInterfaceDecl *IDecl) {
+void Sema::ComparePropertiesInBaseAndSuper(ObjCInterfaceDecl *IDecl) {
   ObjCInterfaceDecl *SDecl = IDecl->getSuperClass();
   if (!SDecl)
     return;
@@ -390,10 +389,8 @@
 /// declared in 'MergeItsProtocols' objects (which can be a class or an
 /// inherited protocol into the list of properties for class/category 'CDecl'
 ///
-
-void
-Sema::MergeProtocolPropertiesIntoClass(Decl *CDecl,
-                                       DeclTy *MergeItsProtocols) {
+void Sema::MergeProtocolPropertiesIntoClass(Decl *CDecl,
+                                            DeclTy *MergeItsProtocols) {
   Decl *ClassDecl = static_cast<Decl *>(MergeItsProtocols);
   ObjCInterfaceDecl *IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(CDecl);
 
@@ -478,32 +475,34 @@
                             DeclTy * const *ProtoRefs,
                             unsigned NumProtoRefs,
                             SourceLocation EndProtoLoc) {
-  ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName);
-  
   ObjCCategoryDecl *CDecl = 
     ObjCCategoryDecl::Create(Context, CurContext, AtInterfaceLoc, CategoryName);
   // FIXME: PushOnScopeChains?
   CurContext->addDecl(CDecl);
-  CDecl->setClassInterface(IDecl);
-  
+
+  ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName);
   /// Check that class of this category is already completely declared.
-  if (!IDecl || IDecl->isForwardDecl())
+  if (!IDecl || IDecl->isForwardDecl()) {
+    CDecl->setInvalidDecl();
     Diag(ClassLoc, diag::err_undef_interface) << ClassName;
-  else {
-    /// Check for duplicate interface declaration for this category
-    ObjCCategoryDecl *CDeclChain;
-    for (CDeclChain = IDecl->getCategoryList(); CDeclChain;
-         CDeclChain = CDeclChain->getNextClassCategory()) {
-      if (CategoryName && CDeclChain->getIdentifier() == CategoryName) {
-        Diag(CategoryLoc, diag::warn_dup_category_def)
-          << ClassName << CategoryName;
-        Diag(CDeclChain->getLocation(), diag::note_previous_definition);
-        break;
-      }
+    return CDecl;
+  }
+
+  CDecl->setClassInterface(IDecl);
+
+  /// Check for duplicate interface declaration for this category
+  ObjCCategoryDecl *CDeclChain;
+  for (CDeclChain = IDecl->getCategoryList(); CDeclChain;
+       CDeclChain = CDeclChain->getNextClassCategory()) {
+    if (CategoryName && CDeclChain->getIdentifier() == CategoryName) {
+      Diag(CategoryLoc, diag::warn_dup_category_def)
+      << ClassName << CategoryName;
+      Diag(CDeclChain->getLocation(), diag::note_previous_definition);
+      break;
     }
-    if (!CDeclChain)
-      CDecl->insertNextClassCategory();
   }
+  if (!CDeclChain)
+    CDecl->insertNextClassCategory();
 
   if (NumProtoRefs) {
     CDecl->addReferencedProtocols((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs);





More information about the cfe-commits mailing list