4 #![feature(associated_type_bounds)]
6 trait Tr1 { type As1; }
7 trait Tr2 { type As2; }
9 trait Tr4
<'a
> { type As4; }
10 trait Tr5 { type As5; }
12 impl Tr1
for &str { type As1 = bool; }
13 impl Tr2
for bool { type As2 = u8; }
15 impl Tr1
for () { type As1 = (usize,); }
16 impl<'a
> Tr4
<'a
> for (usize,) { type As4 = u8; }
17 impl Tr5
for bool { type As5 = u16; }
19 struct St1
<T
: Tr1
<As1
: Tr2
>> {
22 inner
: <T
::As1
as Tr2
>::As2
,
25 fn unwrap_1_st1
<T
: Tr1
<As1
: Tr2
>>(x
: St1
<T
>) -> (T
, T
::As1
, <T
::As1
as Tr2
>::As2
) {
26 (x
.outest
, x
.outer
, x
.inner
)
29 fn unwrap_2_st1
<T
>(x
: St1
<T
>) -> (T
, T
::As1
, <T
::As1
as Tr2
>::As2
)
37 struct St2
<T
: Tr1
<As1
: Tr2
<As2
: Tr3
>>> {
40 inner
: <T
::As1
as Tr2
>::As2
,
43 struct St3
<T
: Tr1
<As1
: '
static>> {
45 outer
: &'
static T
::As1
,
48 struct St4
<'x1
, 'x2
, T
: Tr1
<As1
: for<'l
> Tr4
<'l
>>> {
49 f1
: &'x1
<T
::As1
as Tr4
<'x1
>>::As4
,
50 f2
: &'x2
<T
::As1
as Tr4
<'x2
>>::As4
,
53 struct St5
<'x1
, 'x2
, T
: Tr1
<As1
: for<'l
> Tr4
<'l
, As4
: Copy
>>> {
54 f1
: &'x1
<T
::As1
as Tr4
<'x1
>>::As4
,
55 f2
: &'x2
<T
::As1
as Tr4
<'x2
>>::As4
,
60 T
: Tr1
<As1
: Tr2
+ '
static + Tr5
>,
63 f1
: <T
::As1
as Tr2
>::As2
,
65 f3
: <T
::As1
as Tr5
>::As5
,
68 struct St7
<'a
, 'b
, T
> // `<T::As1 as Tr2>::As2: 'a` is implied.
73 f1
: &'b
<T
::As1
as Tr2
>::As2
,
76 fn _use_st7
<'a
, 'b
, T
>(x
: St7
<'a
, 'b
, T
>)
84 struct StSelf
<T
> where Self: Tr1
<As1
: Tr2
> {
85 f2
: <<Self as Tr1
>::As1
as Tr2
>::As2
,
88 impl Tr1
for StSelf
<&'
static str> { type As1 = bool; }
91 let st1
= St1 { outest: "foo", outer: true, inner: 42u8 }
;
92 assert_eq
!(("foo", true, 42), unwrap_1_st1(st1
));
94 let _
= St2 { outest: "foo", outer: true, inner: 42u8 }
;
96 let _
= St3 { outest: "foo", outer: &true }
;
100 let st4
= St4
::<()> { f1: &f1.0, f2: &f2.0, }
;
101 assert_eq
!((&1, &2), (st4
.f1
, st4
.f2
));
103 // FIXME: requires lazy normalization.
107 let st5 = St5::<()> { f1: &f1.0, f2: &f2.0, };
108 assert_eq!((&1, &2), (st5.f1, st5.f2));
111 let st6
= St6 { f0: "bar", f1: 24u8, f2: &true, f3: 12u16, }
;
112 assert_eq
!(("bar", 24, &true, 12), (st6
.f0
, st6
.f1
, st6
.f2
, st6
.f3
));
114 let stself
= StSelf
::<&'
static str> { f2: 42u8 }
;
115 assert_eq
!(stself
.f2
, 42u8);