@@ -21,7 +21,8 @@ const RANGE_PAT_END_FIRST: TokenSet =
21
21
expressions:: LITERAL_FIRST . union ( paths:: PATH_FIRST ) . union ( TokenSet :: new ( & [ T ! [ -] , T ! [ const ] ] ) ) ;
22
22
23
23
pub ( crate ) fn pattern ( p : & mut Parser < ' _ > ) {
24
- pattern_r ( p, PAT_RECOVERY_SET ) ;
24
+ let m = p. start ( ) ;
25
+ pattern_r ( p, m, false , PAT_RECOVERY_SET ) ;
25
26
}
26
27
27
28
/// Parses a pattern list separated by pipes `|`.
@@ -36,8 +37,9 @@ pub(crate) fn pattern_single(p: &mut Parser<'_>) {
36
37
/// Parses a pattern list separated by pipes `|`
37
38
/// using the given `recovery_set`.
38
39
pub ( super ) fn pattern_top_r ( p : & mut Parser < ' _ > , recovery_set : TokenSet ) {
39
- p. eat ( T ! [ |] ) ;
40
- pattern_r ( p, recovery_set) ;
40
+ let m = p. start ( ) ;
41
+ let has_leading_pipe = p. eat ( T ! [ |] ) ;
42
+ pattern_r ( p, m, has_leading_pipe, recovery_set) ;
41
43
}
42
44
43
45
// test or_pattern
@@ -51,11 +53,10 @@ pub(super) fn pattern_top_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
51
53
// }
52
54
/// Parses a pattern list separated by pipes `|`, with no leading `|`,using the
53
55
/// given `recovery_set`.
54
- fn pattern_r ( p : & mut Parser < ' _ > , recovery_set : TokenSet ) {
55
- let m = p. start ( ) ;
56
+ fn pattern_r ( p : & mut Parser < ' _ > , m : Marker , has_leading_pipe : bool , recovery_set : TokenSet ) {
56
57
pattern_single_r ( p, recovery_set) ;
57
58
58
- if !p. at ( T ! [ |] ) {
59
+ if !p. at ( T ! [ |] ) && !has_leading_pipe {
59
60
m. abandon ( p) ;
60
61
return ;
61
62
}
0 commit comments