diff options
| author | Michael Goulet <michael@errs.io> | 2024-12-30 18:59:49 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-12-31 00:46:46 +0000 |
| commit | ed9a4cfdeb0c81f26c7f6d8b8e56e36aa23cf420 (patch) | |
| tree | 4059788a58abc54d1f29aae373fb42dbc7c6ea1e /compiler/rustc_trait_selection/src | |
| parent | 93722f7ed56bcf27839a6355074095c4320b7d37 (diff) | |
| download | rust-ed9a4cfdeb0c81f26c7f6d8b8e56e36aa23cf420.tar.gz rust-ed9a4cfdeb0c81f26c7f6d8b8e56e36aa23cf420.zip | |
Make sure we check the future type is Sized in AsyncFn*
Diffstat (limited to 'compiler/rustc_trait_selection/src')
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/select/confirmation.rs | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 962b6b94fa6..3619d16cde2 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -896,6 +896,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { sig.tupled_inputs_ty, ]) }); + + // Note that unlike below, we don't need to check `Future + Sized` for + // the output coroutine because they are `Future + Sized` by construction. + (trait_ref, args.kind_ty()) } ty::FnDef(..) | ty::FnPtr(..) => { @@ -907,7 +911,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ]) }); - // We must additionally check that the return type impls `Future`. + // We must additionally check that the return type impls `Future + Sized`. let future_trait_def_id = tcx.require_lang_item(LangItem::Future, None); nested.push(obligation.with( tcx, @@ -915,6 +919,13 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ty::TraitRef::new(tcx, future_trait_def_id, [output_ty]) }), )); + let sized_trait_def_id = tcx.require_lang_item(LangItem::Sized, None); + nested.push(obligation.with( + tcx, + sig.output().map_bound(|output_ty| { + ty::TraitRef::new(tcx, sized_trait_def_id, [output_ty]) + }), + )); (trait_ref, Ty::from_closure_kind(tcx, ty::ClosureKind::Fn)) } @@ -928,14 +939,20 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { ]) }); - // We must additionally check that the return type impls `Future`. - // See FIXME in last branch for why we instantiate the binder eagerly. + // We must additionally check that the return type impls `Future + Sized`. let future_trait_def_id = tcx.require_lang_item(LangItem::Future, None); let placeholder_output_ty = self.infcx.enter_forall_and_leak_universe(sig.output()); nested.push(obligation.with( tcx, ty::TraitRef::new(tcx, future_trait_def_id, [placeholder_output_ty]), )); + let sized_trait_def_id = tcx.require_lang_item(LangItem::Sized, None); + nested.push(obligation.with( + tcx, + sig.output().map_bound(|output_ty| { + ty::TraitRef::new(tcx, sized_trait_def_id, [output_ty]) + }), + )); (trait_ref, args.kind_ty()) } |
