diff options
| author | Andrew Zhogin <andrew.zhogin@gmail.com> | 2025-07-01 23:54:52 +0700 |
|---|---|---|
| committer | Andrew Zhogin <andrew.zhogin@gmail.com> | 2025-09-01 13:45:00 +0700 |
| commit | c2c58cbc65343f1a227885c7a5893f3e6d616e82 (patch) | |
| tree | f24ab9f20f6f7a2beba266cc4e541db98cc2cc8f /compiler/rustc_monomorphize/src | |
| parent | 922958cffe059e9c156835df19d199ccd861c36a (diff) | |
| download | rust-c2c58cbc65343f1a227885c7a5893f3e6d616e82.tar.gz rust-c2c58cbc65343f1a227885c7a5893f3e6d616e82.zip | |
pub async fn implementation coroutine (func::{closure#0}) is monomorphized, when func itself is monomorphized
Diffstat (limited to 'compiler/rustc_monomorphize/src')
| -rw-r--r-- | compiler/rustc_monomorphize/src/collector.rs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/compiler/rustc_monomorphize/src/collector.rs b/compiler/rustc_monomorphize/src/collector.rs index 6a836442c32..cffeb6f9807 100644 --- a/compiler/rustc_monomorphize/src/collector.rs +++ b/compiler/rustc_monomorphize/src/collector.rs @@ -1535,7 +1535,20 @@ impl<'v> RootCollector<'_, 'v> { fn process_nested_body(&mut self, def_id: LocalDefId) { match self.tcx.def_kind(def_id) { DefKind::Closure => { - if self.strategy == MonoItemCollectionStrategy::Eager + // for 'pub async fn foo(..)' also trying to monomorphize foo::{closure} + let is_pub_fn_coroutine = + match *self.tcx.type_of(def_id).instantiate_identity().kind() { + ty::Coroutine(cor_id, _args) => { + let tcx = self.tcx; + let parent_id = tcx.parent(cor_id); + tcx.def_kind(parent_id) == DefKind::Fn + && tcx.asyncness(parent_id).is_async() + && tcx.visibility(parent_id).is_public() + } + ty::Closure(..) | ty::CoroutineClosure(..) => false, + _ => unreachable!(), + }; + if (self.strategy == MonoItemCollectionStrategy::Eager || is_pub_fn_coroutine) && !self .tcx .generics_of(self.tcx.typeck_root_def_id(def_id.to_def_id())) |
