1
1
#![ feature( trait_upcasting) ]
2
2
#![ allow( incomplete_features) ]
3
3
4
+ use std:: fmt;
5
+
4
6
fn main ( ) {
5
7
basic ( ) ;
6
8
diamond ( ) ;
7
9
struct_ ( ) ;
8
10
replace_vptr ( ) ;
9
- vtable_mismatch_nop_cast ( ) ;
11
+ vtable_nop_cast ( ) ;
10
12
}
11
13
12
- fn vtable_mismatch_nop_cast ( ) {
13
- let ptr: & dyn std :: fmt:: Display = & 0 ;
14
- // Even though the vtable is for the wrong trait, this cast doesn't actually change the needed
15
- // vtable so it should still be allowed.
16
- let ptr : * const ( dyn std :: fmt :: Debug + Send + Sync ) = unsafe { std :: mem :: transmute ( ptr ) } ;
17
- let _ptr2 = ptr as * const dyn std :: fmt:: Debug ;
14
+ fn vtable_nop_cast ( ) {
15
+ let ptr: & dyn fmt:: Debug = & 0 ;
16
+ // We transmute things around, but the principal trait does not change, so this is allowed.
17
+ let ptr : * const ( dyn fmt :: Debug + Send + Sync ) = unsafe { std :: mem :: transmute ( ptr ) } ;
18
+ // This cast is a NOP and should be allowed.
19
+ let _ptr2 = ptr as * const dyn fmt:: Debug ;
18
20
}
19
21
20
22
fn basic ( ) {
21
- trait Foo : PartialEq < i32 > + std :: fmt:: Debug + Send + Sync {
23
+ trait Foo : PartialEq < i32 > + fmt:: Debug + Send + Sync {
22
24
fn a ( & self ) -> i32 {
23
25
10
24
26
}
@@ -67,7 +69,7 @@ fn basic() {
67
69
}
68
70
69
71
let baz: & dyn Baz = & 1 ;
70
- let _: & dyn std :: fmt:: Debug = baz;
72
+ let _: & dyn fmt:: Debug = baz;
71
73
assert_eq ! ( * baz, 1 ) ;
72
74
assert_eq ! ( baz. a( ) , 100 ) ;
73
75
assert_eq ! ( baz. b( ) , 200 ) ;
@@ -77,7 +79,7 @@ fn basic() {
77
79
assert_eq ! ( baz. w( ) , 21 ) ;
78
80
79
81
let bar: & dyn Bar = baz;
80
- let _: & dyn std :: fmt:: Debug = bar;
82
+ let _: & dyn fmt:: Debug = bar;
81
83
assert_eq ! ( * bar, 1 ) ;
82
84
assert_eq ! ( bar. a( ) , 100 ) ;
83
85
assert_eq ! ( bar. b( ) , 200 ) ;
@@ -86,22 +88,22 @@ fn basic() {
86
88
assert_eq ! ( bar. w( ) , 21 ) ;
87
89
88
90
let foo: & dyn Foo = baz;
89
- let _: & dyn std :: fmt:: Debug = foo;
91
+ let _: & dyn fmt:: Debug = foo;
90
92
assert_eq ! ( * foo, 1 ) ;
91
93
assert_eq ! ( foo. a( ) , 100 ) ;
92
94
assert_eq ! ( foo. z( ) , 11 ) ;
93
95
assert_eq ! ( foo. y( ) , 12 ) ;
94
96
95
97
let foo: & dyn Foo = bar;
96
- let _: & dyn std :: fmt:: Debug = foo;
98
+ let _: & dyn fmt:: Debug = foo;
97
99
assert_eq ! ( * foo, 1 ) ;
98
100
assert_eq ! ( foo. a( ) , 100 ) ;
99
101
assert_eq ! ( foo. z( ) , 11 ) ;
100
102
assert_eq ! ( foo. y( ) , 12 ) ;
101
103
}
102
104
103
105
fn diamond ( ) {
104
- trait Foo : PartialEq < i32 > + std :: fmt:: Debug + Send + Sync {
106
+ trait Foo : PartialEq < i32 > + fmt:: Debug + Send + Sync {
105
107
fn a ( & self ) -> i32 {
106
108
10
107
109
}
@@ -166,7 +168,7 @@ fn diamond() {
166
168
}
167
169
168
170
let baz: & dyn Baz = & 1 ;
169
- let _: & dyn std :: fmt:: Debug = baz;
171
+ let _: & dyn fmt:: Debug = baz;
170
172
assert_eq ! ( * baz, 1 ) ;
171
173
assert_eq ! ( baz. a( ) , 100 ) ;
172
174
assert_eq ! ( baz. b( ) , 200 ) ;
@@ -178,7 +180,7 @@ fn diamond() {
178
180
assert_eq ! ( baz. v( ) , 31 ) ;
179
181
180
182
let bar1: & dyn Bar1 = baz;
181
- let _: & dyn std :: fmt:: Debug = bar1;
183
+ let _: & dyn fmt:: Debug = bar1;
182
184
assert_eq ! ( * bar1, 1 ) ;
183
185
assert_eq ! ( bar1. a( ) , 100 ) ;
184
186
assert_eq ! ( bar1. b( ) , 200 ) ;
@@ -187,7 +189,7 @@ fn diamond() {
187
189
assert_eq ! ( bar1. w( ) , 21 ) ;
188
190
189
191
let bar2: & dyn Bar2 = baz;
190
- let _: & dyn std :: fmt:: Debug = bar2;
192
+ let _: & dyn fmt:: Debug = bar2;
191
193
assert_eq ! ( * bar2, 1 ) ;
192
194
assert_eq ! ( bar2. a( ) , 100 ) ;
193
195
assert_eq ! ( bar2. c( ) , 300 ) ;
@@ -196,17 +198,17 @@ fn diamond() {
196
198
assert_eq ! ( bar2. v( ) , 31 ) ;
197
199
198
200
let foo: & dyn Foo = baz;
199
- let _: & dyn std :: fmt:: Debug = foo;
201
+ let _: & dyn fmt:: Debug = foo;
200
202
assert_eq ! ( * foo, 1 ) ;
201
203
assert_eq ! ( foo. a( ) , 100 ) ;
202
204
203
205
let foo: & dyn Foo = bar1;
204
- let _: & dyn std :: fmt:: Debug = foo;
206
+ let _: & dyn fmt:: Debug = foo;
205
207
assert_eq ! ( * foo, 1 ) ;
206
208
assert_eq ! ( foo. a( ) , 100 ) ;
207
209
208
210
let foo: & dyn Foo = bar2;
209
- let _: & dyn std :: fmt:: Debug = foo;
211
+ let _: & dyn fmt:: Debug = foo;
210
212
assert_eq ! ( * foo, 1 ) ;
211
213
assert_eq ! ( foo. a( ) , 100 ) ;
212
214
}
@@ -215,7 +217,7 @@ fn struct_() {
215
217
use std:: rc:: Rc ;
216
218
use std:: sync:: Arc ;
217
219
218
- trait Foo : PartialEq < i32 > + std :: fmt:: Debug + Send + Sync {
220
+ trait Foo : PartialEq < i32 > + fmt:: Debug + Send + Sync {
219
221
fn a ( & self ) -> i32 {
220
222
10
221
223
}
0 commit comments