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