xref: /aosp_15_r20/external/clang/test/SemaObjC/attr-availability-1.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 -x objective-c++ -std=c++11 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
3*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -std=c++03 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s
4*67e74705SXin Li// rdar://18490958
5*67e74705SXin Li
6*67e74705SXin Li#if !__has_feature(attribute_availability_with_version_underscores)
7*67e74705SXin Li# error "missing feature"
8*67e74705SXin Li#endif
9*67e74705SXin Li
10*67e74705SXin Li@protocol P
11*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}}
12*67e74705SXin Li@end
13*67e74705SXin Li
14*67e74705SXin Li@interface A <P>
15*67e74705SXin Li- (void)method __attribute__((availability(macosx,introduced=10_1,deprecated=10_2))); // expected-note {{'method' has been explicitly marked deprecated here}}
16*67e74705SXin Li
17*67e74705SXin Li- (void)overridden __attribute__((availability(macosx,introduced=10_3))); // expected-note{{overridden method is here}}
18*67e74705SXin Li- (void)overridden2 __attribute__((availability(macosx,introduced=10_3)));
19*67e74705SXin Li- (void)overridden3 __attribute__((availability(macosx,deprecated=10_3)));
20*67e74705SXin Li- (void)overridden4 __attribute__((availability(macosx,deprecated=10_3))); // expected-note{{overridden method is here}}
21*67e74705SXin Li- (void)overridden5 __attribute__((availability(macosx,unavailable)));
22*67e74705SXin Li- (void)overridden6 __attribute__((availability(macosx,introduced=10_3))); // expected-note{{overridden method is here}}
23*67e74705SXin Li@end
24*67e74705SXin Li
25*67e74705SXin Li// rdar://11475360
26*67e74705SXin Li@interface B : A
27*67e74705SXin Li- (void)method; // NOTE: we expect 'method' to *not* inherit availability.
28*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)}}
29*67e74705SXin Li- (void)overridden2 __attribute__((availability(macosx,introduced=10_2)));
30*67e74705SXin Li- (void)overridden3 __attribute__((availability(macosx,deprecated=10_4)));
31*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)}}
32*67e74705SXin Li- (void)overridden5 __attribute__((availability(macosx,introduced=10_3)));
33*67e74705SXin Li- (void)overridden6 __attribute__((availability(macosx,unavailable))); // expected-warning{{overriding method cannot be unavailable on macOS when its overridden method is available}}
34*67e74705SXin Li@end
35*67e74705SXin Li
36*67e74705SXin Livoid f(A *a, B *b) {
37*67e74705SXin Li  [a method]; // expected-warning{{'method' is deprecated: first deprecated in macOS 10.2}}
38*67e74705SXin Li  [b method]; // no-warning
39*67e74705SXin Li  [a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in macOS 10.2}}
40*67e74705SXin Li  [b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in macOS 10.2}}
41*67e74705SXin Li}
42*67e74705SXin Li
43*67e74705SXin Li// Test case for <rdar://problem/11627873>.  Warn about
44*67e74705SXin Li// using a deprecated method when that method is re-implemented in a
45*67e74705SXin Li// subclass where the redeclared method is not deprecated.
46*67e74705SXin Li@interface C
47*67e74705SXin Li- (void) method __attribute__((availability(macosx,introduced=10_1,deprecated=10_2))); // expected-note {{'method' has been explicitly marked deprecated here}}
48*67e74705SXin Li@end
49*67e74705SXin Li
50*67e74705SXin Li@interface D : C
51*67e74705SXin Li- (void) method;
52*67e74705SXin Li@end
53*67e74705SXin Li
54*67e74705SXin Li@interface E : D
55*67e74705SXin Li- (void) method;
56*67e74705SXin Li@end
57*67e74705SXin Li
58*67e74705SXin Li@implementation D
59*67e74705SXin Li- (void) method {
60*67e74705SXin Li  [super method]; // expected-warning {{'method' is deprecated: first deprecated in macOS 10.2}}
61*67e74705SXin Li}
62*67e74705SXin Li@end
63*67e74705SXin Li
64*67e74705SXin Li@implementation E
65*67e74705SXin Li- (void) method {
66*67e74705SXin Li  [super method]; // no-warning
67*67e74705SXin Li}
68*67e74705SXin Li@end
69*67e74705SXin Li
70*67e74705SXin Li// rdar://18059669
71*67e74705SXin Li@class NSMutableArray;
72*67e74705SXin Li
73*67e74705SXin Li@interface NSDictionary
74*67e74705SXin Li+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... __attribute__((sentinel(0,1)));
75*67e74705SXin Li@end
76*67e74705SXin Li
77*67e74705SXin Li@class NSString;
78*67e74705SXin Li
79*67e74705SXin Liextern NSString *NSNibTopLevelObjects __attribute__((availability(macosx,introduced=10_0 ,deprecated=10_8,message="" )));
80*67e74705SXin Liid NSNibOwner, topNibObjects;
81*67e74705SXin Li
82*67e74705SXin Li@interface AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}
83*67e74705SXin Li
84*67e74705SXin Li-(void)__attribute__((ibaction))importFromSIE:(id)sender;
85*67e74705SXin Li
86*67e74705SXin Li@end
87*67e74705SXin Li
88*67e74705SXin Li@implementation AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}}
89*67e74705SXin Li
90*67e74705SXin Li-(void)__attribute__((ibaction))importFromSIE:(id)sender {
91*67e74705SXin Li
92*67e74705SXin Li NSMutableArray *topNibObjects;
93*67e74705SXin Li NSDictionary *nibLoadDict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSNibOwner, topNibObjects, NSNibTopLevelObjects, ((void *)0)];
94*67e74705SXin Li}
95*67e74705SXin Li
96*67e74705SXin Li@end
97*67e74705SXin Li
98*67e74705SXin Li@interface Mixed
99*67e74705SXin Li- (void)Meth1 __attribute__((availability(macosx,introduced=10.3_0))); // expected-warning {{use same version number separators '_' or '.'}}
100*67e74705SXin Li- (void)Meth2 __attribute__((availability(macosx,introduced=10_3.1))); // expected-warning {{use same version number separators '_' or '.'}}
101*67e74705SXin Li@end
102*67e74705SXin Li
103*67e74705SXin Li// rdar://18804883
104*67e74705SXin Li@protocol P18804883
105*67e74705SXin Li- (void)proto_method __attribute__((availability(macosx,introduced=10_1,deprecated=NA))); // means nothing (not deprecated)
106*67e74705SXin Li@end
107*67e74705SXin Li
108*67e74705SXin Li@interface A18804883 <P18804883>
109*67e74705SXin Li- (void)interface_method __attribute__((availability(macosx,introduced=NA))); // expected-note {{'interface_method' has been explicitly marked unavailable here}}
110*67e74705SXin Li- (void)strange_method __attribute__((availability(macosx,introduced=NA,deprecated=NA)));  // expected-note {{'strange_method' has been explicitly marked unavailable here}}
111*67e74705SXin Li- (void) always_available __attribute__((availability(macosx,deprecated=NA)));
112*67e74705SXin Li@end
113*67e74705SXin Li
114*67e74705SXin Livoid foo (A18804883* pa) {
115*67e74705SXin Li  [pa interface_method]; // expected-error {{'interface_method' is unavailable: not available on macOS}}
116*67e74705SXin Li  [pa proto_method];
117*67e74705SXin Li  [pa strange_method]; // expected-error {{'strange_method' is unavailable: not available on macOS}}
118*67e74705SXin Li  [pa always_available];
119*67e74705SXin Li}
120*67e74705SXin Li
121