• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// RUN: %clang_cc1 -x objective-c -verify -fobjc-arc %s
2
3@interface NSObject
4
5+ (instancetype)new;
6+ (instancetype)alloc;
7
8- (void)declaredInSuper;
9
10@end
11
12@interface NSObject (Category)
13
14- (void)declaredInSuperCategory;
15
16@end
17
18@interface Sub: NSObject
19
20- (instancetype)init __attribute__((unavailable)); // expected-note 4 {{'init' has been explicitly marked unavailable here}}
21
22- (void)notImplemented __attribute__((unavailable));
23
24- (void)declaredInSuper __attribute__((unavailable));
25- (void)declaredInSuperCategory __attribute__((unavailable));
26
27@end
28
29@implementation Sub
30
31+ (Sub *)create {
32  return [[self alloc] init];
33}
34
35+ (Sub *)create2 {
36  return [self new];
37}
38
39+ (Sub *)create3 {
40  return [Sub new];
41}
42
43- (instancetype) init {
44  return self;
45}
46
47- (void)reportUseOfUnimplemented {
48  [self notImplemented];
49}
50
51- (void)allowSuperCallUsingSelf {
52  [self declaredInSuper];
53  [[Sub alloc] declaredInSuper];
54  [self declaredInSuperCategory];
55  [[Sub alloc] declaredInSuperCategory];
56}
57
58@end
59
60@interface SubClassContext: Sub
61@end
62
63@implementation SubClassContext
64
65- (void)subClassContext {
66  (void)[[Sub alloc] init]; // expected-error {{'init' is unavailable}}
67  (void)[Sub new]; // expected-error {{'new' is unavailable}}
68}
69
70@end
71
72void unrelatedContext() {
73  (void)[[Sub alloc] init]; // expected-error {{'init' is unavailable}}
74  (void)[Sub new]; // expected-error {{'new' is unavailable}}
75}
76
77@interface X @end
78
79@interface X (Foo)
80-(void)meth __attribute__((unavailable));
81@end
82
83@implementation X (Foo)
84-(void)meth {}
85-(void)call_it { [self meth]; }
86@end
87