From 363e67273622285a65caa74bb63ecfa04df59055 Mon Sep 17 00:00:00 2001 From: Seo Sanghyeon Date: Thu, 23 May 2013 23:58:23 +0900 Subject: [PATCH] Use adjustments table for allocation lint --- src/librustc/middle/lint.rs | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs index d156457ca886..ae60a90c7acd 100644 --- a/src/librustc/middle/lint.rs +++ b/src/librustc/middle/lint.rs @@ -892,14 +892,9 @@ fn lint_session(cx: @mut Context) -> visit::vt<()> { } fn lint_unnecessary_allocations(cx: @mut Context) -> visit::vt<()> { - // If the expression `e` has an allocated type, but `t` dictates that it's - // something like a slice (doesn't need allocation), emit a warning with the - // specified span. - // - // Currently, this only applies to string and vector literals with sigils in - // front. Those can have the sigil removed to get a borrowed pointer - // automatically. - fn check(cx: @mut Context, e: @ast::expr, t: ty::t) { + // Warn if string and vector literals with sigils are immediately borrowed. + // Those can have the sigil removed. + fn check(cx: @mut Context, e: @ast::expr) { match e.node { ast::expr_vstore(e2, ast::expr_vstore_uniq) | ast::expr_vstore(e2, ast::expr_vstore_box) => { @@ -914,9 +909,9 @@ fn lint_unnecessary_allocations(cx: @mut Context) -> visit::vt<()> { _ => return } - match ty::get(t).sty { - ty::ty_estr(ty::vstore_slice(*)) | - ty::ty_evec(_, ty::vstore_slice(*)) => { + match cx.tcx.adjustments.find_copy(&e.id) { + Some(@ty::AutoDerefRef(ty::AutoDerefRef { + autoref: Some(ty::AutoBorrowVec(*)), _ })) => { cx.span_lint(unnecessary_allocation, e.span, "unnecessary allocation, the sigil can be \ removed"); @@ -927,23 +922,7 @@ fn lint_unnecessary_allocations(cx: @mut Context) -> visit::vt<()> { } let visit_expr: @fn(@ast::expr) = |e| { - match e.node { - ast::expr_call(c, ref args, _) => { - let t = ty::node_id_to_type(cx.tcx, c.id); - let s = ty::ty_fn_sig(t); - for vec::each2(*args, s.inputs) |e, t| { - check(cx, *e, *t); - } - } - ast::expr_method_call(_, _, _, ref args, _) => { - let t = ty::node_id_to_type(cx.tcx, e.callee_id); - let s = ty::ty_fn_sig(t); - for vec::each2(*args, s.inputs) |e, t| { - check(cx, *e, *t); - } - } - _ => {} - } + check(cx, e); }; visit::mk_simple_visitor(@visit::SimpleVisitor {