]> git.proxmox.com Git - rustc.git/blame - src/test/ui/traits/alias/no-duplicates.rs
Merge tag 'debian/1.52.1+dfsg1-1_exp2' into proxmox/buster
[rustc.git] / src / test / ui / traits / alias / no-duplicates.rs
CommitLineData
dc9dc135
XL
1// The purpose of this test is to demonstrate that duplicating object safe traits
2// that are not auto traits is rejected with trait aliases even though one could
3// reasonably accept this.
4
5#![feature(trait_alias)]
6
7use std::marker::Unpin;
8
9// Some arbitrary object-safe trait:
10trait Obj {}
11
12// Nest a few levels deep:
13trait _0 = Obj;
14trait _1 = _0;
15
16type _T00 = dyn _0 + _0;
17//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
18
19type _T01 = dyn _1 + _0;
20//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
21
22type _T02 = dyn _1 + _1;
23//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
24
25type _T03 = dyn Obj + _1;
26//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
27
28type _T04 = dyn _1 + Obj;
29//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
30
31// Nest some more and in weird ways:
32
33trait _2 = _0 + _1;
34trait _3 = Obj;
35trait _4 = _3;
36
37type _T10 = dyn _2 + _3;
38//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
39
40type _T11 = dyn _3 + _2;
41//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
42
43type _T12 = dyn Obj + _2;
44//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
45
46type _T13 = dyn _2 + Obj;
47//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
48
49type _T14 = dyn _1 + _3;
50//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
51
52type _T15 = dyn _3 + _1;
53//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
54
55type _T16 = dyn _1 + _4;
56//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
57
58type _T17 = dyn _4 + _1;
59//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
60
61// Include auto traits:
62
63trait _5 = Obj + Send;
64
65type _T20 = dyn _5 + _5;
66//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
67
68type _T21 = dyn Obj + _5;
69//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
70
71type _T22 = dyn _5 + Obj;
72//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
73
74type _T23 = dyn _5 + Send + Sync + Obj;
75//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
76
77// Also nest:
78
79trait _6 = _5 + _5; // ==> Obj + Send + Obj + Send
80
81type _T30 = dyn _6;
82//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
83
84type _T31 = dyn _6 + Send;
85//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
86
87type _T32 = dyn Send + _6;
88//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
89
90// Nest some more:
91
92trait _7 = _5 + Sync;
93trait _8 = Unpin + _7;
94
95type _T40 = dyn _8 + Obj;
96//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
97
98type _T41 = dyn Obj + _8;
99//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
100
101type _T42 = dyn _8 + _4;
102//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
103
104type _T43 = dyn _4 + _8;
105//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
106
107type _T44 = dyn _4 + Send + Sync + _8;
108//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
109
110// Take higher ranked types into account.
111
112// Note that `'a` and `'b` are intentionally different to make sure we consider
113// them semantically the same.
114trait ObjL<'l> {}
115trait _9 = for<'a> ObjL<'a>;
116trait _10 = for<'b> ObjL<'b>;
117type _T50 = dyn _9 + _10;
118//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
119
120trait ObjT<T> {}
121trait _11 = ObjT<for<'a> fn(&'a u8)>;
122trait _12 = ObjT<for<'b> fn(&'b u8)>;
123type _T60 = dyn _11 + _12;
124//~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
125
126fn main() {}