Tell expr_use_visitor which binops are by value
This commit is contained in:
parent
f64e52a7f7
commit
5038f5a70c
@ -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<ast::BinOp>)
|
||||
-> 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user