Make the next
variable mutable to allow for ref mut in for patterns.
This commit is contained in:
parent
09bc09201c
commit
bd7cc779b6
@ -2170,12 +2170,12 @@ impl<'a> LoweringContext<'a> {
|
|||||||
// let result = match ::std::iter::IntoIterator::into_iter(<head>) {
|
// let result = match ::std::iter::IntoIterator::into_iter(<head>) {
|
||||||
// mut iter => {
|
// mut iter => {
|
||||||
// [opt_ident]: loop {
|
// [opt_ident]: loop {
|
||||||
// let next;
|
// let mut _next;
|
||||||
// match ::std::iter::Iterator::next(&mut iter) {
|
// 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
|
// ::std::option::Option::None => break
|
||||||
// };
|
// };
|
||||||
// let <pat> = next;
|
// let <pat> = _next;
|
||||||
// StmtExpr(<body>);
|
// StmtExpr(<body>);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
@ -2188,8 +2188,8 @@ impl<'a> LoweringContext<'a> {
|
|||||||
|
|
||||||
let iter = self.str_to_ident("iter");
|
let iter = self.str_to_ident("iter");
|
||||||
|
|
||||||
let next_ident = self.str_to_ident("next");
|
let next_ident = self.str_to_ident("_next");
|
||||||
let next_pat = self.pat_ident(e.span, next_ident);
|
let next_pat = self.pat_ident_binding_mode(e.span, next_ident, hir::BindByValue(hir::MutMutable));
|
||||||
|
|
||||||
// `::std::option::Option::Some(val) => next = val`
|
// `::std::option::Option::Some(val) => next = val`
|
||||||
let pat_arm = {
|
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_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,
|
let next_let = self.stmt_let_pat(e.span,
|
||||||
None,
|
None,
|
||||||
next_pat,
|
next_pat,
|
||||||
hir::LocalSource::ForLoopDesugar);
|
hir::LocalSource::ForLoopDesugar);
|
||||||
|
|
||||||
// `let <pat> = next`
|
// `let <pat> = _next`
|
||||||
let pat = self.lower_pat(pat);
|
let pat = self.lower_pat(pat);
|
||||||
let pat_let = self.stmt_let_pat(e.span,
|
let pat_let = self.stmt_let_pat(e.span,
|
||||||
Some(next_expr),
|
Some(next_expr),
|
||||||
|
15
src/test/run-pass/for-loop-mut-ref-element.rs
Normal file
15
src/test/run-pass/for-loop-mut-ref-element.rs
Normal file
@ -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) {}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user