From 9be79fe44da82f56764f1119b54fe282958623bf Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Mon, 1 Sep 2014 16:14:56 +1200 Subject: [PATCH] Schedule cleanup for &* on fat owned pointers For example `let _x: &Trait = &*(box Foo as Box);`. There was a bug where no cleanup would be scheduled by the deref. No test because cleanup-auto-borrow-obj.rs is a test for this once we remove trait cross-borrowing (done on another branch). --- src/librustc/middle/trans/datum.rs | 2 ++ src/librustc/middle/trans/expr.rs | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/librustc/middle/trans/datum.rs b/src/librustc/middle/trans/datum.rs index 2882eaf10be2f..74093d26fea55 100644 --- a/src/librustc/middle/trans/datum.rs +++ b/src/librustc/middle/trans/datum.rs @@ -451,6 +451,8 @@ impl Datum { name: &str, expr_id: ast::NodeId) -> DatumBlock<'a, Lvalue> { + debug!("to_lvalue_datum self: {}", self.to_string(bcx.ccx())); + assert!(ty::lltype_is_sized(bcx.tcx(), self.ty), "Trying to convert unsized value to lval"); self.match_kind( diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs index 72f99a3802dcb..c3e0518887bb3 100644 --- a/src/librustc/middle/trans/expr.rs +++ b/src/librustc/middle/trans/expr.rs @@ -2066,11 +2066,17 @@ fn deref_once<'a>(bcx: &'a Block<'a>, if ty::type_is_sized(bcx.tcx(), content_ty) { deref_owned_pointer(bcx, expr, datum, content_ty) } else { - // A fat pointer and an opened DST value have the same represenation - // just different types. - DatumBlock::new(bcx, Datum::new(datum.val, - ty::mk_open(bcx.tcx(), content_ty), - datum.kind)) + // A fat pointer and an opened DST value have the same + // represenation just different types. Since there is no + // temporary for `*e` here (because it is unsized), we cannot + // emulate the sized object code path for running drop glue and + // free. Instead, we schedule cleanup for `e`, turning it into + // an lvalue. + let datum = unpack_datum!( + bcx, datum.to_lvalue_datum(bcx, "deref", expr.id)); + + let datum = Datum::new(datum.val, ty::mk_open(bcx.tcx(), content_ty), LvalueExpr); + DatumBlock::new(bcx, datum) } } @@ -2099,7 +2105,7 @@ fn deref_once<'a>(bcx: &'a Block<'a>, // just different types. DatumBlock::new(bcx, Datum::new(datum.val, ty::mk_open(bcx.tcx(), content_ty), - datum.kind)) + LvalueExpr)) } }