Skip to content

Commit 3248148

Browse files
avanhatttedinski
authored andcommitted
Update dyn trait tests from raw to ptr Rust APIs (rust-lang#306)
1 parent 91571ce commit 3248148

12 files changed

+39
-43
lines changed

src/test/cbmc/DynTrait/dyn_fn_param.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
// Check that we can pass a dyn function pointer to a stand alone
55
// function definition
66

7-
#![feature(raw)]
8-
#![allow(deprecated)]
7+
#![feature(ptr_metadata)]
98

109
include!("../Helpers/vtable_utils_ignore.rs");
1110

src/test/cbmc/DynTrait/dyn_fn_param_closure.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33

44
// Check that we can pass a dyn function pointer to a simple closure
5-
#![feature(raw)]
6-
#![allow(deprecated)]
5+
#![feature(ptr_metadata)]
76

87
include!("../Helpers/vtable_utils_ignore.rs");
98

src/test/cbmc/DynTrait/dyn_fn_param_closure_capture.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
// Check that we can pass a dyn function pointer to a closure that captures
55
// some data
6-
#![feature(raw)]
7-
#![allow(deprecated)]
6+
#![feature(ptr_metadata)]
87

98
include!("../Helpers/vtable_utils_ignore.rs");
109

src/test/cbmc/DynTrait/dyn_fn_param_closure_capture_fail.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
// Check that we can pass a dyn function pointer to a closure that captures
55
// some data
6-
#![feature(raw)]
7-
#![allow(deprecated)]
6+
#![feature(ptr_metadata)]
87

98
include!("../Helpers/vtable_utils_ignore.rs");
109
include!("../../rmc-prelude.rs");

src/test/cbmc/DynTrait/dyn_fn_param_closure_fail.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33

44
// Check that we can pass a dyn function pointer to a simple closure
5-
#![feature(raw)]
6-
#![allow(deprecated)]
5+
#![feature(ptr_metadata)]
76

87
include!("../Helpers/vtable_utils_ignore.rs");
98
include!("../../rmc-prelude.rs");

src/test/cbmc/DynTrait/dyn_fn_param_fail_fixme.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
// function definition. Inverted negative test.
66

77
// FIXME https://github.com/model-checking/rmc/issues/240
8-
9-
#![feature(raw)]
10-
#![allow(deprecated)]
8+
#![feature(ptr_metadata)]
119

1210
include!("../Helpers/vtable_utils_ignore.rs");
1311
include!("../../rmc-prelude.rs");

src/test/cbmc/DynTrait/nested_boxes.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
// outter 2 dynamic trait objects have fat pointers as their backing data.
66

77
#![feature(core_intrinsics)]
8-
#![feature(raw)]
9-
#![allow(deprecated)]
8+
#![feature(ptr_metadata)]
109

10+
use std::any::Any;
1111
use std::intrinsics::size_of;
12+
use std::ptr::DynMetadata;
1213

1314
include!("../Helpers/vtable_utils_ignore.rs");
1415

@@ -27,15 +28,15 @@ fn main() {
2728
// Outermost trait object
2829
// The size is 16, because the data is another fat pointer
2930
let dyn_3 = &*dyn_trait3 as &dyn Send;
30-
let vtable3: *mut usize = vtable!(dyn_3);
31+
let vtable3: DynMetadata<dyn Any> = vtable!(dyn_3);
3132
assert!(size_from_vtable(vtable3) == 16);
3233
assert!(align_from_vtable(vtable3) == 8);
3334

3435
// Inspect the data pointer from dyn_trait3
3536
let data_ptr3 = data!(dyn_3) as *mut usize;
3637

3738
// The second half of this fat pointer is another vtable, for dyn_trait2
38-
let vtable2 = *(data_ptr3.offset(1) as *mut *mut usize);
39+
let vtable2 = *(data_ptr3.offset(1) as *mut DynMetadata<dyn Any>);
3940

4041
// The size is 16, because the data is another fat pointer
4142
assert!(size_from_vtable(vtable2) == 16);
@@ -45,7 +46,7 @@ fn main() {
4546
let data_ptr2 = *(data_ptr3 as *mut *mut usize);
4647

4748
// The second half of this fat pointer is another vtable, for dyn_trait1
48-
let vtable1 = *(data_ptr2.offset(1) as *mut *mut usize);
49+
let vtable1 = *(data_ptr2.offset(1) as *mut DynMetadata<dyn Any>);
4950

5051
// The size is 8, because the data is the Foo itself
5152
assert!(size_from_vtable(vtable1) == size_of::<Foo>());

src/test/cbmc/DynTrait/nested_boxes_fail.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
// In this failing tests, assertions are inverted to use !=.
77

88
#![feature(core_intrinsics)]
9-
#![feature(raw)]
10-
#![allow(deprecated)]
9+
#![feature(ptr_metadata)]
1110

1211
use std::intrinsics::size_of;
1312

src/test/cbmc/DynTrait/vtable_size_align_drop.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33

44
// This test checks the `size` and `align` fields of vtables, for a
55
// dynamic trait where two implementing structs have different sizes.
6-
// The strategy is to cast the dyn trait object to a raw::TraitObject
7-
// then do some unsafe pointer math.
6+
// The strategy is to use the new pointer metadata API:
7+
// https://github.com/rust-lang/rust/issues/81513
88

99
#![feature(core_intrinsics)]
10-
#![feature(raw)]
11-
#![allow(deprecated)]
10+
#![feature(ptr_metadata)]
1211

1312
use std::intrinsics::size_of;
1413
use std::ptr::drop_in_place;

src/test/cbmc/DynTrait/vtable_size_align_drop_fail.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33

44
// This test checks the `size` and `align` fields of vtables, for a
55
// dynamic trait where two implementing structs have different sizes.
6-
// The strategy is to cast the dyn trait object to a raw::TraitObject
7-
// then do some unsafe pointer math.
6+
// The strategy is to use the new pointer metadata API:
7+
// https://github.com/rust-lang/rust/issues/81513
88

99
// In this _fail version, all asserts should fail.
1010

1111
#![feature(core_intrinsics)]
12-
#![feature(raw)]
13-
#![allow(deprecated)]
12+
#![feature(ptr_metadata)]
1413

1514
use std::intrinsics::size_of;
1615
use std::ptr::drop_in_place;

src/test/cbmc/FatPointers/boxmuttrait.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0 OR MIT
33
#![feature(core_intrinsics)]
4-
#![feature(raw)]
5-
#![allow(deprecated)]
4+
#![feature(ptr_metadata)]
65

76
use std::io::{sink, Write};
7+
use std::ptr::DynMetadata;
8+
use std::any::Any;
89

910
include!("../Helpers/vtable_utils_ignore.rs");
1011

@@ -31,7 +32,7 @@ fn main() {
3132
let dest_data_ptr = data!(dest_ptr) as *mut usize;
3233

3334
// // The second half of this fat pointer is another vtable, for log
34-
let second_vtable_ptr = dest_data_ptr.offset(1) as *mut *mut usize;
35+
let second_vtable_ptr = dest_data_ptr.offset(1) as *mut DynMetadata<dyn Any>;
3536
let second_vtable = *second_vtable_ptr;
3637

3738
// The sink itself has no size, weirdly enough

src/test/cbmc/Helpers/vtable_utils_ignore.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,39 @@
55
// an import! to share this code across test directories.
66

77
// Macro rules because we can't cast between incompatible dyn trait fat pointer types
8-
macro_rules! vtable {
8+
macro_rules! data {
99
($f:ident) => {{
1010
unsafe {
11-
let trait_object: std::raw::TraitObject = std::mem::transmute($f);
12-
trait_object.vtable as *mut usize
11+
let ptr: *mut dyn std::any::Any = std::mem::transmute($f);
12+
let data: *mut () = ptr.cast();
13+
data
1314
}
1415
}};
1516
}
1617

17-
macro_rules! data {
18+
macro_rules! vtable {
1819
($f:ident) => {{
1920
unsafe {
20-
let trait_object: std::raw::TraitObject = std::mem::transmute($f);
21-
trait_object.data as *mut ()
21+
let ptr: *mut dyn std::any::Any = std::mem::transmute($f);
22+
std::ptr::metadata(ptr)
2223
}
2324
}};
2425
}
2526

26-
fn drop_from_vtable(vtable_ptr: *mut usize) -> *mut () {
27+
fn drop_from_vtable(vtable_ptr: std::ptr::DynMetadata<dyn std::any::Any>) -> *mut () {
2728
// 1st pointer-sized position
28-
unsafe { *vtable_ptr as *mut () }
29+
unsafe {
30+
let ptr: *mut usize = std::mem::transmute(vtable_ptr);
31+
*ptr as *mut ()
32+
}
2933
}
3034

31-
fn size_from_vtable(vtable_ptr: *mut usize) -> usize {
35+
fn size_from_vtable(vtable_ptr: std::ptr::DynMetadata<dyn std::any::Any>) -> usize {
3236
// 2nd usize-sized position
33-
unsafe { *(vtable_ptr.offset(1)) }
37+
vtable_ptr.size_of()
3438
}
3539

36-
fn align_from_vtable(vtable_ptr: *mut usize) -> usize {
40+
fn align_from_vtable(vtable_ptr: std::ptr::DynMetadata<dyn std::any::Any>) -> usize {
3741
// 3rd usize-sized position
38-
unsafe { *(vtable_ptr.offset(2)) }
42+
vtable_ptr.align_of()
3943
}

0 commit comments

Comments
 (0)