Skip to content

Commit

Permalink
Rollup merge of #74102 - oli-obk:const_prop_icde, r=wesleywiser
Browse files Browse the repository at this point in the history
Fix const prop ICE

we used to erase the local just before we tried to read it for diagnostics

fixes #73993

r? @wesleywiser
  • Loading branch information
Manishearth authored Jul 7, 2020
2 parents 50e22bd + ee8dd4e commit 38f5151
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 19 deletions.
40 changes: 21 additions & 19 deletions src/librustc_mir/transform/const_prop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1004,14 +1004,6 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
let expected = ScalarMaybeUninit::from(Scalar::from_bool(*expected));
let value_const = self.ecx.read_scalar(value).unwrap();
if expected != value_const {
// Poison all places this operand references so that further code
// doesn't use the invalid value
match cond {
Operand::Move(ref place) | Operand::Copy(ref place) => {
Self::remove_const(&mut self.ecx, place.local);
}
Operand::Constant(_) => {}
}
let mut eval_to_int = |op| {
let op = self
.eval_operand(op, source_info)
Expand All @@ -1020,27 +1012,37 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
};
let msg = match msg {
AssertKind::DivisionByZero(op) => {
AssertKind::DivisionByZero(eval_to_int(op))
Some(AssertKind::DivisionByZero(eval_to_int(op)))
}
AssertKind::RemainderByZero(op) => {
AssertKind::RemainderByZero(eval_to_int(op))
Some(AssertKind::RemainderByZero(eval_to_int(op)))
}
AssertKind::BoundsCheck { ref len, ref index } => {
let len = eval_to_int(len);
let index = eval_to_int(index);
AssertKind::BoundsCheck { len, index }
Some(AssertKind::BoundsCheck { len, index })
}
// Overflow is are already covered by checks on the binary operators.
AssertKind::Overflow(..) | AssertKind::OverflowNeg(_) => return,
AssertKind::Overflow(..) | AssertKind::OverflowNeg(_) => None,
// Need proper const propagator for these.
_ => return,
_ => None,
};
self.report_assert_as_lint(
lint::builtin::UNCONDITIONAL_PANIC,
source_info,
"this operation will panic at runtime",
msg,
);
// Poison all places this operand references so that further code
// doesn't use the invalid value
match cond {
Operand::Move(ref place) | Operand::Copy(ref place) => {
Self::remove_const(&mut self.ecx, place.local);
}
Operand::Constant(_) => {}
}
if let Some(msg) = msg {
self.report_assert_as_lint(
lint::builtin::UNCONDITIONAL_PANIC,
source_info,
"this operation will panic at runtime",
msg,
);
}
} else {
if self.should_const_prop(value) {
if let ScalarMaybeUninit::Scalar(scalar) = value_const {
Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/const_prop/ice-assert-fail-div-by-zero.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// check-pass

pub struct Fixed64(i64);

pub fn div(f: Fixed64) {
f.0 / 0;
}

fn main() {}

0 comments on commit 38f5151

Please sign in to comment.