[const-prop] Handle ProjectionElem::Deref
This commit is contained in:
@@ -333,6 +333,12 @@ impl<'a, 'mir, 'tcx> ConstPropagator<'a, 'mir, 'tcx> {
|
|||||||
this.ecx.operand_field(eval, field.index() as u64)
|
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`,
|
// We could get more projections by using e.g., `operand_projection`,
|
||||||
// but we do not even have the stack frame set up properly so
|
// but we do not even have the stack frame set up properly so
|
||||||
// an `Index` projection would throw us off-track.
|
// an `Index` projection would throw us off-track.
|
||||||
|
|||||||
21
src/test/mir-opt/const_prop/ref_deref.rs
Normal file
21
src/test/mir-opt/const_prop/ref_deref.rs
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user