})
}
Some(init) => {
- // Variable declarations with initializers are considered "assigns":
- let tcx = this.bccx.tcx;
- pat_util::pat_bindings(tcx.def_map, local.pat, |_, id, span, _| {
- gather_moves::gather_assignment(this.bccx,
- &this.move_data,
- id,
- span,
- @LpVar(id),
- id);
- });
+ // Variable declarations with initializers are considered "assigns",
+ // which is handled by `gather_pat`:
let init_cmt = this.bccx.cat_expr(init);
this.gather_pat(init_cmt, local.pat, None);
}
self.bccx.cat_pattern(discr_cmt, root_pat, |cmt, pat| {
match pat.node {
ast::PatIdent(bm, _, _) if self.pat_is_binding(pat) => {
+ // Each match binding is effectively an assignment.
+ let tcx = self.bccx.tcx;
+ pat_util::pat_bindings(tcx.def_map, pat, |_, id, span, _| {
+ gather_moves::gather_assignment(self.bccx,
+ &self.move_data,
+ id,
+ span,
+ @LpVar(id),
+ id);
+ });
+
match bm {
ast::BindByRef(mutbl) => {
// ref x or ref x @ p --- creates a ptr which must
--- /dev/null
+// Copyright 2012-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.
+
+// Test that immutable pattern bindings cannot be reassigned.
+
+enum E {
+ Foo(int)
+}
+
+struct S {
+ bar: int,
+}
+
+pub fn main() {
+ match 1i {
+ x => {
+ x += 1; //~ ERROR re-assignment of immutable variable `x`
+ }
+ }
+
+ match Foo(1) {
+ Foo(x) => {
+ x += 1; //~ ERROR re-assignment of immutable variable `x`
+ }
+ }
+
+ match S { bar: 1 } {
+ S { bar: x } => {
+ x += 1; //~ ERROR re-assignment of immutable variable `x`
+ }
+ }
+
+ match (1i,) {
+ (x,) => {
+ x += 1; //~ ERROR re-assignment of immutable variable `x`
+ }
+ }
+
+ match [1,2,3] {
+ [x,_,_] => {
+ x += 1; //~ ERROR re-assignment of immutable variable `x`
+ }
+ }
+}