mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 15:06:36 +00:00

when implementing an optional protocol requirement When an Objective-C method implements an optional protocol requirement, allow the method to use a newer introduced or older obsoleted availability version than what's specified on the method in the protocol itself. This allows SDK adopters to adopt an optional method from a protocol later than when the method is introduced in the protocol. The users that call an optional method on an object that conforms to this protocol are supposed to check whether the object implements the method or not, so a lack of appropriate `if (@available)` check for a new OS version is not a cause of concern as there's already another runtime check that's required. Differential Revision: https://reviews.llvm.org/D102459
48 lines
2.3 KiB
Objective-C
48 lines
2.3 KiB
Objective-C
// RUN: %clang_cc1 -triple arm64-apple-ios11 -fsyntax-only -verify %s
|
|
|
|
@protocol P
|
|
|
|
@property (nonatomic) int reqProp __attribute__((availability(ios, introduced=12.0))); // expected-note 2 {{is here}}
|
|
|
|
|
|
|
|
@optional
|
|
@property (nonatomic) int myProp __attribute__((availability(ios, introduced=12.0))); // expected-note {{has been marked as being introduced in}}
|
|
|
|
@optional
|
|
@property (nonatomic, readonly) int depProp __attribute__((availability(ios, introduced=8.0, deprecated=12.0))); // expected-note {{protocol method is here}}
|
|
|
|
@optional
|
|
@property (nonatomic) int obsProp __attribute__((availability(ios, introduced=8.0, obsoleted=12.0)));
|
|
|
|
@optional
|
|
- (void) unavaibleInClass __attribute__((availability(ios, introduced=12.0))); // expected-note {{method is here}}
|
|
|
|
@end
|
|
|
|
@interface X <P>
|
|
|
|
@property (nonatomic) int myProp __attribute__((availability(ios, introduced=13.0))); // expected-note 2 {{has been marked as being introduced in}}
|
|
|
|
@property (nonatomic) int reqProp __attribute__((availability(ios, introduced=13.0))); // expected-warning 2 {{method introduced after the protocol method it implements on iOS}}
|
|
|
|
@property (nonatomic, readonly) int depProp __attribute__((availability(ios, introduced=8.0, deprecated=10.0))); // expected-warning {{method deprecated before the protocol method it implements on iOS (12.0 vs. 10.0)}} expected-note {{been explicitly marked deprecated here}}
|
|
|
|
@property (nonatomic) int obsProp __attribute__((availability(ios, introduced=8.0, obsoleted=10.0))); // expected-note {{been explicitly marked unavailable here}}
|
|
|
|
- (void) unavaibleInClass __attribute__((availability(ios, unavailable))); // expected-warning {{method cannot be unavailable on iOS when the protocol method it implements is available}}
|
|
|
|
@end
|
|
|
|
|
|
void test(X *x) {
|
|
int i = x.myProp; // expected-warning {{'myProp' is only available on iOS 13.0 or newer}} expected-note {{enclose}}
|
|
x.myProp = i; // expected-warning {{'setMyProp:' is only available on iOS 13.0 or newer}} expected-note {{enclose}}
|
|
int i2 = x.depProp; // expected-warning {{'depProp' is deprecated: first deprecated in iOS 10.0}}
|
|
int i3 = x.obsProp; // expected-error {{'obsProp' is unavailable: obsoleted in iOS 10.0}}
|
|
}
|
|
|
|
void testProto(id<P> x) {
|
|
int i = x.myProp; // expected-warning {{'myProp' is only available on iOS 12.0 or newer}} expected-note {{enclose}}
|
|
}
|