From 8b218000ceccc6094b1524a82476df86d9db83a0 Mon Sep 17 00:00:00 2001 From: Shoaib Meenai Date: Tue, 27 Mar 2018 18:58:28 +0000 Subject: [PATCH] [Sema] Avoid crash for category implementation without interface When we have a category implementation without a corresponding interface (which is an error by itself), semantic checks for property accesses will attempt to access a null interface declaration and then segfault. Error out in such cases instead. Differential Revision: https://reviews.llvm.org/D44916 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@328654 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprMember.cpp | 3 +++ test/SemaObjC/undef-class-property-error.m | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 test/SemaObjC/undef-class-property-error.m diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index d054274289..522e4bbe07 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -1568,6 +1568,9 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R, // Also must look for a getter name which uses property syntax. Selector Sel = S.PP.getSelectorTable().getNullarySelector(Member); ObjCInterfaceDecl *IFace = MD->getClassInterface(); + if (!IFace) + goto fail; + ObjCMethodDecl *Getter; if ((Getter = IFace->lookupClassMethod(Sel))) { // Check the use of this method. diff --git a/test/SemaObjC/undef-class-property-error.m b/test/SemaObjC/undef-class-property-error.m new file mode 100644 index 0000000000..e7e5db41ef --- /dev/null +++ b/test/SemaObjC/undef-class-property-error.m @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +@implementation I (C) // expected-error {{cannot find interface declaration for 'I'}} + ++ (void)f { + self.m; // expected-error {{member reference base type 'Class' is not a structure or union}} +} + +@end -- 2.40.0