xref: /aosp_15_r20/external/clang/test/SemaObjC/parameterized_classes.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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