@@ -146,12 +146,10 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
146146
147147 let ( param_count, c_variadic) = self . param_count ( sig_id) ;
148148
149- let mut generics =
150- self . lower_delegation_generics ( delegation, sig_id, item_id, span) ;
149+ let mut generics = self . uplift_delegation_generics ( delegation, sig_id, item_id) ;
151150
152151 let body_id = self . lower_delegation_body (
153152 delegation,
154- item_id,
155153 is_method,
156154 param_count,
157155 & mut generics,
@@ -166,10 +164,8 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
166164
167165 let generics = self . arena . alloc ( hir:: Generics {
168166 has_where_clause_predicates : false ,
169- params : self . arena . alloc_from_iter ( generics. all_params ( item_id, span, self ) ) ,
170- predicates : self
171- . arena
172- . alloc_from_iter ( generics. all_predicates ( item_id, span, self ) ) ,
167+ params : self . arena . alloc_from_iter ( generics. all_params ( span, self ) ) ,
168+ predicates : self . arena . alloc_from_iter ( generics. all_predicates ( span, self ) ) ,
173169 span,
174170 where_clause_span : span,
175171 } ) ;
@@ -294,19 +290,22 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
294290 let decl_param_count = param_count - c_variadic as usize ;
295291 let inputs = self . arena . alloc_from_iter ( ( 0 ..decl_param_count) . map ( |arg| hir:: Ty {
296292 hir_id : self . next_id ( ) ,
297- kind : hir:: TyKind :: InferDelegation ( sig_id, hir:: InferDelegationKind :: Input ( arg) ) ,
293+ kind : hir:: TyKind :: InferDelegation ( hir:: InferDelegation :: Sig (
294+ sig_id,
295+ hir:: InferDelegationSig :: Input ( arg) ,
296+ ) ) ,
298297 span,
299298 } ) ) ;
300299
301300 let output = self . arena . alloc ( hir:: Ty {
302301 hir_id : self . next_id ( ) ,
303- kind : hir:: TyKind :: InferDelegation (
302+ kind : hir:: TyKind :: InferDelegation ( hir :: InferDelegation :: Sig (
304303 sig_id,
305- hir:: InferDelegationKind :: Output ( self . arena . alloc ( hir:: DelegationGenerics {
304+ hir:: InferDelegationSig :: Output ( self . arena . alloc ( hir:: DelegationGenerics {
306305 child_args_segment_id : generics. child . args_segment_id ,
307306 parent_args_segment_id : generics. parent . args_segment_id ,
308307 } ) ) ,
309- ) ,
308+ ) ) ,
310309 span,
311310 } ) ;
312311
@@ -399,7 +398,6 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
399398 fn lower_delegation_body (
400399 & mut self ,
401400 delegation : & Delegation ,
402- item_id : NodeId ,
403401 is_method : bool ,
404402 param_count : usize ,
405403 generics : & mut GenericsGenerationResults < ' hir > ,
@@ -434,7 +432,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
434432 args. push ( arg) ;
435433 }
436434
437- let final_expr = this. finalize_body_lowering ( delegation, item_id , args, generics, span) ;
435+ let final_expr = this. finalize_body_lowering ( delegation, args, generics, span) ;
438436
439437 ( this. arena . alloc_from_iter ( parameters) , final_expr)
440438 } )
@@ -471,7 +469,6 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
471469 fn finalize_body_lowering (
472470 & mut self ,
473471 delegation : & Delegation ,
474- item_id : NodeId ,
475472 args : Vec < hir:: Expr < ' hir > > ,
476473 generics : & mut GenericsGenerationResults < ' hir > ,
477474 span : Span ,
@@ -501,7 +498,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
501498
502499 // FIXME(fn_delegation): proper support for parent generics propagation
503500 // in method call scenario.
504- let segment = self . process_segment ( item_id , span, & segment, & mut generics. child , false ) ;
501+ let segment = self . process_segment ( span, & segment, & mut generics. child , false ) ;
505502 let segment = self . arena . alloc ( segment) ;
506503
507504 self . arena . alloc ( hir:: Expr {
@@ -528,7 +525,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
528525 new_path. segments = self . arena . alloc_from_iter (
529526 new_path. segments . iter ( ) . enumerate ( ) . map ( |( idx, segment) | {
530527 let mut process_segment = |result, add_lifetimes| {
531- self . process_segment ( item_id , span, segment, result, add_lifetimes)
528+ self . process_segment ( span, segment, result, add_lifetimes)
532529 } ;
533530
534531 if idx + 2 == len {
@@ -544,8 +541,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
544541 hir:: QPath :: Resolved ( ty, self . arena . alloc ( new_path) )
545542 }
546543 hir:: QPath :: TypeRelative ( ty, segment) => {
547- let segment =
548- self . process_segment ( item_id, span, segment, & mut generics. child , false ) ;
544+ let segment = self . process_segment ( span, segment, & mut generics. child , false ) ;
549545
550546 hir:: QPath :: TypeRelative ( ty, self . arena . alloc ( segment) )
551547 }
@@ -569,23 +565,21 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
569565
570566 fn process_segment (
571567 & mut self ,
572- item_id : NodeId ,
573568 span : Span ,
574569 segment : & hir:: PathSegment < ' hir > ,
575570 result : & mut GenericsGenerationResult < ' hir > ,
576571 add_lifetimes : bool ,
577572 ) -> hir:: PathSegment < ' hir > {
578573 let details = result. generics . args_propagation_details ( ) ;
579574
580- // The first condition is needed when there is SelfAndUserSpecified case,
581- // we don't want to propagate generics params in this situation.
582- let segment = if details. should_propagate
583- && let Some ( args) = result
584- . generics
585- . into_hir_generics ( self , item_id, span)
586- . into_generic_args ( self , add_lifetimes, span)
587- {
588- hir:: PathSegment { args : Some ( args) , ..segment. clone ( ) }
575+ let segment = if details. should_propagate {
576+ let generics = result. generics . into_hir_generics ( self , span) ;
577+ let args = generics. into_generic_args ( self , add_lifetimes, span) ;
578+
579+ // Needed for better error messages (`trait-impl-wrong-args-count.rs` test).
580+ let args = if args. is_empty ( ) { None } else { Some ( args) } ;
581+
582+ hir:: PathSegment { args, ..segment. clone ( ) }
589583 } else {
590584 segment. clone ( )
591585 } ;
0 commit comments