@@ -56,11 +56,11 @@ pub enum GeneratorState<Y, R> {
5656/// return "foo"
5757/// };
5858///
59- /// match generator.resume() {
59+ /// match unsafe { generator.resume() } {
6060/// GeneratorState::Yielded(1) => {}
6161/// _ => panic!("unexpected return from resume"),
6262/// }
63- /// match generator.resume() {
63+ /// match unsafe { generator.resume() } {
6464/// GeneratorState::Complete("foo") => {}
6565/// _ => panic!("unexpected return from resume"),
6666/// }
@@ -98,6 +98,10 @@ pub trait Generator {
9898 /// generator will continue executing until it either yields or returns, at
9999 /// which point this function will return.
100100 ///
101+ /// The function is unsafe because it can be used on an immovable generator.
102+ /// After such a call, the immovable generator must not move again, but
103+ /// this is not enforced by the compiler.
104+ ///
101105 /// # Return value
102106 ///
103107 /// The `GeneratorState` enum returned from this function indicates what
@@ -116,7 +120,7 @@ pub trait Generator {
116120 /// been returned previously. While generator literals in the language are
117121 /// guaranteed to panic on resuming after `Complete`, this is not guaranteed
118122 /// for all implementations of the `Generator` trait.
119- fn resume ( & mut self ) -> GeneratorState < Self :: Yield , Self :: Return > ;
123+ unsafe fn resume ( & mut self ) -> GeneratorState < Self :: Yield , Self :: Return > ;
120124}
121125
122126#[ unstable( feature = "generator_trait" , issue = "43122" ) ]
@@ -125,7 +129,7 @@ impl<'a, T> Generator for &'a mut T
125129{
126130 type Yield = T :: Yield ;
127131 type Return = T :: Return ;
128- fn resume ( & mut self ) -> GeneratorState < Self :: Yield , Self :: Return > {
132+ unsafe fn resume ( & mut self ) -> GeneratorState < Self :: Yield , Self :: Return > {
129133 ( * * self ) . resume ( )
130134 }
131135}
0 commit comments