xref: /aosp_15_r20/external/clang/test/SemaObjC/attr-availability.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
2*67e74705SXin Li// RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
3*67e74705SXin Li
4*67e74705SXin Li@protocol P
5*67e74705SXin Li- (void)proto_method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 2 {{'proto_method' has been explicitly marked deprecated here}}
6*67e74705SXin Li
7*67e74705SXin Li#if defined(WARN_PARTIAL)
8*67e74705SXin Li  // expected-note@+2 2 {{'partial_proto_method' has been explicitly marked partial here}}
9*67e74705SXin Li#endif
10*67e74705SXin Li- (void)partial_proto_method __attribute__((availability(macosx,introduced=10.8)));
11*67e74705SXin Li@end
12*67e74705SXin Li
13*67e74705SXin Li@interface A <P>
14*67e74705SXin Li- (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}}
15*67e74705SXin Li#if defined(WARN_PARTIAL)
16*67e74705SXin Li  // expected-note@+2 {{'partialMethod' has been explicitly marked partial here}}
17*67e74705SXin Li#endif
18*67e74705SXin Li- (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));
19*67e74705SXin Li
20*67e74705SXin Li- (void)overridden __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}}
21*67e74705SXin Li- (void)overridden2 __attribute__((availability(macosx,introduced=10.3)));
22*67e74705SXin Li- (void)overridden3 __attribute__((availability(macosx,deprecated=10.3)));
23*67e74705SXin Li- (void)overridden4 __attribute__((availability(macosx,deprecated=10.3))); // expected-note{{overridden method is here}}
24*67e74705SXin Li- (void)overridden5 __attribute__((availability(macosx,unavailable)));
25*67e74705SXin Li- (void)overridden6 __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}}
26*67e74705SXin Li- (void)unavailableMethod __attribute__((unavailable));
27*67e74705SXin Li@end
28*67e74705SXin Li
29*67e74705SXin Li// rdar://11475360
30*67e74705SXin Li@interface B : A
31*67e74705SXin Li- (void)method; // NOTE: we expect 'method' to *not* inherit availability.
32*67e74705SXin Li- (void)partialMethod; // Likewise.
33*67e74705SXin Li- (void)overridden __attribute__((availability(macosx,introduced=10.4))); // expected-warning{{overriding method introduced after overridden method on macOS (10.4 vs. 10.3)}}
34*67e74705SXin Li- (void)overridden2 __attribute__((availability(macosx,introduced=10.2)));
35*67e74705SXin Li- (void)overridden3 __attribute__((availability(macosx,deprecated=10.4)));
36*67e74705SXin Li- (void)overridden4 __attribute__((availability(macosx,deprecated=10.2))); // expected-warning{{overriding method deprecated before overridden method on macOS (10.3 vs. 10.2)}}
37*67e74705SXin Li- (void)overridden5 __attribute__((availability(macosx,introduced=10.3)));
38*67e74705SXin Li- (void)overridden6 __attribute__((availability(macosx,unavailable))); // expected-warning{{overriding method cannot be unavailable on macOS when its overridden method is available}}
39*67e74705SXin Li- (void)unavailableMethod; // does *not* inherit unavailability
40*67e74705SXin Li@end
41*67e74705SXin Li
42*67e74705SXin Livoid f(A *a, B *b) {
43*67e74705SXin Li  [a method]; // expected-warning{{'method' is deprecated: first deprecated in macOS 10.2}}
44*67e74705SXin Li  [b method]; // no-warning
45*67e74705SXin Li  [a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in macOS 10.2}}
46*67e74705SXin Li  [b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in macOS 10.2}}
47*67e74705SXin Li
48*67e74705SXin Li#if defined(WARN_PARTIAL)
49*67e74705SXin Li  // expected-warning@+2 {{'partialMethod' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'partialMethod' to silence this warning}}
50*67e74705SXin Li#endif
51*67e74705SXin Li  [a partialMethod];
52*67e74705SXin Li  [b partialMethod];  // no warning
53*67e74705SXin Li#if defined(WARN_PARTIAL)
54*67e74705SXin Li  // expected-warning@+2 {{'partial_proto_method' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}}
55*67e74705SXin Li#endif
56*67e74705SXin Li  [a partial_proto_method];
57*67e74705SXin Li#if defined(WARN_PARTIAL)
58*67e74705SXin Li  // expected-warning@+2 {{'partial_proto_method' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}}
59*67e74705SXin Li#endif
60*67e74705SXin Li  [b partial_proto_method];
61*67e74705SXin Li}
62*67e74705SXin Li
63*67e74705SXin Li@interface A (NewAPI)
64*67e74705SXin Li- (void)partialMethod;
65*67e74705SXin Li- (void)partial_proto_method;
66*67e74705SXin Li@end
67*67e74705SXin Li
68*67e74705SXin Livoid f_after_redecl(A *a, B *b) {
69*67e74705SXin Li  [a partialMethod]; // no warning
70*67e74705SXin Li  [b partialMethod]; // no warning
71*67e74705SXin Li  [a partial_proto_method]; // no warning
72*67e74705SXin Li  [b partial_proto_method]; // no warning
73*67e74705SXin Li}
74*67e74705SXin Li
75*67e74705SXin Li// Test case for <rdar://problem/11627873>.  Warn about
76*67e74705SXin Li// using a deprecated method when that method is re-implemented in a
77*67e74705SXin Li// subclass where the redeclared method is not deprecated.
78*67e74705SXin Li@interface C
79*67e74705SXin Li- (void) method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}}
80*67e74705SXin Li@end
81*67e74705SXin Li
82*67e74705SXin Li@interface D : C
83*67e74705SXin Li- (void) method;
84*67e74705SXin Li@end
85*67e74705SXin Li
86*67e74705SXin Li@interface E : D
87*67e74705SXin Li- (void) method;
88*67e74705SXin Li@end
89*67e74705SXin Li
90*67e74705SXin Li@implementation D
91*67e74705SXin Li- (void) method {
92*67e74705SXin Li  [super method]; // expected-warning {{'method' is deprecated: first deprecated in macOS 10.2}}
93*67e74705SXin Li}
94*67e74705SXin Li@end
95*67e74705SXin Li
96*67e74705SXin Li@implementation E
97*67e74705SXin Li- (void) method {
98*67e74705SXin Li  [super method]; // no-warning
99*67e74705SXin Li}
100*67e74705SXin Li@end
101*67e74705SXin Li
102*67e74705SXin Li// rdar://18059669
103*67e74705SXin Li@class NSMutableArray;
104*67e74705SXin Li
105*67e74705SXin Li@interface NSDictionary
106*67e74705SXin Li+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... __attribute__((sentinel(0,1)));
107*67e74705SXin Li@end
108*67e74705SXin Li
109*67e74705SXin Li@class NSString;
110*67e74705SXin Li
111*67e74705SXin Liextern NSString *NSNibTopLevelObjects __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.8,message="" )));
112*67e74705SXin Liid NSNibOwner, topNibObjects;
113*67e74705SXin Li
114*67e74705SXin Li@interface AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}
115*67e74705SXin Li
116*67e74705SXin Li-(void)__attribute__((ibaction))importFromSIE:(id)sender;
117*67e74705SXin Li
118*67e74705SXin Li@end
119*67e74705SXin Li
120*67e74705SXin Li@implementation AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}
121*67e74705SXin Li
122*67e74705SXin Li-(void)__attribute__((ibaction))importFromSIE:(id)sender {
123*67e74705SXin Li
124*67e74705SXin Li NSMutableArray *topNibObjects;
125*67e74705SXin Li NSDictionary *nibLoadDict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSNibOwner, topNibObjects, NSNibTopLevelObjects, ((void *)0)];
126*67e74705SXin Li}
127*67e74705SXin Li
128*67e74705SXin Li@end
129*67e74705SXin Li
130*67e74705SXin Li@protocol PartialProt
131*67e74705SXin Li- (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8)));
132*67e74705SXin Li+ (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8)));
133*67e74705SXin Li@end
134*67e74705SXin Li
135*67e74705SXin Li@interface PartialI <PartialProt>
136*67e74705SXin Li- (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));
137*67e74705SXin Li+ (void)partialMethod __attribute__((availability(macosx,introduced=10.8)));
138*67e74705SXin Li@end
139*67e74705SXin Li
140*67e74705SXin Li@interface PartialI ()
141*67e74705SXin Li- (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8)));
142*67e74705SXin Li#if defined(WARN_PARTIAL)
143*67e74705SXin Li  // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}}
144*67e74705SXin Li#endif
145*67e74705SXin Li- (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8)));
146*67e74705SXin Li+ (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8)));
147*67e74705SXin Li#if defined(WARN_PARTIAL)
148*67e74705SXin Li  // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}}
149*67e74705SXin Li#endif
150*67e74705SXin Li+ (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8)));
151*67e74705SXin Li@end
152*67e74705SXin Li
153*67e74705SXin Li@interface PartialI (Redecls)
154*67e74705SXin Li- (void)partialMethod;
155*67e74705SXin Li- (void)ipartialMethod1;
156*67e74705SXin Li- (void)ppartialMethod;
157*67e74705SXin Li+ (void)partialMethod;
158*67e74705SXin Li+ (void)ipartialMethod1;
159*67e74705SXin Li+ (void)ppartialMethod;
160*67e74705SXin Li@end
161*67e74705SXin Li
162*67e74705SXin Livoid partialfun(PartialI* a) {
163*67e74705SXin Li  [a partialMethod]; // no warning
164*67e74705SXin Li  [a ipartialMethod1]; // no warning
165*67e74705SXin Li#if defined(WARN_PARTIAL)
166*67e74705SXin Li  // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}}
167*67e74705SXin Li#endif
168*67e74705SXin Li  [a ipartialMethod2];
169*67e74705SXin Li  [a ppartialMethod]; // no warning
170*67e74705SXin Li  [PartialI partialMethod]; // no warning
171*67e74705SXin Li  [PartialI ipartialMethod1]; // no warning
172*67e74705SXin Li#if defined(WARN_PARTIAL)
173*67e74705SXin Li  // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}}
174*67e74705SXin Li#endif
175*67e74705SXin Li  [PartialI ipartialMethod2];
176*67e74705SXin Li  [PartialI ppartialMethod]; // no warning
177*67e74705SXin Li}
178*67e74705SXin Li
179*67e74705SXin Li#if defined(WARN_PARTIAL)
180*67e74705SXin Li  // expected-note@+2 {{'PartialI2' has been explicitly marked partial here}}
181*67e74705SXin Li#endif
182*67e74705SXin Li__attribute__((availability(macosx, introduced = 10.8))) @interface PartialI2
183*67e74705SXin Li@end
184*67e74705SXin Li
185*67e74705SXin Li#if defined(WARN_PARTIAL)
186*67e74705SXin Li  // expected-warning@+2 {{'PartialI2' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'PartialI2' to silence this warning}}
187*67e74705SXin Li#endif
188*67e74705SXin Livoid partialinter1(PartialI2* p) {
189*67e74705SXin Li}
190*67e74705SXin Li
191*67e74705SXin Li@class PartialI2;
192*67e74705SXin Li
193*67e74705SXin Livoid partialinter2(PartialI2* p) { // no warning
194*67e74705SXin Li}
195*67e74705SXin Li
196*67e74705SXin Li
197*67e74705SXin Li// Test that both the use of the 'typedef' and the enum constant
198*67e74705SXin Li// produces an error. rdar://problem/20903588
199*67e74705SXin Li#define UNAVAILABLE __attribute__((unavailable("not available")))
200*67e74705SXin Li
201*67e74705SXin Litypedef enum MyEnum : int MyEnum;
202*67e74705SXin Lienum MyEnum : int { // expected-note {{'MyEnum' has been explicitly marked unavailable here}}
203*67e74705SXin Li  MyEnum_Blah UNAVAILABLE, // expected-note {{'MyEnum_Blah' has been explicitly marked unavailable here}}
204*67e74705SXin Li} UNAVAILABLE;
205*67e74705SXin Li
206*67e74705SXin Livoid use_myEnum() {
207*67e74705SXin Li  // expected-error@+2 {{'MyEnum' is unavailable: not available}}
208*67e74705SXin Li  // expected-error@+1 {{MyEnum_Blah' is unavailable: not available}}
209*67e74705SXin Li  MyEnum e = MyEnum_Blah;
210*67e74705SXin Li}
211*67e74705SXin Li
212*67e74705SXin Li// Test that the availability of (optional) protocol methods is not
213*67e74705SXin Li// inherited be implementations of those protocol methods.
214*67e74705SXin Li@protocol AvailabilityP2
215*67e74705SXin Li@optional
216*67e74705SXin Li-(void)methodA __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 4{{'methodA' has been explicitly marked deprecated here}} \
217*67e74705SXin Li// expected-note 2{{protocol method is here}}
218*67e74705SXin Li-(void)methodB __attribute__((unavailable)); // expected-note 4{{'methodB' has been explicitly marked unavailable here}}
219*67e74705SXin Li-(void)methodC;
220*67e74705SXin Li@end
221*67e74705SXin Li
222*67e74705SXin Livoid testAvailabilityP2(id<AvailabilityP2> obj) {
223*67e74705SXin Li  [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}}
224*67e74705SXin Li  [obj methodB]; // expected-error{{'methodB' is unavailable}}
225*67e74705SXin Li}
226*67e74705SXin Li
227*67e74705SXin Li@interface ImplementsAvailabilityP2a <AvailabilityP2>
228*67e74705SXin Li-(void)methodA;
229*67e74705SXin Li-(void)methodB;
230*67e74705SXin Li@end
231*67e74705SXin Li
232*67e74705SXin Livoid testImplementsAvailabilityP2a(ImplementsAvailabilityP2a *obj) {
233*67e74705SXin Li  [obj methodA]; // okay: availability not inherited
234*67e74705SXin Li  [obj methodB]; // okay: unavailability not inherited
235*67e74705SXin Li}
236*67e74705SXin Li
237*67e74705SXin Li__attribute__((objc_root_class))
238*67e74705SXin Li@interface ImplementsAvailabilityP2b <AvailabilityP2>
239*67e74705SXin Li@end
240*67e74705SXin Li
241*67e74705SXin Li@implementation ImplementsAvailabilityP2b
242*67e74705SXin Li-(void)methodA {
243*67e74705SXin Li  // Make sure we're not inheriting availability.
244*67e74705SXin Li  id<AvailabilityP2> obj = self;
245*67e74705SXin Li  [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}}
246*67e74705SXin Li  [obj methodB]; // expected-error{{'methodB' is unavailable}}
247*67e74705SXin Li}
248*67e74705SXin Li-(void)methodB {
249*67e74705SXin Li  // Make sure we're not inheriting unavailability.
250*67e74705SXin Li  id<AvailabilityP2> obj = self;
251*67e74705SXin Li  [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}}
252*67e74705SXin Li  [obj methodB]; // expected-error{{'methodB' is unavailable}}
253*67e74705SXin Li}
254*67e74705SXin Li
255*67e74705SXin Li@end
256*67e74705SXin Li
257*67e74705SXin Livoid testImplementsAvailabilityP2b(ImplementsAvailabilityP2b *obj) {
258*67e74705SXin Li  // still get warnings/errors because we see the protocol version.
259*67e74705SXin Li
260*67e74705SXin Li  [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}}
261*67e74705SXin Li  [obj methodB]; // expected-error{{'methodB' is unavailable}}
262*67e74705SXin Li}
263*67e74705SXin Li
264*67e74705SXin Li__attribute__((objc_root_class))
265*67e74705SXin Li@interface ImplementsAvailabilityP2c <AvailabilityP2>
266*67e74705SXin Li-(void)methodA __attribute__((availability(macosx,introduced=10.2))); // expected-warning{{method introduced after the protocol method it implements on macOS (10.2 vs. 10.1)}}
267*67e74705SXin Li-(void)methodB __attribute__((unavailable));
268*67e74705SXin Li@end
269*67e74705SXin Li
270*67e74705SXin Li__attribute__((objc_root_class))
271*67e74705SXin Li@interface ImplementsAvailabilityP2d <AvailabilityP2>
272*67e74705SXin Li@end
273*67e74705SXin Li
274*67e74705SXin Li@implementation ImplementsAvailabilityP2d
275*67e74705SXin Li-(void)methodA __attribute__((availability(macosx,introduced=10.2))) // expected-warning{{method introduced after the protocol method it implements on macOS (10.2 vs. 10.1)}}
276*67e74705SXin Li{
277*67e74705SXin Li}
278*67e74705SXin Li-(void)methodB __attribute__((unavailable)) {
279*67e74705SXin Li}
280*67e74705SXin Li@end
281*67e74705SXin Li
282*67e74705SXin Li__attribute__((objc_root_class))
283*67e74705SXin Li@interface InheritUnavailableSuper
284*67e74705SXin Li-(void)method __attribute__((unavailable)); // expected-note{{'method' has been explicitly marked unavailable here}}
285*67e74705SXin Li@end
286*67e74705SXin Li
287*67e74705SXin Li@interface InheritUnavailableSub : InheritUnavailableSuper
288*67e74705SXin Li-(void)method;
289*67e74705SXin Li@end
290*67e74705SXin Li
291*67e74705SXin Li@implementation InheritUnavailableSub
292*67e74705SXin Li-(void)method {
293*67e74705SXin Li  InheritUnavailableSuper *obj = self;
294*67e74705SXin Li  [obj method]; // expected-error{{'method' is unavailable}}
295*67e74705SXin Li}
296*67e74705SXin Li@end
297