diff --git a/compiler/rustc_mir_transform/src/promote_consts.rs b/compiler/rustc_mir_transform/src/promote_consts.rs index 47d4383097008..40d7b7bdbc13a 100644 --- a/compiler/rustc_mir_transform/src/promote_consts.rs +++ b/compiler/rustc_mir_transform/src/promote_consts.rs @@ -397,7 +397,19 @@ impl<'tcx> Validator<'_, 'tcx> { } BorrowKind::Shared => { - let has_mut_interior = self.qualif_local::(place.local); + // Let's just see what happens if we reject anything `!Freeze`... + // (Except ZST which definitely can't have interior mut) + let ty = place.ty(self.body, self.tcx).ty; + let has_mut_interior = match ty.kind() { + // Empty arrays have no interior mutability no matter their element type. + ty::Array(_elem, count) + if count.try_to_target_usize(self.tcx).is_some_and(|v| v == 0) => + { + false + } + // Fallback to checking `Freeze`. + _ => !ty.is_freeze(self.tcx, self.typing_env), + }; if has_mut_interior { return Err(Unpromotable); } diff --git a/compiler/rustc_pattern_analysis/src/pat.rs b/compiler/rustc_pattern_analysis/src/pat.rs index 901b72e53995e..bd92665251613 100644 --- a/compiler/rustc_pattern_analysis/src/pat.rs +++ b/compiler/rustc_pattern_analysis/src/pat.rs @@ -192,7 +192,7 @@ impl<'p, Cx: PatCx> PatOrWild<'p, Cx> { } pub(crate) fn ctor(self) -> &'p Constructor { match self { - PatOrWild::Wild => &Wildcard, + PatOrWild::Wild => const { &Wildcard }, PatOrWild::Pat(pat) => pat.ctor(), } }