Retag argument to drop_in_place
unconditionally
This commit is contained in:
parent
102040ce76
commit
c359ab0b5d
6 changed files with 34 additions and 47 deletions
|
@ -174,35 +174,36 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option<Ty<'tcx>>)
|
|||
let mut body =
|
||||
new_body(source, blocks, local_decls_for_sig(&sig, span), sig.inputs().len(), span);
|
||||
|
||||
if ty.is_some() {
|
||||
// The first argument (index 0), but add 1 for the return value.
|
||||
let mut dropee_ptr = Place::from(Local::new(1 + 0));
|
||||
if tcx.sess.opts.unstable_opts.mir_emit_retag {
|
||||
// We want to treat the function argument as if it was passed by `&mut`. As such, we
|
||||
// generate
|
||||
// ```
|
||||
// temp = &mut *arg;
|
||||
// Retag(temp, FnEntry)
|
||||
// ```
|
||||
// It's important that we do this first, before anything that depends on `dropee_ptr`
|
||||
// has been put into the body.
|
||||
let reborrow = Rvalue::Ref(
|
||||
tcx.lifetimes.re_erased,
|
||||
BorrowKind::Mut { allow_two_phase_borrow: false },
|
||||
tcx.mk_place_deref(dropee_ptr),
|
||||
);
|
||||
let ref_ty = reborrow.ty(body.local_decls(), tcx);
|
||||
dropee_ptr = body.local_decls.push(LocalDecl::new(ref_ty, span)).into();
|
||||
let new_statements = [
|
||||
StatementKind::Assign(Box::new((dropee_ptr, reborrow))),
|
||||
StatementKind::Retag(RetagKind::FnEntry, Box::new(dropee_ptr)),
|
||||
];
|
||||
for s in new_statements {
|
||||
body.basic_blocks_mut()[START_BLOCK]
|
||||
.statements
|
||||
.push(Statement { source_info, kind: s });
|
||||
}
|
||||
// The first argument (index 0), but add 1 for the return value.
|
||||
let mut dropee_ptr = Place::from(Local::new(1 + 0));
|
||||
if tcx.sess.opts.unstable_opts.mir_emit_retag {
|
||||
// We want to treat the function argument as if it was passed by `&mut`. As such, we
|
||||
// generate
|
||||
// ```
|
||||
// temp = &mut *arg;
|
||||
// Retag(temp, FnEntry)
|
||||
// ```
|
||||
// It's important that we do this first, before anything that depends on `dropee_ptr`
|
||||
// has been put into the body.
|
||||
let reborrow = Rvalue::Ref(
|
||||
tcx.lifetimes.re_erased,
|
||||
BorrowKind::Mut { allow_two_phase_borrow: false },
|
||||
tcx.mk_place_deref(dropee_ptr),
|
||||
);
|
||||
let ref_ty = reborrow.ty(body.local_decls(), tcx);
|
||||
dropee_ptr = body.local_decls.push(LocalDecl::new(ref_ty, span)).into();
|
||||
let new_statements = [
|
||||
StatementKind::Assign(Box::new((dropee_ptr, reborrow))),
|
||||
StatementKind::Retag(RetagKind::FnEntry, Box::new(dropee_ptr)),
|
||||
];
|
||||
for s in new_statements {
|
||||
body.basic_blocks_mut()[START_BLOCK]
|
||||
.statements
|
||||
.push(Statement { source_info, kind: s });
|
||||
}
|
||||
}
|
||||
|
||||
if ty.is_some() {
|
||||
let patch = {
|
||||
let param_env = tcx.param_env_reveal_all_normalized(def_id);
|
||||
let mut elaborator =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue