Skip to content

Commit 5bfad5c

Browse files
committed
Thread a ParamEnv down to might_permit_raw_init
1 parent 662199f commit 5bfad5c

File tree

8 files changed

+45
-22
lines changed

8 files changed

+45
-22
lines changed

compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ mod simd;
2121
pub(crate) use cpuid::codegen_cpuid_call;
2222
pub(crate) use llvm::codegen_llvm_intrinsic_call;
2323

24+
use rustc_middle::ty::layout::HasParamEnv;
2425
use rustc_middle::ty::print::with_no_trimmed_paths;
2526
use rustc_middle::ty::subst::SubstsRef;
2627
use rustc_span::symbol::{kw, sym, Symbol};
@@ -659,7 +660,9 @@ fn codegen_regular_intrinsic_call<'tcx>(
659660
return;
660661
}
661662

662-
if intrinsic == sym::assert_zero_valid && !fx.tcx.permits_zero_init(layout) {
663+
if intrinsic == sym::assert_zero_valid
664+
&& !fx.tcx.permits_zero_init(fx.param_env().and(layout))
665+
{
663666
with_no_trimmed_paths!({
664667
crate::base::codegen_panic(
665668
fx,
@@ -674,7 +677,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
674677
}
675678

676679
if intrinsic == sym::assert_mem_uninitialized_valid
677-
&& !fx.tcx.permits_uninit_init(layout)
680+
&& !fx.tcx.permits_uninit_init(fx.param_env().and(layout))
678681
{
679682
with_no_trimmed_paths!({
680683
crate::base::codegen_panic(

compiler/rustc_codegen_ssa/src/mir/block.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -678,8 +678,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
678678
let layout = bx.layout_of(ty);
679679
let do_panic = match intrinsic {
680680
Inhabited => layout.abi.is_uninhabited(),
681-
ZeroValid => !bx.tcx().permits_zero_init(layout),
682-
MemUninitializedValid => !bx.tcx().permits_uninit_init(layout),
681+
ZeroValid => !bx.tcx().permits_zero_init(bx.param_env().and(layout)),
682+
MemUninitializedValid => !bx.tcx().permits_uninit_init(bx.param_env().and(layout)),
683683
};
684684
Some(if do_panic {
685685
let msg_str = with_no_visible_paths!({

compiler/rustc_const_eval/src/interpret/intrinsics.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
449449
}
450450

451451
if intrinsic_name == sym::assert_zero_valid {
452-
let should_panic = !self.tcx.permits_zero_init(layout);
452+
let should_panic = !self.tcx.permits_zero_init(self.param_env.and(layout));
453453

454454
if should_panic {
455455
M::abort(
@@ -463,7 +463,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
463463
}
464464

465465
if intrinsic_name == sym::assert_mem_uninitialized_valid {
466-
let should_panic = !self.tcx.permits_uninit_init(layout);
466+
let should_panic = !self.tcx.permits_uninit_init(self.param_env.and(layout));
467467

468468
if should_panic {
469469
M::abort(

compiler/rustc_const_eval/src/lib.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,12 @@ pub fn provide(providers: &mut Providers) {
5959
let (param_env, value) = param_env_and_value.into_parts();
6060
const_eval::deref_mir_constant(tcx, param_env, value)
6161
};
62-
providers.permits_uninit_init =
63-
|tcx, ty| util::might_permit_raw_init(tcx, ty, InitKind::UninitMitigated0x01Fill);
64-
providers.permits_zero_init = |tcx, ty| util::might_permit_raw_init(tcx, ty, InitKind::Zero);
62+
providers.permits_uninit_init = |tcx, param_env_and_ty| {
63+
let (param_env, ty) = param_env_and_ty.into_parts();
64+
util::might_permit_raw_init(tcx, param_env, ty, InitKind::UninitMitigated0x01Fill)
65+
};
66+
providers.permits_zero_init = |tcx, param_env_and_ty| {
67+
let (param_env, ty) = param_env_and_ty.into_parts();
68+
util::might_permit_raw_init(tcx, param_env, ty, InitKind::Zero)
69+
};
6570
}

compiler/rustc_const_eval/src/util/might_permit_raw_init.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ use crate::interpret::{InterpCx, MemoryKind, OpTy};
2020
/// to the full uninit check).
2121
pub fn might_permit_raw_init<'tcx>(
2222
tcx: TyCtxt<'tcx>,
23+
param_env: ParamEnv<'tcx>,
2324
ty: TyAndLayout<'tcx>,
2425
kind: InitKind,
2526
) -> bool {
2627
if tcx.sess.opts.unstable_opts.strict_init_checks {
2728
might_permit_raw_init_strict(ty, tcx, kind)
2829
} else {
29-
let layout_cx = LayoutCx { tcx, param_env: ParamEnv::reveal_all() };
30+
let layout_cx = LayoutCx { tcx, param_env };
3031
might_permit_raw_init_lax(ty, &layout_cx, kind)
3132
}
3233
}

compiler/rustc_middle/src/query/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -2109,12 +2109,12 @@ rustc_queries! {
21092109
separate_provide_extern
21102110
}
21112111

2112-
query permits_uninit_init(key: TyAndLayout<'tcx>) -> bool {
2113-
desc { "checking to see if `{}` permits being left uninit", key.ty }
2112+
query permits_uninit_init(key: ty::ParamEnvAnd<'tcx, TyAndLayout<'tcx>>) -> bool {
2113+
desc { "checking to see if `{}` permits being left uninit", key.value.ty }
21142114
}
21152115

2116-
query permits_zero_init(key: TyAndLayout<'tcx>) -> bool {
2117-
desc { "checking to see if `{}` permits being left zeroed", key.ty }
2116+
query permits_zero_init(key: ty::ParamEnvAnd<'tcx, TyAndLayout<'tcx>>) -> bool {
2117+
desc { "checking to see if `{}` permits being left zeroed", key.value.ty }
21182118
}
21192119

21202120
query compare_impl_const(

compiler/rustc_middle/src/ty/structural_impls.rs

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::ty::{self, InferConst, Lift, Term, TermKind, Ty, TyCtxt};
1111
use rustc_data_structures::functor::IdFunctor;
1212
use rustc_hir::def::Namespace;
1313
use rustc_index::vec::{Idx, IndexVec};
14+
use rustc_target::abi::TyAndLayout;
1415

1516
use std::fmt;
1617
use std::mem::ManuallyDrop;
@@ -843,3 +844,9 @@ impl<'tcx> TypeSuperVisitable<'tcx> for ty::UnevaluatedConst<'tcx> {
843844
self.substs.visit_with(visitor)
844845
}
845846
}
847+
848+
impl<'tcx> TypeVisitable<'tcx> for TyAndLayout<'tcx, Ty<'tcx>> {
849+
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
850+
visitor.visit_ty(self.ty)
851+
}
852+
}

compiler/rustc_mir_transform/src/instcombine.rs

+15-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rustc_middle::mir::{
66
BinOp, Body, Constant, ConstantKind, LocalDecls, Operand, Place, ProjectionElem, Rvalue,
77
SourceInfo, Statement, StatementKind, Terminator, TerminatorKind, UnOp,
88
};
9-
use rustc_middle::ty::{self, layout::TyAndLayout, ParamEnv, SubstsRef, Ty, TyCtxt};
9+
use rustc_middle::ty::{self, layout::TyAndLayout, ParamEnv, ParamEnvAnd, SubstsRef, Ty, TyCtxt};
1010
use rustc_span::symbol::{sym, Symbol};
1111

1212
pub struct InstCombine;
@@ -231,7 +231,7 @@ impl<'tcx> InstCombineContext<'tcx, '_> {
231231
// Check this is a foldable intrinsic before we query the layout of our generic parameter
232232
let Some(assert_panics) = intrinsic_assert_panics(intrinsic_name) else { return; };
233233
let Ok(layout) = self.tcx.layout_of(self.param_env.and(ty)) else { return; };
234-
if assert_panics(self.tcx, layout) {
234+
if assert_panics(self.tcx, self.param_env.and(layout)) {
235235
// If we know the assert panics, indicate to later opts that the call diverges
236236
*target = None;
237237
} else {
@@ -243,18 +243,25 @@ impl<'tcx> InstCombineContext<'tcx, '_> {
243243

244244
fn intrinsic_assert_panics<'tcx>(
245245
intrinsic_name: Symbol,
246-
) -> Option<fn(TyCtxt<'tcx>, TyAndLayout<'tcx>) -> bool> {
247-
fn inhabited_predicate<'tcx>(_tcx: TyCtxt<'tcx>, layout: TyAndLayout<'tcx>) -> bool {
246+
) -> Option<fn(TyCtxt<'tcx>, ParamEnvAnd<'tcx, TyAndLayout<'tcx>>) -> bool> {
247+
fn inhabited_predicate<'tcx>(
248+
_tcx: TyCtxt<'tcx>,
249+
param_env_and_layout: ParamEnvAnd<'tcx, TyAndLayout<'tcx>>,
250+
) -> bool {
251+
let (_param_env, layout) = param_env_and_layout.into_parts();
248252
layout.abi.is_uninhabited()
249253
}
250-
fn zero_valid_predicate<'tcx>(tcx: TyCtxt<'tcx>, layout: TyAndLayout<'tcx>) -> bool {
251-
!tcx.permits_zero_init(layout)
254+
fn zero_valid_predicate<'tcx>(
255+
tcx: TyCtxt<'tcx>,
256+
param_env_and_layout: ParamEnvAnd<'tcx, TyAndLayout<'tcx>>,
257+
) -> bool {
258+
!tcx.permits_zero_init(param_env_and_layout)
252259
}
253260
fn mem_uninitialized_valid_predicate<'tcx>(
254261
tcx: TyCtxt<'tcx>,
255-
layout: TyAndLayout<'tcx>,
262+
param_env_and_layout: ParamEnvAnd<'tcx, TyAndLayout<'tcx>>,
256263
) -> bool {
257-
!tcx.permits_uninit_init(layout)
264+
!tcx.permits_uninit_init(param_env_and_layout)
258265
}
259266

260267
match intrinsic_name {

0 commit comments

Comments
 (0)