@@ -4510,28 +4510,32 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
45104510 }
45114511 } ;
45124512
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" } )
45154518 } ;
45164519
45174520 // Check provided lifetime parameters.
45184521 let lifetime_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | & generics. regions ) ;
45194522 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 ( ) ) ;
45204525 struct_span_err ! ( self . tcx. sess, span, E0088 ,
45214526 "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) )
45274530 . emit ( ) ;
45284531 } 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 ( ) ) ;
45294534 struct_span_err ! ( self . tcx. sess, span, E0090 ,
45304535 "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) )
45354539 . emit ( ) ;
45364540 }
45374541
@@ -4552,29 +4556,27 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
45524556 . count ( ) ;
45534557 if types. len ( ) > type_defs. len ( ) {
45544558 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 ( ) ) ;
45554561 struct_span_err ! ( self . tcx. sess, span, E0087 ,
45564562 "too many type parameters provided: \
45574563 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 ( ) ;
45614567
45624568 // To prevent derived errors to accumulate due to extra
45634569 // type parameters, we force instantiate_value_path to
45644570 // use inference variables instead of the provided types.
45654571 * segment = None ;
45664572 } 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 ( ) ) ;
45704575 struct_span_err ! ( self . tcx. sess, span, E0089 ,
45714576 "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) )
45784580 . emit ( ) ;
45794581 }
45804582
0 commit comments