blob: d003e1e2e363bf1c3a8447f1f8849a8aefa3c1cc [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
Fariborz Jahanianc491c3f2012-10-01 18:42:25 +00005void f0() __attribute__((availability(macosx,introduced=10.4,deprecated=10.2))); // expected-warning{{feature cannot be deprecated in OS X 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
24enum __attribute__((availability(macosx,introduced=10.8))) PartialEnum {
25 kPartialEnumConstant,
26};
27
Fariborz Jahanian88d510d2011-12-10 00:28:41 +000028void test_10095131() {
Fariborz Jahanianc491c3f2012-10-01 18:42:25 +000029 ATSFontGetName("Hello"); // expected-warning {{'ATSFontGetName' is deprecated: first deprecated in OS X 9.0 - use CTFontCopyFullName}}
30 ATSFontGetPostScriptName(100); // expected-error {{'ATSFontGetPostScriptName' is unavailable: obsoleted in OS X 9.0 - use ATSFontGetFullPostScriptName}}
Nico Weber0055a192015-03-19 19:18:22 +000031
32#if defined(WARN_PARTIAL)
33 // expected-warning@+2 {{is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'PartiallyAvailable' to silence this warning}}
34#endif
35 PartiallyAvailable();
36}
37
38extern void PartiallyAvailable() ;
39void with_redeclaration() {
40 PartiallyAvailable(); // Don't warn.
41
42 // enums should never warn.
43 enum PartialEnum p = kPartialEnumConstant;
Fariborz Jahanian88d510d2011-12-10 00:28:41 +000044}
Fariborz Jahanian586be882012-01-23 23:38:32 +000045
46// rdar://10711037
47__attribute__((availability(macos, unavailable))) // expected-warning {{attribute 'availability' is ignored}}
48enum {
49 NSDataWritingFileProtectionWriteOnly = 0x30000000,
50 NSDataWritingFileProtectionCompleteUntilUserAuthentication = 0x40000000,
51};
Rafael Espindola2d243bf2012-05-06 19:56:25 +000052
53void f4(int) __attribute__((availability(ios,deprecated=3.0)));
54void 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
Rafael Espindola3c9d9472012-05-07 23:58:18 +000056void f5(int) __attribute__((availability(ios,deprecated=3.0),
57 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}}
Rafael Espindola2d243bf2012-05-06 19:56:25 +000058
59void f6(int) __attribute__((availability(ios,deprecated=3.0))); // expected-note {{previous attribute is here}}
60void f6(int) __attribute__((availability(ios,deprecated=4.0))); // expected-warning {{availability does not match previous declaration}}
61
62void f7(int) __attribute__((availability(ios,introduced=2.0)));
63void f7(int) __attribute__((availability(ios,deprecated=3.0))); // expected-note {{previous attribute is here}}
64void f7(int) __attribute__((availability(ios,deprecated=4.0))); // expected-warning {{availability does not match previous declaration}}
Jordan Rose68449ac2012-07-24 21:55:34 +000065
66
67// <rdar://problem/11886458>
68#if !__has_feature(attribute_availability_with_message)
69# error "Missing __has_feature"
70#endif
Rafael Espindola9a5a6dd2013-01-08 04:04:30 +000071
72extern int x __attribute__((availability(macosx,introduced=10.5)));
73extern int x;
Rafael Espindolac231fab2013-01-08 21:30:32 +000074
75void f8() {
76 int (^b)(int);
77 b = ^ (int i) __attribute__((availability(macosx,introduced=10.2))) { return 1; }; // expected-warning {{'availability' attribute ignored}}
78}
Rafael Espindolab68dd472013-01-08 22:31:36 +000079
80extern int x2 __attribute__((availability(macosx,introduced=10.2))); // expected-note {{previous attribute is here}}
81extern int x2 __attribute__((availability(macosx,introduced=10.5))); // expected-warning {{availability does not match previous declaration}}
Jordan Rose60ac3162015-04-30 17:20:30 +000082
83
84enum Original {
85 OriginalDeprecated __attribute__((availability(macosx, deprecated=10.2))), // expected-note + {{'OriginalDeprecated' has been explicitly marked deprecated here}}
86 OriginalUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'OriginalUnavailable' has been explicitly marked unavailable here}}
87};
88
89enum AllDeprecated {
90 AllDeprecatedCase, // expected-note + {{'AllDeprecatedCase' has been explicitly marked deprecated here}}
91 AllDeprecatedUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'AllDeprecatedUnavailable' has been explicitly marked unavailable here}}
92} __attribute__((availability(macosx, deprecated=10.2)));
93
94enum AllUnavailable {
95 AllUnavailableCase, // expected-note + {{'AllUnavailableCase' has been explicitly marked unavailable here}}
96} __attribute__((availability(macosx, unavailable)));
97
98enum User {
99 UserOD = OriginalDeprecated, // expected-warning {{deprecated}}
100 UserODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000101 UserODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
Jordan Rose60ac3162015-04-30 17:20:30 +0000102
103 UserOU = OriginalUnavailable, // expected-error {{unavailable}}
104 UserOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable, // expected-error {{unavailable}}
105 UserOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
106
107 UserAD = AllDeprecatedCase, // expected-warning {{deprecated}}
108 UserADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000109 UserADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000110
111 UserADU = AllDeprecatedUnavailable, // expected-error {{unavailable}}
112 UserADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable, // expected-error {{unavailable}}
113 UserADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
114
115 UserAU = AllUnavailableCase, // expected-error {{unavailable}}
116 UserAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase, // expected-error {{unavailable}}
117 UserAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
118};
119
120enum UserDeprecated {
121 UserDeprecatedOD = OriginalDeprecated,
122 UserDeprecatedODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
123 UserDeprecatedODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
124
125 UserDeprecatedOU = OriginalUnavailable, // expected-error {{unavailable}}
126 UserDeprecatedOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable, // expected-error {{unavailable}}
127 UserDeprecatedOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
128
129 UserDeprecatedAD = AllDeprecatedCase,
130 UserDeprecatedADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
131 UserDeprecatedADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
132
133 UserDeprecatedADU = AllDeprecatedUnavailable, // expected-error {{unavailable}}
134 UserDeprecatedADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable, // expected-error {{unavailable}}
135 UserDeprecatedADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
136
137 UserDeprecatedAU = AllUnavailableCase, // expected-error {{unavailable}}
138 UserDeprecatedAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase, // expected-error {{unavailable}}
139 UserDeprecatedAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
140} __attribute__((availability(macosx, deprecated=10.2)));
141
142enum UserUnavailable {
Jordan Rosed17c03e2015-04-30 17:20:35 +0000143 UserUnavailableOD = OriginalDeprecated,
Jordan Rose60ac3162015-04-30 17:20:30 +0000144 UserUnavailableODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000145 UserUnavailableODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
Jordan Rose60ac3162015-04-30 17:20:30 +0000146
147 UserUnavailableOU = OriginalUnavailable,
148 UserUnavailableOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable,
149 UserUnavailableOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
150
Jordan Rosed17c03e2015-04-30 17:20:35 +0000151 UserUnavailableAD = AllDeprecatedCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000152 UserUnavailableADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
Jordan Rosed17c03e2015-04-30 17:20:35 +0000153 UserUnavailableADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
Jordan Rose60ac3162015-04-30 17:20:30 +0000154
155 UserUnavailableADU = AllDeprecatedUnavailable,
156 UserUnavailableADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable,
157 UserUnavailableADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
158
159 UserUnavailableAU = AllUnavailableCase,
160 UserUnavailableAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase,
161 UserUnavailableAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
162} __attribute__((availability(macosx, unavailable)));