1 trait Foo {
2     type X;
3     type Y;
4 }
5 
have_x_want_x<T:Foo<X=u32>>(t: &T)6 fn have_x_want_x<T:Foo<X=u32>>(t: &T)
7 {
8     want_x(t);
9 }
10 
have_x_want_y<T:Foo<X=u32>>(t: &T)11 fn have_x_want_y<T:Foo<X=u32>>(t: &T)
12 {
13     want_y(t); //~ ERROR type mismatch
14 }
15 
have_y_want_x<T:Foo<Y=i32>>(t: &T)16 fn have_y_want_x<T:Foo<Y=i32>>(t: &T)
17 {
18     want_x(t); //~ ERROR type mismatch
19 }
20 
have_y_want_y<T:Foo<Y=i32>>(t: &T)21 fn have_y_want_y<T:Foo<Y=i32>>(t: &T)
22 {
23     want_y(t);
24 }
25 
have_xy_want_x<T:Foo<X=u32,Y=i32>>(t: &T)26 fn have_xy_want_x<T:Foo<X=u32,Y=i32>>(t: &T)
27 {
28     want_x(t);
29 }
30 
have_xy_want_y<T:Foo<X=u32,Y=i32>>(t: &T)31 fn have_xy_want_y<T:Foo<X=u32,Y=i32>>(t: &T)
32 {
33     want_y(t);
34 }
35 
have_xy_want_xy<T:Foo<X=u32,Y=i32>>(t: &T)36 fn have_xy_want_xy<T:Foo<X=u32,Y=i32>>(t: &T)
37 {
38     want_x(t);
39     want_y(t);
40 }
41 
want_x<T:Foo<X=u32>>(t: &T)42 fn want_x<T:Foo<X=u32>>(t: &T) { }
43 
want_y<T:Foo<Y=i32>>(t: &T)44 fn want_y<T:Foo<Y=i32>>(t: &T) { }
45 
main()46 fn main() { }
47