Skip to content

Commit

Permalink
Improve invalid operator assignment handling.
Browse files Browse the repository at this point in the history
  • Loading branch information
rcatolino committed Jan 10, 2014
1 parent 72a5252 commit 02d8621
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 14 deletions.
29 changes: 16 additions & 13 deletions src/librustc/middle/typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,13 @@ impl PurityState {
}
}

/// Whether `check_binop` allows overloaded operators to be invoked.
/// Whether `check_binop` is part of an assignment or not.
/// Used to know wether we allow user overloads and to print
/// better messages on error.
#[deriving(Eq)]
enum AllowOverloadedOperatorsFlag {
AllowOverloadedOperators,
DontAllowOverloadedOperators,
enum IsBinopAssignment{
SimpleBinop,
BinopAssignment,
}

#[deriving(Clone)]
Expand Down Expand Up @@ -2086,7 +2088,7 @@ pub fn check_expr_with_unifier(fcx: @FnCtxt,
rhs: @ast::Expr,
// Used only in the error case
expected_result: Option<ty::t>,
allow_overloaded_operators: AllowOverloadedOperatorsFlag
is_binop_assignment: IsBinopAssignment
) {
let tcx = fcx.ccx.tcx;

Expand Down Expand Up @@ -2136,9 +2138,9 @@ pub fn check_expr_with_unifier(fcx: @FnCtxt,

}

// Check for overloaded operators if allowed.
// Check for overloaded operators if not an assignment.
let result_t;
if allow_overloaded_operators == AllowOverloadedOperators {
if is_binop_assignment == SimpleBinop {
result_t = check_user_binop(fcx,
callee_id,
expr,
Expand All @@ -2150,13 +2152,14 @@ pub fn check_expr_with_unifier(fcx: @FnCtxt,
} else {
fcx.type_error_message(expr.span,
|actual| {
format!("binary operation {} cannot be \
applied to type `{}`",
ast_util::binop_to_str(op),
actual)
format!("binary assignment operation \
{}= cannot be applied to type `{}`",
ast_util::binop_to_str(op),
actual)
},
lhs_t,
None);
check_expr(fcx, rhs);
result_t = ty::mk_err();
}

Expand Down Expand Up @@ -2760,7 +2763,7 @@ pub fn check_expr_with_unifier(fcx: @FnCtxt,
lhs,
rhs,
expected,
AllowOverloadedOperators);
SimpleBinop);

let lhs_ty = fcx.expr_ty(lhs);
let rhs_ty = fcx.expr_ty(rhs);
Expand All @@ -2781,7 +2784,7 @@ pub fn check_expr_with_unifier(fcx: @FnCtxt,
lhs,
rhs,
expected,
DontAllowOverloadedOperators);
BinopAssignment);

let lhs_t = fcx.expr_ty(lhs);
let result_t = fcx.expr_ty(expr);
Expand Down
17 changes: 17 additions & 0 deletions src/test/compile-fail/assignment-operator-unimplemented.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

struct Foo;

fn main() {
let mut a = Foo;
let ref b = Foo;
a += *b; //~ Error: binary assignment operation += cannot be applied to type `Foo`
}
2 changes: 1 addition & 1 deletion src/test/compile-fail/issue-5239-1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@
// Regression test for issue #5239

fn main() {
let x: |int| -> int = |ref x| { x += 1; }; //~ ERROR binary operation + cannot be applied to type `&int`
let x: |int| -> int = |ref x| { x += 1; }; //~ ERROR binary assignment operation += cannot be applied to type `&int`
}

5 comments on commit 02d8621

@bors
Copy link
Contributor

@bors bors commented on 02d8621 Jan 10, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from alexcrichton
at rcatolino@02d8621

@bors
Copy link
Contributor

@bors bors commented on 02d8621 Jan 10, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging rcatolino/rust/assign-binop-handling = 02d8621 into auto

@bors
Copy link
Contributor

@bors bors commented on 02d8621 Jan 10, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rcatolino/rust/assign-binop-handling = 02d8621 merged ok, testing candidate = 33e8663

@bors
Copy link
Contributor

@bors bors commented on 02d8621 Jan 10, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on 02d8621 Jan 10, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding master to auto = 33e8663

Please sign in to comment.