[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / SemaObjC / super-dealloc-attribute.m
blobecab109d3089e48924c9cb2328f47c3aedd9ebf9
1 // RUN: %clang_cc1  -fsyntax-only -verify -Wno-objc-root-class %s
2 // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class %s
3 // RUN: %clang_cc1  -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
4 // RUN: %clang_cc1 -x objective-c++ -fobjc-arc -fsyntax-only -verify -Wno-objc-root-class %s
5 // rdar://6386358
7 #if __has_attribute(objc_requires_super)
8 #define  NS_REQUIRES_SUPER __attribute((objc_requires_super))
9 #endif
11 @protocol NSObject // expected-note {{protocol is declared here}}
12 - MyDealloc NS_REQUIRES_SUPER; // expected-warning {{'objc_requires_super' attribute cannot be applied to methods in protocols}}
13 @end
15 @interface Root
16 - MyDealloc __attribute((objc_requires_super));
17 - (void)XXX __attribute((objc_requires_super));
18 - (void) dealloc __attribute((objc_requires_super)); // expected-warning {{'objc_requires_super' attribute cannot be applied to dealloc}}
19 - (void) MyDeallocMeth; // Method in root is not annotated.
20 - (void) AnnotMyDeallocMeth __attribute((objc_requires_super));
21 - (void) AnnotMyDeallocMethCAT NS_REQUIRES_SUPER; 
23 + (void)registerClass:(id)name __attribute((objc_requires_super));
24 @end
26 @interface Baz : Root<NSObject>
27 - MyDealloc;
28 - (void) MyDeallocMeth __attribute((objc_requires_super)); // 'Baz' author has annotated method
29 - (void) AnnotMyDeallocMeth; // Annotated in root but not here. Annotation is inherited though
30 - (void) AnnotMeth __attribute((objc_requires_super)); // 'Baz' author has annotated method
31 @end
33 @implementation Baz
34 -  MyDealloc {
35    [super MyDealloc];
36         return 0;
39 - (void)XXX {
40   [super MyDealloc];
41 } // expected-warning {{method possibly missing a [super XXX] call}}
43 - (void) MyDeallocMeth {} 
44 - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}}
45 - (void) AnnotMeth{};
47 + (void)registerClass:(id)name {} // expected-warning {{method possibly missing a [super registerClass:] call}}
48 @end
50 @interface Bar : Baz
51 @end
53 @implementation Bar
54 - (void) MyDeallocMeth {} // expected-warning {{method possibly missing a [super MyDeallocMeth] call}}
55 - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}}
56 - (void) AnnotMeth{};  // expected-warning {{method possibly missing a [super AnnotMeth] call}}
57 @end
59 @interface Bar(CAT) 
60 - (void) AnnotMyDeallocMethCAT; // Annotated in root but not here. Annotation is inherited though
61 - (void) AnnotMethCAT __attribute((objc_requires_super));
62 @end
64 @implementation Bar(CAT)
65 - (void) MyDeallocMeth {} // expected-warning {{method possibly missing a [super MyDeallocMeth] call}}
66 - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}}
67 - (void) AnnotMeth{};  // expected-warning {{method possibly missing a [super AnnotMeth] call}}
68 - (void) AnnotMyDeallocMethCAT{}; // expected-warning {{method possibly missing a [super AnnotMyDeallocMethCAT] call}}
69 - (void) AnnotMethCAT {};
70 @end
73 @interface Valid : Baz
74 @end
76 @implementation Valid
78 - (void)MyDeallocMeth {
79   [super MyDeallocMeth]; // no-warning
83 + (void)registerClass:(id)name {
84   [super registerClass:name]; // no-warning
87 @end
89 // rdar://14251387
90 #define IBAction void)__attribute__((ibaction)
92 @interface UIViewController @end
94 @interface ViewController : UIViewController
95 - (void) someMethodRequiringSuper NS_REQUIRES_SUPER;
96 - (IBAction) someAction;
97 - (IBAction) someActionRequiringSuper NS_REQUIRES_SUPER;
98 @end
101 @implementation ViewController
102 - (void) someMethodRequiringSuper
105 - (IBAction) someAction
108 - (IBAction) someActionRequiringSuper
111 @end
113 // rdar://15385981
114 @interface Barn
115 - (void)openDoor __attribute__((objc_requires_super));
116 @end
118 @implementation Barn
119 - (void) openDoor
121     ;
123 @end
125 @interface HorseBarn:Barn @end
127 @implementation HorseBarn
128 - (void) openDoor
130     ;
131 }       // expected-warning {{method possibly missing a [super openDoor] call}}
132 @end