From 285b6b658531e257d0f495111939777e3dc74348 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 18 Jun 2014 17:58:27 +0000 Subject: [PATCH] Objective-C. Attributes on class declarations carry over to forward class declarations for diagnosis. // rdar://16681279 llvm-svn: 211195 --- clang/lib/Sema/SemaExpr.cpp | 6 ++++++ clang/test/SemaObjC/class-unavail-warning.m | 29 ++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0e1aade..4b4cb6c 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -87,6 +87,12 @@ static AvailabilityResult DiagnoseAvailabilityOfDecl(Sema &S, bool ObjCPropertyAccess) { // See if this declaration is unavailable or deprecated. std::string Message; + + // Forward class declarations get their attributes from their definition. + if (ObjCInterfaceDecl *IDecl = dyn_cast(D)) { + if (IDecl->getDefinition()) + D = IDecl->getDefinition(); + } AvailabilityResult Result = D->getAvailability(&Message); if (const EnumConstantDecl *ECD = dyn_cast(D)) if (Result == AR_Available) { diff --git a/clang/test/SemaObjC/class-unavail-warning.m b/clang/test/SemaObjC/class-unavail-warning.m index a337c97..b903e27 100644 --- a/clang/test/SemaObjC/class-unavail-warning.m +++ b/clang/test/SemaObjC/class-unavail-warning.m @@ -15,7 +15,7 @@ __attribute__((unavailable("not available"))) @end -@interface Foo { +@interface Gorf { MyClass *ivar; // expected-error {{unavailable}} } - (MyClass *)meth; // expected-error {{unavailable}} @@ -40,3 +40,30 @@ int main() { return 0; } + +// rdar://16681279 +@interface NSObject @end + +__attribute__((visibility("default"))) __attribute__((availability(macosx,unavailable))) +@interface Foo : NSObject @end // expected-note 3 {{'Foo' has been explicitly marked unavailable here}} +@interface AppDelegate : NSObject +@end + +@class Foo; + +@implementation AppDelegate +- (void) applicationDidFinishLaunching +{ + Foo *foo = 0; // expected-error {{'Foo' is unavailable}} +} +@end + +@class Foo; +Foo *g_foo = 0; // expected-error {{'Foo' is unavailable}} + +@class Foo; +@class Foo; +@class Foo; +Foo * f_func() { // expected-error {{'Foo' is unavailable}} + return 0; +} -- 2.7.4