diff options
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index eaee67f9a61..d75766c608b 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -230,15 +230,18 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> { ast::ExprForLoop(pat, head, body, opt_ident) => { // to: // - // match ::std::iter::IntoIterator::into_iter(<head>) { - // mut iter => { - // [opt_ident]: loop { - // match ::std::iter::Iterator::next(&mut iter) { - // ::std::option::Option::Some(<pat>) => <body>, - // ::std::option::Option::None => break + // { + // let result = match ::std::iter::IntoIterator::into_iter(<head>) { + // mut iter => { + // [opt_ident]: loop { + // match ::std::iter::Iterator::next(&mut iter) { + // ::std::option::Option::Some(<pat>) => <body>, + // ::std::option::Option::None => break + // } // } // } - // } + // }; + // result // } // expand <head> @@ -319,7 +322,16 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> { fld.cx.expr_call(span, fld.cx.expr_path(into_iter_path), vec![head]) }; - fld.cx.expr_match(span, into_iter_expr, vec![iter_arm]) + + let match_expr = fld.cx.expr_match(span, into_iter_expr, vec![iter_arm]); + + // `{ let result = ...; result }` + let result_ident = token::gensym_ident("result"); + fld.cx.expr_block( + fld.cx.block_all( + span, + vec![fld.cx.stmt_let(span, false, result_ident, match_expr)], + Some(fld.cx.expr_ident(span, result_ident)))) } ast::ExprClosure(capture_clause, fn_decl, block) => { |
