remove move_val_init leftovers
This commit is contained in:
parent
1862135351
commit
db03b58f23
10 changed files with 32 additions and 394 deletions
|
@ -10,9 +10,7 @@ use rustc_data_structures::stack::ensure_sufficient_stack;
|
|||
use rustc_hir as hir;
|
||||
use rustc_middle::middle::region;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::{self, CanonicalUserTypeAnnotation};
|
||||
use rustc_span::symbol::sym;
|
||||
use rustc_target::spec::abi::Abi;
|
||||
use rustc_middle::ty::{CanonicalUserTypeAnnotation};
|
||||
|
||||
use std::slice;
|
||||
|
||||
|
@ -185,79 +183,41 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
},
|
||||
)
|
||||
}
|
||||
ExprKind::Call { ty, fun, args, from_hir_call, fn_span } => {
|
||||
let intrinsic = match *ty.kind() {
|
||||
ty::FnDef(def_id, _) => {
|
||||
let f = ty.fn_sig(this.hir.tcx());
|
||||
if f.abi() == Abi::RustIntrinsic || f.abi() == Abi::PlatformIntrinsic {
|
||||
Some(this.hir.tcx().item_name(def_id))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
ExprKind::Call { ty: _, fun, args, from_hir_call, fn_span } => {
|
||||
let fun = unpack!(block = this.as_local_operand(block, fun));
|
||||
if let Some(sym::move_val_init) = intrinsic {
|
||||
// `move_val_init` has "magic" semantics - the second argument is
|
||||
// always evaluated "directly" into the first one.
|
||||
let args: Vec<_> = args
|
||||
.into_iter()
|
||||
.map(|arg| unpack!(block = this.as_local_call_operand(block, arg)))
|
||||
.collect();
|
||||
|
||||
let mut args = args.into_iter();
|
||||
let ptr = args.next().expect("0 arguments to `move_val_init`");
|
||||
let val = args.next().expect("1 argument to `move_val_init`");
|
||||
assert!(args.next().is_none(), ">2 arguments to `move_val_init`");
|
||||
let success = this.cfg.start_new_block();
|
||||
|
||||
let ptr = this.hir.mirror(ptr);
|
||||
let ptr_ty = ptr.ty;
|
||||
// Create an *internal* temp for the pointer, so that unsafety
|
||||
// checking won't complain about the raw pointer assignment.
|
||||
let ptr_temp = this
|
||||
.local_decls
|
||||
.push(LocalDecl::with_source_info(ptr_ty, source_info).internal());
|
||||
let ptr_temp = Place::from(ptr_temp);
|
||||
// No need for a scope, ptr_temp doesn't need drop
|
||||
let block = unpack!(this.into(ptr_temp, None, block, ptr));
|
||||
// Maybe we should provide a scope here so that
|
||||
// `move_val_init` wouldn't leak on panic even with an
|
||||
// arbitrary `val` expression, but `schedule_drop`,
|
||||
// borrowck and drop elaboration all prevent us from
|
||||
// dropping `ptr_temp.deref()`.
|
||||
this.into(this.hir.tcx().mk_place_deref(ptr_temp), None, block, val)
|
||||
} else {
|
||||
let args: Vec<_> = args
|
||||
.into_iter()
|
||||
.map(|arg| unpack!(block = this.as_local_call_operand(block, arg)))
|
||||
.collect();
|
||||
this.record_operands_moved(&args);
|
||||
|
||||
let success = this.cfg.start_new_block();
|
||||
debug!("into_expr: fn_span={:?}", fn_span);
|
||||
|
||||
this.record_operands_moved(&args);
|
||||
|
||||
debug!("into_expr: fn_span={:?}", fn_span);
|
||||
|
||||
this.cfg.terminate(
|
||||
block,
|
||||
source_info,
|
||||
TerminatorKind::Call {
|
||||
func: fun,
|
||||
args,
|
||||
cleanup: None,
|
||||
// FIXME(varkor): replace this with an uninhabitedness-based check.
|
||||
// This requires getting access to the current module to call
|
||||
// `tcx.is_ty_uninhabited_from`, which is currently tricky to do.
|
||||
destination: if expr.ty.is_never() {
|
||||
None
|
||||
} else {
|
||||
Some((destination, success))
|
||||
},
|
||||
from_hir_call,
|
||||
fn_span,
|
||||
this.cfg.terminate(
|
||||
block,
|
||||
source_info,
|
||||
TerminatorKind::Call {
|
||||
func: fun,
|
||||
args,
|
||||
cleanup: None,
|
||||
// FIXME(varkor): replace this with an uninhabitedness-based check.
|
||||
// This requires getting access to the current module to call
|
||||
// `tcx.is_ty_uninhabited_from`, which is currently tricky to do.
|
||||
destination: if expr.ty.is_never() {
|
||||
None
|
||||
} else {
|
||||
Some((destination, success))
|
||||
},
|
||||
);
|
||||
this.diverge_from(block);
|
||||
schedule_drop(this);
|
||||
success.unit()
|
||||
}
|
||||
from_hir_call,
|
||||
fn_span,
|
||||
},
|
||||
);
|
||||
this.diverge_from(block);
|
||||
schedule_drop(this);
|
||||
success.unit()
|
||||
}
|
||||
ExprKind::Use { source } => this.into(destination, scope, block, source),
|
||||
ExprKind::Borrow { arg, borrow_kind } => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue