diff --git a/clang/include/clang/Basic/DiagnosticKinds.def b/clang/include/clang/Basic/DiagnosticKinds.def index a29f43f1dd5c..2577e65d3b60 100644 --- a/clang/include/clang/Basic/DiagnosticKinds.def +++ b/clang/include/clang/Basic/DiagnosticKinds.def @@ -536,6 +536,8 @@ DIAG(error_bad_receiver_type, ERROR, "bad receiver type %0") DIAG(error_no_super_class, ERROR, "no super class declared in @interface for %0") +DIAG(error_no_super_class_message, ERROR, + "no @interface declaration found in class messaging of %0") DIAG(error_missing_property_context, ERROR, "missing context for property implementation declaration") DIAG(error_bad_property_context, ERROR, diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index e2825056c575..de99e182d66c 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -190,10 +190,13 @@ Sema::ExprResult Sema::ActOnClassMessage( if (receiverName->isStr("super")) { if (getCurMethodDecl()) { isSuper = true; - ClassDecl = getCurMethodDecl()->getClassInterface()->getSuperClass(); + ObjCInterfaceDecl *OID = getCurMethodDecl()->getClassInterface(); + if (!OID) + return Diag(lbrac, diag::error_no_super_class_message) + << getCurMethodDecl()->getDeclName(); + ClassDecl = OID->getSuperClass(); if (!ClassDecl) - return Diag(lbrac, diag::error_no_super_class) - << getCurMethodDecl()->getClassInterface()->getDeclName(); + return Diag(lbrac, diag::error_no_super_class) << OID->getDeclName(); if (getCurMethodDecl()->isInstance()) { QualType superTy = Context.getObjCInterfaceType(ClassDecl); superTy = Context.getPointerType(superTy); diff --git a/clang/test/SemaObjC/undef-class-messagin-error.m b/clang/test/SemaObjC/undef-class-messagin-error.m new file mode 100644 index 000000000000..6d162ac4e21b --- /dev/null +++ b/clang/test/SemaObjC/undef-class-messagin-error.m @@ -0,0 +1,13 @@ +// RUN: clang -fsyntax-only -verify %s + +@interface _Child ++ (int) flashCache; +@end + +@interface Child (Categ) // expected-error {{cannot find interface declaration for 'Child'}} ++ (int) flushCache2; +@end + +@implementation Child (Categ) // expected-error {{cannot find interface declaration for 'Child'}} ++ (int) flushCache2 { [super flashCache]; } // expected-error {{no @interface declaration found in class messaging of 'flushCache2'}} +@end