From 045ad33785a0e9d23665fd8b634dd2fa7fde2faa Mon Sep 17 00:00:00 2001 From: edef Date: Thu, 15 Sep 2016 02:35:48 -0400 Subject: [PATCH] Ensure that the Input/Output types outlive the generator [breaking-change] Previously, it was possible to cause unsafety by sending a short-lived value into or out of the generator. --- src/generator.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/generator.rs b/src/generator.rs index 31b7116..96ffdad 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -80,7 +80,7 @@ pub enum State { /// println!("{:?}", nat.next()); // prints Some(2) /// ``` #[derive(Debug)] -pub struct Generator<'a, Input: Send, Output: Send, Stack: stack::Stack> { +pub struct Generator<'a, Input: Send + 'a, Output: Send + 'a, Stack: stack::Stack> { state: State, stack: Stack, stack_id: debug::StackId, @@ -89,7 +89,7 @@ pub struct Generator<'a, Input: Send, Output: Send, Stack: stack::Stack> { } impl<'a, Input, Output, Stack> Generator<'a, Input, Output, Stack> - where Input: Send, Output: Send, Stack: stack::Stack { + where Input: Send + 'a, Output: Send + 'a, Stack: stack::Stack { /// Creates a new generator. /// /// See also the [contract](../trait.GuardedStack.html) that needs to be fulfilled by `stack`. @@ -219,7 +219,7 @@ impl Yielder } impl<'a, Output, Stack> Iterator for Generator<'a, (), Output, Stack> - where Output: Send, Stack: stack::Stack { + where Output: Send + 'a, Stack: stack::Stack { type Item = Output; fn next(&mut self) -> Option { self.resume(()) }