1*67e74705SXin Li// RUN: %clang_cc1 -fblocks %s -verify 2*67e74705SXin Li 3*67e74705SXin Li#if !__has_feature(objc_generics) 4*67e74705SXin Li# error Compiler does not support Objective-C generics? 5*67e74705SXin Li#endif 6*67e74705SXin Li 7*67e74705SXin Li#if !__has_feature(objc_generics_variance) 8*67e74705SXin Li# error Compiler does not support co- and contr-variance? 9*67e74705SXin Li#endif 10*67e74705SXin Li 11*67e74705SXin Li@protocol NSObject // expected-note{{'NSObject' declared here}} 12*67e74705SXin Li@end 13*67e74705SXin Li 14*67e74705SXin Li@protocol NSCopying // expected-note{{'NSCopying' declared here}} 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Li__attribute__((objc_root_class)) 18*67e74705SXin Li@interface NSObject <NSObject> // expected-note{{'NSObject' defined here}} 19*67e74705SXin Li@end 20*67e74705SXin Li 21*67e74705SXin Li@interface NSString : NSObject <NSCopying> 22*67e74705SXin Li@end 23*67e74705SXin Li 24*67e74705SXin Li// -------------------------------------------------------------------------- 25*67e74705SXin Li// Parsing parameterized classes. 26*67e74705SXin Li// -------------------------------------------------------------------------- 27*67e74705SXin Li 28*67e74705SXin Li// Parse type parameters with a bound 29*67e74705SXin Li@interface PC1<T, U : NSObject*> : NSObject // expected-note{{'PC1' declared here}} 30*67e74705SXin Li// expected-note@-1{{type parameter 'T' declared here}} 31*67e74705SXin Li// expected-note@-2{{type parameter 'U' declared here}} 32*67e74705SXin Li// expected-note@-3{{type parameter 'U' declared here}} 33*67e74705SXin Li@end 34*67e74705SXin Li 35*67e74705SXin Li// Parse a type parameter with a bound that terminates in '>>'. 36*67e74705SXin Li@interface PC2<T : id<NSObject>> : NSObject 37*67e74705SXin Li@end 38*67e74705SXin Li 39*67e74705SXin Li// Parse multiple type parameters. 40*67e74705SXin Li@interface PC3<T, U : id> : NSObject 41*67e74705SXin Li@end 42*67e74705SXin Li 43*67e74705SXin Li// Parse multiple type parameters--grammatically ambiguous with protocol refs. 44*67e74705SXin Li@interface PC4<T, U, V> : NSObject // expected-note 2{{'PC4' declared here}} 45*67e74705SXin Li@end 46*67e74705SXin Li 47*67e74705SXin Li// Parse a type parameter list without a superclass. 48*67e74705SXin Li@interface PC5<T : id> 49*67e74705SXin Li@end 50*67e74705SXin Li 51*67e74705SXin Li// Parse a type parameter with name conflicts. 52*67e74705SXin Li@interface PC6<T, U, 53*67e74705SXin Li T> : NSObject // expected-error{{redeclaration of type parameter 'T'}} 54*67e74705SXin Li@end 55*67e74705SXin Li 56*67e74705SXin Li// Parse Objective-C protocol references. 57*67e74705SXin Li@interface PC7<T> // expected-error{{cannot find protocol declaration for 'T'}} 58*67e74705SXin Li@end 59*67e74705SXin Li 60*67e74705SXin Li// Parse both type parameters and protocol references. 61*67e74705SXin Li@interface PC8<T> : NSObject <NSObject> 62*67e74705SXin Li@end 63*67e74705SXin Li 64*67e74705SXin Li// Type parameters with improper bounds. 65*67e74705SXin Li@interface PC9<T : int, // expected-error{{type bound 'int' for type parameter 'T' is not an Objective-C pointer type}} 66*67e74705SXin Li U : NSString> : NSObject // expected-error{{missing '*' in type bound 'NSString' for type parameter 'U'}} 67*67e74705SXin Li@end 68*67e74705SXin Li 69*67e74705SXin Li// -------------------------------------------------------------------------- 70*67e74705SXin Li// Parsing parameterized forward declarations classes. 71*67e74705SXin Li// -------------------------------------------------------------------------- 72*67e74705SXin Li 73*67e74705SXin Li// Okay: forward declaration without type parameters. 74*67e74705SXin Li@class PC10; 75*67e74705SXin Li 76*67e74705SXin Li// Okay: forward declarations with type parameters. 77*67e74705SXin Li@class PC10<T, U : NSObject *>, PC11<T : NSObject *, U : id>; // expected-note{{type parameter 'T' declared here}} 78*67e74705SXin Li 79*67e74705SXin Li// Okay: forward declaration without type parameters following ones 80*67e74705SXin Li// with type parameters. 81*67e74705SXin Li@class PC10, PC11; 82*67e74705SXin Li 83*67e74705SXin Li// Okay: definition of class with type parameters that was formerly 84*67e74705SXin Li// declared with the same type parameters. 85*67e74705SXin Li@interface PC10<T, U : NSObject *> : NSObject 86*67e74705SXin Li@end 87*67e74705SXin Li 88*67e74705SXin Li// Mismatched parameters in declaration of @interface following @class. 89*67e74705SXin Li@interface PC11<T, U> : NSObject // expected-error{{missing type bound 'NSObject *' for type parameter 'T' in @interface}} 90*67e74705SXin Li@end 91*67e74705SXin Li 92*67e74705SXin Li@interface PC12<T : NSObject *> : NSObject // expected-note{{type parameter 'T' declared here}} 93*67e74705SXin Li@end 94*67e74705SXin Li 95*67e74705SXin Li@class PC12; 96*67e74705SXin Li 97*67e74705SXin Li// Mismatched parameters in subsequent forward declarations. 98*67e74705SXin Li@class PC13<T : NSObject *>; // expected-note{{type parameter 'T' declared here}} 99*67e74705SXin Li@class PC13; 100*67e74705SXin Li@class PC13<U>; // expected-error{{missing type bound 'NSObject *' for type parameter 'U' in @class}} 101*67e74705SXin Li 102*67e74705SXin Li// Mismatch parameters in declaration of @class following @interface. 103*67e74705SXin Li@class PC12<T>; // expected-error{{missing type bound 'NSObject *' for type parameter 'T' in @class}} 104*67e74705SXin Li 105*67e74705SXin Li// Parameterized forward declaration a class that is not parameterized. 106*67e74705SXin Li@class NSObject<T>; // expected-error{{forward declaration of non-parameterized class 'NSObject' cannot have type parameters}} 107*67e74705SXin Li// expected-note@-1{{'NSObject' declared here}} 108*67e74705SXin Li 109*67e74705SXin Li// Parameterized forward declaration preceding the definition (that is 110*67e74705SXin Li// not parameterized). 111*67e74705SXin Li@class NSNumber<T : NSObject *>; // expected-note{{'NSNumber' declared here}} 112*67e74705SXin Li@interface NSNumber : NSObject // expected-error{{class 'NSNumber' previously declared with type parameters}} 113*67e74705SXin Li@end 114*67e74705SXin Li 115*67e74705SXin Li@class PC14; 116*67e74705SXin Li 117*67e74705SXin Li// Okay: definition of class with type parameters that was formerly 118*67e74705SXin Li// declared without type parameters. 119*67e74705SXin Li@interface PC14<T, U : NSObject *> : NSObject 120*67e74705SXin Li@end 121*67e74705SXin Li 122*67e74705SXin Li// -------------------------------------------------------------------------- 123*67e74705SXin Li// Parsing parameterized categories and extensions. 124*67e74705SXin Li// -------------------------------------------------------------------------- 125*67e74705SXin Li 126*67e74705SXin Li// Inferring type bounds 127*67e74705SXin Li@interface PC1<T, U> (Cat1) <NSObject> 128*67e74705SXin Li@end 129*67e74705SXin Li 130*67e74705SXin Li// Matching type bounds 131*67e74705SXin Li@interface PC1<T : id, U : NSObject *> (Cat2) <NSObject> 132*67e74705SXin Li@end 133*67e74705SXin Li 134*67e74705SXin Li// Inferring type bounds 135*67e74705SXin Li@interface PC1<T, U> () <NSObject> 136*67e74705SXin Li@end 137*67e74705SXin Li 138*67e74705SXin Li// Matching type bounds 139*67e74705SXin Li@interface PC1<T : id, U : NSObject *> () <NSObject> 140*67e74705SXin Li@end 141*67e74705SXin Li 142*67e74705SXin Li// Missing type parameters. 143*67e74705SXin Li@interface PC1<T> () // expected-error{{extension has too few type parameters (expected 2, have 1)}} 144*67e74705SXin Li@end 145*67e74705SXin Li 146*67e74705SXin Li// Extra type parameters. 147*67e74705SXin Li@interface PC1<T, U, V> (Cat3) // expected-error{{category has too many type parameters (expected 2, have 3)}} 148*67e74705SXin Li@end 149*67e74705SXin Li 150*67e74705SXin Li// Mismatched bounds. 151*67e74705SXin Li@interface PC1<T : NSObject *, // expected-error{{type bound 'NSObject *' for type parameter 'T' conflicts with implicit bound 'id'}} 152*67e74705SXin Li X : id> () // expected-error{{type bound 'id' for type parameter 'X' conflicts with previous bound 'NSObject *'for type parameter 'U'}} 153*67e74705SXin Li@end 154*67e74705SXin Li 155*67e74705SXin Li// Parameterized category/extension of non-parameterized class. 156*67e74705SXin Li@interface NSObject<T> (Cat1) // expected-error{{category of non-parameterized class 'NSObject' cannot have type parameters}} 157*67e74705SXin Li@end 158*67e74705SXin Li 159*67e74705SXin Li@interface NSObject<T> () // expected-error{{extension of non-parameterized class 'NSObject' cannot have type parameters}} 160*67e74705SXin Li@end 161*67e74705SXin Li 162*67e74705SXin Li// -------------------------------------------------------------------------- 163*67e74705SXin Li// @implementations cannot have type parameters 164*67e74705SXin Li// -------------------------------------------------------------------------- 165*67e74705SXin Li@implementation PC1<T : id> // expected-error{{@implementation cannot have type parameters}} 166*67e74705SXin Li@end 167*67e74705SXin Li 168*67e74705SXin Li@implementation PC2<T> // expected-error{{@implementation declaration cannot be protocol qualified}} 169*67e74705SXin Li@end 170*67e74705SXin Li 171*67e74705SXin Li@implementation PC1<T> (Cat1) // expected-error{{@implementation cannot have type parameters}} 172*67e74705SXin Li@end 173*67e74705SXin Li 174*67e74705SXin Li@implementation PC1<T : id> (Cat2) // expected-error{{@implementation cannot have type parameters}} 175*67e74705SXin Li@end 176*67e74705SXin Li 177*67e74705SXin Litypedef T undeclaredT; // expected-error{{unknown type name 'T'}} 178*67e74705SXin Li 179*67e74705SXin Li// -------------------------------------------------------------------------- 180*67e74705SXin Li// Interfaces involving type parameters 181*67e74705SXin Li// -------------------------------------------------------------------------- 182*67e74705SXin Li@interface PC20<T : id, U : NSObject *, V : NSString *> : NSObject { 183*67e74705SXin Li T object; 184*67e74705SXin Li} 185*67e74705SXin Li 186*67e74705SXin Li- (U)method:(V)param; 187*67e74705SXin Li@end 188*67e74705SXin Li 189*67e74705SXin Li@interface PC20<T, U, V> (Cat1) 190*67e74705SXin Li- (U)catMethod:(V)param; 191*67e74705SXin Li@end 192*67e74705SXin Li 193*67e74705SXin Li@interface PC20<X, Y, Z>() 194*67e74705SXin Li- (X)extMethod:(Y)param; 195*67e74705SXin Li@end 196*67e74705SXin Li 197*67e74705SXin Li// -------------------------------------------------------------------------- 198*67e74705SXin Li// Parsing type arguments. 199*67e74705SXin Li// -------------------------------------------------------------------------- 200*67e74705SXin Li 201*67e74705SXin Litypedef NSString * ObjCStringRef; // expected-note{{'ObjCStringRef' declared here}} 202*67e74705SXin Li 203*67e74705SXin Li// Type arguments with a mix of identifiers and type-names. 204*67e74705SXin Litypedef PC4<id, NSObject *, NSString *> typeArgs1; 205*67e74705SXin Li 206*67e74705SXin Li// Type arguments with only identifiers. 207*67e74705SXin Litypedef PC4<id, id, id> typeArgs2; 208*67e74705SXin Li 209*67e74705SXin Li// Type arguments with only identifiers; one is ambiguous (resolved as 210*67e74705SXin Li// types). 211*67e74705SXin Litypedef PC4<NSObject, id, id> typeArgs3; // expected-error{{type argument 'NSObject' must be a pointer (requires a '*')}} 212*67e74705SXin Li 213*67e74705SXin Li// Type arguments with only identifiers; one is ambiguous (resolved as 214*67e74705SXin Li// protocol qualifiers). 215*67e74705SXin Litypedef PC4<NSObject, NSCopying> protocolQuals1; 216*67e74705SXin Li 217*67e74705SXin Li// Type arguments and protocol qualifiers. 218*67e74705SXin Litypedef PC4<id, NSObject *, id><NSObject, NSCopying> typeArgsAndProtocolQuals1; 219*67e74705SXin Li 220*67e74705SXin Li// Type arguments and protocol qualifiers in the wrong order. 221*67e74705SXin Litypedef PC4<NSObject, NSCopying><id, NSObject *, id> typeArgsAndProtocolQuals2; // expected-error{{protocol qualifiers must precede type arguments}} 222*67e74705SXin Li 223*67e74705SXin Li// Type arguments and protocol qualifiers (identifiers). 224*67e74705SXin Litypedef PC4<id, NSObject, id><NSObject, NSCopying> typeArgsAndProtocolQuals3; // expected-error{{type argument 'NSObject' must be a pointer (requires a '*')}} 225*67e74705SXin Li 226*67e74705SXin Li// Typo correction: protocol bias. 227*67e74705SXin Litypedef PC4<NSCopying, NSObjec> protocolQuals2; // expected-error{{cannot find protocol declaration for 'NSObjec'; did you mean 'NSObject'?}} 228*67e74705SXin Li 229*67e74705SXin Li// Typo correction: type bias. 230*67e74705SXin Litypedef PC4<id, id, NSObjec> typeArgs4; // expected-error{{unknown class name 'NSObjec'; did you mean 'NSObject'?}} 231*67e74705SXin Li// expected-error@-1{{type argument 'NSObject' must be a pointer (requires a '*')}} 232*67e74705SXin Li 233*67e74705SXin Li// Typo correction: bias set by correction itself to a protocol. 234*67e74705SXin Litypedef PC4<NSObject, NSObject, NSCopyin> protocolQuals3; // expected-error{{cannot find protocol declaration for 'NSCopyin'; did you mean 'NSCopying'?}} 235*67e74705SXin Li 236*67e74705SXin Li// Typo correction: bias set by correction itself to a type. 237*67e74705SXin Litypedef PC4<NSObject, NSObject, ObjCStringref> typeArgs5; // expected-error{{unknown type name 'ObjCStringref'; did you mean 'ObjCStringRef'?}} 238*67e74705SXin Li// expected-error@-1{{type argument 'NSObject' must be a pointer (requires a '*')}} 239*67e74705SXin Li// expected-error@-2{{type argument 'NSObject' must be a pointer (requires a '*')}} 240*67e74705SXin Li 241*67e74705SXin Li// Type/protocol conflict. 242*67e74705SXin Litypedef PC4<NSCopying, ObjCStringRef> typeArgsProtocolQualsConflict1; // expected-error{{angle brackets contain both a type ('ObjCStringRef') and a protocol ('NSCopying')}} 243*67e74705SXin Litypedef PC4<NSCopying, NSString *> typeArgsProtocolQualsConflict2; // expected-error{{angle brackets contain both a type ('NSString') and a protocol ('NSCopying')}} 244*67e74705SXin Litypedef PC4<NSCopying, UnknownType, NSString *> typeArgsProtocolQualsConflict3; // expected-error{{angle brackets contain both a type ('NSString') and a protocol ('NSCopying')}} expected-error{{unknown type name 'UnknownType'}} 245*67e74705SXin Litypedef PC4<UnknownType, NSString *> typeArgsProtocolQualsConflict4; // expected-error{{unknown type name 'UnknownType'}} 246*67e74705SXin Litypedef PC4<NSString, NSCopying, NSString *> typeArgsProtocolQualsConflict5; // expected-error{{angle brackets contain both a type ('NSString') and a protocol ('NSCopying')}} 247*67e74705SXin Li 248*67e74705SXin Li// Handling the '>>' in type argument lists. 249*67e74705SXin Litypedef PC4<id<NSCopying>, NSObject *, id<NSObject>> typeArgs6; 250*67e74705SXin Li 251*67e74705SXin Li// -------------------------------------------------------------------------- 252*67e74705SXin Li// Checking type arguments. 253*67e74705SXin Li// -------------------------------------------------------------------------- 254*67e74705SXin Li 255*67e74705SXin Li@interface PC15<T : id, U : NSObject *, V : id<NSCopying>> : NSObject 256*67e74705SXin Li// expected-note@-1{{type parameter 'V' declared here}} 257*67e74705SXin Li// expected-note@-2{{type parameter 'V' declared here}} 258*67e74705SXin Li// expected-note@-3{{type parameter 'U' declared here}} 259*67e74705SXin Li@end 260*67e74705SXin Li 261*67e74705SXin Litypedef PC4<NSString *> tooFewTypeArgs1; // expected-error{{too few type arguments for class 'PC4' (have 1, expected 3)}} 262*67e74705SXin Li 263*67e74705SXin Litypedef PC4<NSString *, NSString *, NSString *, NSString *> tooManyTypeArgs1; // expected-error{{too many type arguments for class 'PC4' (have 4, expected 3)}} 264*67e74705SXin Li 265*67e74705SXin Litypedef PC15<int (^)(int, int), // block pointers as 'id' 266*67e74705SXin Li NSString *, // subclass 267*67e74705SXin Li NSString *> typeArgs7; // class that conforms to the protocol 268*67e74705SXin Li 269*67e74705SXin Litypedef PC15<NSObject *, NSObject *, id<NSCopying>> typeArgs8; 270*67e74705SXin Li 271*67e74705SXin Litypedef PC15<NSObject *, NSObject *, 272*67e74705SXin Li NSObject *> typeArgs8b; // expected-error{{type argument 'NSObject *' does not satisfy the bound ('id<NSCopying>') of type parameter 'V'}} 273*67e74705SXin Li 274*67e74705SXin Litypedef PC15<id, 275*67e74705SXin Li id, // expected-error{{type argument 'id' does not satisfy the bound ('NSObject *') of type parameter 'U'}} 276*67e74705SXin Li id> typeArgs9; 277*67e74705SXin Li 278*67e74705SXin Litypedef PC15<id, NSObject *, 279*67e74705SXin Li id> typeArgs10; // expected-error{{type argument 'id' does not satisfy the bound ('id<NSCopying>') of type parameter 'V'}} 280*67e74705SXin Li 281*67e74705SXin Litypedef PC15<id, 282*67e74705SXin Li int (^)(int, int), // okay 283*67e74705SXin Li id<NSCopying, NSObject>> typeArgs11; 284*67e74705SXin Li 285*67e74705SXin Litypedef PC15<id, NSString *, int (^)(int, int)> typeArgs12; // okay 286*67e74705SXin Li 287*67e74705SXin Litypedef NSObject<id, id> typeArgs13; // expected-error{{type arguments cannot be applied to non-parameterized class 'NSObject'}} 288*67e74705SXin Li 289*67e74705SXin Litypedef id<id, id> typeArgs14; // expected-error{{type arguments cannot be applied to non-class type 'id'}} 290*67e74705SXin Li 291*67e74705SXin Litypedef PC1<NSObject *, NSString *> typeArgs15; 292*67e74705SXin Li 293*67e74705SXin Litypedef PC1<NSObject *, NSString *><NSCopying> typeArgsAndProtocolQuals4; 294*67e74705SXin Li 295*67e74705SXin Litypedef typeArgs15<NSCopying> typeArgsAndProtocolQuals5; 296*67e74705SXin Li 297*67e74705SXin Litypedef typeArgs15<NSObject *, NSString *> typeArgs16; // expected-error{{type arguments cannot be applied to already-specialized class type 'typeArgs15' (aka 'PC1<NSObject *,NSString *>')}} 298*67e74705SXin Li 299*67e74705SXin Litypedef typeArgs15<NSObject> typeArgsAndProtocolQuals6; 300*67e74705SXin Li 301*67e74705SXin Livoid testSpecializedTypePrinting() { 302*67e74705SXin Li int *ip; 303*67e74705SXin Li 304*67e74705SXin Li ip = (typeArgs15*)0; // expected-warning{{'typeArgs15 *' (aka 'PC1<NSObject *,NSString *> *')}} 305*67e74705SXin Li ip = (typeArgsAndProtocolQuals4*)0; // expected-warning{{'typeArgsAndProtocolQuals4 *' (aka 'PC1<NSObject *,NSString *><NSCopying> *')}} 306*67e74705SXin Li ip = (typeArgsAndProtocolQuals5*)0; // expected-warning{{'typeArgsAndProtocolQuals5 *' (aka 'typeArgs15<NSCopying> *')}} 307*67e74705SXin Li ip = (typeArgsAndProtocolQuals6)0; // expected-error{{used type 'typeArgsAndProtocolQuals6' (aka 'typeArgs15<NSObject>')}} 308*67e74705SXin Li ip = (typeArgsAndProtocolQuals6*)0;// expected-warning{{'typeArgsAndProtocolQuals6 *' (aka 'typeArgs15<NSObject> *')}} 309*67e74705SXin Li} 310*67e74705SXin Li 311*67e74705SXin Li// -------------------------------------------------------------------------- 312*67e74705SXin Li// Specialized superclasses 313*67e74705SXin Li// -------------------------------------------------------------------------- 314*67e74705SXin Li@interface PC21<T : NSObject *> : PC1<T, T> 315*67e74705SXin Li@end 316*67e74705SXin Li 317*67e74705SXin Li@interface PC22<T : NSObject *> : PC1<T> // expected-error{{too few type arguments for class 'PC1' (have 1, expected 2)}} 318*67e74705SXin Li@end 319*67e74705SXin Li 320*67e74705SXin Li@interface PC23<T : NSObject *> : PC1<T, U> // expected-error{{unknown type name 'U'}} 321*67e74705SXin Li@end 322*67e74705SXin Li 323*67e74705SXin Li@interface PC24<T> : PC1<T, T> // expected-error{{type argument 'T' (aka 'id') does not satisfy the bound ('NSObject *') of type parameter 'U'}} 324*67e74705SXin Li@end 325*67e74705SXin Li 326*67e74705SXin Li@interface NSFoo : PC1<NSObject *, NSObject *> // okay 327*67e74705SXin Li@end 328*67e74705SXin Li 329*67e74705SXin Li// -------------------------------------------------------------------------- 330*67e74705SXin Li// Co- and contra-variance. 331*67e74705SXin Li// -------------------------------------------------------------------------- 332*67e74705SXin Li@class Variance1<T, U>; 333*67e74705SXin Li 334*67e74705SXin Li@class Variance1<__covariant T, __contravariant U>; 335*67e74705SXin Li 336*67e74705SXin Li@interface Variance1<__covariant T, __contravariant U> : NSObject // expected-note 2{{declared here}} 337*67e74705SXin Li@end 338*67e74705SXin Li 339*67e74705SXin Li@interface Variance1<T, U> () // okay, inferred 340*67e74705SXin Li@end 341*67e74705SXin Li 342*67e74705SXin Li@interface Variance1<T, U> (Cat1) // okay, inferred 343*67e74705SXin Li@end 344*67e74705SXin Li 345*67e74705SXin Li@class Variance1<T, U>; // okay, inferred 346*67e74705SXin Li 347*67e74705SXin Li@interface Variance1<__covariant T, __contravariant U> () // okay, matches 348*67e74705SXin Li@end 349*67e74705SXin Li 350*67e74705SXin Li@interface Variance1<__covariant T, __contravariant U> (Cat2) // okay, matches 351*67e74705SXin Li@end 352*67e74705SXin Li 353*67e74705SXin Li@class Variance1<__covariant T, __contravariant U>; // okay, matches 354*67e74705SXin Li 355*67e74705SXin Li@interface Variance1<__contravariant X, // expected-error{{contravariant type parameter 'X' conflicts with previous covariant type parameter 'T'}} 356*67e74705SXin Li __covariant Y> () // expected-error{{covariant type parameter 'Y' conflicts with previous contravariant type parameter 'U'}} 357*67e74705SXin Li@end 358*67e74705SXin Li 359*67e74705SXin Li@class Variance2<__covariant T, __contravariant U>; // expected-note 2{{declared here}} 360*67e74705SXin Li 361*67e74705SXin Li@interface Variance2<__contravariant T, // expected-error{{contravariant type parameter 'T' conflicts with previous covariant type parameter 'T'}} 362*67e74705SXin Li U> : NSObject // expected-error{{invariant type parameter 'U' conflicts with previous contravariant type parameter 'U'}} 363*67e74705SXin Li@end 364