From 337d860a8777a761267daaad9b561787b10e7c87 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Thu, 15 Mar 2012 17:04:35 +0100 Subject: [PATCH] Make last-use finder treat referenced function arguments properly Closes #1964 --- src/rustc/middle/last_use.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/rustc/middle/last_use.rs b/src/rustc/middle/last_use.rs index 7b6266ecde5..c8ced03175e 100644 --- a/src/rustc/middle/last_use.rs +++ b/src/rustc/middle/last_use.rs @@ -163,24 +163,36 @@ fn visit_expr(ex: @expr, cx: ctx, v: visit::vt) { } expr_call(f, args, _) { v.visit_expr(f, cx, v); - let i = 0u, fns = []; + let fns = []; let arg_ts = ty::ty_fn_args(ty::expr_ty(cx.tcx, f)); - for arg in args { + vec::iter2(args, arg_ts) {|arg, arg_t| alt arg.node { expr_fn(_, _, _, _) | expr_fn_block(_, _) - if is_blockish(ty::ty_fn_proto(arg_ts[i].ty)) { + if is_blockish(ty::ty_fn_proto(arg_t.ty)) { fns += [arg]; } _ { - alt ty::arg_mode(cx.tcx, arg_ts[i]) { + alt ty::arg_mode(cx.tcx, arg_t) { by_mutbl_ref { clear_if_path(cx, arg, v, false); } _ { v.visit_expr(arg, cx, v); } } } } - i += 1u; } for f in fns { v.visit_expr(f, cx, v); } + vec::iter2(args, arg_ts) {|arg, arg_t| + alt arg.node { + expr_path(_) { + alt ty::arg_mode(cx.tcx, arg_t) { + by_ref | by_val | by_mutbl_ref { + clear_if_path(cx, arg, v, false); + } + _ {} + } + } + _ {} + } + } } _ { visit::visit_expr(ex, cx, v); } }