1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s 2*67e74705SXin Li// RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s 3*67e74705SXin Li 4*67e74705SXin Li@protocol P 5*67e74705SXin Li- (void)proto_method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 2 {{'proto_method' has been explicitly marked deprecated here}} 6*67e74705SXin Li 7*67e74705SXin Li#if defined(WARN_PARTIAL) 8*67e74705SXin Li // expected-note@+2 2 {{'partial_proto_method' has been explicitly marked partial here}} 9*67e74705SXin Li#endif 10*67e74705SXin Li- (void)partial_proto_method __attribute__((availability(macosx,introduced=10.8))); 11*67e74705SXin Li@end 12*67e74705SXin Li 13*67e74705SXin Li@interface A <P> 14*67e74705SXin Li- (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}} 15*67e74705SXin Li#if defined(WARN_PARTIAL) 16*67e74705SXin Li // expected-note@+2 {{'partialMethod' has been explicitly marked partial here}} 17*67e74705SXin Li#endif 18*67e74705SXin Li- (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); 19*67e74705SXin Li 20*67e74705SXin Li- (void)overridden __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}} 21*67e74705SXin Li- (void)overridden2 __attribute__((availability(macosx,introduced=10.3))); 22*67e74705SXin Li- (void)overridden3 __attribute__((availability(macosx,deprecated=10.3))); 23*67e74705SXin Li- (void)overridden4 __attribute__((availability(macosx,deprecated=10.3))); // expected-note{{overridden method is here}} 24*67e74705SXin Li- (void)overridden5 __attribute__((availability(macosx,unavailable))); 25*67e74705SXin Li- (void)overridden6 __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}} 26*67e74705SXin Li- (void)unavailableMethod __attribute__((unavailable)); 27*67e74705SXin Li@end 28*67e74705SXin Li 29*67e74705SXin Li// rdar://11475360 30*67e74705SXin Li@interface B : A 31*67e74705SXin Li- (void)method; // NOTE: we expect 'method' to *not* inherit availability. 32*67e74705SXin Li- (void)partialMethod; // Likewise. 33*67e74705SXin Li- (void)overridden __attribute__((availability(macosx,introduced=10.4))); // expected-warning{{overriding method introduced after overridden method on macOS (10.4 vs. 10.3)}} 34*67e74705SXin Li- (void)overridden2 __attribute__((availability(macosx,introduced=10.2))); 35*67e74705SXin Li- (void)overridden3 __attribute__((availability(macosx,deprecated=10.4))); 36*67e74705SXin Li- (void)overridden4 __attribute__((availability(macosx,deprecated=10.2))); // expected-warning{{overriding method deprecated before overridden method on macOS (10.3 vs. 10.2)}} 37*67e74705SXin Li- (void)overridden5 __attribute__((availability(macosx,introduced=10.3))); 38*67e74705SXin Li- (void)overridden6 __attribute__((availability(macosx,unavailable))); // expected-warning{{overriding method cannot be unavailable on macOS when its overridden method is available}} 39*67e74705SXin Li- (void)unavailableMethod; // does *not* inherit unavailability 40*67e74705SXin Li@end 41*67e74705SXin Li 42*67e74705SXin Livoid f(A *a, B *b) { 43*67e74705SXin Li [a method]; // expected-warning{{'method' is deprecated: first deprecated in macOS 10.2}} 44*67e74705SXin Li [b method]; // no-warning 45*67e74705SXin Li [a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in macOS 10.2}} 46*67e74705SXin Li [b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in macOS 10.2}} 47*67e74705SXin Li 48*67e74705SXin Li#if defined(WARN_PARTIAL) 49*67e74705SXin Li // expected-warning@+2 {{'partialMethod' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'partialMethod' to silence this warning}} 50*67e74705SXin Li#endif 51*67e74705SXin Li [a partialMethod]; 52*67e74705SXin Li [b partialMethod]; // no warning 53*67e74705SXin Li#if defined(WARN_PARTIAL) 54*67e74705SXin Li // expected-warning@+2 {{'partial_proto_method' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}} 55*67e74705SXin Li#endif 56*67e74705SXin Li [a partial_proto_method]; 57*67e74705SXin Li#if defined(WARN_PARTIAL) 58*67e74705SXin Li // expected-warning@+2 {{'partial_proto_method' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}} 59*67e74705SXin Li#endif 60*67e74705SXin Li [b partial_proto_method]; 61*67e74705SXin Li} 62*67e74705SXin Li 63*67e74705SXin Li@interface A (NewAPI) 64*67e74705SXin Li- (void)partialMethod; 65*67e74705SXin Li- (void)partial_proto_method; 66*67e74705SXin Li@end 67*67e74705SXin Li 68*67e74705SXin Livoid f_after_redecl(A *a, B *b) { 69*67e74705SXin Li [a partialMethod]; // no warning 70*67e74705SXin Li [b partialMethod]; // no warning 71*67e74705SXin Li [a partial_proto_method]; // no warning 72*67e74705SXin Li [b partial_proto_method]; // no warning 73*67e74705SXin Li} 74*67e74705SXin Li 75*67e74705SXin Li// Test case for <rdar://problem/11627873>. Warn about 76*67e74705SXin Li// using a deprecated method when that method is re-implemented in a 77*67e74705SXin Li// subclass where the redeclared method is not deprecated. 78*67e74705SXin Li@interface C 79*67e74705SXin Li- (void) method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}} 80*67e74705SXin Li@end 81*67e74705SXin Li 82*67e74705SXin Li@interface D : C 83*67e74705SXin Li- (void) method; 84*67e74705SXin Li@end 85*67e74705SXin Li 86*67e74705SXin Li@interface E : D 87*67e74705SXin Li- (void) method; 88*67e74705SXin Li@end 89*67e74705SXin Li 90*67e74705SXin Li@implementation D 91*67e74705SXin Li- (void) method { 92*67e74705SXin Li [super method]; // expected-warning {{'method' is deprecated: first deprecated in macOS 10.2}} 93*67e74705SXin Li} 94*67e74705SXin Li@end 95*67e74705SXin Li 96*67e74705SXin Li@implementation E 97*67e74705SXin Li- (void) method { 98*67e74705SXin Li [super method]; // no-warning 99*67e74705SXin Li} 100*67e74705SXin Li@end 101*67e74705SXin Li 102*67e74705SXin Li// rdar://18059669 103*67e74705SXin Li@class NSMutableArray; 104*67e74705SXin Li 105*67e74705SXin Li@interface NSDictionary 106*67e74705SXin Li+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... __attribute__((sentinel(0,1))); 107*67e74705SXin Li@end 108*67e74705SXin Li 109*67e74705SXin Li@class NSString; 110*67e74705SXin Li 111*67e74705SXin Liextern NSString *NSNibTopLevelObjects __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.8,message="" ))); 112*67e74705SXin Liid NSNibOwner, topNibObjects; 113*67e74705SXin Li 114*67e74705SXin Li@interface AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}} 115*67e74705SXin Li 116*67e74705SXin Li-(void)__attribute__((ibaction))importFromSIE:(id)sender; 117*67e74705SXin Li 118*67e74705SXin Li@end 119*67e74705SXin Li 120*67e74705SXin Li@implementation AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}} 121*67e74705SXin Li 122*67e74705SXin Li-(void)__attribute__((ibaction))importFromSIE:(id)sender { 123*67e74705SXin Li 124*67e74705SXin Li NSMutableArray *topNibObjects; 125*67e74705SXin Li NSDictionary *nibLoadDict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSNibOwner, topNibObjects, NSNibTopLevelObjects, ((void *)0)]; 126*67e74705SXin Li} 127*67e74705SXin Li 128*67e74705SXin Li@end 129*67e74705SXin Li 130*67e74705SXin Li@protocol PartialProt 131*67e74705SXin Li- (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8))); 132*67e74705SXin Li+ (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8))); 133*67e74705SXin Li@end 134*67e74705SXin Li 135*67e74705SXin Li@interface PartialI <PartialProt> 136*67e74705SXin Li- (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); 137*67e74705SXin Li+ (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); 138*67e74705SXin Li@end 139*67e74705SXin Li 140*67e74705SXin Li@interface PartialI () 141*67e74705SXin Li- (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8))); 142*67e74705SXin Li#if defined(WARN_PARTIAL) 143*67e74705SXin Li // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}} 144*67e74705SXin Li#endif 145*67e74705SXin Li- (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8))); 146*67e74705SXin Li+ (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8))); 147*67e74705SXin Li#if defined(WARN_PARTIAL) 148*67e74705SXin Li // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}} 149*67e74705SXin Li#endif 150*67e74705SXin Li+ (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8))); 151*67e74705SXin Li@end 152*67e74705SXin Li 153*67e74705SXin Li@interface PartialI (Redecls) 154*67e74705SXin Li- (void)partialMethod; 155*67e74705SXin Li- (void)ipartialMethod1; 156*67e74705SXin Li- (void)ppartialMethod; 157*67e74705SXin Li+ (void)partialMethod; 158*67e74705SXin Li+ (void)ipartialMethod1; 159*67e74705SXin Li+ (void)ppartialMethod; 160*67e74705SXin Li@end 161*67e74705SXin Li 162*67e74705SXin Livoid partialfun(PartialI* a) { 163*67e74705SXin Li [a partialMethod]; // no warning 164*67e74705SXin Li [a ipartialMethod1]; // no warning 165*67e74705SXin Li#if defined(WARN_PARTIAL) 166*67e74705SXin Li // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}} 167*67e74705SXin Li#endif 168*67e74705SXin Li [a ipartialMethod2]; 169*67e74705SXin Li [a ppartialMethod]; // no warning 170*67e74705SXin Li [PartialI partialMethod]; // no warning 171*67e74705SXin Li [PartialI ipartialMethod1]; // no warning 172*67e74705SXin Li#if defined(WARN_PARTIAL) 173*67e74705SXin Li // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}} 174*67e74705SXin Li#endif 175*67e74705SXin Li [PartialI ipartialMethod2]; 176*67e74705SXin Li [PartialI ppartialMethod]; // no warning 177*67e74705SXin Li} 178*67e74705SXin Li 179*67e74705SXin Li#if defined(WARN_PARTIAL) 180*67e74705SXin Li // expected-note@+2 {{'PartialI2' has been explicitly marked partial here}} 181*67e74705SXin Li#endif 182*67e74705SXin Li__attribute__((availability(macosx, introduced = 10.8))) @interface PartialI2 183*67e74705SXin Li@end 184*67e74705SXin Li 185*67e74705SXin Li#if defined(WARN_PARTIAL) 186*67e74705SXin Li // expected-warning@+2 {{'PartialI2' is partial: introduced in macOS 10.8}} expected-note@+2 {{explicitly redeclare 'PartialI2' to silence this warning}} 187*67e74705SXin Li#endif 188*67e74705SXin Livoid partialinter1(PartialI2* p) { 189*67e74705SXin Li} 190*67e74705SXin Li 191*67e74705SXin Li@class PartialI2; 192*67e74705SXin Li 193*67e74705SXin Livoid partialinter2(PartialI2* p) { // no warning 194*67e74705SXin Li} 195*67e74705SXin Li 196*67e74705SXin Li 197*67e74705SXin Li// Test that both the use of the 'typedef' and the enum constant 198*67e74705SXin Li// produces an error. rdar://problem/20903588 199*67e74705SXin Li#define UNAVAILABLE __attribute__((unavailable("not available"))) 200*67e74705SXin Li 201*67e74705SXin Litypedef enum MyEnum : int MyEnum; 202*67e74705SXin Lienum MyEnum : int { // expected-note {{'MyEnum' has been explicitly marked unavailable here}} 203*67e74705SXin Li MyEnum_Blah UNAVAILABLE, // expected-note {{'MyEnum_Blah' has been explicitly marked unavailable here}} 204*67e74705SXin Li} UNAVAILABLE; 205*67e74705SXin Li 206*67e74705SXin Livoid use_myEnum() { 207*67e74705SXin Li // expected-error@+2 {{'MyEnum' is unavailable: not available}} 208*67e74705SXin Li // expected-error@+1 {{MyEnum_Blah' is unavailable: not available}} 209*67e74705SXin Li MyEnum e = MyEnum_Blah; 210*67e74705SXin Li} 211*67e74705SXin Li 212*67e74705SXin Li// Test that the availability of (optional) protocol methods is not 213*67e74705SXin Li// inherited be implementations of those protocol methods. 214*67e74705SXin Li@protocol AvailabilityP2 215*67e74705SXin Li@optional 216*67e74705SXin Li-(void)methodA __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 4{{'methodA' has been explicitly marked deprecated here}} \ 217*67e74705SXin Li// expected-note 2{{protocol method is here}} 218*67e74705SXin Li-(void)methodB __attribute__((unavailable)); // expected-note 4{{'methodB' has been explicitly marked unavailable here}} 219*67e74705SXin Li-(void)methodC; 220*67e74705SXin Li@end 221*67e74705SXin Li 222*67e74705SXin Livoid testAvailabilityP2(id<AvailabilityP2> obj) { 223*67e74705SXin Li [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}} 224*67e74705SXin Li [obj methodB]; // expected-error{{'methodB' is unavailable}} 225*67e74705SXin Li} 226*67e74705SXin Li 227*67e74705SXin Li@interface ImplementsAvailabilityP2a <AvailabilityP2> 228*67e74705SXin Li-(void)methodA; 229*67e74705SXin Li-(void)methodB; 230*67e74705SXin Li@end 231*67e74705SXin Li 232*67e74705SXin Livoid testImplementsAvailabilityP2a(ImplementsAvailabilityP2a *obj) { 233*67e74705SXin Li [obj methodA]; // okay: availability not inherited 234*67e74705SXin Li [obj methodB]; // okay: unavailability not inherited 235*67e74705SXin Li} 236*67e74705SXin Li 237*67e74705SXin Li__attribute__((objc_root_class)) 238*67e74705SXin Li@interface ImplementsAvailabilityP2b <AvailabilityP2> 239*67e74705SXin Li@end 240*67e74705SXin Li 241*67e74705SXin Li@implementation ImplementsAvailabilityP2b 242*67e74705SXin Li-(void)methodA { 243*67e74705SXin Li // Make sure we're not inheriting availability. 244*67e74705SXin Li id<AvailabilityP2> obj = self; 245*67e74705SXin Li [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}} 246*67e74705SXin Li [obj methodB]; // expected-error{{'methodB' is unavailable}} 247*67e74705SXin Li} 248*67e74705SXin Li-(void)methodB { 249*67e74705SXin Li // Make sure we're not inheriting unavailability. 250*67e74705SXin Li id<AvailabilityP2> obj = self; 251*67e74705SXin Li [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}} 252*67e74705SXin Li [obj methodB]; // expected-error{{'methodB' is unavailable}} 253*67e74705SXin Li} 254*67e74705SXin Li 255*67e74705SXin Li@end 256*67e74705SXin Li 257*67e74705SXin Livoid testImplementsAvailabilityP2b(ImplementsAvailabilityP2b *obj) { 258*67e74705SXin Li // still get warnings/errors because we see the protocol version. 259*67e74705SXin Li 260*67e74705SXin Li [obj methodA]; // expected-warning{{'methodA' is deprecated: first deprecated in macOS 10.2}} 261*67e74705SXin Li [obj methodB]; // expected-error{{'methodB' is unavailable}} 262*67e74705SXin Li} 263*67e74705SXin Li 264*67e74705SXin Li__attribute__((objc_root_class)) 265*67e74705SXin Li@interface ImplementsAvailabilityP2c <AvailabilityP2> 266*67e74705SXin Li-(void)methodA __attribute__((availability(macosx,introduced=10.2))); // expected-warning{{method introduced after the protocol method it implements on macOS (10.2 vs. 10.1)}} 267*67e74705SXin Li-(void)methodB __attribute__((unavailable)); 268*67e74705SXin Li@end 269*67e74705SXin Li 270*67e74705SXin Li__attribute__((objc_root_class)) 271*67e74705SXin Li@interface ImplementsAvailabilityP2d <AvailabilityP2> 272*67e74705SXin Li@end 273*67e74705SXin Li 274*67e74705SXin Li@implementation ImplementsAvailabilityP2d 275*67e74705SXin Li-(void)methodA __attribute__((availability(macosx,introduced=10.2))) // expected-warning{{method introduced after the protocol method it implements on macOS (10.2 vs. 10.1)}} 276*67e74705SXin Li{ 277*67e74705SXin Li} 278*67e74705SXin Li-(void)methodB __attribute__((unavailable)) { 279*67e74705SXin Li} 280*67e74705SXin Li@end 281*67e74705SXin Li 282*67e74705SXin Li__attribute__((objc_root_class)) 283*67e74705SXin Li@interface InheritUnavailableSuper 284*67e74705SXin Li-(void)method __attribute__((unavailable)); // expected-note{{'method' has been explicitly marked unavailable here}} 285*67e74705SXin Li@end 286*67e74705SXin Li 287*67e74705SXin Li@interface InheritUnavailableSub : InheritUnavailableSuper 288*67e74705SXin Li-(void)method; 289*67e74705SXin Li@end 290*67e74705SXin Li 291*67e74705SXin Li@implementation InheritUnavailableSub 292*67e74705SXin Li-(void)method { 293*67e74705SXin Li InheritUnavailableSuper *obj = self; 294*67e74705SXin Li [obj method]; // expected-error{{'method' is unavailable}} 295*67e74705SXin Li} 296*67e74705SXin Li@end 297