Clang Project

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