From a77bf4b5bfaf1a705977ad6d9fa81d4c910d3e69 Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Fri, 12 Dec 2025 17:22:39 +0300 Subject: [PATCH 1/8] WIP on recursive delegations --- compiler/rustc_ast_lowering/src/delegation.rs | 62 +++++++++++++------ compiler/rustc_middle/src/ty/mod.rs | 6 ++ compiler/rustc_resolve/src/late.rs | 27 ++++++-- compiler/rustc_resolve/src/lib.rs | 6 +- 4 files changed, 76 insertions(+), 25 deletions(-) diff --git a/compiler/rustc_ast_lowering/src/delegation.rs b/compiler/rustc_ast_lowering/src/delegation.rs index 82bade8829a2f..5e3c1ea0bf549 100644 --- a/compiler/rustc_ast_lowering/src/delegation.rs +++ b/compiler/rustc_ast_lowering/src/delegation.rs @@ -44,6 +44,7 @@ use hir::{BodyId, HirId}; use rustc_abi::ExternAbi; use rustc_ast::*; use rustc_attr_parsing::{AttributeParser, ShouldEmit}; +use rustc_data_structures::fx::FxHashSet; use rustc_errors::ErrorGuaranteed; use rustc_hir::Target; use rustc_hir::attrs::{AttributeKind, InlineAttr}; @@ -119,10 +120,19 @@ impl<'hir> LoweringContext<'_, 'hir> { &mut self, delegation: &Delegation, item_id: NodeId, - is_in_trait_impl: bool, + _is_in_trait_impl: bool, ) -> DelegationResults<'hir> { let span = self.lower_span(delegation.path.segments.last().unwrap().ident.span); - let sig_id = self.get_delegation_sig_id(item_id, delegation.id, span, is_in_trait_impl); + + let sig_id = self.get_resolution_id( + self.resolver + .delegation_resolution_info + .get(&self.local_def_id(item_id)) + .unwrap() + .resolution_id, + span, + ); + match sig_id { Ok(sig_id) => { self.add_attributes_if_needed(span, sig_id); @@ -236,26 +246,42 @@ impl<'hir> LoweringContext<'_, 'hir> { } } - fn get_delegation_sig_id( - &self, - item_id: NodeId, - path_id: NodeId, - span: Span, - is_in_trait_impl: bool, - ) -> Result { - let sig_id = if is_in_trait_impl { item_id } else { path_id }; - self.get_resolution_id(sig_id, span) - } - - fn get_resolution_id(&self, node_id: NodeId, span: Span) -> Result { - let def_id = - self.resolver.get_partial_res(node_id).and_then(|r| r.expect_full_res().opt_def_id()); - def_id.ok_or_else(|| { + fn get_resolution_id(&self, mut node_id: NodeId, span: Span) -> Result { + let create_error = |node_id: NodeId| { self.tcx.dcx().span_delayed_bug( span, format!("LoweringContext: couldn't resolve node {:?} in delegation item", node_id), ) - }) + }; + + let mut processed: FxHashSet = Default::default(); + + loop { + processed.insert(node_id); + + let def_id = self + .resolver + .get_partial_res(node_id) + .and_then(|r| r.expect_full_res().opt_def_id()); + + if let Some(def_id) = def_id + && let Some(local_id) = def_id.as_local() + && !self.resolver.delegation_fn_sigs.contains_key(&local_id) + { + if let Some(info) = self.resolver.delegation_resolution_info.get(&local_id) { + node_id = info.resolution_id; + if processed.contains(&node_id) { + return Err(create_error(node_id)); + } + + continue; + } else { + return Err(create_error(node_id)); + } + } + + return def_id.ok_or_else(|| create_error(node_id)); + } } fn lower_delegation_generics(&mut self, span: Span) -> &'hir hir::Generics<'hir> { diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index b91176e3d4862..2b1393d9e499c 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -220,6 +220,7 @@ pub struct ResolverAstLowering { /// Information about functions signatures for delegation items expansion pub delegation_fn_sigs: LocalDefIdMap, + pub delegation_resolution_info: LocalDefIdMap, } bitflags::bitflags! { @@ -242,6 +243,11 @@ pub struct DelegationFnSig { pub to_inherit_attrs: AttrVec, } +#[derive(Debug)] +pub struct DelegationResolutionInfo { + pub resolution_id: ast::NodeId, +} + #[derive(Clone, Copy, Debug, HashStable)] pub struct MainDefinition { pub res: Res, diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 5a4fbad6aaf88..4a4e77c64a24a 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -31,6 +31,7 @@ use rustc_middle::middle::resolve_bound_vars::Set1; use rustc_middle::ty::{ AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs, Visibility, }; +use rustc_middle::ty::{AssocTag, DelegationFnSig, DelegationResolutionInfo, Visibility}; use rustc_middle::{bug, span_bug}; use rustc_session::config::{CrateType, ResolveDocLinks}; use rustc_session::lint; @@ -2928,7 +2929,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { item.id, LifetimeBinderKind::Function, span, - |this| this.resolve_delegation(delegation), + |this| this.resolve_delegation(delegation, item.id, false), ); } @@ -3257,7 +3258,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { item.id, LifetimeBinderKind::Function, delegation.path.segments.last().unwrap().ident.span, - |this| this.resolve_delegation(delegation), + |this| this.resolve_delegation(delegation, item.id, false), ); } AssocItemKind::Type(box TyAlias { generics, .. }) => self @@ -3550,7 +3551,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { |i, s, c| MethodNotMemberOfTrait(i, s, c), ); - this.resolve_delegation(delegation) + this.resolve_delegation(delegation, item.id, trait_id.is_some()); }, ); } @@ -3699,17 +3700,34 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { }) } - fn resolve_delegation(&mut self, delegation: &'ast Delegation) { + fn resolve_delegation( + &mut self, + delegation: &'ast Delegation, + item_id: NodeId, + is_in_trait_impl: bool, + ) { self.smart_resolve_path( delegation.id, &delegation.qself, &delegation.path, PathSource::Delegation, ); + if let Some(qself) = &delegation.qself { self.visit_ty(&qself.ty); } + self.visit_path(&delegation.path); + + if let Some(def_id) = self.r.opt_local_def_id(item_id) { + self.r.delegation_resolution_info.insert( + def_id, + DelegationResolutionInfo { + resolution_id: if is_in_trait_impl { item_id } else { delegation.id }, + }, + ); + } + let Some(body) = &delegation.body else { return }; self.with_rib(ValueNS, RibKind::FnOrCoroutine, |this| { let span = delegation.path.segments.last().unwrap().ident.span; @@ -4294,7 +4312,6 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { ); } - #[instrument(level = "debug", skip(self))] fn smart_resolve_path_fragment( &mut self, qself: &Option>, diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index b3141406e467e..b7abea650aa13 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -70,8 +70,7 @@ use rustc_middle::middle::privacy::EffectiveVisibilities; use rustc_middle::query::Providers; use rustc_middle::span_bug; use rustc_middle::ty::{ - self, DelegationFnSig, Feed, MainDefinition, RegisteredTools, ResolverAstLowering, - ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility, + self, DelegationFnSig, DelegationResolutionInfo, Feed, MainDefinition, RegisteredTools, ResolverAstLowering, ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility }; use rustc_query_system::ich::StableHashingContext; use rustc_session::config::CrateType; @@ -1276,6 +1275,7 @@ pub struct Resolver<'ra, 'tcx> { /// Amount of lifetime parameters for each item in the crate. item_generics_num_lifetimes: FxHashMap, delegation_fn_sigs: LocalDefIdMap, + delegation_resolution_info: LocalDefIdMap, main_def: Option = None, trait_impls: FxIndexMap>, @@ -1694,6 +1694,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { current_crate_outer_attr_insert_span, mods_with_parse_errors: Default::default(), impl_trait_names: Default::default(), + delegation_resolution_info: Default::default(), .. }; @@ -1822,6 +1823,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { lifetime_elision_allowed: self.lifetime_elision_allowed, lint_buffer: Steal::new(self.lint_buffer), delegation_fn_sigs: self.delegation_fn_sigs, + delegation_resolution_info: self.delegation_resolution_info }; ResolverOutputs { global_ctxt, ast_lowering } } From 6e2eb6ec0f9ee4409c2346b687f871cab143c0ce Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Mon, 15 Dec 2025 14:00:13 +0300 Subject: [PATCH 2/8] WIP on recursive delegation --- compiler/rustc_ast_lowering/messages.ftl | 2 + compiler/rustc_ast_lowering/src/delegation.rs | 73 +++++++++++++------ compiler/rustc_ast_lowering/src/errors.rs | 7 ++ compiler/rustc_ast_lowering/src/item.rs | 6 +- compiler/rustc_middle/src/ty/mod.rs | 2 +- compiler/rustc_resolve/src/late.rs | 5 +- tests/ui/delegation/ice-issue-124347.rs | 4 +- tests/ui/delegation/ice-issue-124347.stderr | 17 ++--- .../ui/delegation/unsupported.current.stderr | 13 +--- tests/ui/delegation/unsupported.next.stderr | 13 +--- tests/ui/delegation/unsupported.rs | 1 - 11 files changed, 80 insertions(+), 63 deletions(-) diff --git a/compiler/rustc_ast_lowering/messages.ftl b/compiler/rustc_ast_lowering/messages.ftl index 370b15d2871a9..8473a2532e364 100644 --- a/compiler/rustc_ast_lowering/messages.ftl +++ b/compiler/rustc_ast_lowering/messages.ftl @@ -186,3 +186,5 @@ ast_lowering_yield = yield syntax is experimental ast_lowering_yield_in_closure = `yield` can only be used in `#[coroutine]` closures, or `gen` blocks .suggestion = use `#[coroutine]` to make this closure a coroutine + +ast_lowering_unresolved_delegation_callee = failed to resolve delegation callee diff --git a/compiler/rustc_ast_lowering/src/delegation.rs b/compiler/rustc_ast_lowering/src/delegation.rs index 5e3c1ea0bf549..6280c55284a4e 100644 --- a/compiler/rustc_ast_lowering/src/delegation.rs +++ b/compiler/rustc_ast_lowering/src/delegation.rs @@ -56,6 +56,7 @@ use rustc_span::{DUMMY_SP, Ident, Span, Symbol}; use {rustc_ast as ast, rustc_hir as hir}; use super::{GenericArgsMode, ImplTraitContext, LoweringContext, ParamMode}; +use crate::errors::UnresolvedDelegationCallee; use crate::{AllowReturnTypeNotation, ImplTraitPosition, ResolverAstLoweringExt}; pub(crate) struct DelegationResults<'hir> { @@ -120,16 +121,15 @@ impl<'hir> LoweringContext<'_, 'hir> { &mut self, delegation: &Delegation, item_id: NodeId, - _is_in_trait_impl: bool, ) -> DelegationResults<'hir> { let span = self.lower_span(delegation.path.segments.last().unwrap().ident.span); - let sig_id = self.get_resolution_id( + let sig_id = self.resolve_callee_sig( self.resolver .delegation_resolution_info .get(&self.local_def_id(item_id)) .unwrap() - .resolution_id, + .sig_resolution_id, span, ); @@ -246,44 +246,73 @@ impl<'hir> LoweringContext<'_, 'hir> { } } - fn get_resolution_id(&self, mut node_id: NodeId, span: Span) -> Result { - let create_error = |node_id: NodeId| { - self.tcx.dcx().span_delayed_bug( - span, - format!("LoweringContext: couldn't resolve node {:?} in delegation item", node_id), - ) - }; - - let mut processed: FxHashSet = Default::default(); + fn resolve_callee_sig( + &self, + mut node_id: NodeId, + span: Span, + ) -> Result { + let mut visited: FxHashSet = Default::default(); loop { - processed.insert(node_id); + visited.insert(node_id); - let def_id = self - .resolver - .get_partial_res(node_id) - .and_then(|r| r.expect_full_res().opt_def_id()); + let def_id = self.opt_get_partial_res_id(node_id); + // If def_id is in local crate and there is no signature in delegation_fn_sigs + // it means that we refer to another delegation as a callee, so in order to obtain + // a signature DefId we obtain NodeId of the callee delegation and try to get signature from it. if let Some(def_id) = def_id && let Some(local_id) = def_id.as_local() && !self.resolver.delegation_fn_sigs.contains_key(&local_id) { if let Some(info) = self.resolver.delegation_resolution_info.get(&local_id) { - node_id = info.resolution_id; - if processed.contains(&node_id) { - return Err(create_error(node_id)); + node_id = info.sig_resolution_id; + if visited.contains(&node_id) { + // We encountered a cycle in the resolution, or delegation callee refers to non-existent + // entity, in this case emit an error. + return Err(self.dcx().emit_err(UnresolvedDelegationCallee { span })); } continue; } else { - return Err(create_error(node_id)); + // The LocalDefId for some reason refers not to another delegation, in this case + // we will emit a bug (not an error), as we have to catch such cases on the resolve stage, + // during smart_resolve_path in resolve_delegation. + return Err(self.tcx.dcx().span_delayed_bug(span, format!( + "There is no information about delegation resolution node id for LocalDefId {:?}", + local_id + ))); } } - return def_id.ok_or_else(|| create_error(node_id)); + // Def id is either None or is from non-local crate, fallback to the original routine. + return self.def_id_or_guaranteed_err(def_id, node_id, span); } } + fn opt_get_partial_res_id(&self, node_id: NodeId) -> Option { + self.resolver.get_partial_res(node_id).and_then(|r| r.expect_full_res().opt_def_id()) + } + + fn def_id_or_guaranteed_err( + &self, + def_id: Option, + node_id: NodeId, + span: Span, + ) -> Result { + def_id.ok_or_else(|| { + self.tcx.dcx().span_delayed_bug( + span, + format!("LoweringContext: couldn't resolve node {:?} in delegation item", node_id), + ) + }) + } + + fn get_resolution_id(&mut self, node_id: NodeId, span: Span) -> Result { + let def_id = self.opt_get_partial_res_id(node_id); + self.def_id_or_guaranteed_err(def_id, node_id, span) + } + fn lower_delegation_generics(&mut self, span: Span) -> &'hir hir::Generics<'hir> { self.arena.alloc(hir::Generics { params: &[], diff --git a/compiler/rustc_ast_lowering/src/errors.rs b/compiler/rustc_ast_lowering/src/errors.rs index 83f3a976e83f7..9072bf4f35adf 100644 --- a/compiler/rustc_ast_lowering/src/errors.rs +++ b/compiler/rustc_ast_lowering/src/errors.rs @@ -475,3 +475,10 @@ pub(crate) struct UnionWithDefault { #[primary_span] pub span: Span, } + +#[derive(Diagnostic)] +#[diag(ast_lowering_unresolved_delegation_callee)] +pub(crate) struct UnresolvedDelegationCallee { + #[primary_span] + pub span: Span, +} diff --git a/compiler/rustc_ast_lowering/src/item.rs b/compiler/rustc_ast_lowering/src/item.rs index a68d63bf1464c..bfce7c25b75db 100644 --- a/compiler/rustc_ast_lowering/src/item.rs +++ b/compiler/rustc_ast_lowering/src/item.rs @@ -541,7 +541,7 @@ impl<'hir> LoweringContext<'_, 'hir> { hir::ItemKind::Macro(ident, macro_def, macro_kinds) } ItemKind::Delegation(box delegation) => { - let delegation_results = self.lower_delegation(delegation, id, false); + let delegation_results = self.lower_delegation(delegation, id); hir::ItemKind::Fn { sig: delegation_results.sig, ident: delegation_results.ident, @@ -1026,7 +1026,7 @@ impl<'hir> LoweringContext<'_, 'hir> { (*ident, generics, kind, ty.is_some()) } AssocItemKind::Delegation(box delegation) => { - let delegation_results = self.lower_delegation(delegation, i.id, false); + let delegation_results = self.lower_delegation(delegation, i.id); let item_kind = hir::TraitItemKind::Fn( delegation_results.sig, hir::TraitFn::Provided(delegation_results.body_id), @@ -1196,7 +1196,7 @@ impl<'hir> LoweringContext<'_, 'hir> { ) } AssocItemKind::Delegation(box delegation) => { - let delegation_results = self.lower_delegation(delegation, i.id, is_in_trait_impl); + let delegation_results = self.lower_delegation(delegation, i.id); ( delegation.ident, ( diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 2b1393d9e499c..351836a92d682 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -245,7 +245,7 @@ pub struct DelegationFnSig { #[derive(Debug)] pub struct DelegationResolutionInfo { - pub resolution_id: ast::NodeId, + pub sig_resolution_id: ast::NodeId, } #[derive(Clone, Copy, Debug, HashStable)] diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 4a4e77c64a24a..e12e998d66055 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -29,7 +29,8 @@ use rustc_hir::def_id::{CRATE_DEF_ID, DefId, LOCAL_CRATE, LocalDefId}; use rustc_hir::{MissingLifetimeKind, PrimTy, TraitCandidate}; use rustc_middle::middle::resolve_bound_vars::Set1; use rustc_middle::ty::{ - AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs, Visibility, + AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs, + DelegationResolutionInfo, Visibility, }; use rustc_middle::ty::{AssocTag, DelegationFnSig, DelegationResolutionInfo, Visibility}; use rustc_middle::{bug, span_bug}; @@ -3723,7 +3724,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { self.r.delegation_resolution_info.insert( def_id, DelegationResolutionInfo { - resolution_id: if is_in_trait_impl { item_id } else { delegation.id }, + sig_resolution_id: if is_in_trait_impl { item_id } else { delegation.id }, }, ); } diff --git a/tests/ui/delegation/ice-issue-124347.rs b/tests/ui/delegation/ice-issue-124347.rs index 3e0a5b36ddcf3..6bf3a08ba5b49 100644 --- a/tests/ui/delegation/ice-issue-124347.rs +++ b/tests/ui/delegation/ice-issue-124347.rs @@ -1,12 +1,12 @@ #![feature(fn_delegation)] #![allow(incomplete_features)] -// FIXME(fn_delegation): `recursive delegation` error should be emitted here trait Trait { reuse Trait::foo { &self.0 } + //~^ ERROR failed to resolve delegation callee } reuse foo; -//~^ ERROR cycle detected when computing generics of `foo` +//~^ ERROR failed to resolve delegation callee fn main() {} diff --git a/tests/ui/delegation/ice-issue-124347.stderr b/tests/ui/delegation/ice-issue-124347.stderr index 2955c04420348..40be6be4abfa1 100644 --- a/tests/ui/delegation/ice-issue-124347.stderr +++ b/tests/ui/delegation/ice-issue-124347.stderr @@ -1,17 +1,14 @@ -error[E0391]: cycle detected when computing generics of `foo` - --> $DIR/ice-issue-124347.rs:9:7 +error: failed to resolve delegation callee + --> $DIR/ice-issue-124347.rs:5:18 | -LL | reuse foo; - | ^^^ - | - = note: ...which immediately requires computing generics of `foo` again -note: cycle used when checking that `foo` is well-formed +LL | reuse Trait::foo { &self.0 } + | ^^^ + +error: failed to resolve delegation callee --> $DIR/ice-issue-124347.rs:9:7 | LL | reuse foo; | ^^^ - = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information -error: aborting due to 1 previous error +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0391`. diff --git a/tests/ui/delegation/unsupported.current.stderr b/tests/ui/delegation/unsupported.current.stderr index 5c4115630c002..2bb0633621f21 100644 --- a/tests/ui/delegation/unsupported.current.stderr +++ b/tests/ui/delegation/unsupported.current.stderr @@ -36,24 +36,15 @@ LL | reuse ToReuse::opaque_ret; | ^^^^^^^^^^ = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information -error: recursive delegation is not supported yet - --> $DIR/unsupported.rs:46:22 - | -LL | pub reuse to_reuse2::foo; - | --- callee defined here -... -LL | reuse to_reuse1::foo; - | ^^^ - error[E0283]: type annotations needed - --> $DIR/unsupported.rs:55:18 + --> $DIR/unsupported.rs:54:18 | LL | reuse Trait::foo; | ^^^ cannot infer type | = note: cannot satisfy `_: effects::Trait` -error: aborting due to 4 previous errors +error: aborting due to 3 previous errors Some errors have detailed explanations: E0283, E0391. For more information about an error, try `rustc --explain E0283`. diff --git a/tests/ui/delegation/unsupported.next.stderr b/tests/ui/delegation/unsupported.next.stderr index a626da9a1442c..1665d1f39d6d0 100644 --- a/tests/ui/delegation/unsupported.next.stderr +++ b/tests/ui/delegation/unsupported.next.stderr @@ -28,24 +28,15 @@ LL | reuse ToReuse::opaque_ret; = note: cycle used when computing implied outlives bounds for `::opaque_ret::{anon_assoc#0}` (hack disabled = false) = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information -error: recursive delegation is not supported yet - --> $DIR/unsupported.rs:46:22 - | -LL | pub reuse to_reuse2::foo; - | --- callee defined here -... -LL | reuse to_reuse1::foo; - | ^^^ - error[E0283]: type annotations needed - --> $DIR/unsupported.rs:55:18 + --> $DIR/unsupported.rs:54:18 | LL | reuse Trait::foo; | ^^^ cannot infer type | = note: cannot satisfy `_: effects::Trait` -error: aborting due to 4 previous errors +error: aborting due to 3 previous errors Some errors have detailed explanations: E0283, E0391. For more information about an error, try `rustc --explain E0283`. diff --git a/tests/ui/delegation/unsupported.rs b/tests/ui/delegation/unsupported.rs index 5e2bd832a4d84..1681888e34ea6 100644 --- a/tests/ui/delegation/unsupported.rs +++ b/tests/ui/delegation/unsupported.rs @@ -44,7 +44,6 @@ mod recursive { } reuse to_reuse1::foo; - //~^ ERROR recursive delegation is not supported yet } mod effects { From 119a8df041e01f2c9621519a642e8ff5929a419c Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Mon, 15 Dec 2025 14:24:40 +0300 Subject: [PATCH 3/8] WIP --- compiler/rustc_resolve/src/late.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index e12e998d66055..bb3bffc15d026 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -32,7 +32,6 @@ use rustc_middle::ty::{ AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs, DelegationResolutionInfo, Visibility, }; -use rustc_middle::ty::{AssocTag, DelegationFnSig, DelegationResolutionInfo, Visibility}; use rustc_middle::{bug, span_bug}; use rustc_session::config::{CrateType, ResolveDocLinks}; use rustc_session::lint; From 297735feaff4308e2ec3f3f30e491cc908ba6268 Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Mon, 15 Dec 2025 16:18:23 +0300 Subject: [PATCH 4/8] Add tests --- compiler/rustc_ast_lowering/src/delegation.rs | 2 +- .../auxiliary/recursive-delegation-aux.rs | 9 +++ .../delegation/recursive_delegation_errors.rs | 44 ++++++++++++ .../recursive_delegation_errors.stderr | 68 +++++++++++++++++++ .../delegation/recursive_delegation_pass.rs | 53 +++++++++++++++ 5 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 tests/ui/delegation/auxiliary/recursive-delegation-aux.rs create mode 100644 tests/ui/delegation/recursive_delegation_errors.rs create mode 100644 tests/ui/delegation/recursive_delegation_errors.stderr create mode 100644 tests/ui/delegation/recursive_delegation_pass.rs diff --git a/compiler/rustc_ast_lowering/src/delegation.rs b/compiler/rustc_ast_lowering/src/delegation.rs index 6280c55284a4e..9815c3ad3b37d 100644 --- a/compiler/rustc_ast_lowering/src/delegation.rs +++ b/compiler/rustc_ast_lowering/src/delegation.rs @@ -285,7 +285,7 @@ impl<'hir> LoweringContext<'_, 'hir> { } } - // Def id is either None or is from non-local crate, fallback to the original routine. + // DefId is either None or is from non-local crate, fallback to the original routine. return self.def_id_or_guaranteed_err(def_id, node_id, span); } } diff --git a/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs b/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs new file mode 100644 index 0000000000000..66889b31e4c3a --- /dev/null +++ b/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs @@ -0,0 +1,9 @@ +#![feature(fn_delegation)] +#![allow(incomplete_features)] + +fn foo() { + +} + +reuse foo as bar; +pub reuse bar as goo; \ No newline at end of file diff --git a/tests/ui/delegation/recursive_delegation_errors.rs b/tests/ui/delegation/recursive_delegation_errors.rs new file mode 100644 index 0000000000000..61a8d594e4503 --- /dev/null +++ b/tests/ui/delegation/recursive_delegation_errors.rs @@ -0,0 +1,44 @@ +#![feature(fn_delegation)] +#![allow(incomplete_features)] +#![allow(dead_code)] +#![allow(unused_variables)] + + +mod first_mod { + reuse foo; + //~^ ERROR failed to resolve delegation callee +} + +mod second_mod { + reuse foo as bar; + //~^ ERROR failed to resolve delegation callee + reuse bar as foo; + //~^ ERROR failed to resolve delegation callee + +} + +mod third_mod { + reuse foo as foo1; + //~^ ERROR failed to resolve delegation callee + reuse foo1 as foo2; + //~^ ERROR failed to resolve delegation callee + reuse foo2 as foo3; + //~^ ERROR failed to resolve delegation callee + reuse foo3 as foo4; + //~^ ERROR failed to resolve delegation callee + reuse foo4 as foo5; + //~^ ERROR failed to resolve delegation callee + reuse foo5 as foo; + //~^ ERROR failed to resolve delegation callee +} + +mod fourth_mod { + trait Trait { + reuse Trait::foo as bar; + //~^ ERROR failed to resolve delegation callee + reuse Trait::bar as foo; + //~^ ERROR failed to resolve delegation callee + } +} + +fn main() {} diff --git a/tests/ui/delegation/recursive_delegation_errors.stderr b/tests/ui/delegation/recursive_delegation_errors.stderr new file mode 100644 index 0000000000000..bff9068690ce7 --- /dev/null +++ b/tests/ui/delegation/recursive_delegation_errors.stderr @@ -0,0 +1,68 @@ +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:8:11 + | +LL | reuse foo; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:13:11 + | +LL | reuse foo as bar; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:15:11 + | +LL | reuse bar as foo; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:21:11 + | +LL | reuse foo as foo1; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:23:11 + | +LL | reuse foo1 as foo2; + | ^^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:25:11 + | +LL | reuse foo2 as foo3; + | ^^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:27:11 + | +LL | reuse foo3 as foo4; + | ^^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:29:11 + | +LL | reuse foo4 as foo5; + | ^^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:31:11 + | +LL | reuse foo5 as foo; + | ^^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:37:22 + | +LL | reuse Trait::foo as bar; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:39:22 + | +LL | reuse Trait::bar as foo; + | ^^^ + +error: aborting due to 11 previous errors + diff --git a/tests/ui/delegation/recursive_delegation_pass.rs b/tests/ui/delegation/recursive_delegation_pass.rs new file mode 100644 index 0000000000000..4ad9e9b8c201e --- /dev/null +++ b/tests/ui/delegation/recursive_delegation_pass.rs @@ -0,0 +1,53 @@ +//@ run-pass +//@ edition:2018 +//@ aux-crate:recursive_delegation_aux=recursive-delegation-aux.rs + +#![feature(fn_delegation)] +#![allow(incomplete_features)] +#![allow(dead_code)] +#![allow(unused_variables)] + +extern crate recursive_delegation_aux; + +mod first_mod { + pub mod to_reuse { + pub fn foo(x: usize) -> usize { + x + 1 + } + } + + reuse to_reuse::foo; + reuse foo as bar; + reuse foo as bar1; + reuse bar as goo; + reuse goo as koo; + reuse koo as too; +} + +mod second_mod { + trait T { + fn foo(&self); + reuse T::foo as bar; + reuse T::bar as goo; + reuse T::goo as poo; + } +} + +mod third_mod { + reuse crate::first_mod::to_reuse::foo { + reuse foo as bar { + reuse bar as goo { + bar(123) + } + + goo(123) + }(123) + } +} + +mod fourth_mod { + reuse recursive_delegation_aux::goo as bar; + reuse bar as foo; +} + +fn main() {} From bda2e5c10521f6c540c5e369313455a0f9dffa6c Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Mon, 15 Dec 2025 17:57:15 +0300 Subject: [PATCH 5/8] Some fixes + reformat --- compiler/rustc_ast_lowering/messages.ftl | 3 +- compiler/rustc_ast_lowering/src/delegation.rs | 59 +++++++++---------- compiler/rustc_hir_analysis/src/delegation.rs | 6 -- compiler/rustc_resolve/src/lib.rs | 5 +- .../auxiliary/recursive-delegation-aux.rs | 2 +- .../delegation/recursive_delegation_errors.rs | 13 ++++ .../recursive_delegation_errors.stderr | 32 +++++++++- .../delegation/recursive_delegation_pass.rs | 29 +++++++-- 8 files changed, 101 insertions(+), 48 deletions(-) diff --git a/compiler/rustc_ast_lowering/messages.ftl b/compiler/rustc_ast_lowering/messages.ftl index 8473a2532e364..ac0f87bd3c676 100644 --- a/compiler/rustc_ast_lowering/messages.ftl +++ b/compiler/rustc_ast_lowering/messages.ftl @@ -175,6 +175,7 @@ ast_lowering_underscore_expr_lhs_assign = ast_lowering_union_default_field_values = unions cannot have default field values +ast_lowering_unresolved_delegation_callee = failed to resolve delegation callee ast_lowering_unstable_inline_assembly = inline assembly is not stable yet on this architecture ast_lowering_unstable_inline_assembly_label_operand_with_outputs = using both label and output operands for inline assembly is unstable @@ -186,5 +187,3 @@ ast_lowering_yield = yield syntax is experimental ast_lowering_yield_in_closure = `yield` can only be used in `#[coroutine]` closures, or `gen` blocks .suggestion = use `#[coroutine]` to make this closure a coroutine - -ast_lowering_unresolved_delegation_callee = failed to resolve delegation callee diff --git a/compiler/rustc_ast_lowering/src/delegation.rs b/compiler/rustc_ast_lowering/src/delegation.rs index 9815c3ad3b37d..551e6c8edf3f7 100644 --- a/compiler/rustc_ast_lowering/src/delegation.rs +++ b/compiler/rustc_ast_lowering/src/delegation.rs @@ -48,9 +48,11 @@ use rustc_data_structures::fx::FxHashSet; use rustc_errors::ErrorGuaranteed; use rustc_hir::Target; use rustc_hir::attrs::{AttributeKind, InlineAttr}; -use rustc_hir::def_id::DefId; +use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_middle::span_bug; -use rustc_middle::ty::{Asyncness, DelegationFnSigAttrs, ResolverAstLowering}; +use rustc_middle::ty::{ + Asyncness, DelegationFnSigAttrs, DelegationResolutionInfo, ResolverAstLowering, +}; use rustc_span::symbol::kw; use rustc_span::{DUMMY_SP, Ident, Span, Symbol}; use {rustc_ast as ast, rustc_hir as hir}; @@ -124,14 +126,10 @@ impl<'hir> LoweringContext<'_, 'hir> { ) -> DelegationResults<'hir> { let span = self.lower_span(delegation.path.segments.last().unwrap().ident.span); - let sig_id = self.resolve_callee_sig( - self.resolver - .delegation_resolution_info - .get(&self.local_def_id(item_id)) - .unwrap() - .sig_resolution_id, - span, - ); + let sig_id = self + .delegation_res_info_or_err(&self.local_def_id(item_id), span) + .map(|info| self.get_delegation_sig_id(info.sig_resolution_id, span)) + .flatten(); match sig_id { Ok(sig_id) => { @@ -246,7 +244,7 @@ impl<'hir> LoweringContext<'_, 'hir> { } } - fn resolve_callee_sig( + fn get_delegation_sig_id( &self, mut node_id: NodeId, span: Span, @@ -265,24 +263,14 @@ impl<'hir> LoweringContext<'_, 'hir> { && let Some(local_id) = def_id.as_local() && !self.resolver.delegation_fn_sigs.contains_key(&local_id) { - if let Some(info) = self.resolver.delegation_resolution_info.get(&local_id) { - node_id = info.sig_resolution_id; - if visited.contains(&node_id) { - // We encountered a cycle in the resolution, or delegation callee refers to non-existent - // entity, in this case emit an error. - return Err(self.dcx().emit_err(UnresolvedDelegationCallee { span })); - } - - continue; - } else { - // The LocalDefId for some reason refers not to another delegation, in this case - // we will emit a bug (not an error), as we have to catch such cases on the resolve stage, - // during smart_resolve_path in resolve_delegation. - return Err(self.tcx.dcx().span_delayed_bug(span, format!( - "There is no information about delegation resolution node id for LocalDefId {:?}", - local_id - ))); + node_id = self.delegation_res_info_or_err(&local_id, span)?.sig_resolution_id; + if visited.contains(&node_id) { + // We encountered a cycle in the resolution, or delegation callee refers to non-existent + // entity, in this case emit an error. + return Err(self.dcx().emit_err(UnresolvedDelegationCallee { span })); } + + continue; } // DefId is either None or is from non-local crate, fallback to the original routine. @@ -290,6 +278,19 @@ impl<'hir> LoweringContext<'_, 'hir> { } } + fn delegation_res_info_or_err( + &self, + local_id: &LocalDefId, + span: Span, + ) -> Result<&DelegationResolutionInfo, ErrorGuaranteed> { + self.resolver.delegation_resolution_info.get(local_id).ok_or_else(|| { + self.tcx.dcx().span_delayed_bug(span, format!( + "There is no information about delegation resolution node id for LocalDefId {:?}", + local_id + )) + }) + } + fn opt_get_partial_res_id(&self, node_id: NodeId) -> Option { self.resolver.get_partial_res(node_id).and_then(|r| r.expect_full_res().opt_def_id()) } @@ -326,8 +327,6 @@ impl<'hir> LoweringContext<'_, 'hir> { // Function parameter count, including C variadic `...` if present. fn param_count(&self, sig_id: DefId) -> (usize, bool /*c_variadic*/) { if let Some(local_sig_id) = sig_id.as_local() { - // Map may be filled incorrectly due to recursive delegation. - // Error will be emitted later during HIR ty lowering. match self.resolver.delegation_fn_sigs.get(&local_sig_id) { Some(sig) => (sig.param_count, sig.c_variadic), None => (0, false), diff --git a/compiler/rustc_hir_analysis/src/delegation.rs b/compiler/rustc_hir_analysis/src/delegation.rs index 125fc21a5cc1c..4ab13140bf9c9 100644 --- a/compiler/rustc_hir_analysis/src/delegation.rs +++ b/compiler/rustc_hir_analysis/src/delegation.rs @@ -401,12 +401,6 @@ fn check_constraints<'tcx>( })); }; - if let Some(local_sig_id) = sig_id.as_local() - && tcx.hir_opt_delegation_sig_id(local_sig_id).is_some() - { - emit("recursive delegation is not supported yet"); - } - if tcx.fn_sig(sig_id).skip_binder().skip_binder().c_variadic { // See issue #127443 for explanation. emit("delegation to C-variadic functions is not allowed"); diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index b7abea650aa13..dac8bf4f029b8 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -70,7 +70,8 @@ use rustc_middle::middle::privacy::EffectiveVisibilities; use rustc_middle::query::Providers; use rustc_middle::span_bug; use rustc_middle::ty::{ - self, DelegationFnSig, DelegationResolutionInfo, Feed, MainDefinition, RegisteredTools, ResolverAstLowering, ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility + self, DelegationFnSig, DelegationResolutionInfo, Feed, MainDefinition, RegisteredTools, + ResolverAstLowering, ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility, }; use rustc_query_system::ich::StableHashingContext; use rustc_session::config::CrateType; @@ -1823,7 +1824,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { lifetime_elision_allowed: self.lifetime_elision_allowed, lint_buffer: Steal::new(self.lint_buffer), delegation_fn_sigs: self.delegation_fn_sigs, - delegation_resolution_info: self.delegation_resolution_info + delegation_resolution_info: self.delegation_resolution_info, }; ResolverOutputs { global_ctxt, ast_lowering } } diff --git a/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs b/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs index 66889b31e4c3a..8c94dd089e46f 100644 --- a/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs +++ b/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs @@ -6,4 +6,4 @@ fn foo() { } reuse foo as bar; -pub reuse bar as goo; \ No newline at end of file +pub reuse bar as goo; diff --git a/tests/ui/delegation/recursive_delegation_errors.rs b/tests/ui/delegation/recursive_delegation_errors.rs index 61a8d594e4503..a5949d70a08de 100644 --- a/tests/ui/delegation/recursive_delegation_errors.rs +++ b/tests/ui/delegation/recursive_delegation_errors.rs @@ -41,4 +41,17 @@ mod fourth_mod { } } +mod fifth_mod { + reuse super::fifth_mod::{bar as foo, foo as bar}; + //~^ ERROR failed to resolve delegation callee + //~| ERROR failed to resolve delegation callee + + trait GlobReuse { + reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; + //~^ ERROR failed to resolve delegation callee + //~| ERROR failed to resolve delegation callee + //~| ERROR failed to resolve delegation callee + } +} + fn main() {} diff --git a/tests/ui/delegation/recursive_delegation_errors.stderr b/tests/ui/delegation/recursive_delegation_errors.stderr index bff9068690ce7..434a4cc811a7b 100644 --- a/tests/ui/delegation/recursive_delegation_errors.stderr +++ b/tests/ui/delegation/recursive_delegation_errors.stderr @@ -64,5 +64,35 @@ error: failed to resolve delegation callee LL | reuse Trait::bar as foo; | ^^^ -error: aborting due to 11 previous errors +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:45:30 + | +LL | reuse super::fifth_mod::{bar as foo, foo as bar}; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:45:42 + | +LL | reuse super::fifth_mod::{bar as foo, foo as bar}; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:50:27 + | +LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:50:39 + | +LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; + | ^^^ + +error: failed to resolve delegation callee + --> $DIR/recursive_delegation_errors.rs:50:51 + | +LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; + | ^^^ + +error: aborting due to 16 previous errors diff --git a/tests/ui/delegation/recursive_delegation_pass.rs b/tests/ui/delegation/recursive_delegation_pass.rs index 4ad9e9b8c201e..856c03d1e8e8b 100644 --- a/tests/ui/delegation/recursive_delegation_pass.rs +++ b/tests/ui/delegation/recursive_delegation_pass.rs @@ -16,12 +16,19 @@ mod first_mod { } } - reuse to_reuse::foo; - reuse foo as bar; - reuse foo as bar1; - reuse bar as goo; - reuse goo as koo; - reuse koo as too; + mod single_reuse { + reuse crate::first_mod::to_reuse::foo; + reuse foo as bar; + reuse foo as bar1; + reuse bar as goo; + reuse goo as koo; + reuse koo as too; + } + + mod glob_reuse { + reuse super::to_reuse::{foo as bar, foo as bar1} { self } + reuse super::glob_reuse::{bar as goo, goo as koo, koo as too} { self } + } } mod second_mod { @@ -31,6 +38,16 @@ mod second_mod { reuse T::bar as goo; reuse T::goo as poo; } + + trait TGlob { + fn xd(&self) -> &Self; + fn foo1(&self); + fn foo2(&self); + fn foo3(&self); + fn foo4(&self); + + reuse TGlob::{foo1 as bar1, foo3 as bar3, bar1 as bar11, bar11 as bar111} { self.xd() } + } } mod third_mod { From 05467ca7b6bac4e0c99dbf867db45ee7ae1b11f5 Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Tue, 16 Dec 2025 10:56:22 +0300 Subject: [PATCH 6/8] Address review comments --- compiler/rustc_ast_lowering/messages.ftl | 3 +- compiler/rustc_ast_lowering/src/delegation.rs | 38 +++++++++---------- compiler/rustc_ast_lowering/src/errors.rs | 9 ++++- compiler/rustc_middle/src/ty/mod.rs | 8 +--- compiler/rustc_resolve/src/late.rs | 15 +++----- compiler/rustc_resolve/src/lib.rs | 10 ++--- .../auxiliary/recursive-delegation-aux.rs | 4 +- .../delegation/recursive_delegation_errors.rs | 30 +++++++-------- .../recursive_delegation_errors.stderr | 30 +++++++-------- .../delegation/recursive_delegation_pass.rs | 10 ++--- 10 files changed, 74 insertions(+), 83 deletions(-) diff --git a/compiler/rustc_ast_lowering/messages.ftl b/compiler/rustc_ast_lowering/messages.ftl index ac0f87bd3c676..e1fccead4d21a 100644 --- a/compiler/rustc_ast_lowering/messages.ftl +++ b/compiler/rustc_ast_lowering/messages.ftl @@ -56,6 +56,8 @@ ast_lowering_coroutine_too_many_parameters = ast_lowering_default_field_in_tuple = default fields are not supported in tuple structs .label = default fields are only supported on structs +ast_lowering_delegation_cycle_in_signature_resolution = encountered a cycle during delegation signature resolution +ast_lowering_delegation_unresolved_callee = failed to resolve delegation callee ast_lowering_does_not_support_modifiers = the `{$class_name}` register class does not support template modifiers @@ -175,7 +177,6 @@ ast_lowering_underscore_expr_lhs_assign = ast_lowering_union_default_field_values = unions cannot have default field values -ast_lowering_unresolved_delegation_callee = failed to resolve delegation callee ast_lowering_unstable_inline_assembly = inline assembly is not stable yet on this architecture ast_lowering_unstable_inline_assembly_label_operand_with_outputs = using both label and output operands for inline assembly is unstable diff --git a/compiler/rustc_ast_lowering/src/delegation.rs b/compiler/rustc_ast_lowering/src/delegation.rs index 551e6c8edf3f7..3b8d6d4d098ca 100644 --- a/compiler/rustc_ast_lowering/src/delegation.rs +++ b/compiler/rustc_ast_lowering/src/delegation.rs @@ -50,15 +50,13 @@ use rustc_hir::Target; use rustc_hir::attrs::{AttributeKind, InlineAttr}; use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_middle::span_bug; -use rustc_middle::ty::{ - Asyncness, DelegationFnSigAttrs, DelegationResolutionInfo, ResolverAstLowering, -}; +use rustc_middle::ty::{Asyncness, DelegationFnSigAttrs, ResolverAstLowering}; use rustc_span::symbol::kw; use rustc_span::{DUMMY_SP, Ident, Span, Symbol}; use {rustc_ast as ast, rustc_hir as hir}; use super::{GenericArgsMode, ImplTraitContext, LoweringContext, ParamMode}; -use crate::errors::UnresolvedDelegationCallee; +use crate::errors::{CycleInDelegationSignatureResolution, UnresolvedDelegationCallee}; use crate::{AllowReturnTypeNotation, ImplTraitPosition, ResolverAstLoweringExt}; pub(crate) struct DelegationResults<'hir> { @@ -126,10 +124,10 @@ impl<'hir> LoweringContext<'_, 'hir> { ) -> DelegationResults<'hir> { let span = self.lower_span(delegation.path.segments.last().unwrap().ident.span); - let sig_id = self - .delegation_res_info_or_err(&self.local_def_id(item_id), span) - .map(|info| self.get_delegation_sig_id(info.sig_resolution_id, span)) - .flatten(); + let sig_id = self.get_delegation_sig_id( + self.get_delegation_sig_node_id(&self.local_def_id(item_id)), + span, + ); match sig_id { Ok(sig_id) => { @@ -263,11 +261,14 @@ impl<'hir> LoweringContext<'_, 'hir> { && let Some(local_id) = def_id.as_local() && !self.resolver.delegation_fn_sigs.contains_key(&local_id) { - node_id = self.delegation_res_info_or_err(&local_id, span)?.sig_resolution_id; + node_id = self.get_delegation_sig_node_id(&local_id); if visited.contains(&node_id) { // We encountered a cycle in the resolution, or delegation callee refers to non-existent // entity, in this case emit an error. - return Err(self.dcx().emit_err(UnresolvedDelegationCallee { span })); + return Err(match visited.len() { + 1 => self.dcx().emit_err(UnresolvedDelegationCallee { span }), + _ => self.dcx().emit_err(CycleInDelegationSignatureResolution { span }), + }); } continue; @@ -278,17 +279,12 @@ impl<'hir> LoweringContext<'_, 'hir> { } } - fn delegation_res_info_or_err( - &self, - local_id: &LocalDefId, - span: Span, - ) -> Result<&DelegationResolutionInfo, ErrorGuaranteed> { - self.resolver.delegation_resolution_info.get(local_id).ok_or_else(|| { - self.tcx.dcx().span_delayed_bug(span, format!( - "There is no information about delegation resolution node id for LocalDefId {:?}", - local_id - )) - }) + fn get_delegation_sig_node_id(&self, local_id: &LocalDefId) -> NodeId { + *self + .resolver + .delegation_sig_resolution_nodes + .get(local_id) + .expect("All delegations should have signature resolution NodeId") } fn opt_get_partial_res_id(&self, node_id: NodeId) -> Option { diff --git a/compiler/rustc_ast_lowering/src/errors.rs b/compiler/rustc_ast_lowering/src/errors.rs index 9072bf4f35adf..35c37fe91d494 100644 --- a/compiler/rustc_ast_lowering/src/errors.rs +++ b/compiler/rustc_ast_lowering/src/errors.rs @@ -477,8 +477,15 @@ pub(crate) struct UnionWithDefault { } #[derive(Diagnostic)] -#[diag(ast_lowering_unresolved_delegation_callee)] +#[diag(ast_lowering_delegation_unresolved_callee)] pub(crate) struct UnresolvedDelegationCallee { #[primary_span] pub span: Span, } + +#[derive(Diagnostic)] +#[diag(ast_lowering_delegation_cycle_in_signature_resolution)] +pub(crate) struct CycleInDelegationSignatureResolution { + #[primary_span] + pub span: Span, +} diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 351836a92d682..3171f4fadcffb 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -220,7 +220,8 @@ pub struct ResolverAstLowering { /// Information about functions signatures for delegation items expansion pub delegation_fn_sigs: LocalDefIdMap, - pub delegation_resolution_info: LocalDefIdMap, + // NodeIds for delegation signature resolution + pub delegation_sig_resolution_nodes: LocalDefIdMap, } bitflags::bitflags! { @@ -243,11 +244,6 @@ pub struct DelegationFnSig { pub to_inherit_attrs: AttrVec, } -#[derive(Debug)] -pub struct DelegationResolutionInfo { - pub sig_resolution_id: ast::NodeId, -} - #[derive(Clone, Copy, Debug, HashStable)] pub struct MainDefinition { pub res: Res, diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index bb3bffc15d026..d3428a4af348a 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -29,8 +29,7 @@ use rustc_hir::def_id::{CRATE_DEF_ID, DefId, LOCAL_CRATE, LocalDefId}; use rustc_hir::{MissingLifetimeKind, PrimTy, TraitCandidate}; use rustc_middle::middle::resolve_bound_vars::Set1; use rustc_middle::ty::{ - AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs, - DelegationResolutionInfo, Visibility, + AssocTag, DELEGATION_INHERIT_ATTRS_START, DelegationFnSig, DelegationFnSigAttrs, Visibility, }; use rustc_middle::{bug, span_bug}; use rustc_session::config::{CrateType, ResolveDocLinks}; @@ -3719,14 +3718,10 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { self.visit_path(&delegation.path); - if let Some(def_id) = self.r.opt_local_def_id(item_id) { - self.r.delegation_resolution_info.insert( - def_id, - DelegationResolutionInfo { - sig_resolution_id: if is_in_trait_impl { item_id } else { delegation.id }, - }, - ); - } + self.r.delegation_sig_resolution_nodes.insert( + self.r.local_def_id(item_id), + if is_in_trait_impl { item_id } else { delegation.id }, + ); let Some(body) = &delegation.body else { return }; self.with_rib(ValueNS, RibKind::FnOrCoroutine, |this| { diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index dac8bf4f029b8..646a1b8914133 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -70,8 +70,8 @@ use rustc_middle::middle::privacy::EffectiveVisibilities; use rustc_middle::query::Providers; use rustc_middle::span_bug; use rustc_middle::ty::{ - self, DelegationFnSig, DelegationResolutionInfo, Feed, MainDefinition, RegisteredTools, - ResolverAstLowering, ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility, + self, DelegationFnSig, Feed, MainDefinition, RegisteredTools, ResolverAstLowering, + ResolverGlobalCtxt, TyCtxt, TyCtxtFeed, Visibility, }; use rustc_query_system::ich::StableHashingContext; use rustc_session::config::CrateType; @@ -1276,7 +1276,7 @@ pub struct Resolver<'ra, 'tcx> { /// Amount of lifetime parameters for each item in the crate. item_generics_num_lifetimes: FxHashMap, delegation_fn_sigs: LocalDefIdMap, - delegation_resolution_info: LocalDefIdMap, + delegation_sig_resolution_nodes: LocalDefIdMap, main_def: Option = None, trait_impls: FxIndexMap>, @@ -1695,7 +1695,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { current_crate_outer_attr_insert_span, mods_with_parse_errors: Default::default(), impl_trait_names: Default::default(), - delegation_resolution_info: Default::default(), + delegation_sig_resolution_nodes: Default::default(), .. }; @@ -1824,7 +1824,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { lifetime_elision_allowed: self.lifetime_elision_allowed, lint_buffer: Steal::new(self.lint_buffer), delegation_fn_sigs: self.delegation_fn_sigs, - delegation_resolution_info: self.delegation_resolution_info, + delegation_sig_resolution_nodes: self.delegation_sig_resolution_nodes, }; ResolverOutputs { global_ctxt, ast_lowering } } diff --git a/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs b/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs index 8c94dd089e46f..5df644974f3ef 100644 --- a/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs +++ b/tests/ui/delegation/auxiliary/recursive-delegation-aux.rs @@ -1,9 +1,7 @@ #![feature(fn_delegation)] #![allow(incomplete_features)] -fn foo() { - -} +fn foo() {} reuse foo as bar; pub reuse bar as goo; diff --git a/tests/ui/delegation/recursive_delegation_errors.rs b/tests/ui/delegation/recursive_delegation_errors.rs index a5949d70a08de..1a7ce498b054c 100644 --- a/tests/ui/delegation/recursive_delegation_errors.rs +++ b/tests/ui/delegation/recursive_delegation_errors.rs @@ -11,46 +11,46 @@ mod first_mod { mod second_mod { reuse foo as bar; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution reuse bar as foo; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution } mod third_mod { reuse foo as foo1; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution reuse foo1 as foo2; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution reuse foo2 as foo3; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution reuse foo3 as foo4; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution reuse foo4 as foo5; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution reuse foo5 as foo; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution } mod fourth_mod { trait Trait { reuse Trait::foo as bar; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution reuse Trait::bar as foo; - //~^ ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution } } mod fifth_mod { reuse super::fifth_mod::{bar as foo, foo as bar}; - //~^ ERROR failed to resolve delegation callee - //~| ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution + //~| ERROR encountered a cycle during delegation signature resolution trait GlobReuse { reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; - //~^ ERROR failed to resolve delegation callee - //~| ERROR failed to resolve delegation callee - //~| ERROR failed to resolve delegation callee + //~^ ERROR encountered a cycle during delegation signature resolution + //~| ERROR encountered a cycle during delegation signature resolution + //~| ERROR encountered a cycle during delegation signature resolution } } diff --git a/tests/ui/delegation/recursive_delegation_errors.stderr b/tests/ui/delegation/recursive_delegation_errors.stderr index 434a4cc811a7b..d19088058ea53 100644 --- a/tests/ui/delegation/recursive_delegation_errors.stderr +++ b/tests/ui/delegation/recursive_delegation_errors.stderr @@ -4,91 +4,91 @@ error: failed to resolve delegation callee LL | reuse foo; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:13:11 | LL | reuse foo as bar; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:15:11 | LL | reuse bar as foo; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:21:11 | LL | reuse foo as foo1; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:23:11 | LL | reuse foo1 as foo2; | ^^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:25:11 | LL | reuse foo2 as foo3; | ^^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:27:11 | LL | reuse foo3 as foo4; | ^^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:29:11 | LL | reuse foo4 as foo5; | ^^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:31:11 | LL | reuse foo5 as foo; | ^^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:37:22 | LL | reuse Trait::foo as bar; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:39:22 | LL | reuse Trait::bar as foo; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:45:30 | LL | reuse super::fifth_mod::{bar as foo, foo as bar}; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:45:42 | LL | reuse super::fifth_mod::{bar as foo, foo as bar}; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:50:27 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:50:39 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ -error: failed to resolve delegation callee +error: encountered a cycle during delegation signature resolution --> $DIR/recursive_delegation_errors.rs:50:51 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; diff --git a/tests/ui/delegation/recursive_delegation_pass.rs b/tests/ui/delegation/recursive_delegation_pass.rs index 856c03d1e8e8b..93f8fa401b555 100644 --- a/tests/ui/delegation/recursive_delegation_pass.rs +++ b/tests/ui/delegation/recursive_delegation_pass.rs @@ -1,13 +1,9 @@ -//@ run-pass +//@ check-pass //@ edition:2018 //@ aux-crate:recursive_delegation_aux=recursive-delegation-aux.rs #![feature(fn_delegation)] #![allow(incomplete_features)] -#![allow(dead_code)] -#![allow(unused_variables)] - -extern crate recursive_delegation_aux; mod first_mod { pub mod to_reuse { @@ -58,7 +54,9 @@ mod third_mod { } goo(123) - }(123) + } + + bar(123) } } From b07d42b6b7ed8b76028c46e72a6a24e1737c2b2d Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Wed, 17 Dec 2025 10:43:32 +0300 Subject: [PATCH 7/8] Address review comments --- compiler/rustc_ast_lowering/src/delegation.rs | 48 ++++++------------- compiler/rustc_middle/src/ty/mod.rs | 3 +- .../delegation/recursive_delegation_errors.rs | 2 - .../recursive_delegation_errors.stderr | 32 ++++++------- 4 files changed, 32 insertions(+), 53 deletions(-) diff --git a/compiler/rustc_ast_lowering/src/delegation.rs b/compiler/rustc_ast_lowering/src/delegation.rs index 3b8d6d4d098ca..db5efce223df0 100644 --- a/compiler/rustc_ast_lowering/src/delegation.rs +++ b/compiler/rustc_ast_lowering/src/delegation.rs @@ -48,7 +48,7 @@ use rustc_data_structures::fx::FxHashSet; use rustc_errors::ErrorGuaranteed; use rustc_hir::Target; use rustc_hir::attrs::{AttributeKind, InlineAttr}; -use rustc_hir::def_id::{DefId, LocalDefId}; +use rustc_hir::def_id::DefId; use rustc_middle::span_bug; use rustc_middle::ty::{Asyncness, DelegationFnSigAttrs, ResolverAstLowering}; use rustc_span::symbol::kw; @@ -125,7 +125,7 @@ impl<'hir> LoweringContext<'_, 'hir> { let span = self.lower_span(delegation.path.segments.last().unwrap().ident.span); let sig_id = self.get_delegation_sig_id( - self.get_delegation_sig_node_id(&self.local_def_id(item_id)), + self.resolver.delegation_sig_resolution_nodes[&self.local_def_id(item_id)], span, ); @@ -261,7 +261,7 @@ impl<'hir> LoweringContext<'_, 'hir> { && let Some(local_id) = def_id.as_local() && !self.resolver.delegation_fn_sigs.contains_key(&local_id) { - node_id = self.get_delegation_sig_node_id(&local_id); + node_id = self.resolver.delegation_sig_resolution_nodes[&local_id]; if visited.contains(&node_id) { // We encountered a cycle in the resolution, or delegation callee refers to non-existent // entity, in this case emit an error. @@ -274,42 +274,22 @@ impl<'hir> LoweringContext<'_, 'hir> { continue; } - // DefId is either None or is from non-local crate, fallback to the original routine. - return self.def_id_or_guaranteed_err(def_id, node_id, span); + return def_id.ok_or_else(|| { + self.tcx.dcx().span_delayed_bug( + span, + format!( + "LoweringContext: couldn't resolve node {:?} in delegation item", + node_id + ), + ) + }); } } - fn get_delegation_sig_node_id(&self, local_id: &LocalDefId) -> NodeId { - *self - .resolver - .delegation_sig_resolution_nodes - .get(local_id) - .expect("All delegations should have signature resolution NodeId") - } - fn opt_get_partial_res_id(&self, node_id: NodeId) -> Option { self.resolver.get_partial_res(node_id).and_then(|r| r.expect_full_res().opt_def_id()) } - fn def_id_or_guaranteed_err( - &self, - def_id: Option, - node_id: NodeId, - span: Span, - ) -> Result { - def_id.ok_or_else(|| { - self.tcx.dcx().span_delayed_bug( - span, - format!("LoweringContext: couldn't resolve node {:?} in delegation item", node_id), - ) - }) - } - - fn get_resolution_id(&mut self, node_id: NodeId, span: Span) -> Result { - let def_id = self.opt_get_partial_res_id(node_id); - self.def_id_or_guaranteed_err(def_id, node_id, span) - } - fn lower_delegation_generics(&mut self, span: Span) -> &'hir hir::Generics<'hir> { self.arena.alloc(hir::Generics { params: &[], @@ -539,8 +519,8 @@ impl<'hir> LoweringContext<'_, 'hir> { delegation.path.segments.iter().rev().skip(1).any(|segment| segment.args.is_some()); let call = if self - .get_resolution_id(delegation.id, span) - .and_then(|def_id| Ok(self.is_method(def_id, span))) + .opt_get_partial_res_id(delegation.id) + .and_then(|def_id| Some(self.is_method(def_id, span))) .unwrap_or_default() && delegation.qself.is_none() && !has_generic_args diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 3171f4fadcffb..e918f7ba362d1 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -220,7 +220,8 @@ pub struct ResolverAstLowering { /// Information about functions signatures for delegation items expansion pub delegation_fn_sigs: LocalDefIdMap, - // NodeIds for delegation signature resolution + // NodeIds (either delegation.id or item_id in case of a trait impl) for signature resolution, + // for details see https://github.com/rust-lang/rust/issues/118212#issuecomment-2160686914 pub delegation_sig_resolution_nodes: LocalDefIdMap, } diff --git a/tests/ui/delegation/recursive_delegation_errors.rs b/tests/ui/delegation/recursive_delegation_errors.rs index 1a7ce498b054c..5758ddc6ae4d9 100644 --- a/tests/ui/delegation/recursive_delegation_errors.rs +++ b/tests/ui/delegation/recursive_delegation_errors.rs @@ -1,7 +1,5 @@ #![feature(fn_delegation)] #![allow(incomplete_features)] -#![allow(dead_code)] -#![allow(unused_variables)] mod first_mod { diff --git a/tests/ui/delegation/recursive_delegation_errors.stderr b/tests/ui/delegation/recursive_delegation_errors.stderr index d19088058ea53..14c7065d0edc9 100644 --- a/tests/ui/delegation/recursive_delegation_errors.stderr +++ b/tests/ui/delegation/recursive_delegation_errors.stderr @@ -1,95 +1,95 @@ error: failed to resolve delegation callee - --> $DIR/recursive_delegation_errors.rs:8:11 + --> $DIR/recursive_delegation_errors.rs:6:11 | LL | reuse foo; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:13:11 + --> $DIR/recursive_delegation_errors.rs:11:11 | LL | reuse foo as bar; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:15:11 + --> $DIR/recursive_delegation_errors.rs:13:11 | LL | reuse bar as foo; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:21:11 + --> $DIR/recursive_delegation_errors.rs:19:11 | LL | reuse foo as foo1; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:23:11 + --> $DIR/recursive_delegation_errors.rs:21:11 | LL | reuse foo1 as foo2; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:25:11 + --> $DIR/recursive_delegation_errors.rs:23:11 | LL | reuse foo2 as foo3; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:27:11 + --> $DIR/recursive_delegation_errors.rs:25:11 | LL | reuse foo3 as foo4; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:29:11 + --> $DIR/recursive_delegation_errors.rs:27:11 | LL | reuse foo4 as foo5; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:31:11 + --> $DIR/recursive_delegation_errors.rs:29:11 | LL | reuse foo5 as foo; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:37:22 + --> $DIR/recursive_delegation_errors.rs:35:22 | LL | reuse Trait::foo as bar; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:39:22 + --> $DIR/recursive_delegation_errors.rs:37:22 | LL | reuse Trait::bar as foo; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:45:30 + --> $DIR/recursive_delegation_errors.rs:43:30 | LL | reuse super::fifth_mod::{bar as foo, foo as bar}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:45:42 + --> $DIR/recursive_delegation_errors.rs:43:42 | LL | reuse super::fifth_mod::{bar as foo, foo as bar}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:50:27 + --> $DIR/recursive_delegation_errors.rs:48:27 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:50:39 + --> $DIR/recursive_delegation_errors.rs:48:39 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:50:51 + --> $DIR/recursive_delegation_errors.rs:48:51 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ From 27fef147eb8ff1a2ef4fad6f119d91711c952a7c Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Wed, 17 Dec 2025 14:11:38 +0300 Subject: [PATCH 8/8] Rename tests --- ...rors.rs => recursive-delegation-errors.rs} | 1 - ...err => recursive-delegation-errors.stderr} | 32 +++++++++---------- ...n_pass.rs => recursive-delegation-pass.rs} | 0 3 files changed, 16 insertions(+), 17 deletions(-) rename tests/ui/delegation/{recursive_delegation_errors.rs => recursive-delegation-errors.rs} (99%) rename tests/ui/delegation/{recursive_delegation_errors.stderr => recursive-delegation-errors.stderr} (74%) rename tests/ui/delegation/{recursive_delegation_pass.rs => recursive-delegation-pass.rs} (100%) diff --git a/tests/ui/delegation/recursive_delegation_errors.rs b/tests/ui/delegation/recursive-delegation-errors.rs similarity index 99% rename from tests/ui/delegation/recursive_delegation_errors.rs rename to tests/ui/delegation/recursive-delegation-errors.rs index 5758ddc6ae4d9..194182e20ed02 100644 --- a/tests/ui/delegation/recursive_delegation_errors.rs +++ b/tests/ui/delegation/recursive-delegation-errors.rs @@ -12,7 +12,6 @@ mod second_mod { //~^ ERROR encountered a cycle during delegation signature resolution reuse bar as foo; //~^ ERROR encountered a cycle during delegation signature resolution - } mod third_mod { diff --git a/tests/ui/delegation/recursive_delegation_errors.stderr b/tests/ui/delegation/recursive-delegation-errors.stderr similarity index 74% rename from tests/ui/delegation/recursive_delegation_errors.stderr rename to tests/ui/delegation/recursive-delegation-errors.stderr index 14c7065d0edc9..9c4e316745aea 100644 --- a/tests/ui/delegation/recursive_delegation_errors.stderr +++ b/tests/ui/delegation/recursive-delegation-errors.stderr @@ -1,95 +1,95 @@ error: failed to resolve delegation callee - --> $DIR/recursive_delegation_errors.rs:6:11 + --> $DIR/recursive-delegation-errors.rs:6:11 | LL | reuse foo; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:11:11 + --> $DIR/recursive-delegation-errors.rs:11:11 | LL | reuse foo as bar; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:13:11 + --> $DIR/recursive-delegation-errors.rs:13:11 | LL | reuse bar as foo; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:19:11 + --> $DIR/recursive-delegation-errors.rs:18:11 | LL | reuse foo as foo1; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:21:11 + --> $DIR/recursive-delegation-errors.rs:20:11 | LL | reuse foo1 as foo2; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:23:11 + --> $DIR/recursive-delegation-errors.rs:22:11 | LL | reuse foo2 as foo3; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:25:11 + --> $DIR/recursive-delegation-errors.rs:24:11 | LL | reuse foo3 as foo4; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:27:11 + --> $DIR/recursive-delegation-errors.rs:26:11 | LL | reuse foo4 as foo5; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:29:11 + --> $DIR/recursive-delegation-errors.rs:28:11 | LL | reuse foo5 as foo; | ^^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:35:22 + --> $DIR/recursive-delegation-errors.rs:34:22 | LL | reuse Trait::foo as bar; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:37:22 + --> $DIR/recursive-delegation-errors.rs:36:22 | LL | reuse Trait::bar as foo; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:43:30 + --> $DIR/recursive-delegation-errors.rs:42:30 | LL | reuse super::fifth_mod::{bar as foo, foo as bar}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:43:42 + --> $DIR/recursive-delegation-errors.rs:42:42 | LL | reuse super::fifth_mod::{bar as foo, foo as bar}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:48:27 + --> $DIR/recursive-delegation-errors.rs:47:27 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:48:39 + --> $DIR/recursive-delegation-errors.rs:47:39 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ error: encountered a cycle during delegation signature resolution - --> $DIR/recursive_delegation_errors.rs:48:51 + --> $DIR/recursive-delegation-errors.rs:47:51 | LL | reuse GlobReuse::{foo as bar, bar as goo, goo as foo}; | ^^^ diff --git a/tests/ui/delegation/recursive_delegation_pass.rs b/tests/ui/delegation/recursive-delegation-pass.rs similarity index 100% rename from tests/ui/delegation/recursive_delegation_pass.rs rename to tests/ui/delegation/recursive-delegation-pass.rs