Stop doing weird index stuff in ElaborateBoxDerefs
This commit is contained in:
parent
f82eb4d0a0
commit
2e52d61807
@ -116,29 +116,30 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
|||||||
for debug_info in body.var_debug_info.iter_mut() {
|
for debug_info in body.var_debug_info.iter_mut() {
|
||||||
if let VarDebugInfoContents::Place(place) = &mut debug_info.value {
|
if let VarDebugInfoContents::Place(place) = &mut debug_info.value {
|
||||||
let mut new_projections: Option<Vec<_>> = None;
|
let mut new_projections: Option<Vec<_>> = None;
|
||||||
let mut last_deref = 0;
|
|
||||||
|
|
||||||
for (i, (base, elem)) in place.iter_projections().enumerate() {
|
for (base, elem) in place.iter_projections() {
|
||||||
let base_ty = base.ty(&body.local_decls, tcx).ty;
|
let base_ty = base.ty(&body.local_decls, tcx).ty;
|
||||||
|
|
||||||
if elem == PlaceElem::Deref && base_ty.is_box() {
|
if elem == PlaceElem::Deref && base_ty.is_box() {
|
||||||
let new_projections = new_projections.get_or_insert_default();
|
// Clone the projections before us, since now we need to mutate them.
|
||||||
|
let new_projections =
|
||||||
|
new_projections.get_or_insert_with(|| base.projection.to_vec());
|
||||||
|
|
||||||
let (unique_ty, nonnull_ty, ptr_ty) =
|
let (unique_ty, nonnull_ty, ptr_ty) =
|
||||||
build_ptr_tys(tcx, base_ty.boxed_ty(), unique_did, nonnull_did);
|
build_ptr_tys(tcx, base_ty.boxed_ty(), unique_did, nonnull_did);
|
||||||
|
|
||||||
new_projections.extend_from_slice(&base.projection[last_deref..]);
|
|
||||||
new_projections.extend_from_slice(&build_projection(
|
new_projections.extend_from_slice(&build_projection(
|
||||||
unique_ty, nonnull_ty, ptr_ty,
|
unique_ty, nonnull_ty, ptr_ty,
|
||||||
));
|
));
|
||||||
new_projections.push(PlaceElem::Deref);
|
new_projections.push(PlaceElem::Deref);
|
||||||
|
} else if let Some(new_projections) = new_projections.as_mut() {
|
||||||
last_deref = i;
|
// Keep building up our projections list once we've started it.
|
||||||
|
new_projections.push(elem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(mut new_projections) = new_projections {
|
// Store the mutated projections if we actually changed something.
|
||||||
new_projections.extend_from_slice(&place.projection[last_deref..]);
|
if let Some(new_projections) = new_projections {
|
||||||
place.projection = tcx.mk_place_elems(&new_projections);
|
place.projection = tcx.mk_place_elems(&new_projections);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
- // MIR for `pointee` before ElaborateBoxDerefs
|
||||||
|
+ // MIR for `pointee` after ElaborateBoxDerefs
|
||||||
|
|
||||||
|
fn pointee(_1: Box<i32>) -> () {
|
||||||
|
- debug foo => (*_1);
|
||||||
|
+ debug foo => (*(((_1.0: std::ptr::Unique<i32>).0: std::ptr::NonNull<i32>).0: *const i32));
|
||||||
|
let mut _0: ();
|
||||||
|
|
||||||
|
bb0: {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
20
tests/mir-opt/elaborate_box_deref_in_debuginfo.rs
Normal file
20
tests/mir-opt/elaborate_box_deref_in_debuginfo.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// skip-filecheck
|
||||||
|
//@ test-mir-pass: ElaborateBoxDerefs
|
||||||
|
|
||||||
|
#![feature(custom_mir, core_intrinsics)]
|
||||||
|
|
||||||
|
extern crate core;
|
||||||
|
use core::intrinsics::mir::*;
|
||||||
|
|
||||||
|
// EMIT_MIR elaborate_box_deref_in_debuginfo.pointee.ElaborateBoxDerefs.diff
|
||||||
|
#[custom_mir(dialect = "built")]
|
||||||
|
fn pointee(opt: Box<i32>) {
|
||||||
|
mir!(
|
||||||
|
debug foo => *opt;
|
||||||
|
{
|
||||||
|
Return()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,35 @@
|
|||||||
|
//@ aux-build:block-on.rs
|
||||||
|
//@ edition:2021
|
||||||
|
//@ run-pass
|
||||||
|
|
||||||
|
#![feature(async_closure)]
|
||||||
|
|
||||||
|
extern crate block_on;
|
||||||
|
|
||||||
|
pub trait Trait {
|
||||||
|
fn callback(&mut self);
|
||||||
|
}
|
||||||
|
impl Trait for (i32,) {
|
||||||
|
fn callback(&mut self) {
|
||||||
|
println!("hi {}", self.0);
|
||||||
|
self.0 += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn call_once(f: impl async FnOnce()) {
|
||||||
|
f().await;
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn run(mut loader: Box<dyn Trait>) {
|
||||||
|
let f = async move || {
|
||||||
|
loader.callback();
|
||||||
|
loader.callback();
|
||||||
|
};
|
||||||
|
call_once(f).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
block_on::block_on(async {
|
||||||
|
run(Box::new((42,))).await;
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user