From 1e50e01bb7c3200c48c8739435d4e7cece83ed6c Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Mon, 3 Jun 2019 21:52:26 -0400 Subject: [PATCH] [const-prop] Handle ProjectionElem::Deref --- src/librustc_mir/transform/const_prop.rs | 6 ++++++ src/test/mir-opt/const_prop/ref_deref.rs | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/test/mir-opt/const_prop/ref_deref.rs diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index 8e7093b833d..693fc9ba2f3 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -333,6 +333,12 @@ fn eval_place(&mut self, place: &Place<'tcx>, source_info: SourceInfo) -> Option this.ecx.operand_field(eval, field.index() as u64) })?; }, + ProjectionElem::Deref => { + trace!("processing deref"); + eval = self.use_ecx(source_info, |this| { + this.ecx.deref_operand(eval) + })?.into(); + } // We could get more projections by using e.g., `operand_projection`, // but we do not even have the stack frame set up properly so // an `Index` projection would throw us off-track. diff --git a/src/test/mir-opt/const_prop/ref_deref.rs b/src/test/mir-opt/const_prop/ref_deref.rs new file mode 100644 index 00000000000..2d04822c0e7 --- /dev/null +++ b/src/test/mir-opt/const_prop/ref_deref.rs @@ -0,0 +1,21 @@ +fn main() { + *(&4); +} + +// END RUST SOURCE +// START rustc.main.ConstProp.before.mir +// bb0: { +// ... +// _2 = &(promoted[0]: i32); +// _1 = (*_2); +// ... +//} +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// bb0: { +// ... +// _2 = const Scalar(AllocId(0).0x0) : &i32; +// _1 = const 4i32; +// ... +// } +// END rustc.main.ConstProp.after.mir -- 2.44.0