diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index 485c41f7feb5..38d6dacd4c44 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -2168,12 +2168,12 @@ impl<'a> LoweringContext<'a> {
// let result = match ::std::iter::IntoIterator::into_iter(
) {
// 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 = next;
+ // let = _next;
// StmtExpr();
// }
// }
@@ -2186,8 +2186,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 = {
@@ -2233,13 +2233,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 = next`
+ // `let = _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 000000000000..14ce23b07242
--- /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 or the MIT license
+// , 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