3 #![feature(associated_type_bounds)]
4 // revisions: min_tait full_tait
5 #![feature(min_type_alias_impl_trait)]
6 #![cfg_attr(full_tait, feature(type_alias_impl_trait))]
7 //[full_tait]~^ WARN incomplete
11 trait Tr1 { type As1; fn mk(self) -> Self::As1; }
12 trait Tr2
<'a
> { fn tr2(self) -> &'a Self; }
14 fn assert_copy
<T
: Copy
>(x
: T
) { let _x = x; let _x = x; }
15 fn assert_static
<T
: '
static>(_
: T
) {}
16 fn assert_forall_tr2
<T
: for<'a
> Tr2
<'a
>>(_
: T
) {}
19 #[derive(Copy, Clone)]
21 impl Tr1
for S1 { type As1 = S2; fn mk(self) -> Self::As1 { S2 }
}
23 type Et1
= impl Tr1
<As1
: Copy
>;
24 fn def_et1() -> Et1 { S1 }
25 pub fn use_et1() { assert_copy(def_et1().mk()); }
27 type Et2
= impl Tr1
<As1
: '
static>;
28 fn def_et2() -> Et2 { S1 }
29 pub fn use_et2() { assert_static(def_et2().mk()); }
31 type Et3
= impl Tr1
<As1
: Clone
+ Iterator
<Item
: Add
<u8, Output
: Into
<u8>>>>;
35 type As1
= core
::ops
::Range
<u8>;
36 fn mk(self) -> Self::As1 { 0..10 }
41 let _0
= def_et3().mk().clone();
47 assert_eq
!(s
, (0..10).map(|x
| x
+ 1).sum());
50 type Et4
= impl Tr1
<As1
: for<'a
> Tr2
<'a
>>;
52 #[derive(Copy, Clone)]
56 fn mk(self) -> A { A }
58 impl<'a
> Tr2
<'a
> for A
{
59 fn tr2(self) -> &'a
Self { &A }
63 pub fn use_et4() { assert_forall_tr2(def_et4().mk()); }