Allow stuct literals in if let guards

This is consistent with normal match guards.
This commit is contained in:
Matthew Jasper 2023-08-28 10:31:45 +01:00
parent 56c17dc280
commit 89235fd837
2 changed files with 4 additions and 3 deletions

View File

@ -2477,9 +2477,7 @@ fn parse_expr_let(&mut self) -> PResult<'a, P<Expr>> {
} else {
self.expect(&token::Eq)?;
}
let expr = self.with_res(self.restrictions | Restrictions::NO_STRUCT_LITERAL, |this| {
this.parse_expr_assoc_with(1 + prec_let_scrutinee_needs_par(), None.into())
})?;
let expr = self.parse_expr_assoc_with(1 + prec_let_scrutinee_needs_par(), None.into())?;
let span = lo.to(expr.span);
self.sess.gated_spans.gate(sym::let_chains, span);
Ok(self.mk_expr(span, ExprKind::Let(pat, expr, span)))

View File

@ -3,6 +3,8 @@
// Unlike `if` condition, `match` guards accept struct literals.
// This is detected in <https://github.com/rust-lang/rust/pull/74566#issuecomment-663613705>.
#![feature(if_let_guard)]
#[derive(PartialEq)]
struct Foo {
x: isize,
@ -11,6 +13,7 @@ struct Foo {
fn foo(f: Foo) {
match () {
() if f == Foo { x: 42 } => {}
() if let Foo { x: 0.. } = Foo { x: 42 } => {}
_ => {}
}
}