@@ -5,7 +5,12 @@ pub(super) const PATTERN_FIRST: TokenSet = expressions::LITERAL_FIRST
55 . union ( token_set ! [ REF_KW , MUT_KW , L_PAREN , L_BRACK , AMP , UNDERSCORE , MINUS ] ) ;
66
77pub ( super ) fn pattern ( p : & mut Parser ) {
8- pattern_r ( p, PAT_RECOVERY_SET ) ;
8+ pattern_r ( p, PAT_RECOVERY_SET , false ) ;
9+ }
10+
11+ fn pattern_with_subslice_patterns ( p : & mut Parser ) {
12+ // Subslice patterns are only allowed within a slice pattern
13+ pattern_r ( p, PAT_RECOVERY_SET , true ) ;
914}
1015
1116/// Parses a pattern list separated by pipes `|`
@@ -17,14 +22,14 @@ pub(super) fn pattern_list(p: &mut Parser) {
1722/// using the given `recovery_set`
1823pub ( super ) fn pattern_list_r ( p : & mut Parser , recovery_set : TokenSet ) {
1924 p. eat ( T ! [ |] ) ;
20- pattern_r ( p, recovery_set) ;
25+ pattern_r ( p, recovery_set, false ) ;
2126
2227 while p. eat ( T ! [ |] ) {
23- pattern_r ( p, recovery_set) ;
28+ pattern_r ( p, recovery_set, false ) ;
2429 }
2530}
2631
27- pub ( super ) fn pattern_r ( p : & mut Parser , recovery_set : TokenSet ) {
32+ pub ( super ) fn pattern_r ( p : & mut Parser , recovery_set : TokenSet , subslice_patterns : bool ) {
2833 if let Some ( lhs) = atom_pat ( p, recovery_set) {
2934 // test range_pat
3035 // fn main() {
@@ -38,7 +43,7 @@ pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
3843 let m = lhs. precede ( p) ;
3944 let dots = p. current ( ) ;
4045 p. bump ( ) ;
41- if dots == T ! [ ..] && !p. at_ts ( PATTERN_FIRST ) {
46+ if subslice_patterns && dots == T ! [ ..] && !p. at_ts ( PATTERN_FIRST ) {
4247 m. complete ( p, SUBSLICE_PAT ) ;
4348 } else {
4449 atom_pat ( p, recovery_set) ;
@@ -158,7 +163,7 @@ fn tuple_pat_fields(p: &mut Parser) {
158163 p. error ( "expected a pattern" ) ;
159164 break ;
160165 }
161- pattern ( p)
166+ pattern_with_subslice_patterns ( p) ;
162167 }
163168 }
164169 if !p. at ( T ! [ ')' ] ) {
@@ -262,8 +267,7 @@ fn slice_pat(p: &mut Parser) -> CompletedMarker {
262267 p. error ( "expected a pattern" ) ;
263268 break ;
264269 }
265- pattern ( p) ;
266- p. eat ( T ! [ ..] ) ;
270+ pattern_with_subslice_patterns ( p) ;
267271 }
268272 }
269273 if !p. at ( T ! [ ']' ] ) {
0 commit comments