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.
4 #![feature(trait_alias)]
6 use std::marker::Unpin;
8 // Some arbitrary object-safe traits:
12 // Nest a few levels deep:
16 type _T00 = dyn _0 + ObjB;
17 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
19 type _T01 = dyn ObjB + _0;
20 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
22 type _T02 = dyn ObjB + _1;
23 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
25 type _T03 = dyn _1 + ObjB;
26 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
28 // Nest some more and in weird ways:
34 type _T10 = dyn _2 + _3;
35 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
37 type _T11 = dyn _3 + _2;
38 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
40 type _T12 = dyn _2 + _4;
41 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
43 type _T13 = dyn _4 + _2;
44 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
46 // Include auto traits:
48 trait _5 = Sync + ObjB + Send;
50 type _T20 = dyn _5 + _1;
51 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
53 type _T21 = dyn _1 + _5;
54 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
56 type _T22 = dyn _5 + ObjA;
57 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
59 type _T23 = dyn ObjA + _5;
60 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
62 type _T24 = dyn Send + _5 + _1 + Sync;
63 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
65 type _T25 = dyn _1 + Sync + _5 + Send;
66 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
68 type _T26 = dyn Sync + Send + _5 + ObjA;
69 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
71 type _T27 = dyn Send + Sync + ObjA + _5;
72 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
81 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
83 type _T31 = dyn _6 + Send;
84 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
86 type _T32 = dyn Send + _6;
87 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
90 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
92 type _T34 = dyn _8 + Send;
93 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
95 type _T35 = dyn Send + _8;
96 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
100 trait _9 = _5 + Sync;
101 trait _10 = Unpin + _9;
103 type _T40 = dyn _10 + ObjA;
104 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
106 type _T41 = dyn ObjA + _10;
107 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
109 type _T42 = dyn _10 + _1;
110 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
112 type _T43 = dyn Send + _10 + Sync + ObjA;
113 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
115 type _T44 = dyn ObjA + _10 + Send + Sync;
116 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]
118 type _T45 = dyn Sync + Send + _10 + _1;
119 //~^ ERROR only auto traits can be used as additional traits in a trait object [E0225]