| // RUN: %clang_cc1 -fsyntax-only -fblocks -triple x86_64-apple-darwin10 -verify %s |
| // rdar://9092208 |
| |
| __attribute__((unavailable("not available"))) |
| @interface MyClass { // expected-note 7 {{'MyClass' has been explicitly marked unavailable here}} |
| @public |
| void *_test; |
| MyClass *ivar; // no error. |
| } |
| |
| - (id)self; |
| - new; |
| + (void)addObject:(id)anObject; |
| - (MyClass *)meth; // no error. |
| |
| @end |
| |
| @interface Gorf { |
| MyClass *ivar; // expected-error {{unavailable}} |
| } |
| - (MyClass *)meth; // expected-error {{unavailable}} |
| @end |
| |
| @interface MyClass (Cat1) |
| - (MyClass *)meth; // no error. |
| @end |
| |
| @interface MyClass (Cat2) // no error. |
| @end |
| |
| @implementation MyClass (Cat2) // no error. |
| @end |
| |
| int main() { |
| [MyClass new]; // expected-error {{'MyClass' is unavailable: not available}} |
| [MyClass self]; // expected-error {{'MyClass' is unavailable: not available}} |
| [MyClass addObject:((void *)0)]; // expected-error {{'MyClass' is unavailable: not available}} |
| |
| MyClass *foo = [MyClass new]; // expected-error 2 {{'MyClass' is unavailable: not available}} |
| |
| 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; |
| } |
| |
| #define UNAVAILABLE __attribute__((unavailable("not available"))) |
| |
| UNAVAILABLE |
| @interface Base // expected-note {{unavailable here}} |
| @end |
| |
| UNAVAILABLE |
| @protocol SomeProto // expected-note 4 {{unavailable here}} |
| @end |
| |
| @interface Sub : Base<SomeProto> // expected-error 2 {{unavailable}} |
| @end |
| @interface IP<SomeProto> // expected-error {{unavailable}} |
| @end |
| @protocol SubProt<SomeProto> // expected-error {{unavailable}} |
| @end |
| @interface Sub(cat)<SomeProto> // expected-error {{unavailable}} |
| @end |
| |
| UNAVAILABLE |
| @interface UnavailSub : Base<SomeProto> // no error |
| @end |
| UNAVAILABLE |
| @interface UnavailIP<SomeProto> // no error |
| @end |
| UNAVAILABLE |
| @protocol UnavailProt<SomeProto> // no error |
| @end |
| @interface UnavailSub(cat)<SomeProto> // no error |
| @end |
| |
| int unavail_global UNAVAILABLE; |
| |
| UNAVAILABLE __attribute__((objc_root_class)) |
| @interface TestAttrContext |
| -meth; |
| @end |
| |
| @implementation TestAttrContext |
| -meth { |
| unavail_global = 2; // no warn |
| (void) ^{ |
| unavail_global = 4; // no warn |
| }; |
| } |
| @end |
| |
| typedef int unavailable_int UNAVAILABLE; |
| |
| UNAVAILABLE |
| @interface A |
| extern unavailable_int global_unavailable; // FIXME: this should be an error! |
| @end |