attr-availability.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. void 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}}
  5. void 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}}
  6. void f2() __attribute__((availability(ios,introduced=2.1,deprecated=2.1)));
  7. void f3() __attribute__((availability(otheros,introduced=2.2))); // expected-warning{{unknown platform 'otheros' in availability macro}}
  8. // rdar://10095131
  9. extern void
  10. ATSFontGetName(const char *oName) __attribute__((availability(macosx,introduced=8.0,deprecated=9.0, message="use CTFontCopyFullName"))); // expected-note {{'ATSFontGetName' has been explicitly marked deprecated here}}
  11. extern void
  12. ATSFontGetPostScriptName(int flags) __attribute__((availability(macosx,introduced=8.0,obsoleted=9.0, message="use ATSFontGetFullPostScriptName"))); // expected-note {{'ATSFontGetPostScriptName' has been explicitly marked unavailable here}}
  13. #if defined(WARN_PARTIAL)
  14. // expected-note@+3 {{has been explicitly marked partial here}}
  15. #endif
  16. extern void
  17. PartiallyAvailable() __attribute__((availability(macosx,introduced=10.8)));
  18. enum __attribute__((availability(macosx,introduced=10.8))) PartialEnum {
  19. kPartialEnumConstant,
  20. };
  21. void test_10095131() {
  22. ATSFontGetName("Hello"); // expected-warning {{'ATSFontGetName' is deprecated: first deprecated in OS X 9.0 - use CTFontCopyFullName}}
  23. ATSFontGetPostScriptName(100); // expected-error {{'ATSFontGetPostScriptName' is unavailable: obsoleted in OS X 9.0 - use ATSFontGetFullPostScriptName}}
  24. #if defined(WARN_PARTIAL)
  25. // expected-warning@+2 {{is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'PartiallyAvailable' to silence this warning}}
  26. #endif
  27. PartiallyAvailable();
  28. }
  29. extern void PartiallyAvailable() ;
  30. void with_redeclaration() {
  31. PartiallyAvailable(); // Don't warn.
  32. // enums should never warn.
  33. enum PartialEnum p = kPartialEnumConstant;
  34. }
  35. // rdar://10711037
  36. __attribute__((availability(macos, unavailable))) // expected-warning {{attribute 'availability' is ignored}}
  37. enum {
  38. NSDataWritingFileProtectionWriteOnly = 0x30000000,
  39. NSDataWritingFileProtectionCompleteUntilUserAuthentication = 0x40000000,
  40. };
  41. void f4(int) __attribute__((availability(ios,deprecated=3.0)));
  42. void 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}}
  43. void f5(int) __attribute__((availability(ios,deprecated=3.0),
  44. 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}}
  45. void f6(int) __attribute__((availability(ios,deprecated=3.0))); // expected-note {{previous attribute is here}}
  46. void f6(int) __attribute__((availability(ios,deprecated=4.0))); // expected-warning {{availability does not match previous declaration}}
  47. void f7(int) __attribute__((availability(ios,introduced=2.0)));
  48. void f7(int) __attribute__((availability(ios,deprecated=3.0))); // expected-note {{previous attribute is here}}
  49. void f7(int) __attribute__((availability(ios,deprecated=4.0))); // expected-warning {{availability does not match previous declaration}}
  50. // <rdar://problem/11886458>
  51. #if !__has_feature(attribute_availability_with_message)
  52. # error "Missing __has_feature"
  53. #endif
  54. extern int x __attribute__((availability(macosx,introduced=10.5)));
  55. extern int x;
  56. void f8() {
  57. int (^b)(int);
  58. b = ^ (int i) __attribute__((availability(macosx,introduced=10.2))) { return 1; }; // expected-warning {{'availability' attribute ignored}}
  59. }
  60. extern int x2 __attribute__((availability(macosx,introduced=10.2))); // expected-note {{previous attribute is here}}
  61. extern int x2 __attribute__((availability(macosx,introduced=10.5))); // expected-warning {{availability does not match previous declaration}}
  62. enum Original {
  63. OriginalDeprecated __attribute__((availability(macosx, deprecated=10.2))), // expected-note + {{'OriginalDeprecated' has been explicitly marked deprecated here}}
  64. OriginalUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'OriginalUnavailable' has been explicitly marked unavailable here}}
  65. };
  66. enum AllDeprecated {
  67. AllDeprecatedCase, // expected-note + {{'AllDeprecatedCase' has been explicitly marked deprecated here}}
  68. AllDeprecatedUnavailable __attribute__((availability(macosx, unavailable))) // expected-note + {{'AllDeprecatedUnavailable' has been explicitly marked unavailable here}}
  69. } __attribute__((availability(macosx, deprecated=10.2)));
  70. enum AllUnavailable {
  71. AllUnavailableCase, // expected-note + {{'AllUnavailableCase' has been explicitly marked unavailable here}}
  72. } __attribute__((availability(macosx, unavailable)));
  73. enum User {
  74. UserOD = OriginalDeprecated, // expected-warning {{deprecated}}
  75. UserODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
  76. UserODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
  77. UserOU = OriginalUnavailable, // expected-error {{unavailable}}
  78. UserOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable, // expected-error {{unavailable}}
  79. UserOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
  80. UserAD = AllDeprecatedCase, // expected-warning {{deprecated}}
  81. UserADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
  82. UserADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
  83. UserADU = AllDeprecatedUnavailable, // expected-error {{unavailable}}
  84. UserADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable, // expected-error {{unavailable}}
  85. UserADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
  86. UserAU = AllUnavailableCase, // expected-error {{unavailable}}
  87. UserAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase, // expected-error {{unavailable}}
  88. UserAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
  89. };
  90. enum UserDeprecated {
  91. UserDeprecatedOD = OriginalDeprecated,
  92. UserDeprecatedODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
  93. UserDeprecatedODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
  94. UserDeprecatedOU = OriginalUnavailable, // expected-error {{unavailable}}
  95. UserDeprecatedOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable, // expected-error {{unavailable}}
  96. UserDeprecatedOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
  97. UserDeprecatedAD = AllDeprecatedCase,
  98. UserDeprecatedADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
  99. UserDeprecatedADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
  100. UserDeprecatedADU = AllDeprecatedUnavailable, // expected-error {{unavailable}}
  101. UserDeprecatedADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable, // expected-error {{unavailable}}
  102. UserDeprecatedADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
  103. UserDeprecatedAU = AllUnavailableCase, // expected-error {{unavailable}}
  104. UserDeprecatedAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase, // expected-error {{unavailable}}
  105. UserDeprecatedAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
  106. } __attribute__((availability(macosx, deprecated=10.2)));
  107. enum UserUnavailable {
  108. UserUnavailableOD = OriginalDeprecated,
  109. UserUnavailableODDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalDeprecated,
  110. UserUnavailableODUnavailable __attribute__((availability(macosx, unavailable))) = OriginalDeprecated,
  111. UserUnavailableOU = OriginalUnavailable,
  112. UserUnavailableOUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = OriginalUnavailable,
  113. UserUnavailableOUUnavailable __attribute__((availability(macosx, unavailable))) = OriginalUnavailable,
  114. UserUnavailableAD = AllDeprecatedCase,
  115. UserUnavailableADDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedCase,
  116. UserUnavailableADUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedCase,
  117. UserUnavailableADU = AllDeprecatedUnavailable,
  118. UserUnavailableADUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllDeprecatedUnavailable,
  119. UserUnavailableADUUnavailable __attribute__((availability(macosx, unavailable))) = AllDeprecatedUnavailable,
  120. UserUnavailableAU = AllUnavailableCase,
  121. UserUnavailableAUDeprecated __attribute__((availability(macosx, deprecated=10.2))) = AllUnavailableCase,
  122. UserUnavailableAUUnavailable __attribute__((availability(macosx, unavailable))) = AllUnavailableCase,
  123. } __attribute__((availability(macosx, unavailable)));