| /// This test verifies several different patterns of iOS, and app extension, availability declarations & usages. |
| // RUN: %clang_cc1 "-triple" "arm64-apple-ios26" -DNEW -fsyntax-only -verify %s |
| // RUN: %clang_cc1 "-triple" "arm64-apple-ios18" -fsyntax-only -verify -fapplication-extension -DAPP_EXT %s |
| // RUN: %clang_cc1 "-triple" "arm64-apple-ios18" -fsyntax-only -verify %s |
| |
| __attribute__((availability(ios,strict,introduced=19))) |
| void fNew1(); |
| #ifndef NEW |
| // expected-note@-2 {{here}} |
| #endif |
| |
| __attribute__((availability(ios,strict,introduced=19))) |
| void fNew(); |
| |
| __attribute__((availability(ios,strict,introduced=26))) |
| void fNew() { } |
| #ifndef NEW |
| // expected-note@-2 {{here}} |
| #endif |
| |
| __attribute__((availability(ios,strict,deprecated=19))) |
| void fDep(); |
| |
| __attribute__((availability(ios,strict,deprecated=26))) |
| void fDep() { } |
| #ifdef NEW |
| // expected-note@-2 {{here}} |
| #endif |
| |
| __attribute__((availability(ios,strict,obsoleted=19))) |
| void fObs(); |
| |
| __attribute__((availability(ios,strict,obsoleted=26))) |
| void fObs() { } |
| #ifdef NEW |
| // expected-note@-2 {{here}} |
| #endif |
| |
| __attribute__((availability(ios_app_extension,strict,introduced=19))) |
| void fAppExt(); |
| |
| __attribute__((availability(ios_app_extension,strict,introduced=26))) |
| void fAppExt() { } |
| #ifdef APP_EXT |
| // expected-note@-2 {{here}} |
| #endif |
| |
| void testVersionRemapping() { |
| fNew1(); |
| #ifndef NEW |
| // expected-error@-2 {{'fNew1' is unavailable: introduced in iOS 26.0}} |
| #endif |
| fNew(); |
| #ifndef NEW |
| // expected-error@-2 {{'fNew' is unavailable: introduced in iOS 26}} |
| #endif |
| fDep(); |
| #ifdef NEW |
| // expected-warning@-2 {{'fDep' is deprecated: first deprecated in iOS 26}} |
| #endif |
| fObs(); |
| #ifdef NEW |
| // expected-error@-2 {{'fObs' is unavailable: obsoleted in iOS 26}} |
| #endif |
| |
| fAppExt(); |
| #ifdef APP_EXT |
| // expected-error@-2 {{'fAppExt' is unavailable: introduced in iOS (App Extension) 26}} |
| #endif |
| } |
| |
| __attribute__((availability(ios,strict,introduced=18.5))) // expected-note {{here}} |
| void fMatchErr(); |
| |
| __attribute__((availability(ios,strict,introduced=26))) // expected-warning {{availability does not match previous declaration}} |
| void fMatchErr() { } |
| |
| __attribute__((availability(ios_app_extension,strict,introduced=19))) // expected-note {{here}} |
| void fAppExtErr(); |
| |
| __attribute__((availability(ios_app_extension,strict,introduced=26.1))) // expected-warning {{availability does not match previous declaration}} |
| void fAppExtErr() { } |
| |
| __attribute__((availability(ios,introduced=26))) |
| void fNew2(); |
| #ifndef NEW |
| // expected-note@-2 {{'fNew2' has been marked as being introduced in iOS 26 here, but the deployment target is iOS 18}} |
| #endif |
| __attribute__((availability(ios,introduced=19))) |
| void fNew3(); |
| |
| __attribute__((availability(ios,introduced=27))) |
| void evenNewer(); |
| #ifdef NEW |
| // expected-note@-2 {{'evenNewer' has been marked as being introduced in iOS 27 here, but the deployment target is iOS 26}} |
| #endif |
| |
| void testAvailabilityCheck() { |
| if (__builtin_available(iOS 19, *)) { |
| fNew2(); |
| fNew3(); |
| } |
| if (__builtin_available(iOS 26, *)) { |
| fNew2(); |
| fNew3(); |
| } |
| fNew2(); |
| #ifndef NEW |
| // expected-warning@-2 {{'fNew2' is only available on iOS 26 or newer}} expected-note@-2 {{enclose}} |
| #endif |
| #ifdef NEW |
| evenNewer(); // expected-warning {{'evenNewer' is only available on iOS 27 or newer}} expected-note {{enclose}} |
| #endif |
| } |
| |
| |