From bf792b922cb14ed7825246f169d60874f71aec78 Mon Sep 17 00:00:00 2001 From: Mahmut Bulut Date: Tue, 30 Oct 2012 23:37:09 +0200 Subject: [PATCH 1/3] * dropnzero_val fn added * zero-mem for not needed drop situation placed in Ignore --- src/rustc/middle/trans/datum.rs | 19 +++++++++++++++++++ src/rustc/middle/trans/expr.rs | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/rustc/middle/trans/datum.rs b/src/rustc/middle/trans/datum.rs index 5e11cdd479436..4a2c82cc7266f 100644 --- a/src/rustc/middle/trans/datum.rs +++ b/src/rustc/middle/trans/datum.rs @@ -542,6 +542,25 @@ impl Datum { }; } + fn dropnzero_val(bcx: block) -> block { + if !ty::type_needs_drop(bcx.tcx(), self.ty) { + return bcx; + } + + return match self.mode { + ByRef => { + glue::drop_ty(bcx, self.val, self.ty); + zero_mem(bcx, self.val, self.ty); + return bcx; + } + ByValue => { + glue::drop_ty_immediate(bcx, self.val, self.ty); + zero_mem(bcx, self.val, self.ty); + return bcx; + } + }; + } + fn box_body(bcx: block) -> Datum { /*! * diff --git a/src/rustc/middle/trans/expr.rs b/src/rustc/middle/trans/expr.rs index dee553536048a..9e1451a3fcd90 100644 --- a/src/rustc/middle/trans/expr.rs +++ b/src/rustc/middle/trans/expr.rs @@ -573,7 +573,7 @@ fn trans_rvalue_dps_unadjusted(bcx: block, expr: @ast::expr, if bcx.expr_is_lval(a) { let datum = unpack_datum!(bcx, trans_to_datum(bcx, a)); return match dest { - Ignore => datum.drop_val(bcx), + Ignore => datum.dropnzero_val(bcx), SaveIn(addr) => datum.move_to(bcx, INIT, addr) }; } else { From 1dc4d024a88b6d2a6a31aad8d09d62c4dc883a85 Mon Sep 17 00:00:00 2001 From: Mahmut Bulut Date: Wed, 31 Oct 2012 00:05:34 +0200 Subject: [PATCH 2/3] testcase added for #3878 --- src/test/run-pass/unused-move.rs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/test/run-pass/unused-move.rs diff --git a/src/test/run-pass/unused-move.rs b/src/test/run-pass/unused-move.rs new file mode 100644 index 0000000000000..4cabac321376c --- /dev/null +++ b/src/test/run-pass/unused-move.rs @@ -0,0 +1,9 @@ +// Issue #3878 +// Issue Name: Unused move causes a crash +// Abstract: zero-fill to block after drop + +fn main() +{ + let y = ~1; + move y; +} \ No newline at end of file From add41271928941e5e3d34239cf81ab711b3d5089 Mon Sep 17 00:00:00 2001 From: Mahmut Bulut Date: Thu, 1 Nov 2012 00:49:37 +0200 Subject: [PATCH 3/3] change function and place in expr.rs --- src/rustc/middle/trans/datum.rs | 19 ------------------- src/rustc/middle/trans/expr.rs | 8 +++++++- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/rustc/middle/trans/datum.rs b/src/rustc/middle/trans/datum.rs index 4a2c82cc7266f..5e11cdd479436 100644 --- a/src/rustc/middle/trans/datum.rs +++ b/src/rustc/middle/trans/datum.rs @@ -542,25 +542,6 @@ impl Datum { }; } - fn dropnzero_val(bcx: block) -> block { - if !ty::type_needs_drop(bcx.tcx(), self.ty) { - return bcx; - } - - return match self.mode { - ByRef => { - glue::drop_ty(bcx, self.val, self.ty); - zero_mem(bcx, self.val, self.ty); - return bcx; - } - ByValue => { - glue::drop_ty_immediate(bcx, self.val, self.ty); - zero_mem(bcx, self.val, self.ty); - return bcx; - } - }; - } - fn box_body(bcx: block) -> Datum { /*! * diff --git a/src/rustc/middle/trans/expr.rs b/src/rustc/middle/trans/expr.rs index 9e1451a3fcd90..06c2421a452d7 100644 --- a/src/rustc/middle/trans/expr.rs +++ b/src/rustc/middle/trans/expr.rs @@ -159,6 +159,12 @@ impl Dest : cmp::Eq { pure fn ne(other: &Dest) -> bool { !self.eq(other) } } +fn drop_and_cancel_clean(dat: Datum, bcx: block) -> block { + let bcx = dat.drop_val(bcx); + dat.cancel_clean(bcx); + return bcx; +} + fn trans_to_datum(bcx: block, expr: @ast::expr) -> DatumBlock { debug!("trans_to_datum(expr=%s)", bcx.expr_to_str(expr)); @@ -573,7 +579,7 @@ fn trans_rvalue_dps_unadjusted(bcx: block, expr: @ast::expr, if bcx.expr_is_lval(a) { let datum = unpack_datum!(bcx, trans_to_datum(bcx, a)); return match dest { - Ignore => datum.dropnzero_val(bcx), + Ignore => drop_and_cancel_clean(datum, bcx), SaveIn(addr) => datum.move_to(bcx, INIT, addr) }; } else {