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>
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) => {