blob: 4a266382529a3937a1250aa0e95fe71a0a5a5f3b [file] [log] [blame]
Rafael Espindolac231fab2013-01-08 21:30:32 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -fsyntax-only -fblocks -verify %s
Nico Weber0055a192015-03-19 19:18:22 +00002// RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9 -fsyntax-only -fblocks -verify %s
3//
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004
Manman Renccf25bb2016-06-28 20:55:30 +00005void 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}}
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006void 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}}
Douglas Gregor6f47e5c2011-08-10 15:31:35 +00007void f2() __attribute__((availability(ios,introduced=2.1,deprecated=2.1)));
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00008
Douglas Gregor6f47e5c2011-08-10 15:31:35 +00009void f3() __attribute__((availability(otheros,introduced=2.2))); // expected-warning{{unknown platform 'otheros' in availability macro}}
Fariborz Jahanian88d510d2011-12-10 00:28:41 +000010
11// rdar://10095131
12extern void
Ted Kremenekb79ee572013-12-18 23:30:06 +000013ATSFontGetName(const char *oName) __attribute__((availability(macosx,introduced=8.0,deprecated=9.0, message="use CTFontCopyFullName"))); // expected-note {{'ATSFontGetName' has been explicitly marked deprecated here}}
Fariborz Jahanian88d510d2011-12-10 00:28:41 +000014
15extern void
Ted Kremenekb79ee572013-12-18 23:30:06 +000016ATSFontGetPostScriptName(int flags) __attribute__((availability(macosx,introduced=8.0,obsoleted=9.0, message="use ATSFontGetFullPostScriptName"))); // expected-note {{'ATSFontGetPostScriptName' has been explicitly marked unavailable here}}
Fariborz Jahanian88d510d2011-12-10 00:28:41 +000017
Nico Weber0055a192015-03-19 19:18:22 +000018#if defined(WARN_PARTIAL)
19// expected-note@+3 {{has been explicitly marked partial here}}
20#endif
21extern void
22PartiallyAvailable() __attribute__((availability(macosx,introduced=10.8)));
23
Erik Pilkington4042f3c2017-07-05 17:08:56 +000024#ifdef WARN_PARTIAL
25// expected-note@+2 2 {{marked partial here}}
26#endif
Nico Weber0055a192015-03-19 19:18:22 +000027enum __attribute__((availability(macosx,introduced=10.8))) PartialEnum {
28 kPartialEnumConstant,
29};
30
Fariborz Jahanian88d510d2011-12-10 00:28:41 +000031void test_10095131() {
Manman Renccf25bb2016-06-28 20:55:30 +000032 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}}
Nico Weber0055a192015-03-19 19:18:22 +000034
35#if defined(WARN_PARTIAL)
Alex Lorenz9c5c2bf2017-05-05 16:42:44 +000036 // 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}}
Nico Weber0055a192015-03-19 19:18:22 +000037#endif
38 PartiallyAvailable();
39}
40
Erik Pilkington4042f3c2017-07-05 17:08:56 +000041#ifdef WARN_PARTIAL
42// FIXME: This note should point to the declaration with the availability
43// attribute.
44// expected-note@+2 {{marked partial here}}
45#endif
Nico Weber0055a192015-03-19 19:18:22 +000046extern void PartiallyAvailable() ;
47void with_redeclaration() {
Erik Pilkington4042f3c2017-07-05 17:08:56 +000048#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();
Nico Weber0055a192015-03-19 19:18:22 +000054 enum PartialEnum p = kPartialEnumConstant;
Fariborz Jahanian88d510d2011-12-10 00:28:41 +000055}
Fariborz Jahanian586be882012-01-23 23:38:32 +000056
57// rdar://10711037
58__attribute__((availability(macos, unavailable))) // expected-warning {{attribute 'availability' is ignored}}
59enum {
60 NSDataWritingFileProtectionWriteOnly = 0x30000000,
61 NSDataWritingFileProtectionCompleteUntilUserAuthentication = 0x40000000,
62};
Rafael Espindola2d243bf2012-05-06 19:56:25 +000063
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
Michael Krusedc5ce722018-08-03 01:21:16 +000067void 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)));
Rafael Espindola2d243bf2012-05-06 19:56:25 +000069
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}}
Jordan Rose68449ac2012-07-24 21:55:34 +000076
77
78// <rdar://problem/11886458>
79#if !__has_feature(attribute_availability_with_message)
80# error "Missing __has_feature"
81#endif
Rafael Espindola9a5a6dd2013-01-08 04:04:30 +000082
83extern int x __attribute__((availability(macosx,introduced=10.5)));
84extern int x;
Rafael Espindolac231fab2013-01-08 21:30:32 +000085
86void f8() {
87 int (^b)(int);
Alex Lorenz472cc792017-04-20 09:35:02 +000088 b = ^ (int i) __attribute__((availability(macosx,introduced=10.2))) { return 1; }; // expected-warning {{'availability' attribute only applies to named declarations}}
Rafael Espindolac231fab2013-01-08 21:30:32 +000089}
Rafael Espindolab68dd472013-01-08 22:31:36 +000090
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}}
Jordan Rose60ac3162015-04-30 17:20:30 +000093
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
Erik Pilkington4042f3c2017-07-05 17:08:56 +0000100enum AllDeprecated { // expected-note + {{'AllDeprecated' has been explicitly marked deprecated here}}
101 AllDeprecatedCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000102 AllDeprecatedUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'AllDeprecatedUnavailable' has been explicitly marked unavailable here}}
103} __attribute__((availability(macosx, deprecated=10.2)));
104
Erik Pilkington4042f3c2017-07-05 17:08:56 +0000105enum AllUnavailable { // expected-note + {{'AllUnavailable' has been explicitly marked unavailable here}}
106 AllUnavailableCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000107} __attribute__((availability(macosx, unavailable)));
108
109enum User {
110 UserOD = OriginalDeprecated, // expected-warning {{deprecated}}
111 UserODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000112 UserODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
Jordan Rose60ac3162015-04-30 17:20:30 +0000113
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,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000120 UserADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000121
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 {
Jordan Rosed17c03e2015-04-30 17:20:35 +0000154 UserUnavailableOD = OriginalDeprecated,
Jordan Rose60ac3162015-04-30 17:20:30 +0000155 UserUnavailableODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000156 UserUnavailableODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
Jordan Rose60ac3162015-04-30 17:20:30 +0000157
158 UserUnavailableOU = OriginalUnavailable,
159 UserUnavailableOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable,
160 UserUnavailableOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
161
Jordan Rosed17c03e2015-04-30 17:20:35 +0000162 UserUnavailableAD = AllDeprecatedCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000163 UserUnavailableADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000164 UserUnavailableADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000165
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)));