about summary refs log tree commit diff
path: root/tests/ui/generator/yield-while-local-borrowed.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/generator/yield-while-local-borrowed.rs')
-rw-r--r--tests/ui/generator/yield-while-local-borrowed.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/ui/generator/yield-while-local-borrowed.rs b/tests/ui/generator/yield-while-local-borrowed.rs
new file mode 100644
index 00000000000..061a64dbc36
--- /dev/null
+++ b/tests/ui/generator/yield-while-local-borrowed.rs
@@ -0,0 +1,49 @@
+#![feature(generators, generator_trait)]
+
+use std::ops::{GeneratorState, Generator};
+use std::cell::Cell;
+use std::pin::Pin;
+
+fn borrow_local_inline() {
+    // Not OK to yield with a borrow of a temporary.
+    //
+    // (This error occurs because the region shows up in the type of
+    // `b` and gets extended by region inference.)
+    let mut b = move || {
+        let a = &mut 3;
+        //~^ ERROR borrow may still be in use when generator yields
+        yield();
+        println!("{}", a);
+    };
+    Pin::new(&mut b).resume(());
+}
+
+fn borrow_local_inline_done() {
+    // No error here -- `a` is not in scope at the point of `yield`.
+    let mut b = move || {
+        {
+            let a = &mut 3;
+        }
+        yield();
+    };
+    Pin::new(&mut b).resume(());
+}
+
+fn borrow_local() {
+    // Not OK to yield with a borrow of a temporary.
+    //
+    // (This error occurs because the region shows up in the type of
+    // `b` and gets extended by region inference.)
+    let mut b = move || {
+        let a = 3;
+        {
+            let b = &a;
+            //~^ ERROR borrow may still be in use when generator yields
+            yield();
+            println!("{}", b);
+        }
+    };
+    Pin::new(&mut b).resume(());
+}
+
+fn main() { }