@@ -4510,28 +4510,32 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4510
4510
}
4511
4511
} ;
4512
4512
4513
- let count = |n| {
4514
- format ! ( "{} parameter{}" , n, if n == 1 { "" } else { "s" } )
4513
+ let count_lifetime_params = |n| {
4514
+ format ! ( "{} lifetime parameter{}" , n, if n == 1 { "" } else { "s" } )
4515
+ } ;
4516
+ let count_type_params = |n| {
4517
+ format ! ( "{} type parameter{}" , n, if n == 1 { "" } else { "s" } )
4515
4518
} ;
4516
4519
4517
4520
// Check provided lifetime parameters.
4518
4521
let lifetime_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | & generics. regions ) ;
4519
4522
if lifetimes. len ( ) > lifetime_defs. len ( ) {
4523
+ let expected_text = count_lifetime_params ( lifetime_defs. len ( ) ) ;
4524
+ let actual_text = count_lifetime_params ( lifetimes. len ( ) ) ;
4520
4525
struct_span_err ! ( self . tcx. sess, span, E0088 ,
4521
4526
"too many lifetime parameters provided: \
4522
- expected {}, found {}",
4523
- count( lifetime_defs. len( ) ) ,
4524
- count( lifetimes. len( ) ) )
4525
- . span_label ( span, & format ! ( "unexpected lifetime parameter{}" ,
4526
- match lifetimes. len( ) { 1 => "" , _ => "s" } ) )
4527
+ expected at most {}, found {}",
4528
+ expected_text, actual_text)
4529
+ . span_label ( span, & format ! ( "expected {}" , expected_text) )
4527
4530
. emit ( ) ;
4528
4531
} else if lifetimes. len ( ) > 0 && lifetimes. len ( ) < lifetime_defs. len ( ) {
4532
+ let expected_text = count_lifetime_params ( lifetime_defs. len ( ) ) ;
4533
+ let actual_text = count_lifetime_params ( lifetimes. len ( ) ) ;
4529
4534
struct_span_err ! ( self . tcx. sess, span, E0090 ,
4530
4535
"too few lifetime parameters provided: \
4531
- expected {}, found {}",
4532
- count( lifetime_defs. len( ) ) ,
4533
- count( lifetimes. len( ) ) )
4534
- . span_label ( span, & format ! ( "too few lifetime parameters" ) )
4536
+ expected {}, found {}",
4537
+ expected_text, actual_text)
4538
+ . span_label ( span, & format ! ( "expected {}" , expected_text) )
4535
4539
. emit ( ) ;
4536
4540
}
4537
4541
@@ -4552,29 +4556,27 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4552
4556
. count ( ) ;
4553
4557
if types. len ( ) > type_defs. len ( ) {
4554
4558
let span = types[ type_defs. len ( ) ] . span ;
4559
+ let expected_text = count_type_params ( type_defs. len ( ) ) ;
4560
+ let actual_text = count_type_params ( types. len ( ) ) ;
4555
4561
struct_span_err ! ( self . tcx. sess, span, E0087 ,
4556
4562
"too many type parameters provided: \
4557
4563
expected at most {}, found {}",
4558
- count ( type_defs . len ( ) ) ,
4559
- count ( types . len ( ) ) )
4560
- . span_label ( span , & format ! ( "too many type parameters" ) ) . emit ( ) ;
4564
+ expected_text , actual_text )
4565
+ . span_label ( span , & format ! ( "expected {}" , expected_text ) )
4566
+ . emit ( ) ;
4561
4567
4562
4568
// To prevent derived errors to accumulate due to extra
4563
4569
// type parameters, we force instantiate_value_path to
4564
4570
// use inference variables instead of the provided types.
4565
4571
* segment = None ;
4566
4572
} else if !infer_types && types. len ( ) < required_len {
4567
- let adjust = |len| if len > 1 { "parameters" } else { "parameter" } ;
4568
- let required_param_str = adjust ( required_len) ;
4569
- let actual_param_str = adjust ( types. len ( ) ) ;
4573
+ let expected_text = count_type_params ( required_len) ;
4574
+ let actual_text = count_type_params ( types. len ( ) ) ;
4570
4575
struct_span_err ! ( self . tcx. sess, span, E0089 ,
4571
4576
"too few type parameters provided: \
4572
- expected {} {}, found {} {}",
4573
- count( required_len) ,
4574
- required_param_str,
4575
- count( types. len( ) ) ,
4576
- actual_param_str)
4577
- . span_label ( span, & format ! ( "expected {} type {}" , required_len, required_param_str) )
4577
+ expected {}, found {}",
4578
+ expected_text, actual_text)
4579
+ . span_label ( span, & format ! ( "expected {}" , expected_text) )
4578
4580
. emit ( ) ;
4579
4581
}
4580
4582
0 commit comments