3 #![feature(associated_type_bounds)]
5 trait Tr1 { type As1; }
6 trait Tr2 { type As2; }
7 trait Tr3 { type As3; }
8 trait Tr4
<'a
> { type As4; }
9 trait Tr5 { type As5; }
11 impl Tr1
for &str { type As1 = bool; }
12 impl Tr2
for bool { type As2 = u8; }
13 impl Tr3
for u8 { type As3 = fn() -> u8; }
14 impl Tr1
for () { type As1 = (usize,); }
15 impl<'a
> Tr4
<'a
> for (usize,) { type As4 = u8; }
16 impl Tr5
for bool { type As5 = u16; }
18 enum En1
<T
: Tr1
<As1
: Tr2
>> {
21 Inner(<T
::As1
as Tr2
>::As2
),
24 fn wrap_en1_1
<T
>(x
: T
) -> En1
<T
> where T
: Tr1
, T
::As1
: Tr2
{
28 fn wrap_en1_2
<T
>(x
: T
::As1
) -> En1
<T
> where T
: Tr1
, T
::As1
: Tr2
{
32 fn wrap_en1_3
<T
>(x
: <T
::As1
as Tr2
>::As2
) -> En1
<T
> where T
: Tr1
, T
::As1
: Tr2
{
36 enum En2
<T
: Tr1
<As1
: Tr2
<As2
: Tr3
>>> {
39 V2(<T
::As1
as Tr2
>::As2
),
40 V3(<<T
::As1
as Tr2
>::As2
as Tr3
>::As3
),
43 enum En3
<T
: Tr1
<As1
: '
static>> {
48 enum En4
<'x1
, 'x2
, T
: Tr1
<As1
: for<'l
> Tr4
<'l
>>> {
49 V0(&'x1
<T
::As1
as Tr4
<'x1
>>::As4
),
50 V1(&'x2
<T
::As1
as Tr4
<'x2
>>::As4
),
53 enum _En5
<'x1
, 'x2
, T
: Tr1
<As1
: for<'l
> Tr4
<'l
, As4
: Copy
>>> {
54 _V0(&'x1
<T
::As1
as Tr4
<'x1
>>::As4
),
55 _V1(&'x2
<T
::As1
as Tr4
<'x2
>>::As4
),
60 T
: Tr1
<As1
: Tr2
+ '
static + Tr5
>,
63 V1(<T
::As1
as Tr2
>::As2
),
65 V3(<T
::As1
as Tr5
>::As5
),
68 enum _En7
<'a
, 'b
, T
> // `<T::As1 as Tr2>::As2: 'a` is implied.
73 V1(&'b
<T
::As1
as Tr2
>::As2
),
76 fn _make_en7
<'a
, 'b
, T
>(x
: _En7
<'a
, 'b
, T
>)
88 enum EnSelf
<T
> where Self: Tr1
<As1
: Tr2
> {
90 V1(<Self as Tr1
>::As1
),
91 V2(<<Self as Tr1
>::As1
as Tr2
>::As2
),
94 impl Tr1
for EnSelf
<&'
static str> { type As1 = bool; }
97 if let En1
::Outest("foo") = wrap_en1_1
::<_
>("foo") {}
else { panic!() }
;
98 if let En1
::Outer(true) = wrap_en1_2
::<&str>(true) {}
else { panic!() }
;
99 if let En1
::Inner(24u8) = wrap_en1_3
::<&str>(24u8) {}
else { panic!() }
;
101 let _
= En2
::<_
>::V0("151571");
102 let _
= En2
::<&str>::V1(false);
103 let _
= En2
::<&str>::V2(42u8);
104 let _
= En2
::<&str>::V3(|| 12u8);
106 let _
= En3
::<_
>::V0("deadbeef");
107 let _
= En3
::<&str>::V1(&true);
111 let _
= En4
::<()>::V0(&f1
.0
);
112 let _
= En4
::<()>::V1(&f2
.0
);
114 let _
= En6
::<_
>::V0("bar");
115 let _
= En6
::<&str>::V1(24u8);
116 let _
= En6
::<&str>::V2(&false);
117 let _
= En6
::<&str>::V3(12u16);
119 let _
= EnSelf
::<_
>::V0("foo");
120 let _
= EnSelf
::<&'
static str>::V1(true);
121 let _
= EnSelf
::<&'
static str>::V2(24u8);