From 1656fa19ef6149a67a069eca3f7933ab8f4a1828 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Mon, 27 Jun 2011 11:17:05 -0700 Subject: [PATCH] Implement move for scalar values Before, something like: let int y = 42; let int x; x <- y; would cause an LLVM assertion failure. Fixed it. --- src/comp/middle/trans.rs | 4 +++- src/test/run-pass/move-scalar.rs | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/move-scalar.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 26daf479e42e..f3c37ea01e74 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3107,7 +3107,8 @@ fn move_val(@block_ctxt cx, copy_action action, ValueRef dst, ValueRef src, &ty::t t) -> result { if (ty::type_is_scalar(cx.fcx.lcx.ccx.tcx, t) || ty::type_is_native(cx.fcx.lcx.ccx.tcx, t)) { - ret rslt(cx, cx.build.Store(src, dst)); + auto r = rslt(cx, cx.build.Store(cx.build.Load(src), dst)); + ret zero_alloca(r.bcx, src, t); } else if (ty::type_is_nil(cx.fcx.lcx.ccx.tcx, t) || ty::type_is_bot(cx.fcx.lcx.ccx.tcx, t)) { ret rslt(cx, C_nil()); @@ -5798,6 +5799,7 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) -> auto move_res = move_val(rhs_res.res.bcx, DROP_EXISTING, lhs_res.res.val, rhs_res.res.val, t); + log_err "returning move_res"; ret rslt(move_res.bcx, C_nil()); } case (ast::expr_assign(?dst, ?src)) { diff --git a/src/test/run-pass/move-scalar.rs b/src/test/run-pass/move-scalar.rs new file mode 100644 index 000000000000..bc96c7a42507 --- /dev/null +++ b/src/test/run-pass/move-scalar.rs @@ -0,0 +1,7 @@ +fn main() { + + let int y = 42; + let int x; + x <- y; + assert (x == 42); +} \ No newline at end of file