]> granicus.if.org Git - clang/commitdiff
Objective-C. Prevent an assertion crash due to buggy code
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 11 Mar 2014 18:56:18 +0000 (18:56 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 11 Mar 2014 18:56:18 +0000 (18:56 +0000)
as it can commonly happen. // rdar://16261494

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

lib/AST/DeclObjC.cpp
test/SemaObjC/attr-designated-init.m

index b76fc5cf38af28a944a75fb34b6f3582937e0fc0..094110fecf8647c43c86cd607748a69163c38719 100644 (file)
@@ -415,7 +415,9 @@ bool ObjCInterfaceDecl::inheritsDesignatedInitializers() const {
 
 void ObjCInterfaceDecl::getDesignatedInitializers(
     llvm::SmallVectorImpl<const ObjCMethodDecl *> &Methods) const {
-  assert(hasDefinition());
+  // Check for a complete definition and recover if not so.
+  if (!isThisDeclarationADefinition())
+    return;
   if (data().ExternallyCompleted)
     LoadExternalDefinition();
 
@@ -433,7 +435,9 @@ void ObjCInterfaceDecl::getDesignatedInitializers(
 
 bool ObjCInterfaceDecl::isDesignatedInitializer(Selector Sel,
                                       const ObjCMethodDecl **InitMethod) const {
-  assert(hasDefinition());
+  // Check for a complete definition and recover if not so.
+  if (!isThisDeclarationADefinition())
+    return false;
   if (data().ExternallyCompleted)
     LoadExternalDefinition();
 
@@ -1197,12 +1201,16 @@ void ObjCInterfaceDecl::setExternallyCompleted() {
 }
 
 void ObjCInterfaceDecl::setHasDesignatedInitializers() {
-  assert(hasDefinition() && "Forward declarations can't contain methods");
+  // Check for a complete definition and recover if not so.
+  if (!isThisDeclarationADefinition())
+    return;
   data().HasDesignatedInitializers = true;
 }
 
 bool ObjCInterfaceDecl::hasDesignatedInitializers() const {
-  assert(hasDefinition() && "Forward declarations can't contain methods");
+  // Check for a complete definition and recover if not so.
+  if (!isThisDeclarationADefinition())
+    return false;
   if (data().ExternallyCompleted)
     LoadExternalDefinition();
 
index 0432a1859bb77094c0e3fa6ed3b9f2ac33376a94..d24c9c65cbbe644f0aaf500f3480f150a2b661df 100644 (file)
@@ -238,3 +238,13 @@ __attribute__((objc_root_class))
   return 0;
 }
 @end
+
+// rdar://16261494
+@class GEOPDAnalyticMetadata; // expected-note {{forward declaration of class here}}
+
+@implementation GEOPDAnalyticMetadata (PlaceCardExtras) // expected-error {{cannot find interface declaration for 'GEOPDAnalyticMetadata'}}
+- (instancetype)initInProcess
+{
+    return ((void*)0);
+}
+@end