| // RUN: %clang_cc1 -x objective-c -verify -fobjc-arc %s |
| |
| @interface NSObject |
| |
| + (instancetype)new; |
| + (instancetype)alloc; |
| |
| - (void)declaredInSuper; |
| |
| @end |
| |
| @interface NSObject (Category) |
| |
| - (void)declaredInSuperCategory; |
| |
| @end |
| |
| @interface Sub: NSObject |
| |
| - (instancetype)init __attribute__((unavailable)); // expected-note 4 {{'init' has been explicitly marked unavailable here}} |
| |
| - (void)notImplemented __attribute__((unavailable)); |
| |
| - (void)declaredInSuper __attribute__((unavailable)); |
| - (void)declaredInSuperCategory __attribute__((unavailable)); |
| |
| @end |
| |
| @implementation Sub |
| |
| + (Sub *)create { |
| return [[self alloc] init]; |
| } |
| |
| + (Sub *)create2 { |
| return [self new]; |
| } |
| |
| + (Sub *)create3 { |
| return [Sub new]; |
| } |
| |
| - (instancetype) init { |
| return self; |
| } |
| |
| - (void)reportUseOfUnimplemented { |
| [self notImplemented]; |
| } |
| |
| - (void)allowSuperCallUsingSelf { |
| [self declaredInSuper]; |
| [[Sub alloc] declaredInSuper]; |
| [self declaredInSuperCategory]; |
| [[Sub alloc] declaredInSuperCategory]; |
| } |
| |
| @end |
| |
| @interface SubClassContext: Sub |
| @end |
| |
| @implementation SubClassContext |
| |
| - (void)subClassContext { |
| (void)[[Sub alloc] init]; // expected-error {{'init' is unavailable}} |
| (void)[Sub new]; // expected-error {{'new' is unavailable}} |
| } |
| |
| @end |
| |
| void unrelatedContext() { |
| (void)[[Sub alloc] init]; // expected-error {{'init' is unavailable}} |
| (void)[Sub new]; // expected-error {{'new' is unavailable}} |
| } |
| |
| @interface X @end |
| |
| @interface X (Foo) |
| -(void)meth __attribute__((unavailable)); |
| @end |
| |
| @implementation X (Foo) |
| -(void)meth {} |
| -(void)call_it { [self meth]; } |
| @end |