@@ -276,6 +276,90 @@ fn bound_in_header_from_env() {
276
276
}
277
277
}
278
278
279
+ #[ test]
280
+ fn mixed_indices_check_projection_bounds ( ) {
281
+ lowering_success ! {
282
+ program {
283
+ trait Foo <T > { }
284
+
285
+ trait Bar <T > {
286
+ type Item : Foo <T >;
287
+ }
288
+
289
+ struct Stuff <T , U > { }
290
+
291
+ impl <T , U > Bar <T > for Stuff <T , U > where U : Foo <T > {
292
+ type Item = U ;
293
+ }
294
+ }
295
+ }
296
+
297
+ lowering_error ! {
298
+ program {
299
+ trait Foo <T > { }
300
+ trait Baz <T > { }
301
+
302
+ trait Bar <T > {
303
+ type Item : Baz <T >;
304
+ }
305
+
306
+ struct Stuff <T , U > { }
307
+
308
+ impl <T , U > Bar <T > for Stuff <T , U > where U : Foo <T > {
309
+ type Item = U ;
310
+ }
311
+ } error_msg {
312
+ "trait impl for \" Bar\" does not meet well-formedness requirements"
313
+ }
314
+ }
315
+ }
316
+
317
+ #[ test]
318
+ fn mixed_indices_check_generic_projection_bounds ( ) {
319
+ lowering_success ! {
320
+ program {
321
+ struct Stuff <T , U > { }
322
+
323
+ trait Foo <T > { }
324
+
325
+ // A type that impls Foo<T> as long as U: Foo<T>.
326
+ struct Fooey <U , V > { }
327
+ impl <T , U , V > Foo <T > for Fooey <U , V > where U : Foo <T > { }
328
+
329
+ trait Bar <T > {
330
+ type Item <V >: Foo <T > where V : Foo <T >;
331
+ }
332
+
333
+ impl <T , U > Bar <T > for Stuff <T , U > where U : Foo <T > {
334
+ type Item <V > = Fooey <U , V >;
335
+ }
336
+ }
337
+ }
338
+
339
+ lowering_error ! {
340
+ program {
341
+ struct Stuff <T , U > { }
342
+
343
+ trait Foo <T > { }
344
+ trait Baz <T > { }
345
+
346
+ // A type that impls Foo<T> as long as U: Foo<T>.
347
+ struct Fooey <U , V > { }
348
+ impl <T , U , V > Foo <T > for Fooey <U , V > where U : Foo <T > { }
349
+
350
+ trait Bar <T > {
351
+ type Item <V >: Baz <T > where V : Foo <T >;
352
+ }
353
+
354
+ impl <T , U > Bar <T > for Stuff <T , U > where U : Foo <T > {
355
+ type Item <V > = Fooey <U , V >;
356
+ }
357
+ } error_msg {
358
+ "trait impl for \" Bar\" does not meet well-formedness requirements"
359
+ }
360
+ }
361
+ }
362
+
279
363
#[ test]
280
364
fn generic_projection_where_clause ( ) {
281
365
lowering_success ! {
0 commit comments