@@ -4324,20 +4324,27 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4324
4324
// Check provided lifetime parameters.
4325
4325
let lifetime_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | & generics. regions ) ;
4326
4326
if lifetimes. len ( ) > lifetime_defs. len ( ) {
4327
- let span = lifetimes[ lifetime_defs. len ( ) ] . span ;
4328
- span_err ! ( self . tcx. sess, span, E0088 ,
4329
- "too many lifetime parameters provided: \
4330
- expected {}, found {}",
4331
- count( lifetime_defs. len( ) ) ,
4332
- count( lifetimes. len( ) ) ) ;
4333
- } else if lifetimes. len ( ) > 0 && lifetimes. len ( ) < lifetime_defs. len ( ) {
4334
- span_err ! ( self . tcx. sess, span, E0090 ,
4335
- "too few lifetime parameters provided: \
4336
- expected {}, found {}",
4337
- count( lifetime_defs. len( ) ) ,
4338
- count( lifetimes. len( ) ) ) ;
4327
+ let span = lifetimes[ ..] . into_iter ( ) . skip ( 1 ) . map ( |lft| lft. span )
4328
+ . fold ( lifetimes[ 0 ] . span , |acc, n| Span {
4329
+ expn_id : acc. expn_id ,
4330
+ lo : acc. lo ,
4331
+ hi : n. hi ,
4332
+ } ) ;
4333
+
4334
+ struct_span_err ! ( self . tcx. sess, span, E0088 ,
4335
+ "too many lifetime parameters provided: \
4336
+ expected {}, found {}",
4337
+ count( lifetime_defs. len( ) ) ,
4338
+ count( lifetimes. len( ) ) )
4339
+ . span_label ( span, & format ! ( "unexpected lifetime parameter{}" ,
4340
+ match lifetimes. len( ) { 1 => "" , _ => "s" } ) )
4341
+ . emit ( ) ;
4339
4342
}
4340
4343
4344
+ // The case where there is not enough lifetime parameters is not checked,
4345
+ // because this is not possible - a function never takes lifetime parameters.
4346
+ // See discussion for Pull Request 36208.
4347
+
4341
4348
// Check provided type parameters.
4342
4349
let type_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | {
4343
4350
if generics. parent . is_none ( ) {
0 commit comments