@@ -4412,20 +4412,27 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4412
4412
// Check provided lifetime parameters.
4413
4413
let lifetime_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | & generics. regions ) ;
4414
4414
if lifetimes. len ( ) > lifetime_defs. len ( ) {
4415
- let span = lifetimes[ lifetime_defs. len ( ) ] . span ;
4416
- span_err ! ( self . tcx. sess, span, E0088 ,
4417
- "too many lifetime parameters provided: \
4418
- expected {}, found {}",
4419
- count( lifetime_defs. len( ) ) ,
4420
- count( lifetimes. len( ) ) ) ;
4421
- } else if lifetimes. len ( ) > 0 && lifetimes. len ( ) < lifetime_defs. len ( ) {
4422
- span_err ! ( self . tcx. sess, span, E0090 ,
4423
- "too few lifetime parameters provided: \
4424
- expected {}, found {}",
4425
- count( lifetime_defs. len( ) ) ,
4426
- count( lifetimes. len( ) ) ) ;
4415
+ let span = lifetimes[ ..] . into_iter ( ) . skip ( 1 ) . map ( |lft| lft. span )
4416
+ . fold ( lifetimes[ 0 ] . span , |acc, n| Span {
4417
+ expn_id : acc. expn_id ,
4418
+ lo : acc. lo ,
4419
+ hi : n. hi ,
4420
+ } ) ;
4421
+
4422
+ struct_span_err ! ( self . tcx. sess, span, E0088 ,
4423
+ "too many lifetime parameters provided: \
4424
+ expected {}, found {}",
4425
+ count( lifetime_defs. len( ) ) ,
4426
+ count( lifetimes. len( ) ) )
4427
+ . span_label ( span, & format ! ( "unexpected lifetime parameter{}" ,
4428
+ match lifetimes. len( ) { 1 => "" , _ => "s" } ) )
4429
+ . emit ( ) ;
4427
4430
}
4428
4431
4432
+ // The case where there is not enough lifetime parameters is not checked,
4433
+ // because this is not possible - a function never takes lifetime parameters.
4434
+ // See discussion for Pull Request 36208.
4435
+
4429
4436
// Check provided type parameters.
4430
4437
let type_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | {
4431
4438
if generics. parent . is_none ( ) {
0 commit comments