Skip to content

Commit 9f4d94b

Browse files
committed
[const-prop] Handle Rvalue::Ref
1 parent 529b94e commit 9f4d94b

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/librustc_mir/interpret/place.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,23 @@ where
663663
Ok(())
664664
}
665665

666+
/// Write an `Immediate` to memory.
667+
#[inline(always)]
668+
pub fn write_immediate_to_mplace(
669+
&mut self,
670+
src: Immediate<M::PointerTag>,
671+
dest: MPlaceTy<'tcx, M::PointerTag>,
672+
) -> EvalResult<'tcx> {
673+
self.write_immediate_to_mplace_no_validate(src, dest)?;
674+
675+
if M::enforce_validity(self) {
676+
// Data got changed, better make sure it matches the type!
677+
self.validate_operand(dest.into(), vec![], None, /*const_mode*/ false)?;
678+
}
679+
680+
Ok(())
681+
}
682+
666683
/// Write an immediate to a place.
667684
/// If you use this you are responsible for validating that things got copied at the
668685
/// right type.

src/librustc_mir/transform/const_prop.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,12 @@ impl<'a, 'mir, 'tcx> ConstPropagator<'a, 'mir, 'tcx> {
363363
Rvalue::Use(ref op) => {
364364
self.eval_operand(op, source_info)
365365
},
366+
Rvalue::Ref(_, _, ref place) => {
367+
let src = self.eval_place(place, source_info)?;
368+
let mplace = src.try_as_mplace().ok()?;
369+
Some(ImmTy::from_scalar(mplace.ptr.into(), place_layout).into())
370+
},
366371
Rvalue::Repeat(..) |
367-
Rvalue::Ref(..) |
368372
Rvalue::Aggregate(..) |
369373
Rvalue::NullaryOp(NullOp::Box, _) |
370374
Rvalue::Discriminant(..) => None,

0 commit comments

Comments
 (0)