@@ -5,7 +5,12 @@ pub(super) const PATTERN_FIRST: TokenSet = expressions::LITERAL_FIRST
5
5
. union ( token_set ! [ REF_KW , MUT_KW , L_PAREN , L_BRACK , AMP , UNDERSCORE , MINUS ] ) ;
6
6
7
7
pub ( 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 ) ;
9
14
}
10
15
11
16
/// Parses a pattern list separated by pipes `|`
@@ -17,14 +22,14 @@ pub(super) fn pattern_list(p: &mut Parser) {
17
22
/// using the given `recovery_set`
18
23
pub ( super ) fn pattern_list_r ( p : & mut Parser , recovery_set : TokenSet ) {
19
24
p. eat ( T ! [ |] ) ;
20
- pattern_r ( p, recovery_set) ;
25
+ pattern_r ( p, recovery_set, false ) ;
21
26
22
27
while p. eat ( T ! [ |] ) {
23
- pattern_r ( p, recovery_set) ;
28
+ pattern_r ( p, recovery_set, false ) ;
24
29
}
25
30
}
26
31
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 ) {
28
33
if let Some ( lhs) = atom_pat ( p, recovery_set) {
29
34
// test range_pat
30
35
// fn main() {
@@ -38,7 +43,7 @@ pub(super) fn pattern_r(p: &mut Parser, recovery_set: TokenSet) {
38
43
let m = lhs. precede ( p) ;
39
44
let dots = p. current ( ) ;
40
45
p. bump ( ) ;
41
- if dots == T ! [ ..] && !p. at_ts ( PATTERN_FIRST ) {
46
+ if subslice_patterns && dots == T ! [ ..] && !p. at_ts ( PATTERN_FIRST ) {
42
47
m. complete ( p, SUBSLICE_PAT ) ;
43
48
} else {
44
49
atom_pat ( p, recovery_set) ;
@@ -158,7 +163,7 @@ fn tuple_pat_fields(p: &mut Parser) {
158
163
p. error ( "expected a pattern" ) ;
159
164
break ;
160
165
}
161
- pattern ( p)
166
+ pattern_with_subslice_patterns ( p) ;
162
167
}
163
168
}
164
169
if !p. at ( T ! [ ')' ] ) {
@@ -262,8 +267,7 @@ fn slice_pat(p: &mut Parser) -> CompletedMarker {
262
267
p. error ( "expected a pattern" ) ;
263
268
break ;
264
269
}
265
- pattern ( p) ;
266
- p. eat ( T ! [ ..] ) ;
270
+ pattern_with_subslice_patterns ( p) ;
267
271
}
268
272
}
269
273
if !p. at ( T ! [ ']' ] ) {
0 commit comments