From bb8d6f790b63797a816a4007e8ab002ed2906de7 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Fri, 12 Apr 2024 10:43:51 -0700 Subject: [PATCH] Address PR feedback --- .../rustc_const_eval/src/interpret/operand.rs | 11 ----------- compiler/rustc_const_eval/src/interpret/step.rs | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/compiler/rustc_const_eval/src/interpret/operand.rs b/compiler/rustc_const_eval/src/interpret/operand.rs index d4a6dab9ac3..718c91b2f76 100644 --- a/compiler/rustc_const_eval/src/interpret/operand.rs +++ b/compiler/rustc_const_eval/src/interpret/operand.rs @@ -603,17 +603,6 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Ok(self.read_immediate(op)?.to_scalar()) } - pub fn read_mem_place_meta( - &self, - op: &impl Readable<'tcx, M::Provenance>, - ) -> InterpResult<'tcx, MemPlaceMeta> { - Ok(if op.layout().is_zst() { - MemPlaceMeta::None - } else { - MemPlaceMeta::Meta(self.read_scalar(op)?) - }) - } - // Pointer-sized reads are fairly common and need target layout access, so we wrap them in // convenience functions. diff --git a/compiler/rustc_const_eval/src/interpret/step.rs b/compiler/rustc_const_eval/src/interpret/step.rs index 460cd377c8f..b29034e991e 100644 --- a/compiler/rustc_const_eval/src/interpret/step.rs +++ b/compiler/rustc_const_eval/src/interpret/step.rs @@ -9,7 +9,9 @@ use rustc_middle::mir; use rustc_middle::ty::layout::LayoutOf; use rustc_target::abi::{FieldIdx, FIRST_VARIANT}; -use super::{ImmTy, Immediate, InterpCx, InterpResult, Machine, PlaceTy, Projectable, Scalar}; +use super::{ + ImmTy, Immediate, InterpCx, InterpResult, Machine, MemPlaceMeta, PlaceTy, Projectable, Scalar, +}; use crate::util; impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { @@ -304,15 +306,21 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { (variant_index, variant_dest, active_field_index) } mir::AggregateKind::RawPtr(..) => { - // Trying to `project_field` into pointers tends not to work, - // so build the `Immediate` from the parts directly. + // Pointers don't have "fields" in the normal sense, so the + // projection-based code below would either fail in projection + // or in type mismatches. Instead, build an `Immediate` from + // the parts and write that to the destination. let [data, meta] = &operands.raw else { bug!("{kind:?} should have 2 operands, had {operands:?}"); }; let data = self.eval_operand(data, None)?; let data = self.read_pointer(&data)?; let meta = self.eval_operand(meta, None)?; - let meta = self.read_mem_place_meta(&meta)?; + let meta = if meta.layout.is_zst() { + MemPlaceMeta::None + } else { + MemPlaceMeta::Meta(self.read_scalar(&meta)?) + }; let ptr_imm = Immediate::new_pointer_with_meta(data, meta, self); let ptr = ImmTy::from_immediate(ptr_imm, dest.layout); self.copy_op(&ptr, dest)?;