1// RUN: %clang_cc1 -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s 2// RUN: %clang_cc1 -D WARN_PARTIAL -Wpartial-availability -triple x86_64-apple-darwin9.0.0 -fsyntax-only -verify %s 3 4@protocol P 5- (void)proto_method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note 2 {{'proto_method' has been explicitly marked deprecated here}} 6 7#if defined(WARN_PARTIAL) 8 // expected-note@+2 2 {{'partial_proto_method' has been explicitly marked partial here}} 9#endif 10- (void)partial_proto_method __attribute__((availability(macosx,introduced=10.8))); 11@end 12 13@interface A <P> 14- (void)method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}} 15#if defined(WARN_PARTIAL) 16 // expected-note@+2 {{'partialMethod' has been explicitly marked partial here}} 17#endif 18- (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); 19 20- (void)overridden __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}} 21- (void)overridden2 __attribute__((availability(macosx,introduced=10.3))); 22- (void)overridden3 __attribute__((availability(macosx,deprecated=10.3))); 23- (void)overridden4 __attribute__((availability(macosx,deprecated=10.3))); // expected-note{{overridden method is here}} 24- (void)overridden5 __attribute__((availability(macosx,unavailable))); 25- (void)overridden6 __attribute__((availability(macosx,introduced=10.3))); // expected-note{{overridden method is here}} 26@end 27 28// rdar://11475360 29@interface B : A 30- (void)method; // NOTE: we expect 'method' to *not* inherit availability. 31- (void)partialMethod; // Likewise. 32- (void)overridden __attribute__((availability(macosx,introduced=10.4))); // expected-warning{{overriding method introduced after overridden method on OS X (10.4 vs. 10.3)}} 33- (void)overridden2 __attribute__((availability(macosx,introduced=10.2))); 34- (void)overridden3 __attribute__((availability(macosx,deprecated=10.4))); 35- (void)overridden4 __attribute__((availability(macosx,deprecated=10.2))); // expected-warning{{overriding method deprecated before overridden method on OS X (10.3 vs. 10.2)}} 36- (void)overridden5 __attribute__((availability(macosx,introduced=10.3))); 37- (void)overridden6 __attribute__((availability(macosx,unavailable))); // expected-warning{{overriding method cannot be unavailable on OS X when its overridden method is available}} 38@end 39 40void f(A *a, B *b) { 41 [a method]; // expected-warning{{'method' is deprecated: first deprecated in OS X 10.2}} 42 [b method]; // no-warning 43 [a proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}} 44 [b proto_method]; // expected-warning{{'proto_method' is deprecated: first deprecated in OS X 10.2}} 45 46#if defined(WARN_PARTIAL) 47 // expected-warning@+2 {{'partialMethod' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'partialMethod' to silence this warning}} 48#endif 49 [a partialMethod]; 50 [b partialMethod]; // no warning 51#if defined(WARN_PARTIAL) 52 // expected-warning@+2 {{'partial_proto_method' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}} 53#endif 54 [a partial_proto_method]; 55#if defined(WARN_PARTIAL) 56 // expected-warning@+2 {{'partial_proto_method' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'partial_proto_method' to silence this warning}} 57#endif 58 [b partial_proto_method]; 59} 60 61@interface A (NewAPI) 62- (void)partialMethod; 63- (void)partial_proto_method; 64@end 65 66void f_after_redecl(A *a, B *b) { 67 [a partialMethod]; // no warning 68 [b partialMethod]; // no warning 69 [a partial_proto_method]; // no warning 70 [b partial_proto_method]; // no warning 71} 72 73// Test case for <rdar://problem/11627873>. Warn about 74// using a deprecated method when that method is re-implemented in a 75// subclass where the redeclared method is not deprecated. 76@interface C 77- (void) method __attribute__((availability(macosx,introduced=10.1,deprecated=10.2))); // expected-note {{'method' has been explicitly marked deprecated here}} 78@end 79 80@interface D : C 81- (void) method; 82@end 83 84@interface E : D 85- (void) method; 86@end 87 88@implementation D 89- (void) method { 90 [super method]; // expected-warning {{'method' is deprecated: first deprecated in OS X 10.2}} 91} 92@end 93 94@implementation E 95- (void) method { 96 [super method]; // no-warning 97} 98@end 99 100// rdar://18059669 101@class NSMutableArray; 102 103@interface NSDictionary 104+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... __attribute__((sentinel(0,1))); 105@end 106 107@class NSString; 108 109extern NSString *NSNibTopLevelObjects __attribute__((availability(macosx,introduced=10.0 ,deprecated=10.8,message="" ))); 110id NSNibOwner, topNibObjects; 111 112@interface AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}} 113 114-(void)__attribute__((ibaction))importFromSIE:(id)sender; 115 116@end 117 118@implementation AppDelegate (SIEImport) // expected-error {{cannot find interface declaration for 'AppDelegate'}} 119 120-(void)__attribute__((ibaction))importFromSIE:(id)sender { 121 122 NSMutableArray *topNibObjects; 123 NSDictionary *nibLoadDict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSNibOwner, topNibObjects, NSNibTopLevelObjects, ((void *)0)]; 124} 125 126@end 127 128@protocol PartialProt 129- (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8))); 130+ (void)ppartialMethod __attribute__((availability(macosx,introduced=10.8))); 131@end 132 133@interface PartialI <PartialProt> 134- (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); 135+ (void)partialMethod __attribute__((availability(macosx,introduced=10.8))); 136@end 137 138@interface PartialI () 139- (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8))); 140#if defined(WARN_PARTIAL) 141 // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}} 142#endif 143- (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8))); 144+ (void)ipartialMethod1 __attribute__((availability(macosx,introduced=10.8))); 145#if defined(WARN_PARTIAL) 146 // expected-note@+2 {{'ipartialMethod2' has been explicitly marked partial here}} 147#endif 148+ (void)ipartialMethod2 __attribute__((availability(macosx,introduced=10.8))); 149@end 150 151@interface PartialI (Redecls) 152- (void)partialMethod; 153- (void)ipartialMethod1; 154- (void)ppartialMethod; 155+ (void)partialMethod; 156+ (void)ipartialMethod1; 157+ (void)ppartialMethod; 158@end 159 160void partialfun(PartialI* a) { 161 [a partialMethod]; // no warning 162 [a ipartialMethod1]; // no warning 163#if defined(WARN_PARTIAL) 164 // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}} 165#endif 166 [a ipartialMethod2]; 167 [a ppartialMethod]; // no warning 168 [PartialI partialMethod]; // no warning 169 [PartialI ipartialMethod1]; // no warning 170#if defined(WARN_PARTIAL) 171 // expected-warning@+2 {{'ipartialMethod2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'ipartialMethod2' to silence this warning}} 172#endif 173 [PartialI ipartialMethod2]; 174 [PartialI ppartialMethod]; // no warning 175} 176 177#if defined(WARN_PARTIAL) 178 // expected-note@+2 {{'PartialI2' has been explicitly marked partial here}} 179#endif 180__attribute__((availability(macosx, introduced = 10.8))) @interface PartialI2 181@end 182 183#if defined(WARN_PARTIAL) 184 // expected-warning@+2 {{'PartialI2' is partial: introduced in OS X 10.8}} expected-note@+2 {{explicitly redeclare 'PartialI2' to silence this warning}} 185#endif 186void partialinter1(PartialI2* p) { 187} 188 189@class PartialI2; 190 191void partialinter2(PartialI2* p) { // no warning 192} 193