@@ -96,7 +96,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
9696 let generics = self . lower_delegation_generics ( span) ;
9797 DelegationResults { body_id, sig, ident, generics }
9898 }
99- Err ( err) => self . generate_delegation_error ( err, span) ,
99+ Err ( err) => self . generate_delegation_error ( err, span, delegation ) ,
100100 }
101101 }
102102
@@ -404,6 +404,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
404404 & mut self ,
405405 err : ErrorGuaranteed ,
406406 span : Span ,
407+ delegation : & Delegation ,
407408 ) -> DelegationResults < ' hir > {
408409 let generics = self . lower_delegation_generics ( span) ;
409410
@@ -418,8 +419,41 @@ impl<'hir> LoweringContext<'_, 'hir> {
418419 let header = self . generate_header_error ( ) ;
419420 let sig = hir:: FnSig { decl, header, span } ;
420421
421- let ident = Ident :: dummy ( ) ;
422- let body_id = self . lower_body ( |this| ( & [ ] , this. mk_expr ( hir:: ExprKind :: Err ( err) , span) ) ) ;
422+ let ident = self . lower_ident ( delegation. ident ) ;
423+
424+ let body_id = self . lower_body ( |this| {
425+ let body_expr = match delegation. body . as_ref ( ) {
426+ Some ( box block) => {
427+ // Generates a block when we failed to resolve delegation, where a target expression is its only statement,
428+ // thus there will be no ICEs on further stages of analysis (see #144594)
429+
430+ // As we generate a void function we want to convert target expression to statement to avoid additional
431+ // errors, such as mismatched return type
432+ let stmts = this. arena . alloc_from_iter ( [ hir:: Stmt {
433+ hir_id : this. next_id ( ) ,
434+ kind : rustc_hir:: StmtKind :: Semi (
435+ this. arena . alloc ( this. lower_target_expr ( block) ) ,
436+ ) ,
437+ span,
438+ } ] ) ;
439+
440+ let block = this. arena . alloc ( hir:: Block {
441+ stmts,
442+ expr : None ,
443+ hir_id : this. next_id ( ) ,
444+ rules : hir:: BlockCheckMode :: DefaultBlock ,
445+ span,
446+ targeted_by_break : false ,
447+ } ) ;
448+
449+ hir:: ExprKind :: Block ( block, None )
450+ }
451+ None => hir:: ExprKind :: Err ( err) ,
452+ } ;
453+
454+ ( & [ ] , this. mk_expr ( body_expr, span) )
455+ } ) ;
456+
423457 DelegationResults { ident, generics, body_id, sig }
424458 }
425459
0 commit comments