@@ -44,22 +44,17 @@ use hir::{BodyId, HirId};
4444use rustc_abi:: ExternAbi ;
4545use rustc_ast as ast;
4646use rustc_ast:: * ;
47- use rustc_data_structures:: fx:: FxHashSet ;
48- use rustc_errors:: ErrorGuaranteed ;
4947use rustc_hir:: attrs:: { AttributeKind , InlineAttr } ;
5048use rustc_hir:: def_id:: DefId ;
5149use rustc_hir:: { self as hir, FnDeclFlags } ;
5250use rustc_middle:: span_bug;
5351use rustc_middle:: ty:: Asyncness ;
5452use rustc_span:: symbol:: kw;
5553use rustc_span:: { Ident , Span , Symbol } ;
56- use smallvec:: SmallVec ;
5754
5855use crate :: delegation:: generics:: { GenericsGenerationResult , GenericsGenerationResults } ;
59- use crate :: errors:: { CycleInDelegationSignatureResolution , UnresolvedDelegationCallee } ;
6056use crate :: {
6157 AllowReturnTypeNotation , ImplTraitContext , ImplTraitPosition , LoweringContext , ParamMode ,
62- ResolverAstLoweringExt ,
6358} ;
6459
6560mod generics;
@@ -119,13 +114,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
119114 delegation : & Delegation ,
120115 item_id : NodeId ,
121116 ) -> DelegationResults < ' hir > {
122- let span = self . lower_span ( delegation. path . segments . last ( ) . unwrap ( ) . ident . span ) ;
117+ let span = self . lower_span ( delegation. span ( ) ) ;
118+
119+ let sig_id =
120+ self . tcx . delegations_resolutions ( ( ) ) . get ( & self . owner . def_id ) . copied ( ) . flatten ( ) ;
123121
124122 // Delegation can be unresolved in illegal places such as function bodies in extern blocks (see #151356)
125- let sig_id = if let Some ( delegation_info) = self . resolver . delegation_info ( self . owner . def_id )
126- {
127- self . get_sig_id ( delegation_info. resolution_id , span)
128- } else {
123+ let Some ( sig_id) = sig_id else {
129124 self . dcx ( ) . span_delayed_bug (
130125 span,
131126 format ! ( "LoweringContext: the delegation {:?} is unresolved" , item_id) ,
@@ -134,49 +129,39 @@ impl<'hir> LoweringContext<'_, 'hir> {
134129 return self . generate_delegation_error ( span, delegation) ;
135130 } ;
136131
137- match sig_id {
138- Ok ( sig_id) => {
139- self . add_attrs_if_needed ( span, sig_id) ;
132+ self . add_attrs_if_needed ( span, sig_id) ;
140133
141- let is_method = self . is_method ( sig_id, span) ;
134+ let is_method = self . is_method ( sig_id, span) ;
142135
143- let ( param_count, c_variadic) = self . param_count ( sig_id) ;
136+ let ( param_count, c_variadic) = self . param_count ( sig_id) ;
144137
145- let mut generics = self . uplift_delegation_generics ( delegation, sig_id, is_method) ;
138+ let mut generics = self . uplift_delegation_generics ( delegation, sig_id, is_method) ;
146139
147- let ( body_id, call_expr_id) = self . lower_delegation_body (
148- delegation,
149- is_method,
150- param_count,
151- & mut generics,
152- span,
153- ) ;
140+ let ( body_id, call_expr_id) =
141+ self . lower_delegation_body ( delegation, is_method, param_count, & mut generics, span) ;
154142
155- let decl = self . lower_delegation_decl (
156- sig_id,
157- param_count,
158- c_variadic,
159- span,
160- & generics,
161- delegation. id ,
162- call_expr_id,
163- ) ;
143+ let decl = self . lower_delegation_decl (
144+ sig_id,
145+ param_count,
146+ c_variadic,
147+ span,
148+ & generics,
149+ delegation. id ,
150+ call_expr_id,
151+ ) ;
164152
165- let sig = self . lower_delegation_sig ( sig_id, decl, span) ;
166- let ident = self . lower_ident ( delegation. ident ) ;
153+ let sig = self . lower_delegation_sig ( sig_id, decl, span) ;
154+ let ident = self . lower_ident ( delegation. ident ) ;
167155
168- let generics = self . arena . alloc ( hir:: Generics {
169- has_where_clause_predicates : false ,
170- params : self . arena . alloc_from_iter ( generics. all_params ( ) ) ,
171- predicates : self . arena . alloc_from_iter ( generics. all_predicates ( ) ) ,
172- span,
173- where_clause_span : span,
174- } ) ;
156+ let generics = self . arena . alloc ( hir:: Generics {
157+ has_where_clause_predicates : false ,
158+ params : self . arena . alloc_from_iter ( generics. all_params ( ) ) ,
159+ predicates : self . arena . alloc_from_iter ( generics. all_predicates ( ) ) ,
160+ span,
161+ where_clause_span : span,
162+ } ) ;
175163
176- DelegationResults { body_id, sig, ident, generics }
177- }
178- Err ( _) => self . generate_delegation_error ( span, delegation) ,
179- }
164+ DelegationResults { body_id, sig, ident, generics }
180165 }
181166
182167 fn add_attrs_if_needed ( & mut self , span : Span , sig_id : DefId ) {
@@ -230,36 +215,6 @@ impl<'hir> LoweringContext<'_, 'hir> {
230215 . collect :: < Vec < _ > > ( )
231216 }
232217
233- fn get_sig_id ( & self , mut def_id : DefId , span : Span ) -> Result < DefId , ErrorGuaranteed > {
234- let mut visited: FxHashSet < DefId > = Default :: default ( ) ;
235- let mut path: SmallVec < [ DefId ; 1 ] > = Default :: default ( ) ;
236-
237- loop {
238- visited. insert ( def_id) ;
239-
240- path. push ( def_id) ;
241-
242- // If def_id is in local crate and it corresponds to another delegation
243- // it means that we refer to another delegation as a callee, so in order to obtain
244- // a signature DefId we obtain NodeId of the callee delegation and try to get signature from it.
245- if let Some ( local_id) = def_id. as_local ( )
246- && let Some ( delegation_info) = self . resolver . delegation_info ( local_id)
247- {
248- def_id = delegation_info. resolution_id ;
249- if visited. contains ( & def_id) {
250- // We encountered a cycle in the resolution, or delegation callee refers to non-existent
251- // entity, in this case emit an error.
252- return Err ( match visited. len ( ) {
253- 1 => self . dcx ( ) . emit_err ( UnresolvedDelegationCallee { span } ) ,
254- _ => self . dcx ( ) . emit_err ( CycleInDelegationSignatureResolution { span } ) ,
255- } ) ;
256- }
257- } else {
258- return Ok ( path[ 0 ] ) ;
259- }
260- }
261- }
262-
263218 fn get_resolution_id ( & self , node_id : NodeId ) -> Option < DefId > {
264219 self . get_partial_res ( node_id) . and_then ( |r| r. expect_full_res ( ) . opt_def_id ( ) )
265220 }
0 commit comments