1*67e74705SXin Li// RUN: %clang_cc1 -fblocks -fsyntax-only %s -verify -Wmethod-signatures 2*67e74705SXin Li 3*67e74705SXin Li// Tests Objective-C 'kindof' types. 4*67e74705SXin Li 5*67e74705SXin Li#if !__has_feature(objc_kindof) 6*67e74705SXin Li#error does not support __kindof 7*67e74705SXin Li#endif 8*67e74705SXin Li 9*67e74705SXin Li@protocol NSObject 10*67e74705SXin Li@end 11*67e74705SXin Li 12*67e74705SXin Li@protocol NSCopying 13*67e74705SXin Li- (id)copy; 14*67e74705SXin Li+ (Class)classCopy; 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Li@protocol NSRandomProto 18*67e74705SXin Li- (void)randomMethod; 19*67e74705SXin Li+ (void)randomClassMethod; 20*67e74705SXin Li@end 21*67e74705SXin Li 22*67e74705SXin Li__attribute__((objc_root_class)) 23*67e74705SXin Li@interface NSObject <NSObject> 24*67e74705SXin Li- (NSObject *)retain; 25*67e74705SXin Li@end 26*67e74705SXin Li 27*67e74705SXin Li@interface NSString : NSObject <NSCopying> // expected-note{{receiver is instance of class declared here}} 28*67e74705SXin Li- (void)compare:(NSString *)string; 29*67e74705SXin Li- (NSString *)stringByAppendingString:(NSString *)string; 30*67e74705SXin Li+ (instancetype)string; 31*67e74705SXin Li@end 32*67e74705SXin Li 33*67e74705SXin Li@interface NSMutableString : NSString 34*67e74705SXin Li- (void)appendString:(NSString *)string; 35*67e74705SXin Li@end 36*67e74705SXin Li 37*67e74705SXin Li@interface NSNumber : NSObject <NSCopying> 38*67e74705SXin Li- (NSNumber *)numberByAddingNumber:(NSNumber *)number; 39*67e74705SXin Li@end 40*67e74705SXin Li 41*67e74705SXin Li// --------------------------------------------------------------------------- 42*67e74705SXin Li// Parsing and semantic analysis for __kindof 43*67e74705SXin Li// --------------------------------------------------------------------------- 44*67e74705SXin Li 45*67e74705SXin Li// Test proper application of __kindof. 46*67e74705SXin Litypedef __kindof NSObject *typedef1; 47*67e74705SXin Litypedef NSObject __kindof *typedef2; 48*67e74705SXin Litypedef __kindof NSObject<NSCopying> typedef3; 49*67e74705SXin Litypedef NSObject<NSCopying> __kindof *typedef4; 50*67e74705SXin Litypedef __kindof id<NSCopying> typedef5; 51*67e74705SXin Litypedef __kindof Class<NSCopying> typedef6; 52*67e74705SXin Li 53*67e74705SXin Li// Test redundancy of __kindof. 54*67e74705SXin Litypedef __kindof id __kindof redundant_typedef1; 55*67e74705SXin Litypedef __kindof NSObject __kindof *redundant_typedef2; 56*67e74705SXin Li 57*67e74705SXin Li// Test application of __kindof to typedefs. 58*67e74705SXin Litypedef NSObject *NSObject_ptr_typedef; 59*67e74705SXin Litypedef NSObject NSObject_typedef; 60*67e74705SXin Litypedef __kindof NSObject_ptr_typedef typedef_typedef1; 61*67e74705SXin Litypedef __kindof NSObject_typedef typedef_typedef2; 62*67e74705SXin Li 63*67e74705SXin Li// Test application of __kindof to non-object types. 64*67e74705SXin Litypedef __kindof int nonobject_typedef1; // expected-error{{'__kindof' specifier cannot be applied to non-object type 'int'}} 65*67e74705SXin Litypedef NSObject **NSObject_ptr_ptr; 66*67e74705SXin Litypedef __kindof NSObject_ptr_ptr nonobject_typedef2; // expected-error{{'__kindof' specifier cannot be applied to non-object type 'NSObject_ptr_ptr' (aka 'NSObject **')}} 67*67e74705SXin Li 68*67e74705SXin Li// Test application of __kindof outside of the decl-specifiers. 69*67e74705SXin Litypedef NSObject * __kindof bad_specifier_location1; // expected-error{{'__kindof' type specifier must precede the declarator}} 70*67e74705SXin Litypedef NSObject bad_specifier_location2 __kindof; // expected-error{{expected ';' after top level declarator}} 71*67e74705SXin Li// expected-warning@-1{{declaration does not declare anything}} 72*67e74705SXin Li 73*67e74705SXin Li// --------------------------------------------------------------------------- 74*67e74705SXin Li// Pretty printing of __kindof 75*67e74705SXin Li// --------------------------------------------------------------------------- 76*67e74705SXin Livoid test_pretty_print(int *ip) { 77*67e74705SXin Li __kindof NSObject *kindof_NSObject; 78*67e74705SXin Li ip = kindof_NSObject; // expected-warning{{from '__kindof NSObject *'}} 79*67e74705SXin Li 80*67e74705SXin Li __kindof NSObject_ptr_typedef kindof_NSObject_ptr; 81*67e74705SXin Li ip = kindof_NSObject_ptr; // expected-warning{{from '__kindof NSObject_ptr_typedef'}} 82*67e74705SXin Li 83*67e74705SXin Li __kindof id <NSCopying> *kindof_NSCopying; 84*67e74705SXin Li ip = kindof_NSCopying; // expected-warning{{from '__kindof id<NSCopying> *'}} 85*67e74705SXin Li 86*67e74705SXin Li __kindof NSObject_ptr_typedef *kindof_NSObject_ptr_typedef; 87*67e74705SXin Li ip = kindof_NSObject_ptr_typedef; // expected-warning{{from '__kindof NSObject_ptr_typedef *'}} 88*67e74705SXin Li} 89*67e74705SXin Li 90*67e74705SXin Li// --------------------------------------------------------------------------- 91*67e74705SXin Li// Basic implicit conversions (dropping __kindof, upcasts, etc.) 92*67e74705SXin Li// --------------------------------------------------------------------------- 93*67e74705SXin Livoid test_add_remove_kindof_conversions(void) { 94*67e74705SXin Li __kindof NSObject *kindof_NSObject_obj; 95*67e74705SXin Li NSObject *NSObject_obj; 96*67e74705SXin Li 97*67e74705SXin Li // Conversion back and forth 98*67e74705SXin Li kindof_NSObject_obj = NSObject_obj; 99*67e74705SXin Li NSObject_obj = kindof_NSObject_obj; 100*67e74705SXin Li 101*67e74705SXin Li // Qualified-id conversion back and forth. 102*67e74705SXin Li __kindof id <NSCopying> kindof_id_NSCopying_obj; 103*67e74705SXin Li id <NSCopying> id_NSCopying_obj; 104*67e74705SXin Li kindof_id_NSCopying_obj = id_NSCopying_obj; 105*67e74705SXin Li id_NSCopying_obj = kindof_id_NSCopying_obj; 106*67e74705SXin Li} 107*67e74705SXin Li 108*67e74705SXin Livoid test_upcast_conversions(void) { 109*67e74705SXin Li __kindof NSObject *kindof_NSObject_obj; 110*67e74705SXin Li NSObject *NSObject_obj; 111*67e74705SXin Li 112*67e74705SXin Li // Upcasts 113*67e74705SXin Li __kindof NSString *kindof_NSString_obj; 114*67e74705SXin Li NSString *NSString_obj; 115*67e74705SXin Li kindof_NSObject_obj = kindof_NSString_obj; 116*67e74705SXin Li kindof_NSObject_obj = NSString_obj; 117*67e74705SXin Li NSObject_obj = kindof_NSString_obj; 118*67e74705SXin Li NSObject_obj = NSString_obj; 119*67e74705SXin Li 120*67e74705SXin Li // "Upcasts" with qualified-id. 121*67e74705SXin Li __kindof id <NSCopying> kindof_id_NSCopying_obj; 122*67e74705SXin Li id <NSCopying> id_NSCopying_obj; 123*67e74705SXin Li kindof_id_NSCopying_obj = kindof_NSString_obj; 124*67e74705SXin Li kindof_id_NSCopying_obj = NSString_obj; 125*67e74705SXin Li id_NSCopying_obj = kindof_NSString_obj; 126*67e74705SXin Li id_NSCopying_obj = NSString_obj; 127*67e74705SXin Li} 128*67e74705SXin Li 129*67e74705SXin Li 130*67e74705SXin Livoid test_ptr_object_conversions(void) { 131*67e74705SXin Li __kindof NSObject **ptr_kindof_NSObject_obj; 132*67e74705SXin Li NSObject **ptr_NSObject_obj; 133*67e74705SXin Li 134*67e74705SXin Li // Conversions back and forth. 135*67e74705SXin Li ptr_kindof_NSObject_obj = ptr_NSObject_obj; 136*67e74705SXin Li ptr_NSObject_obj = ptr_kindof_NSObject_obj; 137*67e74705SXin Li 138*67e74705SXin Li // Conversions back and forth with qualified-id. 139*67e74705SXin Li __kindof id <NSCopying> *ptr_kindof_id_NSCopying_obj; 140*67e74705SXin Li id <NSCopying> *ptr_id_NSCopying_obj; 141*67e74705SXin Li ptr_kindof_id_NSCopying_obj = ptr_id_NSCopying_obj; 142*67e74705SXin Li ptr_id_NSCopying_obj = ptr_kindof_id_NSCopying_obj; 143*67e74705SXin Li 144*67e74705SXin Li // Upcasts. 145*67e74705SXin Li __kindof NSString **ptr_kindof_NSString_obj; 146*67e74705SXin Li NSString **ptr_NSString_obj; 147*67e74705SXin Li ptr_kindof_NSObject_obj = ptr_kindof_NSString_obj; 148*67e74705SXin Li ptr_kindof_NSObject_obj = ptr_NSString_obj; 149*67e74705SXin Li ptr_NSObject_obj = ptr_kindof_NSString_obj; 150*67e74705SXin Li ptr_NSObject_obj = ptr_NSString_obj; 151*67e74705SXin Li} 152*67e74705SXin Li 153*67e74705SXin Li// --------------------------------------------------------------------------- 154*67e74705SXin Li// Implicit downcasting 155*67e74705SXin Li// --------------------------------------------------------------------------- 156*67e74705SXin Livoid test_downcast_conversions(void) { 157*67e74705SXin Li __kindof NSObject *kindof_NSObject_obj; 158*67e74705SXin Li NSObject *NSObject_obj; 159*67e74705SXin Li __kindof NSString *kindof_NSString_obj; 160*67e74705SXin Li NSString *NSString_obj; 161*67e74705SXin Li 162*67e74705SXin Li // Implicit downcasting. 163*67e74705SXin Li kindof_NSString_obj = kindof_NSObject_obj; 164*67e74705SXin Li kindof_NSString_obj = NSObject_obj; // expected-warning{{assigning to '__kindof NSString *' from 'NSObject *'}} 165*67e74705SXin Li NSString_obj = kindof_NSObject_obj; 166*67e74705SXin Li NSString_obj = NSObject_obj; // expected-warning{{assigning to 'NSString *' from 'NSObject *'}} 167*67e74705SXin Li 168*67e74705SXin Li // Implicit downcasting with qualified id. 169*67e74705SXin Li __kindof id <NSCopying> kindof_NSCopying_obj; 170*67e74705SXin Li id <NSCopying> NSCopying_obj; 171*67e74705SXin Li kindof_NSString_obj = kindof_NSCopying_obj; 172*67e74705SXin Li kindof_NSString_obj = NSCopying_obj; // expected-warning{{from incompatible type 'id<NSCopying>'}} 173*67e74705SXin Li NSString_obj = kindof_NSCopying_obj; 174*67e74705SXin Li NSString_obj = NSCopying_obj; // expected-warning{{from incompatible type 'id<NSCopying>'}} 175*67e74705SXin Li kindof_NSObject_obj = kindof_NSCopying_obj; 176*67e74705SXin Li kindof_NSObject_obj = NSCopying_obj; // expected-warning{{from incompatible type 'id<NSCopying>'}} 177*67e74705SXin Li NSObject_obj = kindof_NSCopying_obj; 178*67e74705SXin Li NSObject_obj = NSCopying_obj; // expected-warning{{from incompatible type 'id<NSCopying>'}} 179*67e74705SXin Li} 180*67e74705SXin Li 181*67e74705SXin Livoid test_crosscast_conversions(void) { 182*67e74705SXin Li __kindof NSString *kindof_NSString_obj; 183*67e74705SXin Li NSString *NSString_obj; 184*67e74705SXin Li __kindof NSNumber *kindof_NSNumber_obj; 185*67e74705SXin Li NSNumber *NSNumber_obj; 186*67e74705SXin Li 187*67e74705SXin Li NSString_obj = kindof_NSNumber_obj; // expected-warning{{from '__kindof NSNumber *'}} 188*67e74705SXin Li} 189*67e74705SXin Li 190*67e74705SXin Li@interface NSCell : NSObject 191*67e74705SXin Li@end 192*67e74705SXin Li@interface NSCellSub : NSCell 193*67e74705SXin Li@end 194*67e74705SXin Li@interface NSCellSub2 : NSCell 195*67e74705SXin Li@end 196*67e74705SXin Li@interface NSCellSubSub : NSCellSub 197*67e74705SXin Li@end 198*67e74705SXin Li 199*67e74705SXin Litypedef signed char BOOL; 200*67e74705SXin Livoid test_conditional(BOOL flag) { 201*67e74705SXin Li NSCellSubSub *result; 202*67e74705SXin Li __kindof NSCellSub *kindof_Sub; 203*67e74705SXin Li NSCell *cell; 204*67e74705SXin Li NSCellSub *sub; 205*67e74705SXin Li NSCellSub2 *sub2; 206*67e74705SXin Li NSCellSubSub *subsub; 207*67e74705SXin Li 208*67e74705SXin Li // LHS is kindof NSCellSub, RHS is NSCell --> kindof NSCell 209*67e74705SXin Li // LHS is kindof NSCellSub, RHS is NSCellSub --> kindof NSCellSub 210*67e74705SXin Li // LHS is kindof NSCellSub, RHS is NSCellSub2 --> kindof NSCell 211*67e74705SXin Li // LHS is kindof NSCellSub, RHS is NSCellSubSub --> kindof NSCellSub 212*67e74705SXin Li result = flag ? kindof_Sub : cell; 213*67e74705SXin Li result = flag ? kindof_Sub : sub; 214*67e74705SXin Li result = flag ? kindof_Sub : sub2; 215*67e74705SXin Li result = flag ? kindof_Sub : subsub; 216*67e74705SXin Li 217*67e74705SXin Li result = flag ? cell : kindof_Sub; 218*67e74705SXin Li result = flag ? sub : kindof_Sub; 219*67e74705SXin Li result = flag ? sub2 : kindof_Sub; 220*67e74705SXin Li result = flag ? subsub : kindof_Sub; 221*67e74705SXin Li} 222*67e74705SXin Li 223*67e74705SXin Li// --------------------------------------------------------------------------- 224*67e74705SXin Li// Blocks 225*67e74705SXin Li// --------------------------------------------------------------------------- 226*67e74705SXin Livoid test_block_conversions(void) { 227*67e74705SXin Li // Adding/removing __kindof from return type. 228*67e74705SXin Li __kindof NSString *(^kindof_NSString_void_block)(void); 229*67e74705SXin Li NSString *(^NSString_void_block)(void); 230*67e74705SXin Li kindof_NSString_void_block = NSString_void_block; 231*67e74705SXin Li NSString_void_block = kindof_NSString_void_block; 232*67e74705SXin Li 233*67e74705SXin Li // Covariant return type. 234*67e74705SXin Li __kindof NSMutableString *(^kindof_NSMutableString_void_block)(void); 235*67e74705SXin Li NSMutableString *(^NSMutableString_void_block)(void); 236*67e74705SXin Li kindof_NSString_void_block = NSMutableString_void_block; 237*67e74705SXin Li NSString_void_block = kindof_NSMutableString_void_block; 238*67e74705SXin Li kindof_NSString_void_block = NSMutableString_void_block; 239*67e74705SXin Li NSString_void_block = kindof_NSMutableString_void_block; 240*67e74705SXin Li 241*67e74705SXin Li // "Covariant" return type via downcasting rule. 242*67e74705SXin Li kindof_NSMutableString_void_block = NSString_void_block; // expected-error{{from 'NSString *(^)(void)'}} 243*67e74705SXin Li NSMutableString_void_block = kindof_NSString_void_block; 244*67e74705SXin Li kindof_NSMutableString_void_block = NSString_void_block; // expected-error{{from 'NSString *(^)(void)'}} 245*67e74705SXin Li NSMutableString_void_block = kindof_NSString_void_block; 246*67e74705SXin Li 247*67e74705SXin Li // Cross-casted return type. 248*67e74705SXin Li __kindof NSNumber *(^kindof_NSNumber_void_block)(void); 249*67e74705SXin Li NSNumber *(^NSNumber_void_block)(void); 250*67e74705SXin Li kindof_NSString_void_block = NSNumber_void_block; // expected-error{{from 'NSNumber *(^)(void)'}} 251*67e74705SXin Li NSString_void_block = kindof_NSNumber_void_block; // expected-error{{'__kindof NSNumber *(^)(void)'}} 252*67e74705SXin Li kindof_NSString_void_block = NSNumber_void_block; // expected-error{{from 'NSNumber *(^)(void)'}} 253*67e74705SXin Li NSString_void_block = kindof_NSNumber_void_block; // expected-error{{'__kindof NSNumber *(^)(void)'}} 254*67e74705SXin Li 255*67e74705SXin Li // Adding/removing __kindof from argument type. 256*67e74705SXin Li void (^void_kindof_NSString_block)(__kindof NSString *); 257*67e74705SXin Li void (^void_NSString_block)(NSString *); 258*67e74705SXin Li void_kindof_NSString_block = void_NSString_block; 259*67e74705SXin Li void_NSString_block = void_kindof_NSString_block; 260*67e74705SXin Li 261*67e74705SXin Li // Contravariant argument type. 262*67e74705SXin Li void (^void_kindof_NSMutableString_block)(__kindof NSMutableString *); 263*67e74705SXin Li void (^void_NSMutableString_block)(NSMutableString *); 264*67e74705SXin Li void_kindof_NSMutableString_block = void_kindof_NSString_block; 265*67e74705SXin Li void_kindof_NSMutableString_block = void_NSString_block; 266*67e74705SXin Li void_NSMutableString_block = void_kindof_NSString_block; 267*67e74705SXin Li void_NSMutableString_block = void_NSString_block; 268*67e74705SXin Li 269*67e74705SXin Li // "Contravariant" argument type via downcasting rule. 270*67e74705SXin Li void_kindof_NSString_block = void_kindof_NSMutableString_block; 271*67e74705SXin Li void_kindof_NSString_block = void_NSMutableString_block; 272*67e74705SXin Li void_NSString_block = void_kindof_NSMutableString_block; // expected-error{{from 'void (^)(__kindof NSMutableString *)'}} 273*67e74705SXin Li void_NSString_block = void_NSMutableString_block; // expected-error{{from 'void (^)(NSMutableString *)'}} 274*67e74705SXin Li} 275*67e74705SXin Li 276*67e74705SXin Li// --------------------------------------------------------------------------- 277*67e74705SXin Li// Messaging __kindof types. 278*67e74705SXin Li// --------------------------------------------------------------------------- 279*67e74705SXin Livoid message_kindof_object(__kindof NSString *kindof_NSString) { 280*67e74705SXin Li [kindof_NSString retain]; // in superclass 281*67e74705SXin Li [kindof_NSString stringByAppendingString:0]; // in class 282*67e74705SXin Li [kindof_NSString appendString:0]; // in subclass 283*67e74705SXin Li [kindof_NSString numberByAddingNumber: 0]; // expected-warning{{instance method '-numberByAddingNumber:' not found (return type defaults to 'id')}} 284*67e74705SXin Li [kindof_NSString randomMethod]; // in protocol 285*67e74705SXin Li} 286*67e74705SXin Li 287*67e74705SXin Livoid message_kindof_qualified_id(__kindof id <NSCopying> kindof_NSCopying) { 288*67e74705SXin Li [kindof_NSCopying copy]; // in protocol 289*67e74705SXin Li [kindof_NSCopying stringByAppendingString:0]; // in some class 290*67e74705SXin Li [kindof_NSCopying randomMethod]; // in unrelated protocol 291*67e74705SXin Li} 292*67e74705SXin Li 293*67e74705SXin Livoid message_kindof_qualified_class( 294*67e74705SXin Li __kindof Class <NSCopying> kindof_NSCopying) { 295*67e74705SXin Li [kindof_NSCopying classCopy]; // in protocol 296*67e74705SXin Li [kindof_NSCopying string]; // in some class 297*67e74705SXin Li [kindof_NSCopying randomClassMethod]; // in unrelated protocol 298*67e74705SXin Li} 299*67e74705SXin Li 300*67e74705SXin Li// Make sure we don't emit warning about multiple methods found. 301*67e74705SXin Litypedef int NSInteger; 302*67e74705SXin Li@interface Foo : NSObject 303*67e74705SXin Li- (NSString*)test; 304*67e74705SXin Li@end 305*67e74705SXin Li@interface Bar : NSObject 306*67e74705SXin Li- (NSInteger)test; 307*67e74705SXin Li@end 308*67e74705SXin Livoid test(__kindof Bar *kBar) { 309*67e74705SXin Li [kBar test]; 310*67e74705SXin Li} 311*67e74705SXin Li 312*67e74705SXin Li// Make sure we don't emit warning about no method found. 313*67e74705SXin Li@interface A : NSObject 314*67e74705SXin Li@property (readonly, getter=isActive) BOOL active; 315*67e74705SXin Li@end 316*67e74705SXin Li@interface B : NSObject 317*67e74705SXin Li@property (getter=isActive, readonly) BOOL active; 318*67e74705SXin Li@end 319*67e74705SXin Livoid foo() { 320*67e74705SXin Li __kindof B *NSApp; 321*67e74705SXin Li if ([NSApp isActive]) { 322*67e74705SXin Li } 323*67e74705SXin Li} 324*67e74705SXin Li 325*67e74705SXin Litypedef const struct CGPath *CGPathRef; 326*67e74705SXin Li@interface C : NSObject 327*67e74705SXin Li@property (copy) NSString *path; 328*67e74705SXin Li@end 329*67e74705SXin Li@interface D : NSObject 330*67e74705SXin Li@property CGPathRef path __attribute__((availability(macosx,unavailable))); 331*67e74705SXin Li@end 332*67e74705SXin Li// Make sure we choose "NSString *path" for [s1 path]. 333*67e74705SXin Livoid bar(id s1, id s2) { 334*67e74705SXin Li return [[s1 path] compare:[s2 path]]; 335*67e74705SXin Li} 336*67e74705SXin Li 337*67e74705SXin Li// --------------------------------------------------------------------------- 338*67e74705SXin Li// __kindof within specialized types 339*67e74705SXin Li// --------------------------------------------------------------------------- 340*67e74705SXin Li@interface NSArray<T> : NSObject 341*67e74705SXin Li@end 342*67e74705SXin Li 343*67e74705SXin Livoid implicit_convert_array(NSArray<__kindof NSString *> *kindofStringsArray, 344*67e74705SXin Li NSArray<NSString *> *stringsArray, 345*67e74705SXin Li NSArray<__kindof NSMutableString *> 346*67e74705SXin Li *kindofMutStringsArray, 347*67e74705SXin Li NSArray<NSMutableString *> *mutStringsArray) { 348*67e74705SXin Li // Adding/removing __kindof is okay. 349*67e74705SXin Li kindofStringsArray = stringsArray; 350*67e74705SXin Li stringsArray = kindofStringsArray; 351*67e74705SXin Li 352*67e74705SXin Li // Other covariant and contravariant conversions still not permitted. 353*67e74705SXin Li kindofStringsArray = mutStringsArray; // expected-warning{{incompatible pointer types}} 354*67e74705SXin Li stringsArray = kindofMutStringsArray; // expected-warning{{incompatible pointer types}} 355*67e74705SXin Li mutStringsArray = kindofStringsArray; // expected-warning{{incompatible pointer types}} 356*67e74705SXin Li 357*67e74705SXin Li // Adding/removing nested __kindof is okay. 358*67e74705SXin Li NSArray<NSArray<__kindof NSString *> *> *kindofStringsArrayArray; 359*67e74705SXin Li NSArray<NSArray<NSString *> *> *stringsArrayArray; 360*67e74705SXin Li kindofStringsArrayArray = stringsArrayArray; 361*67e74705SXin Li stringsArrayArray = kindofStringsArrayArray; 362*67e74705SXin Li} 363*67e74705SXin Li 364*67e74705SXin Li// --------------------------------------------------------------------------- 365*67e74705SXin Li// __kindof + nullability 366*67e74705SXin Li// --------------------------------------------------------------------------- 367*67e74705SXin Li 368*67e74705SXin Livoid testNullability() { 369*67e74705SXin Li // The base type being a pointer type tickles the bug. 370*67e74705SXin Li extern __kindof id <NSCopying> _Nonnull getSomeCopyable(); 371*67e74705SXin Li NSString *string = getSomeCopyable(); // no-warning 372*67e74705SXin Li 373*67e74705SXin Li void processCopyable(__typeof(getSomeCopyable()) string); 374*67e74705SXin Li processCopyable(0); // expected-warning{{null passed to a callee that requires a non-null argument}} 375*67e74705SXin Li} 376*67e74705SXin Li 377*67e74705SXin Li// Make sure that we don't emit a warning about conflicting parameter types 378*67e74705SXin Li// between __kindof id and id. 379*67e74705SXin Li@interface A2 : NSObject 380*67e74705SXin Li- (void)test:(__kindof id)T; 381*67e74705SXin Li@end 382*67e74705SXin Li@implementation A2 383*67e74705SXin Li- (void)test:(id)T { 384*67e74705SXin Li} 385*67e74705SXin Li@end 386*67e74705SXin Li 387*67e74705SXin Li@interface NSGeneric<ObjectType> : NSObject 388*67e74705SXin Li- (void)test:(__kindof ObjectType)T; 389*67e74705SXin Li- (void)mapUsingBlock:(id (^)(__kindof ObjectType))block; 390*67e74705SXin Li@end 391*67e74705SXin Li@implementation NSGeneric 392*67e74705SXin Li- (void)test:(id)T { 393*67e74705SXin Li} 394*67e74705SXin Li- (void)mapUsingBlock:(id (^)(id))block { 395*67e74705SXin Li} 396*67e74705SXin Li@end 397*67e74705SXin Li 398*67e74705SXin Li// Check that clang doesn't crash when a type parameter is illegal. 399*67e74705SXin Li@interface Array1<T> : NSObject 400*67e74705SXin Li@end 401*67e74705SXin Li 402*67e74705SXin Li@interface I1 : NSObject 403*67e74705SXin Li@end 404*67e74705SXin Li 405*67e74705SXin Li@interface Array1<__kindof I1*>(extensions1) // expected-error{{expected type parameter name}} 406*67e74705SXin Li@end 407*67e74705SXin Li 408*67e74705SXin Li@interface Array2<T1, T2, T3> : NSObject 409*67e74705SXin Li@end 410*67e74705SXin Li 411*67e74705SXin Li@interface Array2<T, T, __kindof I1*>(extensions2) // expected-error{{expected type parameter name}} expected-error{{redeclaration of type parameter 'T'}} 412*67e74705SXin Li@end 413