From: Argyrios Kyrtzidis Date: Fri, 2 Mar 2012 19:14:29 +0000 (+0000) Subject: [Sema] Fix crash-on-invalid-code issue: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a61e0c4229dc82617a37a68ac2fc08d46e00488;p=clang [Sema] Fix crash-on-invalid-code issue: @class I; @implementation I(cat) // crashes here @end rdar://10968158 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151931 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 996e93a8f9..7822eb217f 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -806,6 +806,10 @@ ObjCIvarDecl *ObjCInterfaceDecl::all_declared_ivar_begin() { /// ObjCCategoryDecl * ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const { + // FIXME: Should make sure no callers ever do this. + if (!hasDefinition()) + return 0; + if (data().ExternallyCompleted) LoadExternalDefinition(); diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 9b492600ca..4df5ab3916 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -820,7 +820,7 @@ Decl *Sema::ActOnStartCategoryImplementation( IdentifierInfo *CatName, SourceLocation CatLoc) { ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName, ClassLoc, true); ObjCCategoryDecl *CatIDecl = 0; - if (IDecl) { + if (IDecl && IDecl->hasDefinition()) { CatIDecl = IDecl->FindCategoryDeclaration(CatName); if (!CatIDecl) { // Category @implementation with no corresponding @interface. diff --git a/test/SemaObjC/category-1.m b/test/SemaObjC/category-1.m index 137309f755..d5ca0e213a 100644 --- a/test/SemaObjC/category-1.m +++ b/test/SemaObjC/category-1.m @@ -95,3 +95,7 @@ @synthesize name = _name; @end +// rdar://10968158 +@class I; // expected-note {{forward declaration}} +@implementation I(cat) // expected-error{{cannot find interface declaration}} +@end