@@ -2858,43 +2858,42 @@ impl<'a> Parser<'a> {
28582858 let mut before_slice = true ;
28592859
28602860 while self . token != token:: RBRACKET {
2861- if first { first = false ; }
2862- else { self . expect ( & token:: COMMA ) ; }
2861+ if first {
2862+ first = false ;
2863+ } else {
2864+ self . expect ( & token:: COMMA ) ;
2865+ }
28632866
2864- let mut is_slice = false ;
28652867 if before_slice {
28662868 if self . token == token:: DOTDOT {
28672869 self . bump ( ) ;
2868- is_slice = true ;
2869- before_slice = false ;
2870- }
2871- }
28722870
2873- if is_slice {
2874- if self . token == token:: COMMA || self . token == token:: RBRACKET {
2875- slice = Some ( box ( GC ) ast:: Pat {
2876- id : ast:: DUMMY_NODE_ID ,
2877- node : PatWild ( PatWildMulti ) ,
2878- span : self . span ,
2879- } )
2880- } else {
2881- let subpat = self . parse_pat ( ) ;
2882- match * subpat {
2883- ast:: Pat { node : PatIdent ( _, _, _) , .. } => {
2884- slice = Some ( subpat) ;
2885- }
2886- ast:: Pat { span, .. } => self . span_fatal (
2887- span, "expected an identifier or nothing"
2888- )
2871+ if self . token == token:: COMMA ||
2872+ self . token == token:: RBRACKET {
2873+ slice = Some ( box ( GC ) ast:: Pat {
2874+ id : ast:: DUMMY_NODE_ID ,
2875+ node : PatWild ( PatWildMulti ) ,
2876+ span : self . span ,
2877+ } ) ;
2878+ before_slice = false ;
2879+ } else {
2880+ let _ = self . parse_pat ( ) ;
2881+ let span = self . span ;
2882+ self . obsolete ( span, ObsoleteSubsliceMatch ) ;
28892883 }
2884+ continue
28902885 }
2886+ }
2887+
2888+ let subpat = self . parse_pat ( ) ;
2889+ if before_slice && self . token == token:: DOTDOT {
2890+ self . bump ( ) ;
2891+ slice = Some ( subpat) ;
2892+ before_slice = false ;
2893+ } else if before_slice {
2894+ before. push ( subpat) ;
28912895 } else {
2892- let subpat = self . parse_pat ( ) ;
2893- if before_slice {
2894- before. push ( subpat) ;
2895- } else {
2896- after. push ( subpat) ;
2897- }
2896+ after. push ( subpat) ;
28982897 }
28992898 }
29002899
@@ -3065,7 +3064,11 @@ impl<'a> Parser<'a> {
30653064 // These expressions are limited to literals (possibly
30663065 // preceded by unary-minus) or identifiers.
30673066 let val = self . parse_literal_maybe_minus ( ) ;
3068- if self . eat ( & token:: DOTDOT ) {
3067+ if self . token == token:: DOTDOT &&
3068+ self . look_ahead ( 1 , |t| {
3069+ * t != token:: COMMA && * t != token:: RBRACKET
3070+ } ) {
3071+ self . bump ( ) ;
30693072 let end = if is_ident_or_path ( & self . token ) {
30703073 let path = self . parse_path ( LifetimeAndTypesWithColons )
30713074 . path ;
@@ -3106,7 +3109,10 @@ impl<'a> Parser<'a> {
31063109 }
31073110 } ) ;
31083111
3109- if self . look_ahead ( 1 , |t| * t == token:: DOTDOT ) {
3112+ if self . look_ahead ( 1 , |t| * t == token:: DOTDOT ) &&
3113+ self . look_ahead ( 2 , |t| {
3114+ * t != token:: COMMA && * t != token:: RBRACKET
3115+ } ) {
31103116 let start = self . parse_expr_res ( RESTRICT_NO_BAR_OP ) ;
31113117 self . eat ( & token:: DOTDOT ) ;
31123118 let end = self . parse_expr_res ( RESTRICT_NO_BAR_OP ) ;
0 commit comments