about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2017-06-17 01:51:55 +0200
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2017-06-17 01:51:55 +0200
commitbd7cc779b65e658ff5b6bbd9d2bdd8ed07ea38f2 (patch)
treebee5262c5fee95d32c95b620df60d279742fa75a /src
parent09bc09201ca02c9bdbcba1c72610209c3598bca1 (diff)
downloadrust-bd7cc779b65e658ff5b6bbd9d2bdd8ed07ea38f2.tar.gz
rust-bd7cc779b65e658ff5b6bbd9d2bdd8ed07ea38f2.zip
Make the `next` variable mutable to allow for ref mut in for patterns.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/hir/lowering.rs14
-rw-r--r--src/test/run-pass/for-loop-mut-ref-element.rs15
2 files changed, 22 insertions, 7 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index f2a43497953..4b8ee8d8aec 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -2170,12 +2170,12 @@ impl<'a> LoweringContext<'a> {
                 //     let result = match ::std::iter::IntoIterator::into_iter(<head>) {
                 //       mut iter => {
                 //         [opt_ident]: loop {
-                //           let next;
+                //           let mut _next;
                 //           match ::std::iter::Iterator::next(&mut iter) {
-                //             ::std::option::Option::Some(val) => next = val,
+                //             ::std::option::Option::Some(val) => _next = val,
                 //             ::std::option::Option::None => break
                 //           };
-                //           let <pat> = next;
+                //           let <pat> = _next;
                 //           StmtExpr(<body>);
                 //         }
                 //       }
@@ -2188,8 +2188,8 @@ impl<'a> LoweringContext<'a> {
 
                 let iter = self.str_to_ident("iter");
 
-                let next_ident = self.str_to_ident("next");
-                let next_pat = self.pat_ident(e.span, next_ident);
+                let next_ident = self.str_to_ident("_next");
+                let next_pat = self.pat_ident_binding_mode(e.span, next_ident, hir::BindByValue(hir::MutMutable));
 
                 // `::std::option::Option::Some(val) => next = val`
                 let pat_arm = {
@@ -2235,13 +2235,13 @@ impl<'a> LoweringContext<'a> {
 
                 let next_expr = P(self.expr_ident(e.span, next_ident, next_pat.id));
 
-                // `let next`
+                // `let mut _next`
                 let next_let = self.stmt_let_pat(e.span,
                     None,
                     next_pat,
                     hir::LocalSource::ForLoopDesugar);
 
-                // `let <pat> = next`
+                // `let <pat> = _next`
                 let pat = self.lower_pat(pat);
                 let pat_let = self.stmt_let_pat(e.span,
                     Some(next_expr),
diff --git a/src/test/run-pass/for-loop-mut-ref-element.rs b/src/test/run-pass/for-loop-mut-ref-element.rs
new file mode 100644
index 00000000000..14ce23b0724
--- /dev/null
+++ b/src/test/run-pass/for-loop-mut-ref-element.rs
@@ -0,0 +1,15 @@
+// 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.
+
+// Tests that for loops can bind elements as mutable references
+
+fn main() {
+    for ref mut _a in std::iter::once(true) {}
+}
\ No newline at end of file