Do not run const prop on the mir_for_ctfe
of const fn
This commit is contained in:
parent
409195d4e5
commit
65ee418e5c
4 changed files with 39 additions and 22 deletions
|
@ -357,28 +357,43 @@ fn inner_mir_for_ctfe(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -
|
||||||
return shim::build_adt_ctor(tcx, def.did.to_def_id());
|
return shim::build_adt_ctor(tcx, def.did.to_def_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_ne!(
|
let context = tcx
|
||||||
tcx.hir().body_const_context(def.did),
|
.hir()
|
||||||
None,
|
.body_const_context(def.did)
|
||||||
"mir_for_ctfe should not be used for runtime functions"
|
.expect("mir_for_ctfe should not be used for runtime functions");
|
||||||
);
|
|
||||||
|
|
||||||
let mut body = tcx.mir_drops_elaborated_and_const_checked(def).borrow().clone();
|
let mut body = tcx.mir_drops_elaborated_and_const_checked(def).borrow().clone();
|
||||||
|
|
||||||
#[rustfmt::skip]
|
match context {
|
||||||
let optimizations: &[&dyn MirPass<'_>] = &[
|
// Do not const prop functions, either they get executed at runtime or exported to metadata,
|
||||||
&const_prop::ConstProp,
|
// so we run const prop on them, or they don't, in which case we const evaluate some control
|
||||||
];
|
// flow paths of the function and any errors in those paths will get emitted as const eval
|
||||||
|
// errors.
|
||||||
|
hir::ConstContext::ConstFn => {}
|
||||||
|
// Static items always get evaluated, so we can just let const eval see if any erroneous
|
||||||
|
// control flow paths get executed.
|
||||||
|
hir::ConstContext::Static(_) => {}
|
||||||
|
// Associated constants get const prop run so we detect common failure situations in the
|
||||||
|
// crate that defined the constant.
|
||||||
|
// Technically we want to not run on regular const items, but oli-obk doesn't know how to
|
||||||
|
// conveniently detect that at this point without looking at the HIR.
|
||||||
|
hir::ConstContext::Const => {
|
||||||
|
#[rustfmt::skip]
|
||||||
|
let optimizations: &[&dyn MirPass<'_>] = &[
|
||||||
|
&const_prop::ConstProp,
|
||||||
|
];
|
||||||
|
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
run_passes(
|
run_passes(
|
||||||
tcx,
|
tcx,
|
||||||
&mut body,
|
&mut body,
|
||||||
MirPhase::Optimization,
|
MirPhase::Optimization,
|
||||||
&[
|
&[
|
||||||
optimizations,
|
optimizations,
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
debug_assert!(!body.has_free_regions(), "Free regions in MIR for CTFE");
|
debug_assert!(!body.has_free_regions(), "Free regions in MIR for CTFE");
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
// check-pass
|
// check-pass
|
||||||
|
|
||||||
// compile-flags: --crate-type lib
|
// need to emit MIR, because const prop (which emits `unconditional_panic`) only runs if
|
||||||
|
// the `optimized_mir` query is run, which it isn't in check-only mode.
|
||||||
|
// compile-flags: --crate-type lib --emit=mir,link
|
||||||
|
|
||||||
#![warn(unconditional_panic)]
|
#![warn(unconditional_panic)]
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
warning: this operation will panic at runtime
|
warning: this operation will panic at runtime
|
||||||
--> $DIR/ice-assert-fail-div-by-zero.rs:11:5
|
--> $DIR/ice-assert-fail-div-by-zero.rs:13:5
|
||||||
|
|
|
|
||||||
LL | f.0 / 0;
|
LL | f.0 / 0;
|
||||||
| ^^^^^^^ attempt to divide `_` by zero
|
| ^^^^^^^ attempt to divide `_` by zero
|
||||||
|
|
|
|
||||||
note: the lint level is defined here
|
note: the lint level is defined here
|
||||||
--> $DIR/ice-assert-fail-div-by-zero.rs:5:9
|
--> $DIR/ice-assert-fail-div-by-zero.rs:7:9
|
||||||
|
|
|
|
||||||
LL | #![warn(unconditional_panic)]
|
LL | #![warn(unconditional_panic)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -4,7 +4,7 @@ error: any use of this value will cause an error
|
||||||
LL | const X: u64 = *wat(42);
|
LL | const X: u64 = *wat(42);
|
||||||
| ---------------^^^^^^^^-
|
| ---------------^^^^^^^^-
|
||||||
| |
|
| |
|
||||||
| pointer to alloc2 was dereferenced after this allocation got freed
|
| pointer to alloc1 was dereferenced after this allocation got freed
|
||||||
|
|
|
|
||||||
= note: `#[deny(const_err)]` on by default
|
= note: `#[deny(const_err)]` on by default
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue