Fix mem_categorization to treat an AutoObject adjustment as an rvalue.

Currently mem_categorization categorizes an AutoObject adjustment the
same as the original expression. This can cause two moves to be
generated for the same underlying expression. Currently this isn't a
problem in practice, since check_loans doesn't rely on ExprUseVisitor.
This commit is contained in:
Cameron Zwarich 2014-06-06 11:59:32 -07:00
parent d123188b20
commit 0339b27e6d

View file

@ -390,12 +390,10 @@ impl<'t,TYPER:Typer> MemCategorizationContext<'t,TYPER> {
Some(adjustment) => { Some(adjustment) => {
match *adjustment { match *adjustment {
ty::AutoObject(..) => { ty::AutoObject(..) => {
// Implicity casts a concrete object to trait object // Implicity cast a concrete object to trait object.
// so just patch up the type // Result is an rvalue.
let expr_ty = if_ok!(self.expr_ty_adjusted(expr)); let expr_ty = if_ok!(self.expr_ty_adjusted(expr));
let mut expr_cmt = (*if_ok!(self.cat_expr_unadjusted(expr))).clone(); Ok(self.cat_rvalue_node(expr.id(), expr.span(), expr_ty))
expr_cmt.ty = expr_ty;
Ok(Rc::new(expr_cmt))
} }
ty::AutoAddEnv(..) => { ty::AutoAddEnv(..) => {