Skip to content

Commit

Permalink
Make the next variable mutable to allow for ref mut in for patterns.
Browse files Browse the repository at this point in the history
  • Loading branch information
Zoxc committed Jun 16, 2017
1 parent 09bc092 commit bd7cc77
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 7 deletions.
14 changes: 7 additions & 7 deletions src/librustc/hir/lowering.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>);
// }
// }
Expand All @@ -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 = {
Expand Down Expand Up @@ -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),
Expand Down
15 changes: 15 additions & 0 deletions src/test/run-pass/for-loop-mut-ref-element.rs
Original file line number Diff line number Diff line change
@@ -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) {}
}

0 comments on commit bd7cc77

Please sign in to comment.