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 OS X 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 {{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 28void test_10095131() { 29 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}} 31 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; 44} 45 46// rdar://10711037 47__attribute__((availability(macos, unavailable))) // expected-warning {{attribute 'availability' is ignored}} 48enum { 49 NSDataWritingFileProtectionWriteOnly = 0x30000000, 50 NSDataWritingFileProtectionCompleteUntilUserAuthentication = 0x40000000, 51}; 52 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 56void 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}} 58 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}} 65 66 67// <rdar://problem/11886458> 68#if !__has_feature(attribute_availability_with_message) 69# error "Missing __has_feature" 70#endif 71 72extern int x __attribute__((availability(macosx,introduced=10.5))); 73extern int x; 74 75void f8() { 76 int (^b)(int); 77 b = ^ (int i) __attribute__((availability(macosx,introduced=10.2))) { return 1; }; // expected-warning {{'availability' attribute ignored}} 78} 79 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}} 82