about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2018-01-28 19:49:48 +0100
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2018-01-29 10:02:03 +0100
commitdd3fa07a522cb4f059a96f5e8d82f8d82c33d238 (patch)
tree90a4a184bc2dc6c06e6a9dc21e52d973c5a47b82
parentad058cfafe584e1848276a05c2b7b5d3fcc965ff (diff)
downloadrust-dd3fa07a522cb4f059a96f5e8d82f8d82c33d238.tar.gz
rust-dd3fa07a522cb4f059a96f5e8d82f8d82c33d238.zip
Make `yield_in_scope_for_expr` work with patterns. Fixes #47758
-rw-r--r--src/librustc/middle/region.rs3
-rw-r--r--src/test/ui/generator/pattern-borrow.rs23
-rw-r--r--src/test/ui/generator/pattern-borrow.stderr10
3 files changed, 36 insertions, 0 deletions
diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs
index 9d6b29adb04..cbc061478f8 100644
--- a/src/librustc/middle/region.rs
+++ b/src/librustc/middle/region.rs
@@ -471,6 +471,9 @@ impl<'tcx> Visitor<'tcx> for ExprLocatorVisitor {
 
         self.expr_and_pat_count += 1;
 
+        if pat.id == self.id {
+            self.result = Some(self.expr_and_pat_count);
+        }
     }
 
     fn visit_expr(&mut self, expr: &'tcx Expr) {
diff --git a/src/test/ui/generator/pattern-borrow.rs b/src/test/ui/generator/pattern-borrow.rs
new file mode 100644
index 00000000000..557a5e62f7e
--- /dev/null
+++ b/src/test/ui/generator/pattern-borrow.rs
@@ -0,0 +1,23 @@
+// Copyright 2018 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.
+
+#![feature(generators)]
+
+enum Test { A(i32), B, }
+
+fn main() { }
+
+fn fun(test: Test) {
+    move || {
+        if let Test::A(ref _a) = test { //~ ERROR borrow may still be in use when generator yields
+            yield ();
+        }
+    };
+}
diff --git a/src/test/ui/generator/pattern-borrow.stderr b/src/test/ui/generator/pattern-borrow.stderr
new file mode 100644
index 00000000000..6b39b272d0e
--- /dev/null
+++ b/src/test/ui/generator/pattern-borrow.stderr
@@ -0,0 +1,10 @@
+error[E0626]: borrow may still be in use when generator yields
+  --> $DIR/pattern-borrow.rs:19:24
+   |
+19 |         if let Test::A(ref _a) = test { //~ ERROR borrow may still be in use when generator yields
+   |                        ^^^^^^
+20 |             yield ();
+   |             -------- possible yield occurs here
+
+error: aborting due to previous error
+