diff options
-rw-r--r-- | include/clang/Basic/DiagnosticKinds.def | 2 | ||||
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 9 | ||||
-rw-r--r-- | test/SemaObjC/undef-class-messagin-error.m | 13 |
3 files changed, 21 insertions, 3 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index a29f43f1dd..2577e65d3b 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/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/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index e2825056c5..de99e182d6 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/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/test/SemaObjC/undef-class-messagin-error.m b/test/SemaObjC/undef-class-messagin-error.m new file mode 100644 index 0000000000..6d162ac4e2 --- /dev/null +++ b/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 |