Skip to content

Commit d041b7c

Browse files
committed
check for correct trait in size_and_align_of
1 parent af4d6c7 commit d041b7c

File tree

4 files changed

+10
-7
lines changed

4 files changed

+10
-7
lines changed

Diff for: compiler/rustc_const_eval/src/interpret/eval_context.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -765,10 +765,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
765765
}
766766
Ok(Some((full_size, full_align)))
767767
}
768-
ty::Dynamic(_, _, ty::Dyn) => {
768+
ty::Dynamic(expected_trait, _, ty::Dyn) => {
769769
let vtable = metadata.unwrap_meta().to_pointer(self)?;
770770
// Read size and align from vtable (already checks size).
771-
Ok(Some(self.get_vtable_size_and_align(vtable)?))
771+
Ok(Some(self.get_vtable_size_and_align(vtable, Some(expected_trait))?))
772772
}
773773

774774
ty::Slice(_) | ty::Str => {

Diff for: compiler/rustc_const_eval/src/interpret/intrinsics.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -432,12 +432,14 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
432432

433433
sym::vtable_size => {
434434
let ptr = self.read_pointer(&args[0])?;
435-
let (size, _align) = self.get_vtable_size_and_align(ptr)?;
435+
// `None` because we don't know which trait to expect here; any vtable is okay.
436+
let (size, _align) = self.get_vtable_size_and_align(ptr, None)?;
436437
self.write_scalar(Scalar::from_target_usize(size.bytes(), self), dest)?;
437438
}
438439
sym::vtable_align => {
439440
let ptr = self.read_pointer(&args[0])?;
440-
let (_size, align) = self.get_vtable_size_and_align(ptr)?;
441+
// `None` because we don't know which trait to expect here; any vtable is okay.
442+
let (_size, align) = self.get_vtable_size_and_align(ptr, None)?;
441443
self.write_scalar(Scalar::from_target_usize(align.bytes(), self), dest)?;
442444
}
443445

Diff for: compiler/rustc_const_eval/src/interpret/traits.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
3636
pub fn get_vtable_size_and_align(
3737
&self,
3838
vtable: Pointer<Option<M::Provenance>>,
39+
expected_trait: Option<&'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>>,
3940
) -> InterpResult<'tcx, (Size, Align)> {
40-
let ty = self.get_ptr_vtable_ty(vtable, None)?;
41+
let ty = self.get_ptr_vtable_ty(vtable, expected_trait)?;
4142
let layout = self.layout_of(ty)?;
4243
assert!(layout.is_sized(), "there are no vtables for unsized types");
4344
Ok((layout.size, layout.align.abi))

Diff for: src/tools/miri/tests/fail/dyn-call-trait-mismatch.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// Validation stops this too early.
2-
//@compile-flags: -Zmiri-disable-validation
1+
// Validation and SB stop this too early.
2+
//@compile-flags: -Zmiri-disable-validation -Zmiri-disable-stacked-borrows
33

44
trait T1 {
55
#[allow(dead_code)]

0 commit comments

Comments
 (0)