From 5038f5a70c8fd12703fe5d78b8d04918336e764c Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Mon, 1 Dec 2014 14:47:06 -0500 Subject: [PATCH] Tell expr_use_visitor which binops are by value --- src/librustc/middle/expr_use_visitor.rs | 28 ++++++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/librustc/middle/expr_use_visitor.rs b/src/librustc/middle/expr_use_visitor.rs index 8e00c96535b..59872c69462 100644 --- a/src/librustc/middle/expr_use_visitor.rs +++ b/src/librustc/middle/expr_use_visitor.rs @@ -30,7 +30,7 @@ use middle::ty::{MethodStatic, MethodStaticUnboxedClosure}; use util::ppaux::Repr; use std::kinds; -use syntax::ast; +use syntax::{ast, ast_util}; use syntax::ptr::P; use syntax::codemap::Span; @@ -438,7 +438,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> { ast::ExprPath(..) => { } ast::ExprUnary(ast::UnDeref, ref base) => { // *base - if !self.walk_overloaded_operator(expr, &**base, Vec::new()) { + if !self.walk_overloaded_operator(expr, &**base, Vec::new(), None) { self.select_from_expr(&**base); } } @@ -452,7 +452,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> { } ast::ExprIndex(ref lhs, ref rhs) => { // lhs[rhs] - if !self.walk_overloaded_operator(expr, &**lhs, vec![&**rhs]) { + if !self.walk_overloaded_operator(expr, &**lhs, vec![&**rhs], None) { self.select_from_expr(&**lhs); self.consume_expr(&**rhs); } @@ -465,7 +465,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> { (&None, &Some(ref e)) => vec![&**e], (&None, &None) => Vec::new() }; - let overloaded = self.walk_overloaded_operator(expr, &**base, args); + let overloaded = self.walk_overloaded_operator(expr, &**base, args, None); assert!(overloaded); } @@ -570,13 +570,14 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> { } ast::ExprUnary(_, ref lhs) => { - if !self.walk_overloaded_operator(expr, &**lhs, Vec::new()) { + if !self.walk_overloaded_operator(expr, &**lhs, Vec::new(), None) { self.consume_expr(&**lhs); } } - ast::ExprBinary(_, ref lhs, ref rhs) => { - if !self.walk_overloaded_operator(expr, &**lhs, vec![&**rhs]) { + ast::ExprBinary(op, ref lhs, ref rhs) => { + if !self.walk_overloaded_operator(expr, &**lhs, vec![&**rhs], Some(op)) + { self.consume_expr(&**lhs); self.consume_expr(&**rhs); } @@ -911,13 +912,24 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> { fn walk_overloaded_operator(&mut self, expr: &ast::Expr, receiver: &ast::Expr, - rhs: Vec<&ast::Expr>) + rhs: Vec<&ast::Expr>, + binop: Option) -> bool { if !self.typer.is_method_call(expr.id) { return false; } + match binop { + Some(binop) if ast_util::is_by_value_binop(binop) => { + self.consume_expr(receiver); + self.consume_expr(rhs[0]); + + return true; + }, + _ => {}, + } + self.walk_expr(receiver); // Arguments (but not receivers) to overloaded operator