about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <ariel.byd@gmail.com>2017-10-17 15:20:22 +0300
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2017-10-17 15:20:22 +0300
commita151d37401b20d235eac1d862579dbbaa4ccea13 (patch)
tree1db3315ae836aaeb7969176390953636a2833994 /src/test
parentabe7c87eefe4a15b7e83feb6b8962ae15452c16c (diff)
downloadrust-a151d37401b20d235eac1d862579dbbaa4ccea13.tar.gz
rust-a151d37401b20d235eac1d862579dbbaa4ccea13.zip
fix generator drop caching
Fixes #45328.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-pass/dynamic-drop.rs24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/test/run-pass/dynamic-drop.rs b/src/test/run-pass/dynamic-drop.rs
index 1aba47af1e9..d8b6dbe48f1 100644
--- a/src/test/run-pass/dynamic-drop.rs
+++ b/src/test/run-pass/dynamic-drop.rs
@@ -8,9 +8,10 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![feature(untagged_unions)]
+#![feature(generators, generator_trait, untagged_unions)]
 
 use std::cell::{Cell, RefCell};
+use std::ops::Generator;
 use std::panic;
 use std::usize;
 
@@ -161,6 +162,21 @@ fn vec_simple(a: &Allocator) {
     let _x = vec![a.alloc(), a.alloc(), a.alloc(), a.alloc()];
 }
 
+fn generator(a: &Allocator, run_count: usize) {
+    assert!(run_count < 4);
+
+    let mut gen = || {
+        (a.alloc(),
+         yield a.alloc(),
+         a.alloc(),
+         yield a.alloc()
+         );
+    };
+    for _ in 0..run_count {
+        gen.resume();
+    }
+}
+
 #[allow(unreachable_code)]
 fn vec_unreachable(a: &Allocator) {
     let _x = vec![a.alloc(), a.alloc(), a.alloc(), return];
@@ -228,5 +244,11 @@ fn main() {
     run_test(|a| field_assignment(a, false));
     run_test(|a| field_assignment(a, true));
 
+    // FIXME: fix leaks on panics
+    run_test_nopanic(|a| generator(a, 0));
+    run_test_nopanic(|a| generator(a, 1));
+    run_test_nopanic(|a| generator(a, 2));
+    run_test_nopanic(|a| generator(a, 3));
+
     run_test_nopanic(|a| union1(a));
 }