Skip to content

Commit

Permalink
Rollup merge of #124425 - saethlin:ceci-nest-pas-une-ice, r=compiler-…
Browse files Browse the repository at this point in the history
…errors

Do not ICE on invalid consts when walking mono-reachable blocks

The `bug!` here was written under the logic of "this condition is impossible, right?" except that of course, if the compiler is given code that results in an compile error, then the situation is possible.

So now we just direct errors into the already-existing path for when we can't do a mono-time optimization.
  • Loading branch information
matthiaskrgr authored Apr 27, 2024
2 parents aeb4c04 + 82cc02a commit 0430e74
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 6 deletions.
9 changes: 3 additions & 6 deletions compiler/rustc_middle/src/mir/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -701,10 +701,7 @@ impl<'tcx> Body<'tcx> {
env,
crate::ty::EarlyBinder::bind(constant.const_),
);
let Some(bits) = mono_literal.try_eval_bits(tcx, env) else {
bug!("Couldn't evaluate constant {:?} in mono {:?}", constant, instance);
};
bits
mono_literal.try_eval_bits(tcx, env)
};

let TerminatorKind::SwitchInt { discr, targets } = &block.terminator().kind else {
Expand All @@ -714,7 +711,7 @@ impl<'tcx> Body<'tcx> {
// If this is a SwitchInt(const _), then we can just evaluate the constant and return.
let discr = match discr {
Operand::Constant(constant) => {
let bits = eval_mono_const(constant);
let bits = eval_mono_const(constant)?;
return Some((bits, targets));
}
Operand::Move(place) | Operand::Copy(place) => place,
Expand Down Expand Up @@ -748,7 +745,7 @@ impl<'tcx> Body<'tcx> {
match rvalue {
Rvalue::NullaryOp(NullOp::UbChecks, _) => Some((tcx.sess.ub_checks() as u128, targets)),
Rvalue::Use(Operand::Constant(constant)) => {
let bits = eval_mono_const(constant);
let bits = eval_mono_const(constant)?;
Some((bits, targets))
}
_ => None,
Expand Down
23 changes: 23 additions & 0 deletions tests/ui/consts/mono-reachable-invalid-const.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//@ build-fail

struct Bar<const BITS: usize>;

impl<const BITS: usize> Bar<BITS> {
const ASSERT: bool = {
let b = std::convert::identity(1);
["oops"][b]; //~ ERROR evaluation of `Bar::<0>::ASSERT` failed
true
};

fn assert() {
let val = Self::ASSERT;
if val {
std::convert::identity(val);
}
}
}


fn main() {
Bar::<0>::assert();
}
29 changes: 29 additions & 0 deletions tests/ui/consts/mono-reachable-invalid-const.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
error[E0080]: evaluation of `Bar::<0>::ASSERT` failed
--> $DIR/mono-reachable-invalid-const.rs:8:9
|
LL | ["oops"][b];
| ^^^^^^^^^^^ index out of bounds: the length is 1 but the index is 1

note: erroneous constant encountered
--> $DIR/mono-reachable-invalid-const.rs:13:19
|
LL | let val = Self::ASSERT;
| ^^^^^^^^^^^^

note: erroneous constant encountered
--> $DIR/mono-reachable-invalid-const.rs:13:19
|
LL | let val = Self::ASSERT;
| ^^^^^^^^^^^^
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`

note: the above error was encountered while instantiating `fn Bar::<0>::assert`
--> $DIR/mono-reachable-invalid-const.rs:22:5
|
LL | Bar::<0>::assert();
| ^^^^^^^^^^^^^^^^^^

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0080`.

0 comments on commit 0430e74

Please sign in to comment.