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.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64668 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index 6e8154c..76a5c2c 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -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,33 +475,35 @@
                             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;
-      }
-    }
-    if (!CDeclChain)
-      CDecl->insertNextClassCategory();
+    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 (NumProtoRefs) {
     CDecl->addReferencedProtocols((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs);
     CDecl->setLocEnd(EndProtoLoc);