Auto merge of #58784 - oli-obk:accidental_promotion, r=eddyb

Don't promote function calls to nonpromotable things

fixes https://github.com/rust-lang/rust/issues/58767 and fixes https://github.com/rust-lang/rust/issues/58634

r? @eddyb

should we additionally check the function call return type? It might be a promotable function (or any `const fn` inside a `const fn`), but its return type might contain interior mutability.
This commit is contained in:
bors 2019-03-11 01:28:16 +00:00
commit c2ddf5a1dd
2 changed files with 22 additions and 5 deletions

View File

@ -499,6 +499,8 @@ impl Qualif for IsNotConst {
// Refers to temporaries which cannot be promoted as
// promote_consts decided they weren't simple enough.
// FIXME(oli-obk,eddyb): Remove this flag entirely and
// solely process this information via `IsNotConst`.
struct IsNotPromotable;
impl Qualif for IsNotPromotable {
@ -507,7 +509,7 @@ impl Qualif for IsNotPromotable {
fn in_call(
cx: &ConstCx<'_, 'tcx>,
callee: &Operand<'tcx>,
_args: &[Operand<'tcx>],
args: &[Operand<'tcx>],
_return_ty: Ty<'tcx>,
) -> bool {
if cx.mode == Mode::Fn {
@ -520,10 +522,7 @@ impl Qualif for IsNotPromotable {
}
}
// FIXME(eddyb) do we need "not promotable" in anything
// other than `Mode::Fn` by any chance?
false
Self::in_operand(cx, callee) || args.iter().any(|arg| Self::in_operand(cx, arg))
}
}

View File

@ -0,0 +1,18 @@
// compile-pass
// note this was only reproducible with lib crates
// compile-flags: --crate-type=lib
pub struct Hz;
impl Hz {
pub const fn num(&self) -> u32 {
42
}
pub const fn normalized(&self) -> Hz {
Hz
}
pub const fn as_u32(&self) -> u32 {
self.normalized().num() // this used to promote the `self.normalized()`
}
}