Use constant eval to do strict validity checks
This commit is contained in:
parent
c2f428d2f3
commit
27412d1e3e
13 changed files with 161 additions and 94 deletions
|
@ -40,6 +40,7 @@ rustc_metadata = { path = "../rustc_metadata" }
|
|||
rustc_query_system = { path = "../rustc_query_system" }
|
||||
rustc_target = { path = "../rustc_target" }
|
||||
rustc_session = { path = "../rustc_session" }
|
||||
rustc_const_eval = { path = "../rustc_const_eval" }
|
||||
|
||||
[dependencies.object]
|
||||
version = "0.29.0"
|
||||
|
|
|
@ -22,7 +22,7 @@ use rustc_span::source_map::Span;
|
|||
use rustc_span::{sym, Symbol};
|
||||
use rustc_symbol_mangling::typeid_for_fnabi;
|
||||
use rustc_target::abi::call::{ArgAbi, FnAbi, PassMode};
|
||||
use rustc_target::abi::{self, HasDataLayout, InitKind, WrappingRange};
|
||||
use rustc_target::abi::{self, HasDataLayout, WrappingRange};
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
||||
/// Used by `FunctionCx::codegen_terminator` for emitting common patterns
|
||||
|
@ -528,7 +528,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
source_info: mir::SourceInfo,
|
||||
target: Option<mir::BasicBlock>,
|
||||
cleanup: Option<mir::BasicBlock>,
|
||||
strict_validity: bool,
|
||||
) -> bool {
|
||||
// Emit a panic or a no-op for `assert_*` intrinsics.
|
||||
// These are intrinsics that compile to panics so that we can get a message
|
||||
|
@ -547,12 +546,13 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
});
|
||||
if let Some(intrinsic) = panic_intrinsic {
|
||||
use AssertIntrinsic::*;
|
||||
|
||||
let ty = instance.unwrap().substs.type_at(0);
|
||||
let layout = bx.layout_of(ty);
|
||||
let do_panic = match intrinsic {
|
||||
Inhabited => layout.abi.is_uninhabited(),
|
||||
ZeroValid => !layout.might_permit_raw_init(bx, InitKind::Zero, strict_validity),
|
||||
UninitValid => !layout.might_permit_raw_init(bx, InitKind::Uninit, strict_validity),
|
||||
ZeroValid => !bx.tcx().permits_zero_init(layout),
|
||||
UninitValid => !bx.tcx().permits_uninit_init(layout),
|
||||
};
|
||||
if do_panic {
|
||||
let msg_str = with_no_visible_paths!({
|
||||
|
@ -687,7 +687,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
source_info,
|
||||
target,
|
||||
cleanup,
|
||||
self.cx.tcx().sess.opts.unstable_opts.strict_init_checks,
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue