summaryrefslogtreecommitdiffstats
path: root/tests/ui/associated-type-bounds/trait-params.rs
blob: b0703a4ee22b3b35fc792be2e98cd53a4a46c004 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// build-pass (FIXME(62277): could be check-pass?)

#![feature(associated_type_bounds)]

use std::iter::Once;
use std::ops::Range;

pub trait Three { type A; type B; type C; }
pub fn assert_three<T: ?Sized + Three>() {}
pub fn assert_iterator<T: Iterator>() {}
pub fn assert_copy<T: Copy>() {}
pub fn assert_static<T: 'static>() {}
pub fn assert_send<T: Send>() {}
pub fn assert_forall_into<T: for<'a> Into<&'a u8>>() {}

struct A; struct B;
impl<'a> Into<&'a u8> for A { fn into(self) -> &'a u8 { &0 } }
impl Three for B { type A = Range<u8>; type B = Range<u8>; type C = Range<u8>; }

trait Case1<A, B, C, D, E>
where
    A: Iterator<Item: Copy>,
    B: Iterator<Item: 'static>,
    C: Iterator<Item: 'static + Copy + Send>,
    D: Iterator<Item: for<'a> Into<&'a u8>>,
    E: Three<A: Iterator<Item: Copy>, B: Iterator<Item: Copy>, C: Iterator<Item: Copy>>,
    Self: Three<A: 'static, B: Copy, C: Send>,
{
    fn _a() {
        assert_iterator::<A>();
        assert_copy::<A::Item>();
    }
    fn _b() {
        assert_iterator::<B>();
        assert_static::<B::Item>();
    }
    fn _c() {
        assert_iterator::<C>();
        assert_copy::<C::Item>();
        assert_static::<C::Item>();
        assert_send::<C::Item>();
    }
    fn _d() {
        assert_iterator::<D>();
        assert_forall_into::<D::Item>();
    }
    fn _e() {
        assert_three::<E>();
        assert_iterator::<E::A>();
        assert_iterator::<E::B>();
        assert_iterator::<E::C>();
        assert_copy::<<E::A as Iterator>::Item>();
        assert_copy::<<E::B as Iterator>::Item>();
        assert_copy::<<E::C as Iterator>::Item>();
    }
    fn _self() {
        assert_three::<Self>();
        assert_copy::<Self::B>();
        assert_static::<Self::A>();
        assert_send::<Self::C>();
    }
}

struct DataCase1;
impl Three for DataCase1 { type A = u8; type B = u8; type C = u8; }
impl Case1<Range<u8>, Range<u8>, Range<u8>, Once<A>, B> for DataCase1 {}

trait Case2<
    A: Iterator<Item: Copy>,
    B: Iterator<Item: 'static>,
    C: Iterator<Item: 'static + Copy + Send>,
    D: Iterator<Item: for<'a> Into<&'a u8>>,
    E: Three<A: Iterator<Item: Copy>, B: Iterator<Item: Copy>, C: Iterator<Item: Copy>>,
>:
    Three<A: 'static, B: Copy, C: Send>
{
    fn _a() {
        assert_iterator::<A>();
        assert_copy::<A::Item>();
    }
    fn _b() {
        assert_iterator::<B>();
        assert_static::<B::Item>();
    }
    fn _c() {
        assert_iterator::<C>();
        assert_copy::<C::Item>();
        assert_static::<C::Item>();
        assert_send::<C::Item>();
    }
    fn _d() {
        assert_iterator::<D>();
        assert_forall_into::<D::Item>();
    }
    fn _e() {
        assert_three::<E>();
        assert_iterator::<E::A>();
        assert_iterator::<E::B>();
        assert_iterator::<E::C>();
        assert_copy::<<E::A as Iterator>::Item>();
        assert_copy::<<E::B as Iterator>::Item>();
        assert_copy::<<E::C as Iterator>::Item>();
    }
    fn _self() {
        assert_three::<Self>();
        assert_copy::<Self::B>();
        assert_static::<Self::A>();
        assert_send::<Self::C>();
    }
}

struct DataCase2;
impl Three for DataCase2 { type A = u8; type B = u8; type C = u8; }
impl Case2<Range<u8>, Range<u8>, Range<u8>, Once<A>, B> for DataCase2 {}

fn main() {}