1// RUN: %clang_cc1 -triple x86_64-apple-macosx-10.9 -Wunguarded-availability -fblocks -fsyntax-only -verify %s
2
3__attribute__((objc_root_class))
4@interface NSObject
5+(instancetype)new;
6-(instancetype)init;
7@end
8
9@interface MyObject : NSObject
10-(instancetype)init __attribute__((unavailable)); // expected-note{{'init' has been explicitly marked unavailable here}}
11@end
12
13void usemyobject() {
14  [MyObject new]; // expected-error{{'new' is unavailable}}
15}
16
17@interface MyOtherObject : NSObject
18+(instancetype)init __attribute__((unavailable));
19+(instancetype)new;
20@end
21
22void usemyotherobject() {
23  [MyOtherObject new]; // no error; new is overrideen.
24}
25
26@interface NotGoodOverride : NSObject
27+(instancetype)init __attribute__((unavailable));
28-(instancetype)new;
29+(instancetype)new: (int)x;
30@end
31
32void usenotgoodoverride() {
33  [NotGoodOverride new]; // no error
34}
35
36@interface NotNSObject
37+(instancetype)new;
38-(instancetype)init;
39@end
40
41@interface NotMyObject : NotNSObject
42-(instancetype)init __attribute__((unavailable));
43@end
44
45void usenotmyobject() {
46  [NotMyObject new]; // no error; this isn't NSObject
47}
48
49@interface FromSelf : NSObject
50-(instancetype)init __attribute__((unavailable));
51+(FromSelf*)another_one;
52@end
53
54@implementation FromSelf
55+(FromSelf*)another_one {
56  [self new];
57}
58@end
59
60@interface NoInit : NSObject
61-(instancetype)init __attribute__((unavailable)); // expected-note {{'init' has been explicitly marked unavailable here}}
62@end
63
64@interface NoInitSub : NoInit @end
65
66@implementation NoInitSub
67-(void)meth:(Class)c {
68  [c new]; // No error; unknown interface.
69  [NoInitSub new]; // expected-error {{'new' is unavailable}}
70}
71@end
72