Rollup merge of #120897 - compiler-errors:foreign-async-closure, r=oli-obk
Encode `coroutine_for_closure` for foreign crates Async closures (and "coroutine closures" in general) need to have their child coroutine encoded. This PR does that. r? oli-obk
This commit is contained in:
commit
aeafbbeded
@ -250,6 +250,7 @@ fn into_args(self) -> (DefId, SimplifiedType) {
|
|||||||
asyncness => { table_direct }
|
asyncness => { table_direct }
|
||||||
fn_arg_names => { table }
|
fn_arg_names => { table }
|
||||||
coroutine_kind => { table_direct }
|
coroutine_kind => { table_direct }
|
||||||
|
coroutine_for_closure => { table }
|
||||||
trait_def => { table }
|
trait_def => { table }
|
||||||
deduced_param_attrs => { table }
|
deduced_param_attrs => { table }
|
||||||
is_type_alias_impl_trait => {
|
is_type_alias_impl_trait => {
|
||||||
|
@ -1447,6 +1447,13 @@ fn encode_def_ids(&mut self) {
|
|||||||
{
|
{
|
||||||
self.tables.coroutine_kind.set(def_id.index, Some(coroutine_kind))
|
self.tables.coroutine_kind.set(def_id.index, Some(coroutine_kind))
|
||||||
}
|
}
|
||||||
|
if def_kind == DefKind::Closure
|
||||||
|
&& tcx.type_of(def_id).skip_binder().is_coroutine_closure()
|
||||||
|
{
|
||||||
|
self.tables
|
||||||
|
.coroutine_for_closure
|
||||||
|
.set_some(def_id.index, self.tcx.coroutine_for_closure(def_id).into());
|
||||||
|
}
|
||||||
if let DefKind::Enum | DefKind::Struct | DefKind::Union = def_kind {
|
if let DefKind::Enum | DefKind::Struct | DefKind::Union = def_kind {
|
||||||
self.encode_info_for_adt(local_id);
|
self.encode_info_for_adt(local_id);
|
||||||
}
|
}
|
||||||
|
@ -443,6 +443,7 @@ fn encode(&self, buf: &mut FileEncoder) -> LazyTables {
|
|||||||
asyncness: Table<DefIndex, ty::Asyncness>,
|
asyncness: Table<DefIndex, ty::Asyncness>,
|
||||||
fn_arg_names: Table<DefIndex, LazyArray<Ident>>,
|
fn_arg_names: Table<DefIndex, LazyArray<Ident>>,
|
||||||
coroutine_kind: Table<DefIndex, hir::CoroutineKind>,
|
coroutine_kind: Table<DefIndex, hir::CoroutineKind>,
|
||||||
|
coroutine_for_closure: Table<DefIndex, RawDefId>,
|
||||||
trait_def: Table<DefIndex, LazyValue<ty::TraitDef>>,
|
trait_def: Table<DefIndex, LazyValue<ty::TraitDef>>,
|
||||||
trait_item_def_id: Table<DefIndex, RawDefId>,
|
trait_item_def_id: Table<DefIndex, RawDefId>,
|
||||||
expn_that_defined: Table<DefIndex, LazyValue<ExpnId>>,
|
expn_that_defined: Table<DefIndex, LazyValue<ExpnId>>,
|
||||||
|
7
tests/ui/async-await/async-closures/auxiliary/foreign.rs
Normal file
7
tests/ui/async-await/async-closures/auxiliary/foreign.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
// edition:2021
|
||||||
|
|
||||||
|
#![feature(async_closure)]
|
||||||
|
|
||||||
|
pub fn closure() -> impl async Fn() {
|
||||||
|
async || { /* Don't really need to do anything here. */ }
|
||||||
|
}
|
19
tests/ui/async-await/async-closures/foreign.rs
Normal file
19
tests/ui/async-await/async-closures/foreign.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// aux-build:block-on.rs
|
||||||
|
// aux-build:foreign.rs
|
||||||
|
// edition:2021
|
||||||
|
// build-pass
|
||||||
|
|
||||||
|
#![feature(async_closure)]
|
||||||
|
|
||||||
|
use std::future::Future;
|
||||||
|
|
||||||
|
extern crate block_on;
|
||||||
|
extern crate foreign;
|
||||||
|
|
||||||
|
struct NoCopy;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
block_on::block_on(async {
|
||||||
|
foreign::closure()().await;
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user