[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaObjC / call-unavailable-init-in-self.m
blob078f485f616b1d82bdbda58ef0f5c56c8e130c9b
1 // RUN: %clang_cc1 -x objective-c -verify -fobjc-arc %s
3 @interface NSObject
5 + (instancetype)new;
6 + (instancetype)alloc;
8 - (void)declaredInSuper;
10 @end
12 @interface NSObject (Category)
14 - (void)declaredInSuperCategory;
16 @end
18 @interface Sub: NSObject
20 - (instancetype)init __attribute__((unavailable)); // expected-note 4 {{'init' has been explicitly marked unavailable here}}
22 - (void)notImplemented __attribute__((unavailable));
24 - (void)declaredInSuper __attribute__((unavailable));
25 - (void)declaredInSuperCategory __attribute__((unavailable));
27 @end
29 @implementation Sub
31 + (Sub *)create {
32   return [[self alloc] init];
35 + (Sub *)create2 {
36   return [self new];
39 + (Sub *)create3 {
40   return [Sub new];
43 - (instancetype) init {
44   return self;
47 - (void)reportUseOfUnimplemented {
48   [self notImplemented];
51 - (void)allowSuperCallUsingSelf {
52   [self declaredInSuper];
53   [[Sub alloc] declaredInSuper];
54   [self declaredInSuperCategory];
55   [[Sub alloc] declaredInSuperCategory];
58 @end
60 @interface SubClassContext: Sub
61 @end
63 @implementation SubClassContext
65 - (void)subClassContext {
66   (void)[[Sub alloc] init]; // expected-error {{'init' is unavailable}}
67   (void)[Sub new]; // expected-error {{'new' is unavailable}}
70 @end
72 void unrelatedContext(void) {
73   (void)[[Sub alloc] init]; // expected-error {{'init' is unavailable}}
74   (void)[Sub new]; // expected-error {{'new' is unavailable}}
77 @interface X @end
79 @interface X (Foo)
80 -(void)meth __attribute__((unavailable));
81 @end
83 @implementation X (Foo)
84 -(void)meth {}
85 -(void)call_it { [self meth]; }
86 @end