@@ -4324,20 +4324,27 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
43244324 // Check provided lifetime parameters.
43254325 let lifetime_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | & generics. regions ) ;
43264326 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 ( ) ;
43394342 }
43404343
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+
43414348 // Check provided type parameters.
43424349 let type_defs = segment. map_or ( & [ ] [ ..] , |( _, generics) | {
43434350 if generics. parent . is_none ( ) {
0 commit comments