@@ -50,15 +50,13 @@ use rustc_hir::Target;
5050use rustc_hir:: attrs:: { AttributeKind , InlineAttr } ;
5151use rustc_hir:: def_id:: { DefId , LocalDefId } ;
5252use rustc_middle:: span_bug;
53- use rustc_middle:: ty:: {
54- Asyncness , DelegationFnSigAttrs , DelegationResolutionInfo , ResolverAstLowering ,
55- } ;
53+ use rustc_middle:: ty:: { Asyncness , DelegationFnSigAttrs , ResolverAstLowering } ;
5654use rustc_span:: symbol:: kw;
5755use rustc_span:: { DUMMY_SP , Ident , Span , Symbol } ;
5856use { rustc_ast as ast, rustc_hir as hir} ;
5957
6058use super :: { GenericArgsMode , ImplTraitContext , LoweringContext , ParamMode } ;
61- use crate :: errors:: UnresolvedDelegationCallee ;
59+ use crate :: errors:: { CycleInDelegationSignatureResolution , UnresolvedDelegationCallee } ;
6260use crate :: { AllowReturnTypeNotation , ImplTraitPosition , ResolverAstLoweringExt } ;
6361
6462pub ( crate ) struct DelegationResults < ' hir > {
@@ -126,10 +124,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
126124 ) -> DelegationResults < ' hir > {
127125 let span = self . lower_span ( delegation. path . segments . last ( ) . unwrap ( ) . ident . span ) ;
128126
129- let sig_id = self
130- . delegation_res_info_or_err ( & self . local_def_id ( item_id) , span )
131- . map ( |info| self . get_delegation_sig_id ( info . sig_resolution_id , span) )
132- . flatten ( ) ;
127+ let sig_id = self . get_delegation_sig_id (
128+ self . get_delegation_sig_node_id ( & self . local_def_id ( item_id) ) ,
129+ span,
130+ ) ;
133131
134132 match sig_id {
135133 Ok ( sig_id) => {
@@ -263,11 +261,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
263261 && let Some ( local_id) = def_id. as_local ( )
264262 && !self . resolver . delegation_fn_sigs . contains_key ( & local_id)
265263 {
266- node_id = self . delegation_res_info_or_err ( & local_id, span ) ? . sig_resolution_id ;
264+ node_id = self . get_delegation_sig_node_id ( & local_id) ;
267265 if visited. contains ( & node_id) {
268266 // We encountered a cycle in the resolution, or delegation callee refers to non-existent
269267 // entity, in this case emit an error.
270- return Err ( self . dcx ( ) . emit_err ( UnresolvedDelegationCallee { span } ) ) ;
268+ return Err ( match visited. len ( ) {
269+ 1 => self . dcx ( ) . emit_err ( UnresolvedDelegationCallee { span } ) ,
270+ _ => self . dcx ( ) . emit_err ( CycleInDelegationSignatureResolution { span } ) ,
271+ } ) ;
271272 }
272273
273274 continue ;
@@ -278,17 +279,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
278279 }
279280 }
280281
281- fn delegation_res_info_or_err (
282- & self ,
283- local_id : & LocalDefId ,
284- span : Span ,
285- ) -> Result < & DelegationResolutionInfo , ErrorGuaranteed > {
286- self . resolver . delegation_resolution_info . get ( local_id) . ok_or_else ( || {
287- self . tcx . dcx ( ) . span_delayed_bug ( span, format ! (
288- "There is no information about delegation resolution node id for LocalDefId {:?}" ,
289- local_id
290- ) )
291- } )
282+ fn get_delegation_sig_node_id ( & self , local_id : & LocalDefId ) -> NodeId {
283+ * self
284+ . resolver
285+ . delegation_sig_resolution_nodes
286+ . get ( local_id)
287+ . expect ( "All delegations should have signature resolution NodeId" )
292288 }
293289
294290 fn opt_get_partial_res_id ( & self , node_id : NodeId ) -> Option < DefId > {
0 commit comments