]>
Commit | Line | Data |
---|---|---|
dc9dc135 XL |
1 | // The purpose of this test is to demonstrate that trait alias expansion |
2 | // preserves the rule that `dyn Trait` may only reference one non-auto trait. | |
3 | ||
4 | #![feature(trait_alias)] | |
5 | ||
6 | use std::marker::Unpin; | |
7 | ||
8 | // Some arbitrary object-safe traits: | |
9 | trait ObjA {} | |
10 | trait ObjB {} | |
11 | ||
12 | // Nest a few levels deep: | |
13 | trait _0 = ObjA; | |
14 | trait _1 = _0; | |
15 | ||
16 | type _T00 = dyn _0 + ObjB; | |
17 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
18 | ||
19 | type _T01 = dyn ObjB + _0; | |
20 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
21 | ||
22 | type _T02 = dyn ObjB + _1; | |
23 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
24 | ||
25 | type _T03 = dyn _1 + ObjB; | |
26 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
27 | ||
28 | // Nest some more and in weird ways: | |
29 | ||
30 | trait _2 = ObjB; | |
31 | trait _3 = _2; | |
32 | trait _4 = _3; | |
33 | ||
34 | type _T10 = dyn _2 + _3; | |
35 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
36 | ||
37 | type _T11 = dyn _3 + _2; | |
38 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
39 | ||
40 | type _T12 = dyn _2 + _4; | |
41 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
42 | ||
43 | type _T13 = dyn _4 + _2; | |
44 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
45 | ||
46 | // Include auto traits: | |
47 | ||
48 | trait _5 = Sync + ObjB + Send; | |
49 | ||
50 | type _T20 = dyn _5 + _1; | |
51 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
52 | ||
53 | type _T21 = dyn _1 + _5; | |
54 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
55 | ||
56 | type _T22 = dyn _5 + ObjA; | |
57 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
58 | ||
59 | type _T23 = dyn ObjA + _5; | |
60 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
61 | ||
62 | type _T24 = dyn Send + _5 + _1 + Sync; | |
63 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
64 | ||
65 | type _T25 = dyn _1 + Sync + _5 + Send; | |
66 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
67 | ||
68 | type _T26 = dyn Sync + Send + _5 + ObjA; | |
69 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
70 | ||
71 | type _T27 = dyn Send + Sync + ObjA + _5; | |
72 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
73 | ||
74 | // Also nest: | |
75 | ||
76 | trait _6 = _1 + _5; | |
77 | trait _7 = _6; | |
78 | trait _8 = _7; | |
79 | ||
80 | type _T30 = dyn _6; | |
81 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
82 | ||
83 | type _T31 = dyn _6 + Send; | |
84 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
85 | ||
86 | type _T32 = dyn Send + _6; | |
87 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
88 | ||
89 | type _T33 = dyn _8; | |
90 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
91 | ||
92 | type _T34 = dyn _8 + Send; | |
93 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
94 | ||
95 | type _T35 = dyn Send + _8; | |
96 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
97 | ||
98 | // Nest some more: | |
99 | ||
100 | trait _9 = _5 + Sync; | |
101 | trait _10 = Unpin + _9; | |
102 | ||
103 | type _T40 = dyn _10 + ObjA; | |
104 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
105 | ||
106 | type _T41 = dyn ObjA + _10; | |
107 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
108 | ||
109 | type _T42 = dyn _10 + _1; | |
110 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
111 | ||
112 | type _T43 = dyn Send + _10 + Sync + ObjA; | |
113 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
114 | ||
115 | type _T44 = dyn ObjA + _10 + Send + Sync; | |
116 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
117 | ||
118 | type _T45 = dyn Sync + Send + _10 + _1; | |
119 | //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225] | |
120 | ||
121 | fn main() {} |