From e03f4164d9229d8a79ab2d9c20221d0b646734ae Mon Sep 17 00:00:00 2001 From: Dylan MacKenzie Date: Tue, 1 Sep 2020 12:28:55 -0700 Subject: [PATCH] Default to implicit (not explicit) rules for promotability in `const fn` --- compiler/rustc_mir/src/transform/promote_consts.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_mir/src/transform/promote_consts.rs b/compiler/rustc_mir/src/transform/promote_consts.rs index 1d2295a37dddf..b6124049579fd 100644 --- a/compiler/rustc_mir/src/transform/promote_consts.rs +++ b/compiler/rustc_mir/src/transform/promote_consts.rs @@ -734,7 +734,14 @@ impl<'tcx> Validator<'_, 'tcx> { ) -> Result<(), Unpromotable> { let fn_ty = callee.ty(self.body, self.tcx); - if !self.explicit && self.const_kind.is_none() { + // `const` and `static` use the explicit rules for promotion regardless of the `Candidate`, + // meaning calls to `const fn` can be promoted. + let context_uses_explicit_promotion_rules = matches!( + self.const_kind, + Some(hir::ConstContext::Static(_) | hir::ConstContext::Const) + ); + + if !self.explicit && !context_uses_explicit_promotion_rules { if let ty::FnDef(def_id, _) = *fn_ty.kind() { // Never promote runtime `const fn` calls of // functions without `#[rustc_promotable]`.