From b944d8d72e234d14b5147cc210e2cc5ea345d1eb Mon Sep 17 00:00:00 2001 From: Michael Sullivan Date: Tue, 28 Jun 2011 17:24:59 -0700 Subject: [PATCH] Require that both sides of a swap be lvals. --- src/comp/middle/alias.rs | 17 ++++++++++++----- src/test/compile-fail/swap-no-lval.rs | 5 +++++ 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 src/test/compile-fail/swap-no-lval.rs diff --git a/src/comp/middle/alias.rs b/src/comp/middle/alias.rs index 6f2c4ea837b..ade60d68c99 100644 --- a/src/comp/middle/alias.rs +++ b/src/comp/middle/alias.rs @@ -111,6 +111,10 @@ fn visit_expr(@ctx cx, &@ast::expr ex, &scope sc, &vt[scope] v) { check_var(*cx, ex, pt, ex.id, false, sc); handled = false; } + case (ast::expr_swap(?lhs, ?rhs)) { + check_lval(cx, lhs, sc, v); + check_lval(cx, rhs, sc, v); + } case (ast::expr_move(?dest, ?src)) { check_assign(cx, dest, src, sc, v); } @@ -376,11 +380,7 @@ fn check_var(&ctx cx, &@ast::expr ex, &ast::path p, ast::node_id id, } } - -// FIXME does not catch assigning to immutable object fields yet -fn check_assign(&@ctx cx, &@ast::expr dest, &@ast::expr src, &scope sc, - &vt[scope] v) { - visit_expr(cx, src, sc, v); +fn check_lval(&@ctx cx, &@ast::expr dest, &scope sc, &vt[scope] v) { alt (dest.node) { case (ast::expr_path(?p)) { auto dnum = ast::def_id_of_def(cx.tcx.def_map.get(dest.id))._1; @@ -418,6 +418,13 @@ fn check_assign(&@ctx cx, &@ast::expr dest, &@ast::expr src, &scope sc, } } +fn check_assign(&@ctx cx, &@ast::expr dest, &@ast::expr src, &scope sc, + &vt[scope] v) { + visit_expr(cx, src, sc, v); + check_lval(cx, dest, sc, v); +} + + fn is_immutable_alias(&@ctx cx, &scope sc, node_id dnum) -> bool { alt (cx.local_map.find(dnum)) { case (some(arg(ast::alias(false)))) { ret true; } diff --git a/src/test/compile-fail/swap-no-lval.rs b/src/test/compile-fail/swap-no-lval.rs new file mode 100644 index 00000000000..db20cb3b280 --- /dev/null +++ b/src/test/compile-fail/swap-no-lval.rs @@ -0,0 +1,5 @@ +// error-pattern: assignment to non-lvalue + +fn main() { + 5 <-> 3; +}