@@ -2631,7 +2631,7 @@ impl<'a> Parser<'a> {
2631
2631
} ;
2632
2632
self . bump ( ) ; // Eat `let` token
2633
2633
let lo = self . prev_token . span ;
2634
- let pat = self . parse_pat_allow_top_alt (
2634
+ let pat = self . parse_pat_no_top_guard (
2635
2635
None ,
2636
2636
RecoverComma :: Yes ,
2637
2637
RecoverColon :: Yes ,
@@ -2778,7 +2778,7 @@ impl<'a> Parser<'a> {
2778
2778
} ;
2779
2779
// Try to parse the pattern `for ($PAT) in $EXPR`.
2780
2780
let pat = match (
2781
- self . parse_pat_allow_top_alt (
2781
+ self . parse_pat_allow_top_guard (
2782
2782
None ,
2783
2783
RecoverComma :: Yes ,
2784
2784
RecoverColon :: Yes ,
@@ -3241,7 +3241,7 @@ impl<'a> Parser<'a> {
3241
3241
// then we should recover.
3242
3242
let mut snapshot = this. create_snapshot_for_diagnostic ( ) ;
3243
3243
let pattern_follows = snapshot
3244
- . parse_pat_allow_top_alt (
3244
+ . parse_pat_no_top_guard (
3245
3245
None ,
3246
3246
RecoverComma :: Yes ,
3247
3247
RecoverColon :: Yes ,
@@ -3315,43 +3315,37 @@ impl<'a> Parser<'a> {
3315
3315
3316
3316
fn parse_match_arm_pat_and_guard ( & mut self ) -> PResult < ' a , ( P < Pat > , Option < P < Expr > > ) > {
3317
3317
if self . token == token:: OpenDelim ( Delimiter :: Parenthesis ) {
3318
- // Detect and recover from `($pat if $cond) => $arm`.
3319
3318
let left = self . token . span ;
3320
- match self . parse_pat_allow_top_alt (
3319
+ let pat = self . parse_pat_no_top_guard (
3321
3320
None ,
3322
3321
RecoverComma :: Yes ,
3323
3322
RecoverColon :: Yes ,
3324
3323
CommaRecoveryMode :: EitherTupleOrPipe ,
3325
- ) {
3326
- Ok ( pat) => Ok ( ( pat, self . parse_match_arm_guard ( ) ?) ) ,
3327
- Err ( err)
3328
- if let prev_sp = self . prev_token . span
3329
- && let true = self . eat_keyword ( kw:: If ) =>
3330
- {
3331
- // We know for certain we've found `($pat if` so far.
3332
- let mut cond = match self . parse_match_guard_condition ( ) {
3333
- Ok ( cond) => cond,
3334
- Err ( cond_err) => {
3335
- cond_err. cancel ( ) ;
3336
- return Err ( err) ;
3337
- }
3338
- } ;
3339
- err. cancel ( ) ;
3340
- CondChecker :: new ( self ) . visit_expr ( & mut cond) ;
3341
- self . eat_to_tokens ( & [ & token:: CloseDelim ( Delimiter :: Parenthesis ) ] ) ;
3342
- self . expect ( & token:: CloseDelim ( Delimiter :: Parenthesis ) ) ?;
3343
- let right = self . prev_token . span ;
3344
- self . dcx ( ) . emit_err ( errors:: ParenthesesInMatchPat {
3345
- span : vec ! [ left, right] ,
3346
- sugg : errors:: ParenthesesInMatchPatSugg { left, right } ,
3347
- } ) ;
3348
- Ok ( ( self . mk_pat ( left. to ( prev_sp) , ast:: PatKind :: Wild ) , Some ( cond) ) )
3349
- }
3350
- Err ( err) => Err ( err) ,
3324
+ ) ?;
3325
+ if let ast:: PatKind :: Paren ( subpat) = & pat. kind
3326
+ && let ast:: PatKind :: Guard ( ..) = & subpat. kind
3327
+ {
3328
+ // Detect and recover from `($pat if $cond) => $arm`.
3329
+ // FIXME(guard_patterns): convert this to a normal guard instead
3330
+ let span = pat. span ;
3331
+ let ast:: PatKind :: Paren ( subpat) = pat. into_inner ( ) . kind else { unreachable ! ( ) } ;
3332
+ let ast:: PatKind :: Guard ( _, mut cond) = subpat. into_inner ( ) . kind else {
3333
+ unreachable ! ( )
3334
+ } ;
3335
+ self . psess . gated_spans . ungate_last ( sym:: guard_patterns, cond. span ) ;
3336
+ CondChecker :: new ( self ) . visit_expr ( & mut cond) ;
3337
+ let right = self . prev_token . span ;
3338
+ self . dcx ( ) . emit_err ( errors:: ParenthesesInMatchPat {
3339
+ span : vec ! [ left, right] ,
3340
+ sugg : errors:: ParenthesesInMatchPatSugg { left, right } ,
3341
+ } ) ;
3342
+ Ok ( ( self . mk_pat ( span, ast:: PatKind :: Wild ) , Some ( cond) ) )
3343
+ } else {
3344
+ Ok ( ( pat, self . parse_match_arm_guard ( ) ?) )
3351
3345
}
3352
3346
} else {
3353
3347
// Regular parser flow:
3354
- let pat = self . parse_pat_allow_top_alt (
3348
+ let pat = self . parse_pat_no_top_guard (
3355
3349
None ,
3356
3350
RecoverComma :: Yes ,
3357
3351
RecoverColon :: Yes ,
0 commit comments