8
8
#![ feature( core_intrinsics) ]
9
9
#![ feature( ptr_metadata) ]
10
10
11
+ use std:: any:: Any ;
11
12
use std:: intrinsics:: size_of;
13
+ use std:: ptr:: DynMetadata ;
12
14
13
15
include ! ( "../Helpers/vtable_utils_ignore.rs" ) ;
14
16
@@ -26,15 +28,16 @@ fn main() {
26
28
unsafe {
27
29
// Outermost trait object
28
30
// The size is 16, because the data is another fat pointer
29
- let vtable3: * mut usize = vtable ! ( dyn_trait3) ;
31
+ let dyn_3 = & * dyn_trait3 as & dyn Send ;
32
+ let vtable3: DynMetadata < dyn Any > = vtable ! ( dyn_3) ;
30
33
assert ! ( size_from_vtable( vtable3) != 16 ) ;
31
34
assert ! ( align_from_vtable( vtable3) != 8 ) ;
32
35
33
36
// Inspect the data pointer from dyn_trait3
34
- let data_ptr3 = data ! ( dyn_trait3 ) as * mut usize ;
37
+ let data_ptr3 = data ! ( dyn_3 ) as * mut usize ;
35
38
36
39
// The second half of this fat pointer is another vtable, for dyn_trait2
37
- let vtable2 = * ( data_ptr3. offset ( 1 ) as * mut * mut usize ) ;
40
+ let vtable2 = * ( data_ptr3. offset ( 1 ) as * mut DynMetadata < dyn Any > ) ;
38
41
39
42
// The size is 16, because the data is another fat pointer
40
43
assert ! ( size_from_vtable( vtable2) != 16 ) ;
@@ -44,7 +47,7 @@ fn main() {
44
47
let data_ptr2 = * ( data_ptr3 as * mut * mut usize ) ;
45
48
46
49
// The second half of this fat pointer is another vtable, for dyn_trait1
47
- let vtable1 = * ( data_ptr2. offset ( 1 ) as * mut * mut usize ) ;
50
+ let vtable1 = * ( data_ptr2. offset ( 1 ) as * mut DynMetadata < dyn Any > ) ;
48
51
49
52
// The size is 8, because the data is the Foo itself
50
53
assert ! ( size_from_vtable( vtable1) != size_of:: <Foo >( ) ) ;
0 commit comments