| // RUN: %clang_cc1 -triple x86_64-apple-macosx-10.9 -Wunguarded-availability -fblocks -fsyntax-only -verify %s |
| |
| __attribute__((objc_root_class)) |
| @interface NSObject |
| +(instancetype)new; |
| -(instancetype)init; |
| @end |
| |
| @interface MyObject : NSObject |
| -(instancetype)init __attribute__((unavailable)); // expected-note{{'init' has been explicitly marked unavailable here}} |
| @end |
| |
| void usemyobject() { |
| [MyObject new]; // expected-error{{'new' is unavailable}} |
| } |
| |
| @interface MyOtherObject : NSObject |
| +(instancetype)init __attribute__((unavailable)); |
| +(instancetype)new; |
| @end |
| |
| void usemyotherobject() { |
| [MyOtherObject new]; // no error; new is overrideen. |
| } |
| |
| @interface NotGoodOverride : NSObject |
| +(instancetype)init __attribute__((unavailable)); |
| -(instancetype)new; |
| +(instancetype)new: (int)x; |
| @end |
| |
| void usenotgoodoverride() { |
| [NotGoodOverride new]; // no error |
| } |
| |
| @interface NotNSObject |
| +(instancetype)new; |
| -(instancetype)init; |
| @end |
| |
| @interface NotMyObject : NotNSObject |
| -(instancetype)init __attribute__((unavailable)); |
| @end |
| |
| void usenotmyobject() { |
| [NotMyObject new]; // no error; this isn't NSObject |
| } |
| |
| @interface FromSelf : NSObject |
| -(instancetype)init __attribute__((unavailable)); |
| +(FromSelf*)another_one; |
| @end |
| |
| @implementation FromSelf |
| +(FromSelf*)another_one { |
| [self new]; |
| } |
| @end |
| |
| @interface NoInit : NSObject |
| -(instancetype)init __attribute__((unavailable)); // expected-note {{'init' has been explicitly marked unavailable here}} |
| @end |
| |
| @interface NoInitSub : NoInit @end |
| |
| @implementation NoInitSub |
| -(void)meth:(Class)c { |
| [c new]; // No error; unknown interface. |
| [NoInitSub new]; // expected-error {{'new' is unavailable}} |
| } |
| @end |