diff --git a/src/doc/unstable-book/src/language-features/generators.md b/src/doc/unstable-book/src/language-features/generators.md index 97cf58e57e6..8bc62418b39 100644 --- a/src/doc/unstable-book/src/language-features/generators.md +++ b/src/doc/unstable-book/src/language-features/generators.md @@ -37,11 +37,11 @@ fn main() { return "foo" }; - match Pin::new(&mut generator).resume() { + match Pin::new(&mut generator).resume(()) { GeneratorState::Yielded(1) => {} _ => panic!("unexpected value from resume"), } - match Pin::new(&mut generator).resume() { + match Pin::new(&mut generator).resume(()) { GeneratorState::Complete("foo") => {} _ => panic!("unexpected value from resume"), } @@ -71,9 +71,9 @@ fn main() { }; println!("1"); - Pin::new(&mut generator).resume(); + Pin::new(&mut generator).resume(()); println!("3"); - Pin::new(&mut generator).resume(); + Pin::new(&mut generator).resume(()); println!("5"); } ``` @@ -92,10 +92,10 @@ The `Generator` trait in `std::ops` currently looks like: # use std::ops::GeneratorState; # use std::pin::Pin; -pub trait Generator { +pub trait Generator { type Yield; type Return; - fn resume(self: Pin<&mut Self>) -> GeneratorState; + fn resume(self: Pin<&mut Self>, resume: R) -> GeneratorState; } ``` @@ -152,10 +152,6 @@ closure-like semantics. Namely: * Whenever a generator is dropped it will drop all captured environment variables. -Note that unlike closures, generators at this time cannot take any arguments. -That is, generators must always look like `|| { ... }`. This restriction may be -lifted at a future date, the design is ongoing! - ### Generators as state machines In the compiler, generators are currently compiled as state machines. Each @@ -179,8 +175,8 @@ fn main() { return ret }; - Pin::new(&mut generator).resume(); - Pin::new(&mut generator).resume(); + Pin::new(&mut generator).resume(()); + Pin::new(&mut generator).resume(()); } ``` @@ -205,7 +201,7 @@ fn main() { type Yield = i32; type Return = &'static str; - fn resume(mut self: Pin<&mut Self>) -> GeneratorState { + fn resume(mut self: Pin<&mut Self>, resume: ()) -> GeneratorState { use std::mem; match mem::replace(&mut *self, __Generator::Done) { __Generator::Start(s) => { @@ -228,8 +224,8 @@ fn main() { __Generator::Start(ret) }; - Pin::new(&mut generator).resume(); - Pin::new(&mut generator).resume(); + Pin::new(&mut generator).resume(()); + Pin::new(&mut generator).resume(()); } ``` diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs index 8735c2c8f36..04be86862ae 100644 --- a/src/liballoc/boxed.rs +++ b/src/liballoc/boxed.rs @@ -1103,6 +1103,7 @@ impl AsMut for Box { #[stable(feature = "pin", since = "1.33.0")] impl Unpin for Box {} +#[cfg(bootstrap)] #[unstable(feature = "generator_trait", issue = "43122")] impl Generator for Box { type Yield = G::Yield; @@ -1113,6 +1114,7 @@ impl Generator for Box { } } +#[cfg(bootstrap)] #[unstable(feature = "generator_trait", issue = "43122")] impl Generator for Pin> { type Yield = G::Yield; @@ -1123,6 +1125,28 @@ impl Generator for Pin> { } } +#[cfg(not(bootstrap))] +#[unstable(feature = "generator_trait", issue = "43122")] +impl + Unpin, R> Generator for Box { + type Yield = G::Yield; + type Return = G::Return; + + fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState { + G::resume(Pin::new(&mut *self), arg) + } +} + +#[cfg(not(bootstrap))] +#[unstable(feature = "generator_trait", issue = "43122")] +impl, R> Generator for Pin> { + type Yield = G::Yield; + type Return = G::Return; + + fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState { + G::resume((*self).as_mut(), arg) + } +} + #[stable(feature = "futures_api", since = "1.36.0")] impl Future for Box { type Output = F::Output; diff --git a/src/libcore/ops/generator.rs b/src/libcore/ops/generator.rs index 5401fff860e..4e43561996c 100644 --- a/src/libcore/ops/generator.rs +++ b/src/libcore/ops/generator.rs @@ -50,11 +50,11 @@ pub enum GeneratorState { /// return "foo" /// }; /// -/// match Pin::new(&mut generator).resume() { +/// match Pin::new(&mut generator).resume(()) { /// GeneratorState::Yielded(1) => {} /// _ => panic!("unexpected return from resume"), /// } -/// match Pin::new(&mut generator).resume() { +/// match Pin::new(&mut generator).resume(()) { /// GeneratorState::Complete("foo") => {} /// _ => panic!("unexpected return from resume"), /// } @@ -67,7 +67,7 @@ pub enum GeneratorState { #[lang = "generator"] #[unstable(feature = "generator_trait", issue = "43122")] #[fundamental] -pub trait Generator { +pub trait Generator<#[cfg(not(bootstrap))] R = ()> { /// The type of value this generator yields. /// /// This associated type corresponds to the `yield` expression and the @@ -110,9 +110,13 @@ pub trait Generator { /// been returned previously. While generator literals in the language are /// guaranteed to panic on resuming after `Complete`, this is not guaranteed /// for all implementations of the `Generator` trait. - fn resume(self: Pin<&mut Self>) -> GeneratorState; + fn resume( + self: Pin<&mut Self>, + #[cfg(not(bootstrap))] arg: R, + ) -> GeneratorState; } +#[cfg(bootstrap)] #[unstable(feature = "generator_trait", issue = "43122")] impl Generator for Pin<&mut G> { type Yield = G::Yield; @@ -123,6 +127,7 @@ impl Generator for Pin<&mut G> { } } +#[cfg(bootstrap)] #[unstable(feature = "generator_trait", issue = "43122")] impl Generator for &mut G { type Yield = G::Yield; @@ -132,3 +137,25 @@ impl Generator for &mut G { G::resume(Pin::new(&mut *self)) } } + +#[cfg(not(bootstrap))] +#[unstable(feature = "generator_trait", issue = "43122")] +impl, R> Generator for Pin<&mut G> { + type Yield = G::Yield; + type Return = G::Return; + + fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState { + G::resume((*self).as_mut(), arg) + } +} + +#[cfg(not(bootstrap))] +#[unstable(feature = "generator_trait", issue = "43122")] +impl + Unpin, R> Generator for &mut G { + type Yield = G::Yield; + type Return = G::Return; + + fn resume(mut self: Pin<&mut Self>, arg: R) -> GeneratorState { + G::resume(Pin::new(&mut *self), arg) + } +} diff --git a/src/librustc/traits/util.rs b/src/librustc/traits/util.rs index ae1a5e3efa2..947d66e38b4 100644 --- a/src/librustc/traits/util.rs +++ b/src/librustc/traits/util.rs @@ -643,8 +643,10 @@ pub fn generator_trait_ref_and_outputs( self_ty: Ty<'tcx>, sig: ty::PolyGenSig<'tcx>, ) -> ty::Binder<(ty::TraitRef<'tcx>, Ty<'tcx>, Ty<'tcx>)> { - let trait_ref = - ty::TraitRef { def_id: fn_trait_def_id, substs: tcx.mk_substs_trait(self_ty, &[]) }; + let trait_ref = ty::TraitRef { + def_id: fn_trait_def_id, + substs: tcx.mk_substs_trait(self_ty, &[tcx.mk_unit().into()]), + }; ty::Binder::bind((trait_ref, sig.skip_binder().yield_ty, sig.skip_binder().return_ty)) } diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index bda42db40b0..966b60c6cfb 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -2350,8 +2350,8 @@ impl<'tcx> ty::Instance<'tcx> { ]); let ret_ty = tcx.mk_adt(state_adt_ref, state_substs); - tcx.mk_fn_sig(iter::once(env_ty), - ret_ty, + tcx.mk_fn_sig([env_ty, tcx.mk_unit()].iter(), + &ret_ty, false, hir::Unsafety::Normal, rustc_target::spec::abi::Abi::Rust diff --git a/src/librustc_error_codes/error_codes/E0626.md b/src/librustc_error_codes/error_codes/E0626.md index db50bd7ac4f..cc6e03d1ca7 100644 --- a/src/librustc_error_codes/error_codes/E0626.md +++ b/src/librustc_error_codes/error_codes/E0626.md @@ -12,7 +12,7 @@ let mut b = || { yield (); // ...is still in scope here, when the yield occurs. println!("{}", a); }; -Pin::new(&mut b).resume(); +Pin::new(&mut b).resume(()); ``` At present, it is not permitted to have a yield that occurs while a @@ -31,7 +31,7 @@ let mut b = || { yield (); println!("{}", a); }; -Pin::new(&mut b).resume(); +Pin::new(&mut b).resume(()); ``` This is a very simple case, of course. In more complex cases, we may @@ -50,7 +50,7 @@ let mut b = || { yield x; // ...when this yield occurs. } }; -Pin::new(&mut b).resume(); +Pin::new(&mut b).resume(()); ``` Such cases can sometimes be resolved by iterating "by value" (or using @@ -66,7 +66,7 @@ let mut b = || { yield x; // <-- Now yield is OK. } }; -Pin::new(&mut b).resume(); +Pin::new(&mut b).resume(()); ``` If taking ownership is not an option, using indices can work too: @@ -83,7 +83,7 @@ let mut b = || { yield x; // <-- Now yield is OK. } }; -Pin::new(&mut b).resume(); +Pin::new(&mut b).resume(()); // (*) -- Unfortunately, these temporaries are currently required. // See . diff --git a/src/librustc_mir/dataflow/impls/storage_liveness.rs b/src/librustc_mir/dataflow/impls/storage_liveness.rs index 6a48d1e9803..040c13e8210 100644 --- a/src/librustc_mir/dataflow/impls/storage_liveness.rs +++ b/src/librustc_mir/dataflow/impls/storage_liveness.rs @@ -31,10 +31,12 @@ impl<'a, 'tcx> BitDenotation<'tcx> for MaybeStorageLive<'a, 'tcx> { self.body.local_decls.len() } - fn start_block_effect(&self, _on_entry: &mut BitSet) { - // Nothing is live on function entry (generators only have a self - // argument, and we don't care about that) - assert_eq!(1, self.body.arg_count); + fn start_block_effect(&self, on_entry: &mut BitSet) { + // The resume argument is live on function entry (we don't care about + // the `self` argument) + for arg in self.body.args_iter().skip(1) { + on_entry.insert(arg); + } } fn statement_effect(&self, trans: &mut GenKillSet, loc: Location) { @@ -100,10 +102,12 @@ impl<'mir, 'tcx> BitDenotation<'tcx> for RequiresStorage<'mir, 'tcx> { self.body.local_decls.len() } - fn start_block_effect(&self, _sets: &mut BitSet) { - // Nothing is live on function entry (generators only have a self - // argument, and we don't care about that) - assert_eq!(1, self.body.arg_count); + fn start_block_effect(&self, on_entry: &mut BitSet) { + // The resume argument is live on function entry (we don't care about + // the `self` argument) + for arg in self.body.args_iter().skip(1) { + on_entry.insert(arg); + } } fn before_statement_effect(&self, sets: &mut GenKillSet, loc: Location) { diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index 1c86d6f3f65..a8defd03f71 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -885,6 +885,7 @@ fn create_generator_drop_shim<'tcx>( drop_clean: BasicBlock, ) -> BodyAndCache<'tcx> { let mut body = body.clone(); + body.arg_count = 1; // make sure the resume argument is not included here let source_info = source_info(&body); @@ -1164,7 +1165,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform { // Update our MIR struct to reflect the changed we've made body.yield_ty = None; - body.arg_count = 1; + body.arg_count = 2; // self, resume arg body.spread_arg = None; body.generator_layout = Some(layout); diff --git a/src/librustc_mir_build/build/mod.rs b/src/librustc_mir_build/build/mod.rs index 1f536b63a39..ab539e6179e 100644 --- a/src/librustc_mir_build/build/mod.rs +++ b/src/librustc_mir_build/build/mod.rs @@ -75,13 +75,16 @@ fn mir_build(tcx: TyCtxt<'_>, def_id: DefId) -> BodyAndCache<'_> { // HACK(eddyb) Avoid having RustCall on closures, // as it adds unnecessary (and wrong) auto-tupling. abi = Abi::Rust; - Some(ArgInfo(liberated_closure_env_ty(tcx, id, body_id), None, None, None)) + vec![ArgInfo(liberated_closure_env_ty(tcx, id, body_id), None, None, None)] } ty::Generator(..) => { let gen_ty = tcx.body_tables(body_id).node_type(id); - Some(ArgInfo(gen_ty, None, None, None)) + vec![ + ArgInfo(gen_ty, None, None, None), + ArgInfo(tcx.mk_unit(), None, None, None), + ] } - _ => None, + _ => vec![], }; let safety = match fn_sig.unsafety { diff --git a/src/libstd/future.rs b/src/libstd/future.rs index 9c7422c2b20..f74c84e6dfd 100644 --- a/src/libstd/future.rs +++ b/src/libstd/future.rs @@ -40,7 +40,10 @@ impl> Future for GenFuture { // Safe because we're !Unpin + !Drop mapping to a ?Unpin value let gen = unsafe { Pin::map_unchecked_mut(self, |s| &mut s.0) }; let _guard = unsafe { set_task_context(cx) }; - match gen.resume() { + match gen.resume( + #[cfg(not(bootstrap))] + (), + ) { GeneratorState::Yielded(()) => Poll::Pending, GeneratorState::Complete(x) => Poll::Ready(x), } diff --git a/src/test/debuginfo/generator-locals.rs b/src/test/debuginfo/generator-locals.rs index 59dbfecc39f..fd46c1a8b4d 100644 --- a/src/test/debuginfo/generator-locals.rs +++ b/src/test/debuginfo/generator-locals.rs @@ -78,9 +78,9 @@ fn main() { _zzz(); // #break a = c; }; - Pin::new(&mut b).resume(); - Pin::new(&mut b).resume(); - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); + Pin::new(&mut b).resume(()); + Pin::new(&mut b).resume(()); _zzz(); // #break } diff --git a/src/test/debuginfo/generator-objects.rs b/src/test/debuginfo/generator-objects.rs index bfa7a05cad0..f19a3c71dd8 100644 --- a/src/test/debuginfo/generator-objects.rs +++ b/src/test/debuginfo/generator-objects.rs @@ -57,11 +57,11 @@ fn main() { println!("{} {} {}", a, c, d); }; _zzz(); // #break - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); _zzz(); // #break - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); _zzz(); // #break - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); _zzz(); // #break } diff --git a/src/test/debuginfo/issue-57822.rs b/src/test/debuginfo/issue-57822.rs index f18e41db0e6..4de88e9dae6 100644 --- a/src/test/debuginfo/issue-57822.rs +++ b/src/test/debuginfo/issue-57822.rs @@ -45,7 +45,7 @@ fn main() { yield; }; let mut b = move || { - Pin::new(&mut a).resume(); + Pin::new(&mut a).resume(()); yield; }; diff --git a/src/test/run-fail/generator-resume-after-panic.rs b/src/test/run-fail/generator-resume-after-panic.rs index 910b4903bf6..1a7c2e80629 100644 --- a/src/test/run-fail/generator-resume-after-panic.rs +++ b/src/test/run-fail/generator-resume-after-panic.rs @@ -16,7 +16,7 @@ fn main() { yield; }; panic::catch_unwind(panic::AssertUnwindSafe(|| { - let x = Pin::new(&mut g).resume(); + let x = Pin::new(&mut g).resume(()); })); - Pin::new(&mut g).resume(); + Pin::new(&mut g).resume(()); } diff --git a/src/test/ui/async-await/issues/issue-65419/issue-65419-generator-resume-after-completion.rs b/src/test/ui/async-await/issues/issue-65419/issue-65419-generator-resume-after-completion.rs index 23e3483e01c..9fc5667d684 100644 --- a/src/test/ui/async-await/issues/issue-65419/issue-65419-generator-resume-after-completion.rs +++ b/src/test/ui/async-await/issues/issue-65419/issue-65419-generator-resume-after-completion.rs @@ -19,7 +19,7 @@ fn main() { let mut g = || { yield; }; - Pin::new(&mut g).resume(); // Yields once. - Pin::new(&mut g).resume(); // Completes here. - Pin::new(&mut g).resume(); // Panics here. + Pin::new(&mut g).resume(()); // Yields once. + Pin::new(&mut g).resume(()); // Completes here. + Pin::new(&mut g).resume(()); // Panics here. } diff --git a/src/test/ui/drop/dynamic-drop.rs b/src/test/ui/drop/dynamic-drop.rs index b4406204a5d..659e520d4cd 100644 --- a/src/test/ui/drop/dynamic-drop.rs +++ b/src/test/ui/drop/dynamic-drop.rs @@ -184,7 +184,7 @@ fn generator(a: &Allocator, run_count: usize) { ); }; for _ in 0..run_count { - Pin::new(&mut gen).resume(); + Pin::new(&mut gen).resume(()); } } diff --git a/src/test/ui/generator/auxiliary/xcrate-reachable.rs b/src/test/ui/generator/auxiliary/xcrate-reachable.rs index 33337f8038f..2dd5ea67523 100644 --- a/src/test/ui/generator/auxiliary/xcrate-reachable.rs +++ b/src/test/ui/generator/auxiliary/xcrate-reachable.rs @@ -6,7 +6,7 @@ fn msg() -> u32 { 0 } -pub fn foo() -> impl Generator { +pub fn foo() -> impl Generator<(), Yield=(), Return=u32> { || { yield; return msg(); diff --git a/src/test/ui/generator/auxiliary/xcrate.rs b/src/test/ui/generator/auxiliary/xcrate.rs index 613c495832f..d07abd0918c 100644 --- a/src/test/ui/generator/auxiliary/xcrate.rs +++ b/src/test/ui/generator/auxiliary/xcrate.rs @@ -3,7 +3,7 @@ use std::marker::Unpin; use std::ops::Generator; -pub fn foo() -> impl Generator { +pub fn foo() -> impl Generator<(), Yield = (), Return = ()> { || { if false { yield; @@ -11,7 +11,7 @@ pub fn foo() -> impl Generator { } } -pub fn bar(t: T) -> Box + Unpin> { +pub fn bar(t: T) -> Box + Unpin> { Box::new(|| { yield t; }) diff --git a/src/test/ui/generator/borrowing.rs b/src/test/ui/generator/borrowing.rs index 6234b738048..d36592583cd 100644 --- a/src/test/ui/generator/borrowing.rs +++ b/src/test/ui/generator/borrowing.rs @@ -6,7 +6,7 @@ use std::pin::Pin; fn main() { let _b = { let a = 3; - Pin::new(&mut || yield &a).resume() + Pin::new(&mut || yield &a).resume(()) //~^ ERROR: `a` does not live long enough }; diff --git a/src/test/ui/generator/borrowing.stderr b/src/test/ui/generator/borrowing.stderr index 3d58873f826..83987e19839 100644 --- a/src/test/ui/generator/borrowing.stderr +++ b/src/test/ui/generator/borrowing.stderr @@ -1,7 +1,7 @@ error[E0597]: `a` does not live long enough --> $DIR/borrowing.rs:9:33 | -LL | Pin::new(&mut || yield &a).resume() +LL | Pin::new(&mut || yield &a).resume(()) | ----------^ | | | | | borrowed value does not live long enough diff --git a/src/test/ui/generator/conditional-drop.rs b/src/test/ui/generator/conditional-drop.rs index 907f7a3c06d..990d94e6efc 100644 --- a/src/test/ui/generator/conditional-drop.rs +++ b/src/test/ui/generator/conditional-drop.rs @@ -35,9 +35,9 @@ fn t1() { }; let n = A.load(Ordering::SeqCst); - Pin::new(&mut a).resume(); + Pin::new(&mut a).resume(()); assert_eq!(A.load(Ordering::SeqCst), n + 1); - Pin::new(&mut a).resume(); + Pin::new(&mut a).resume(()); assert_eq!(A.load(Ordering::SeqCst), n + 1); } @@ -51,8 +51,8 @@ fn t2() { }; let n = A.load(Ordering::SeqCst); - Pin::new(&mut a).resume(); + Pin::new(&mut a).resume(()); assert_eq!(A.load(Ordering::SeqCst), n); - Pin::new(&mut a).resume(); + Pin::new(&mut a).resume(()); assert_eq!(A.load(Ordering::SeqCst), n + 1); } diff --git a/src/test/ui/generator/control-flow.rs b/src/test/ui/generator/control-flow.rs index df70e013bd3..9d4c217b76e 100644 --- a/src/test/ui/generator/control-flow.rs +++ b/src/test/ui/generator/control-flow.rs @@ -7,10 +7,10 @@ use std::ops::{GeneratorState, Generator}; use std::pin::Pin; fn finish(mut amt: usize, mut t: T) -> T::Return - where T: Generator + Unpin, + where T: Generator<(), Yield = ()> + Unpin, { loop { - match Pin::new(&mut t).resume() { + match Pin::new(&mut t).resume(()) { GeneratorState::Yielded(()) => amt = amt.checked_sub(1).unwrap(), GeneratorState::Complete(ret) => { assert_eq!(amt, 0); diff --git a/src/test/ui/generator/drop-and-replace.rs b/src/test/ui/generator/drop-and-replace.rs index bb33502815b..a9a50a122a1 100644 --- a/src/test/ui/generator/drop-and-replace.rs +++ b/src/test/ui/generator/drop-and-replace.rs @@ -37,7 +37,7 @@ fn main() { }; loop { - match Pin::new(&mut a).resume() { + match Pin::new(&mut a).resume(()) { GeneratorState::Complete(()) => break, _ => (), } diff --git a/src/test/ui/generator/drop-env.rs b/src/test/ui/generator/drop-env.rs index ac4e0665628..7ba71188104 100644 --- a/src/test/ui/generator/drop-env.rs +++ b/src/test/ui/generator/drop-env.rs @@ -30,7 +30,7 @@ fn t1() { }; let n = A.load(Ordering::SeqCst); - drop(Pin::new(&mut foo).resume()); + drop(Pin::new(&mut foo).resume(())); assert_eq!(A.load(Ordering::SeqCst), n); drop(foo); assert_eq!(A.load(Ordering::SeqCst), n + 1); @@ -43,7 +43,7 @@ fn t2() { }; let n = A.load(Ordering::SeqCst); - drop(Pin::new(&mut foo).resume()); + drop(Pin::new(&mut foo).resume(())); assert_eq!(A.load(Ordering::SeqCst), n + 1); drop(foo); assert_eq!(A.load(Ordering::SeqCst), n + 1); diff --git a/src/test/ui/generator/dropck.rs b/src/test/ui/generator/dropck.rs index 65c61fbaac4..da00b230d9f 100644 --- a/src/test/ui/generator/dropck.rs +++ b/src/test/ui/generator/dropck.rs @@ -15,6 +15,6 @@ fn main() { let _d = ref_.take(); //~ ERROR `ref_` does not live long enough yield; }; - Pin::new(&mut gen).resume(); + Pin::new(&mut gen).resume(()); // drops the RefCell and then the Ref, leading to use-after-free } diff --git a/src/test/ui/generator/generator-region-requirements.rs b/src/test/ui/generator/generator-region-requirements.rs index 41cb339f459..5f0a6bb09b7 100644 --- a/src/test/ui/generator/generator-region-requirements.rs +++ b/src/test/ui/generator/generator-region-requirements.rs @@ -8,7 +8,7 @@ fn dangle(x: &mut i32) -> &'static mut i32 { x }; loop { - match Pin::new(&mut g).resume() { + match Pin::new(&mut g).resume(()) { GeneratorState::Complete(c) => return c, //~^ ERROR explicit lifetime required GeneratorState::Yielded(_) => (), diff --git a/src/test/ui/generator/issue-44197.rs b/src/test/ui/generator/issue-44197.rs index 6efaff50c1e..389b9d13969 100644 --- a/src/test/ui/generator/issue-44197.rs +++ b/src/test/ui/generator/issue-44197.rs @@ -2,14 +2,14 @@ #![feature(generators, generator_trait)] -use std::ops::{ Generator, GeneratorState }; +use std::ops::{Generator, GeneratorState}; use std::pin::Pin; fn foo(_: &str) -> String { String::new() } -fn bar(baz: String) -> impl Generator { +fn bar(baz: String) -> impl Generator<(), Yield = String, Return = ()> { move || { yield foo(&baz); } @@ -19,7 +19,7 @@ fn foo2(_: &str) -> Result { Err(()) } -fn bar2(baz: String) -> impl Generator { +fn bar2(baz: String) -> impl Generator<(), Yield = String, Return = ()> { move || { if let Ok(quux) = foo2(&baz) { yield quux; @@ -28,6 +28,9 @@ fn bar2(baz: String) -> impl Generator { } fn main() { - assert_eq!(Pin::new(&mut bar(String::new())).resume(), GeneratorState::Yielded(String::new())); - assert_eq!(Pin::new(&mut bar2(String::new())).resume(), GeneratorState::Complete(())); + assert_eq!( + Pin::new(&mut bar(String::new())).resume(()), + GeneratorState::Yielded(String::new()) + ); + assert_eq!(Pin::new(&mut bar2(String::new())).resume(()), GeneratorState::Complete(())); } diff --git a/src/test/ui/generator/issue-61442-stmt-expr-with-drop.rs b/src/test/ui/generator/issue-61442-stmt-expr-with-drop.rs index e3d19029348..187c374021d 100644 --- a/src/test/ui/generator/issue-61442-stmt-expr-with-drop.rs +++ b/src/test/ui/generator/issue-61442-stmt-expr-with-drop.rs @@ -18,12 +18,12 @@ fn drop_and_yield() { String::new(); yield; }; - Box::pin(x).as_mut().resume(); + Box::pin(x).as_mut().resume(()); let y = static || { String::new(); yield; }; - Box::pin(y).as_mut().resume(); + Box::pin(y).as_mut().resume(()); } fn main() { diff --git a/src/test/ui/generator/iterator-count.rs b/src/test/ui/generator/iterator-count.rs index ac7e122dd58..90eefe02f66 100644 --- a/src/test/ui/generator/iterator-count.rs +++ b/src/test/ui/generator/iterator-count.rs @@ -10,18 +10,18 @@ struct W(T); // This impl isn't safe in general, but the generator used in this test is movable // so it won't cause problems. -impl + Unpin> Iterator for W { +impl + Unpin> Iterator for W { type Item = T::Yield; fn next(&mut self) -> Option { - match Pin::new(&mut self.0).resume() { + match Pin::new(&mut self.0).resume(()) { GeneratorState::Complete(..) => None, GeneratorState::Yielded(v) => Some(v), } } } -fn test() -> impl Generator + Unpin { +fn test() -> impl Generator<(), Return=(), Yield=u8> + Unpin { || { for i in 1..6 { yield i diff --git a/src/test/ui/generator/live-upvar-across-yield.rs b/src/test/ui/generator/live-upvar-across-yield.rs index a1064165b2f..6a2e42a5573 100644 --- a/src/test/ui/generator/live-upvar-across-yield.rs +++ b/src/test/ui/generator/live-upvar-across-yield.rs @@ -10,5 +10,5 @@ fn main() { let mut a = || { b(yield); }; - Pin::new(&mut a).resume(); + Pin::new(&mut a).resume(()); } diff --git a/src/test/ui/generator/nested_generators.rs b/src/test/ui/generator/nested_generators.rs index b56cce1dc44..45519150eec 100644 --- a/src/test/ui/generator/nested_generators.rs +++ b/src/test/ui/generator/nested_generators.rs @@ -11,7 +11,7 @@ fn main() { yield 2; }; - match Pin::new(&mut sub_generator).resume() { + match Pin::new(&mut sub_generator).resume(()) { GeneratorState::Yielded(x) => { yield x; } diff --git a/src/test/ui/generator/panic-drops.rs b/src/test/ui/generator/panic-drops.rs index f88687858fd..c9a201725ae 100644 --- a/src/test/ui/generator/panic-drops.rs +++ b/src/test/ui/generator/panic-drops.rs @@ -35,7 +35,7 @@ fn main() { assert_eq!(A.load(Ordering::SeqCst), 0); let res = panic::catch_unwind(panic::AssertUnwindSafe(|| { - Pin::new(&mut foo).resume() + Pin::new(&mut foo).resume(()) })); assert!(res.is_err()); assert_eq!(A.load(Ordering::SeqCst), 1); @@ -50,7 +50,7 @@ fn main() { assert_eq!(A.load(Ordering::SeqCst), 1); let res = panic::catch_unwind(panic::AssertUnwindSafe(|| { - Pin::new(&mut foo).resume() + Pin::new(&mut foo).resume(()) })); assert!(res.is_err()); assert_eq!(A.load(Ordering::SeqCst), 1); diff --git a/src/test/ui/generator/panic-safe.rs b/src/test/ui/generator/panic-safe.rs index 5f6778674dc..500a3c9c295 100644 --- a/src/test/ui/generator/panic-safe.rs +++ b/src/test/ui/generator/panic-safe.rs @@ -17,13 +17,13 @@ fn main() { }; let res = panic::catch_unwind(panic::AssertUnwindSafe(|| { - Pin::new(&mut foo).resume() + Pin::new(&mut foo).resume(()) })); assert!(res.is_err()); for _ in 0..10 { let res = panic::catch_unwind(panic::AssertUnwindSafe(|| { - Pin::new(&mut foo).resume() + Pin::new(&mut foo).resume(()) })); assert!(res.is_err()); } diff --git a/src/test/ui/generator/resume-after-return.rs b/src/test/ui/generator/resume-after-return.rs index 71a68ff684a..efed08bd470 100644 --- a/src/test/ui/generator/resume-after-return.rs +++ b/src/test/ui/generator/resume-after-return.rs @@ -16,12 +16,12 @@ fn main() { yield; }; - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } - match panic::catch_unwind(move || Pin::new(&mut foo).resume()) { + match panic::catch_unwind(move || Pin::new(&mut foo).resume(())) { Ok(_) => panic!("generator successfully resumed"), Err(_) => {} } diff --git a/src/test/ui/generator/sized-yield.rs b/src/test/ui/generator/sized-yield.rs index f64849b3149..c6dd738d6ac 100644 --- a/src/test/ui/generator/sized-yield.rs +++ b/src/test/ui/generator/sized-yield.rs @@ -9,6 +9,6 @@ fn main() { //~^ ERROR the size for values of type yield s[..]; }; - Pin::new(&mut gen).resume(); + Pin::new(&mut gen).resume(()); //~^ ERROR the size for values of type } diff --git a/src/test/ui/generator/sized-yield.stderr b/src/test/ui/generator/sized-yield.stderr index c2caac7ebe2..79aeec2ec02 100644 --- a/src/test/ui/generator/sized-yield.stderr +++ b/src/test/ui/generator/sized-yield.stderr @@ -15,7 +15,7 @@ LL | | }; error[E0277]: the size for values of type `str` cannot be known at compilation time --> $DIR/sized-yield.rs:12:23 | -LL | Pin::new(&mut gen).resume(); +LL | Pin::new(&mut gen).resume(()); | ^^^^^^ doesn't have a size known at compile-time | = help: the trait `std::marker::Sized` is not implemented for `str` diff --git a/src/test/ui/generator/smoke.rs b/src/test/ui/generator/smoke.rs index 533f2399084..9289710b34b 100644 --- a/src/test/ui/generator/smoke.rs +++ b/src/test/ui/generator/smoke.rs @@ -17,7 +17,7 @@ fn simple() { } }; - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } @@ -33,7 +33,7 @@ fn return_capture() { a }; - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(ref s) if *s == "foo" => {} s => panic!("bad state: {:?}", s), } @@ -45,11 +45,11 @@ fn simple_yield() { yield; }; - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Yielded(()) => {} s => panic!("bad state: {:?}", s), } - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } @@ -62,11 +62,11 @@ fn yield_capture() { yield b; }; - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Yielded(ref s) if *s == "foo" => {} s => panic!("bad state: {:?}", s), } - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } @@ -79,11 +79,11 @@ fn simple_yield_value() { return String::from("foo") }; - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Yielded(ref s) if *s == "bar" => {} s => panic!("bad state: {:?}", s), } - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(ref s) if *s == "foo" => {} s => panic!("bad state: {:?}", s), } @@ -97,11 +97,11 @@ fn return_after_yield() { return a }; - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Yielded(()) => {} s => panic!("bad state: {:?}", s), } - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(ref s) if *s == "foo" => {} s => panic!("bad state: {:?}", s), } @@ -149,11 +149,11 @@ fn send_and_sync() { fn send_over_threads() { let mut foo = || { yield }; thread::spawn(move || { - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Yielded(()) => {} s => panic!("bad state: {:?}", s), } - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } @@ -162,11 +162,11 @@ fn send_over_threads() { let a = String::from("a"); let mut foo = || { yield a }; thread::spawn(move || { - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Yielded(ref s) if *s == "a" => {} s => panic!("bad state: {:?}", s), } - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } diff --git a/src/test/ui/generator/static-generators.rs b/src/test/ui/generator/static-generators.rs index 965d3c61c22..3980766c428 100644 --- a/src/test/ui/generator/static-generators.rs +++ b/src/test/ui/generator/static-generators.rs @@ -15,6 +15,6 @@ fn main() { // Safety: We shadow the original generator variable so have no safe API to // move it after this point. let mut generator = unsafe { Pin::new_unchecked(&mut generator) }; - assert_eq!(generator.as_mut().resume(), GeneratorState::Yielded(())); - assert_eq!(generator.as_mut().resume(), GeneratorState::Complete(())); + assert_eq!(generator.as_mut().resume(()), GeneratorState::Yielded(())); + assert_eq!(generator.as_mut().resume(()), GeneratorState::Complete(())); } diff --git a/src/test/ui/generator/xcrate-reachable.rs b/src/test/ui/generator/xcrate-reachable.rs index 9483ad7395e..1b1cff3387d 100644 --- a/src/test/ui/generator/xcrate-reachable.rs +++ b/src/test/ui/generator/xcrate-reachable.rs @@ -10,5 +10,5 @@ use std::ops::Generator; use std::pin::Pin; fn main() { - Pin::new(&mut foo::foo()).resume(); + Pin::new(&mut foo::foo()).resume(()); } diff --git a/src/test/ui/generator/xcrate.rs b/src/test/ui/generator/xcrate.rs index febf5c3583f..40986bbeb65 100644 --- a/src/test/ui/generator/xcrate.rs +++ b/src/test/ui/generator/xcrate.rs @@ -12,18 +12,18 @@ use std::pin::Pin; fn main() { let mut foo = xcrate::foo(); - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } let mut foo = xcrate::bar(3); - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Yielded(3) => {} s => panic!("bad state: {:?}", s), } - match Pin::new(&mut foo).resume() { + match Pin::new(&mut foo).resume(()) { GeneratorState::Complete(()) => {} s => panic!("bad state: {:?}", s), } diff --git a/src/test/ui/generator/yield-while-iterating.rs b/src/test/ui/generator/yield-while-iterating.rs index e42781d1279..985e5d8bdc8 100644 --- a/src/test/ui/generator/yield-while-iterating.rs +++ b/src/test/ui/generator/yield-while-iterating.rs @@ -43,7 +43,7 @@ fn yield_during_iter_borrowed_slice_3() { yield p; } }; - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn yield_during_iter_borrowed_slice_4() { @@ -56,7 +56,7 @@ fn yield_during_iter_borrowed_slice_4() { } }; println!("{}", x[0]); //~ ERROR - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn yield_during_range_iter() { @@ -69,7 +69,7 @@ fn yield_during_range_iter() { yield x; } }; - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn main() { } diff --git a/src/test/ui/generator/yield-while-iterating.stderr b/src/test/ui/generator/yield-while-iterating.stderr index 6a96b25b19f..b6563475235 100644 --- a/src/test/ui/generator/yield-while-iterating.stderr +++ b/src/test/ui/generator/yield-while-iterating.stderr @@ -16,7 +16,7 @@ LL | for p in &mut x { ... LL | println!("{}", x[0]); | ^ immutable borrow occurs here -LL | Pin::new(&mut b).resume(); +LL | Pin::new(&mut b).resume(()); | ------ mutable borrow later used here error: aborting due to 2 previous errors diff --git a/src/test/ui/generator/yield-while-local-borrowed.rs b/src/test/ui/generator/yield-while-local-borrowed.rs index b643bbf3376..061a64dbc36 100644 --- a/src/test/ui/generator/yield-while-local-borrowed.rs +++ b/src/test/ui/generator/yield-while-local-borrowed.rs @@ -15,7 +15,7 @@ fn borrow_local_inline() { yield(); println!("{}", a); }; - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn borrow_local_inline_done() { @@ -26,7 +26,7 @@ fn borrow_local_inline_done() { } yield(); }; - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn borrow_local() { @@ -43,7 +43,7 @@ fn borrow_local() { println!("{}", b); } }; - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn main() { } diff --git a/src/test/ui/generator/yield-while-ref-reborrowed.rs b/src/test/ui/generator/yield-while-ref-reborrowed.rs index f54a4f468f6..a03ef945dd2 100644 --- a/src/test/ui/generator/yield-while-ref-reborrowed.rs +++ b/src/test/ui/generator/yield-while-ref-reborrowed.rs @@ -12,7 +12,7 @@ fn reborrow_shared_ref(x: &i32) { yield(); println!("{}", a); }; - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn reborrow_mutable_ref(x: &mut i32) { @@ -23,7 +23,7 @@ fn reborrow_mutable_ref(x: &mut i32) { yield(); println!("{}", a); }; - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn reborrow_mutable_ref_2(x: &mut i32) { @@ -34,7 +34,7 @@ fn reborrow_mutable_ref_2(x: &mut i32) { println!("{}", a); }; println!("{}", x); //~ ERROR - Pin::new(&mut b).resume(); + Pin::new(&mut b).resume(()); } fn main() { } diff --git a/src/test/ui/generator/yield-while-ref-reborrowed.stderr b/src/test/ui/generator/yield-while-ref-reborrowed.stderr index 4c37cd35173..fd885660d09 100644 --- a/src/test/ui/generator/yield-while-ref-reborrowed.stderr +++ b/src/test/ui/generator/yield-while-ref-reborrowed.stderr @@ -8,7 +8,7 @@ LL | let a = &mut *x; ... LL | println!("{}", x); | ^ second borrow occurs here -LL | Pin::new(&mut b).resume(); +LL | Pin::new(&mut b).resume(()); | ------ first borrow later used here error: aborting due to previous error diff --git a/src/test/ui/nll/issue-55850.rs b/src/test/ui/nll/issue-55850.rs index a8f7299f899..e6279bd028e 100644 --- a/src/test/ui/nll/issue-55850.rs +++ b/src/test/ui/nll/issue-55850.rs @@ -15,7 +15,7 @@ where type Item = G::Yield; fn next(&mut self) -> Option { - match Pin::new(&mut self.0).resume() { + match Pin::new(&mut self.0).resume(()) { Yielded(y) => Some(y), _ => None }