diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index 9435b28a013..fef8431debb 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -822,23 +822,6 @@ fn resolve_expr<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>, expr: // record_superlifetime(new_cx, expr.callee_id); } - hir::ExprYield(..) => { - // Mark this expr's scope and all parent scopes as containing `yield`. - let mut scope = Scope::Node(expr.hir_id.local_id); - loop { - visitor.scope_tree.yield_in_scope.insert(scope, - (expr.span, visitor.expr_count)); - - // Keep traversing up while we can. - match visitor.scope_tree.parent_map.get(&scope) { - // Don't cross from closure bodies to their parent. - Some(&Scope::CallSite(_)) => break, - Some(&superscope) => scope = superscope, - None => break - } - } - } - _ => {} } } @@ -854,6 +837,23 @@ fn resolve_expr<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>, expr: _ => intravisit::walk_expr(visitor, expr) } + if let hir::ExprYield(..) = expr.node { + // Mark this expr's scope and all parent scopes as containing `yield`. + let mut scope = Scope::Node(expr.hir_id.local_id); + loop { + visitor.scope_tree.yield_in_scope.insert(scope, + (expr.span, visitor.expr_count)); + + // Keep traversing up while we can. + match visitor.scope_tree.parent_map.get(&scope) { + // Don't cross from closure bodies to their parent. + Some(&Scope::CallSite(_)) => break, + Some(&superscope) => scope = superscope, + None => break + } + } + } + visitor.cx = prev_cx; } diff --git a/src/librustc_typeck/check/generator_interior.rs b/src/librustc_typeck/check/generator_interior.rs index 5a029236bcd..8f4ee6290c1 100644 --- a/src/librustc_typeck/check/generator_interior.rs +++ b/src/librustc_typeck/check/generator_interior.rs @@ -36,7 +36,7 @@ impl<'a, 'gcx, 'tcx> InteriorVisitor<'a, 'gcx, 'tcx> { let live_across_yield = scope.map_or(Some(DUMMY_SP), |s| { self.region_scope_tree.yield_in_scope(s).and_then(|(span, expr_count)| { // Check if the span in the region comes after the expression - if expr_count > self.expr_count { + if expr.is_none() || expr_count >= self.expr_count { Some(span) } else { None diff --git a/src/test/run-pass/generator/borrow-in-yield-expr.rs b/src/test/run-pass/generator/borrow-in-yield-expr.rs deleted file mode 100644 index 50981df7566..00000000000 --- a/src/test/run-pass/generator/borrow-in-yield-expr.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 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. - -#![feature(generators, generator_trait, conservative_impl_trait)] - -use std::ops::Generator; - -fn bar(baz: String) -> impl Generator { - move || { - yield drop(&baz); - } -} - -fn main() {} \ No newline at end of file