@@ -2858,43 +2858,42 @@ impl<'a> Parser<'a> {
2858
2858
let mut before_slice = true ;
2859
2859
2860
2860
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
+ }
2863
2866
2864
- let mut is_slice = false ;
2865
2867
if before_slice {
2866
2868
if self . token == token:: DOTDOT {
2867
2869
self . bump ( ) ;
2868
- is_slice = true ;
2869
- before_slice = false ;
2870
- }
2871
- }
2872
2870
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 ) ;
2889
2883
}
2884
+ continue
2890
2885
}
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) ;
2891
2895
} 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) ;
2898
2897
}
2899
2898
}
2900
2899
@@ -3065,7 +3064,11 @@ impl<'a> Parser<'a> {
3065
3064
// These expressions are limited to literals (possibly
3066
3065
// preceded by unary-minus) or identifiers.
3067
3066
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 ( ) ;
3069
3072
let end = if is_ident_or_path ( & self . token ) {
3070
3073
let path = self . parse_path ( LifetimeAndTypesWithColons )
3071
3074
. path ;
@@ -3106,7 +3109,10 @@ impl<'a> Parser<'a> {
3106
3109
}
3107
3110
} ) ;
3108
3111
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
+ } ) {
3110
3116
let start = self . parse_expr_res ( RESTRICT_NO_BAR_OP ) ;
3111
3117
self . eat ( & token:: DOTDOT ) ;
3112
3118
let end = self . parse_expr_res ( RESTRICT_NO_BAR_OP ) ;
0 commit comments