]> git.proxmox.com Git - rustc.git/blob - src/test/ui/associated-type-bounds/trait-alias-impl-trait.rs
New upstream version 1.52.0~beta.3+dfsg1
[rustc.git] / src / test / ui / associated-type-bounds / trait-alias-impl-trait.rs
1 // run-pass
2
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
8
9 use std::ops::Add;
10
11 trait Tr1 { type As1; fn mk(self) -> Self::As1; }
12 trait Tr2<'a> { fn tr2(self) -> &'a Self; }
13
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) {}
17
18 struct S1;
19 #[derive(Copy, Clone)]
20 struct S2;
21 impl Tr1 for S1 { type As1 = S2; fn mk(self) -> Self::As1 { S2 } }
22
23 type Et1 = impl Tr1<As1: Copy>;
24 fn def_et1() -> Et1 { S1 }
25 pub fn use_et1() { assert_copy(def_et1().mk()); }
26
27 type Et2 = impl Tr1<As1: 'static>;
28 fn def_et2() -> Et2 { S1 }
29 pub fn use_et2() { assert_static(def_et2().mk()); }
30
31 type Et3 = impl Tr1<As1: Clone + Iterator<Item: Add<u8, Output: Into<u8>>>>;
32 fn def_et3() -> Et3 {
33 struct A;
34 impl Tr1 for A {
35 type As1 = core::ops::Range<u8>;
36 fn mk(self) -> Self::As1 { 0..10 }
37 }
38 A
39 }
40 pub fn use_et3() {
41 let _0 = def_et3().mk().clone();
42 let mut s = 0u8;
43 for _1 in _0 {
44 let _2 = _1 + 1u8;
45 s += _2.into();
46 }
47 assert_eq!(s, (0..10).map(|x| x + 1).sum());
48 }
49
50 type Et4 = impl Tr1<As1: for<'a> Tr2<'a>>;
51 fn def_et4() -> Et4 {
52 #[derive(Copy, Clone)]
53 struct A;
54 impl Tr1 for A {
55 type As1 = A;
56 fn mk(self) -> A { A }
57 }
58 impl<'a> Tr2<'a> for A {
59 fn tr2(self) -> &'a Self { &A }
60 }
61 A
62 }
63 pub fn use_et4() { assert_forall_tr2(def_et4().mk()); }
64
65 fn main() {
66 let _ = use_et1();
67 let _ = use_et2();
68 let _ = use_et3();
69 let _ = use_et4();
70 }