41 lines
1.3 KiB
Rust
41 lines
1.3 KiB
Rust
![]() |
use crate::const_eval::CompileTimeInterpreter;
|
||
|
use crate::interpret::{InterpCx, MemoryKind, OpTy};
|
||
|
use rustc_middle::ty::layout::LayoutCx;
|
||
|
use rustc_middle::ty::{layout::TyAndLayout, ParamEnv, TyCtxt};
|
||
|
use rustc_session::Limit;
|
||
|
use rustc_target::abi::InitKind;
|
||
|
|
||
|
pub fn might_permit_raw_init<'tcx>(
|
||
|
tcx: TyCtxt<'tcx>,
|
||
|
ty: TyAndLayout<'tcx>,
|
||
|
kind: InitKind,
|
||
|
) -> bool {
|
||
|
let strict = tcx.sess.opts.unstable_opts.strict_init_checks;
|
||
|
|
||
|
if strict {
|
||
|
let machine = CompileTimeInterpreter::new(Limit::new(0), false);
|
||
|
|
||
|
let mut cx = InterpCx::new(tcx, rustc_span::DUMMY_SP, ParamEnv::reveal_all(), machine);
|
||
|
|
||
|
let allocated = cx
|
||
|
.allocate(ty, MemoryKind::Machine(crate::const_eval::MemoryKind::Heap))
|
||
|
.expect("OOM: failed to allocate for uninit check");
|
||
|
|
||
|
if kind == InitKind::Zero {
|
||
|
cx.write_bytes_ptr(
|
||
|
allocated.ptr,
|
||
|
std::iter::repeat(0_u8).take(ty.layout.size().bytes_usize()),
|
||
|
)
|
||
|
.expect("failed to write bytes for zero valid check");
|
||
|
}
|
||
|
|
||
|
let ot: OpTy<'_, _> = allocated.into();
|
||
|
|
||
|
// Assume that if it failed, it's a validation failure.
|
||
|
cx.validate_operand(&ot).is_ok()
|
||
|
} else {
|
||
|
let layout_cx = LayoutCx { tcx, param_env: ParamEnv::reveal_all() };
|
||
|
ty.might_permit_raw_init(&layout_cx, kind)
|
||
|
}
|
||
|
}
|