xref: /aosp_15_r20/external/clang/test/Sema/attr-availability.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -fsyntax-only -fblocks -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9 -fsyntax-only -fblocks -verify %s
3*67e74705SXin Li //
4*67e74705SXin Li 
5*67e74705SXin Li void f0() __attribute__((availability(macosx,introduced=10.4,deprecated=10.2))); // expected-warning{{feature cannot be deprecated in macOS version 10.2 before it was introduced in version 10.4; attribute ignored}}
6*67e74705SXin Li void f1() __attribute__((availability(ios,obsoleted=2.1,deprecated=3.0)));  // expected-warning{{feature cannot be obsoleted in iOS version 2.1 before it was deprecated in version 3.0; attribute ignored}}
7*67e74705SXin Li void f2() __attribute__((availability(ios,introduced=2.1,deprecated=2.1)));
8*67e74705SXin Li 
9*67e74705SXin Li void f3() __attribute__((availability(otheros,introduced=2.2))); // expected-warning{{unknown platform 'otheros' in availability macro}}
10*67e74705SXin Li 
11*67e74705SXin Li // rdar://10095131
12*67e74705SXin Li extern void
13*67e74705SXin Li ATSFontGetName(const char *oName) __attribute__((availability(macosx,introduced=8.0,deprecated=9.0, message="use CTFontCopyFullName"))); // expected-note {{'ATSFontGetName' has been explicitly marked deprecated here}}
14*67e74705SXin Li 
15*67e74705SXin Li extern void
16*67e74705SXin Li ATSFontGetPostScriptName(int flags) __attribute__((availability(macosx,introduced=8.0,obsoleted=9.0, message="use ATSFontGetFullPostScriptName"))); // expected-note {{'ATSFontGetPostScriptName' has been explicitly marked unavailable here}}
17*67e74705SXin Li 
18*67e74705SXin Li #if defined(WARN_PARTIAL)
19*67e74705SXin Li // expected-note@+3 {{has been explicitly marked partial here}}
20*67e74705SXin Li #endif
21*67e74705SXin Li extern void
22*67e74705SXin Li PartiallyAvailable() __attribute__((availability(macosx,introduced=10.8)));
23*67e74705SXin Li 
24*67e74705SXin Li enum __attribute__((availability(macosx,introduced=10.8))) PartialEnum {
25*67e74705SXin Li   kPartialEnumConstant,
26*67e74705SXin Li };
27*67e74705SXin Li 
test_10095131()28*67e74705SXin Li void test_10095131() {
29*67e74705SXin Li   ATSFontGetName("Hello"); // expected-warning {{'ATSFontGetName' is deprecated: first deprecated in macOS 9.0 - use CTFontCopyFullName}}
30*67e74705SXin Li   ATSFontGetPostScriptName(100); // expected-error {{'ATSFontGetPostScriptName' is unavailable: obsoleted in macOS 9.0 - use ATSFontGetFullPostScriptName}}
31*67e74705SXin Li 
32*67e74705SXin Li #if defined(WARN_PARTIAL)
33*67e74705SXin Li   // expected-warning@+2 {{is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'PartiallyAvailable' to silence this warning}}
34*67e74705SXin Li #endif
35*67e74705SXin Li   PartiallyAvailable();
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li extern void PartiallyAvailable() ;
with_redeclaration()39*67e74705SXin Li void with_redeclaration() {
40*67e74705SXin Li   PartiallyAvailable();  // Don't warn.
41*67e74705SXin Li 
42*67e74705SXin Li   // enums should never warn.
43*67e74705SXin Li   enum PartialEnum p = kPartialEnumConstant;
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li // rdar://10711037
47*67e74705SXin Li __attribute__((availability(macos, unavailable))) // expected-warning {{attribute 'availability' is ignored}}
48*67e74705SXin Li enum {
49*67e74705SXin Li     NSDataWritingFileProtectionWriteOnly = 0x30000000,
50*67e74705SXin Li     NSDataWritingFileProtectionCompleteUntilUserAuthentication = 0x40000000,
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li void f4(int) __attribute__((availability(ios,deprecated=3.0)));
54*67e74705SXin Li void f4(int) __attribute__((availability(ios,introduced=4.0))); // expected-warning {{feature cannot be deprecated in iOS version 3.0 before it was introduced in version 4.0; attribute ignored}}
55*67e74705SXin Li 
56*67e74705SXin Li void f5(int) __attribute__((availability(ios,deprecated=3.0),
57*67e74705SXin Li                             availability(ios,introduced=4.0)));  // expected-warning {{feature cannot be deprecated in iOS version 3.0 before it was introduced in version 4.0; attribute ignored}}
58*67e74705SXin Li 
59*67e74705SXin Li void f6(int) __attribute__((availability(ios,deprecated=3.0))); // expected-note {{previous attribute is here}}
60*67e74705SXin Li void f6(int) __attribute__((availability(ios,deprecated=4.0))); // expected-warning {{availability does not match previous declaration}}
61*67e74705SXin Li 
62*67e74705SXin Li void f7(int) __attribute__((availability(ios,introduced=2.0)));
63*67e74705SXin Li void f7(int) __attribute__((availability(ios,deprecated=3.0))); // expected-note {{previous attribute is here}}
64*67e74705SXin Li void f7(int) __attribute__((availability(ios,deprecated=4.0))); // expected-warning {{availability does not match previous declaration}}
65*67e74705SXin Li 
66*67e74705SXin Li 
67*67e74705SXin Li // <rdar://problem/11886458>
68*67e74705SXin Li #if !__has_feature(attribute_availability_with_message)
69*67e74705SXin Li # error "Missing __has_feature"
70*67e74705SXin Li #endif
71*67e74705SXin Li 
72*67e74705SXin Li extern int x __attribute__((availability(macosx,introduced=10.5)));
73*67e74705SXin Li extern int x;
74*67e74705SXin Li 
f8()75*67e74705SXin Li void f8() {
76*67e74705SXin Li   int (^b)(int);
77*67e74705SXin Li   b = ^ (int i) __attribute__((availability(macosx,introduced=10.2))) { return 1; }; // expected-warning {{'availability' attribute ignored}}
78*67e74705SXin Li }
79*67e74705SXin Li 
80*67e74705SXin Li extern int x2 __attribute__((availability(macosx,introduced=10.2))); // expected-note {{previous attribute is here}}
81*67e74705SXin Li extern int x2 __attribute__((availability(macosx,introduced=10.5))); // expected-warning {{availability does not match previous declaration}}
82*67e74705SXin Li 
83*67e74705SXin Li 
84*67e74705SXin Li enum Original {
85*67e74705SXin Li   OriginalDeprecated __attribute__((availability(macosx, deprecated=10.2))), // expected-note + {{'OriginalDeprecated' has been explicitly marked deprecated here}}
86*67e74705SXin Li   OriginalUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'OriginalUnavailable' has been explicitly marked unavailable here}}
87*67e74705SXin Li };
88*67e74705SXin Li 
89*67e74705SXin Li enum AllDeprecated {
90*67e74705SXin Li   AllDeprecatedCase, // expected-note + {{'AllDeprecatedCase' has been explicitly marked deprecated here}}
91*67e74705SXin Li   AllDeprecatedUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'AllDeprecatedUnavailable' has been explicitly marked unavailable here}}
92*67e74705SXin Li } __attribute__((availability(macosx, deprecated=10.2)));
93*67e74705SXin Li 
94*67e74705SXin Li enum AllUnavailable {
95*67e74705SXin Li   AllUnavailableCase, // expected-note + {{'AllUnavailableCase' has been explicitly marked unavailable here}}
96*67e74705SXin Li } __attribute__((availability(macosx, unavailable)));
97*67e74705SXin Li 
98*67e74705SXin Li enum User {
99*67e74705SXin Li   UserOD = OriginalDeprecated, // expected-warning {{deprecated}}
100*67e74705SXin Li   UserODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
101*67e74705SXin Li   UserODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
102*67e74705SXin Li 
103*67e74705SXin Li   UserOU = OriginalUnavailable, // expected-error {{unavailable}}
104*67e74705SXin Li   UserOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable, // expected-error {{unavailable}}
105*67e74705SXin Li   UserOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
106*67e74705SXin Li 
107*67e74705SXin Li   UserAD = AllDeprecatedCase, // expected-warning {{deprecated}}
108*67e74705SXin Li   UserADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
109*67e74705SXin Li   UserADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
110*67e74705SXin Li 
111*67e74705SXin Li   UserADU = AllDeprecatedUnavailable, // expected-error {{unavailable}}
112*67e74705SXin Li   UserADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable, // expected-error {{unavailable}}
113*67e74705SXin Li   UserADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
114*67e74705SXin Li 
115*67e74705SXin Li   UserAU = AllUnavailableCase, // expected-error {{unavailable}}
116*67e74705SXin Li   UserAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase, // expected-error {{unavailable}}
117*67e74705SXin Li   UserAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
118*67e74705SXin Li };
119*67e74705SXin Li 
120*67e74705SXin Li enum UserDeprecated {
121*67e74705SXin Li   UserDeprecatedOD = OriginalDeprecated,
122*67e74705SXin Li   UserDeprecatedODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
123*67e74705SXin Li   UserDeprecatedODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
124*67e74705SXin Li 
125*67e74705SXin Li   UserDeprecatedOU = OriginalUnavailable, // expected-error {{unavailable}}
126*67e74705SXin Li   UserDeprecatedOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable, // expected-error {{unavailable}}
127*67e74705SXin Li   UserDeprecatedOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
128*67e74705SXin Li 
129*67e74705SXin Li   UserDeprecatedAD = AllDeprecatedCase,
130*67e74705SXin Li   UserDeprecatedADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
131*67e74705SXin Li   UserDeprecatedADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
132*67e74705SXin Li 
133*67e74705SXin Li   UserDeprecatedADU = AllDeprecatedUnavailable, // expected-error {{unavailable}}
134*67e74705SXin Li   UserDeprecatedADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable, // expected-error {{unavailable}}
135*67e74705SXin Li   UserDeprecatedADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
136*67e74705SXin Li 
137*67e74705SXin Li   UserDeprecatedAU = AllUnavailableCase, // expected-error {{unavailable}}
138*67e74705SXin Li   UserDeprecatedAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase, // expected-error {{unavailable}}
139*67e74705SXin Li   UserDeprecatedAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
140*67e74705SXin Li } __attribute__((availability(macosx, deprecated=10.2)));
141*67e74705SXin Li 
142*67e74705SXin Li enum UserUnavailable {
143*67e74705SXin Li   UserUnavailableOD = OriginalDeprecated,
144*67e74705SXin Li   UserUnavailableODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
145*67e74705SXin Li   UserUnavailableODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
146*67e74705SXin Li 
147*67e74705SXin Li   UserUnavailableOU = OriginalUnavailable,
148*67e74705SXin Li   UserUnavailableOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable,
149*67e74705SXin Li   UserUnavailableOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
150*67e74705SXin Li 
151*67e74705SXin Li   UserUnavailableAD = AllDeprecatedCase,
152*67e74705SXin Li   UserUnavailableADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
153*67e74705SXin Li   UserUnavailableADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
154*67e74705SXin Li 
155*67e74705SXin Li   UserUnavailableADU = AllDeprecatedUnavailable,
156*67e74705SXin Li   UserUnavailableADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable,
157*67e74705SXin Li   UserUnavailableADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
158*67e74705SXin Li 
159*67e74705SXin Li   UserUnavailableAU = AllUnavailableCase,
160*67e74705SXin Li   UserUnavailableAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase,
161*67e74705SXin Li   UserUnavailableAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
162*67e74705SXin Li } __attribute__((availability(macosx, unavailable)));
163