mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Introduce if-let guards in the HIR
This commit is contained in:
parent
a68864b688
commit
77d80b22f1
@ -505,14 +505,19 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
}
|
||||
|
||||
fn lower_arm(&mut self, arm: &Arm) -> hir::Arm<'hir> {
|
||||
let pat = self.lower_pat(&arm.pat);
|
||||
let guard = arm.guard.as_ref().map(|cond| {
|
||||
if let ExprKind::Let(ref pat, ref scrutinee) = cond.kind {
|
||||
hir::Guard::IfLet(self.lower_pat(pat), self.lower_expr(scrutinee))
|
||||
} else {
|
||||
hir::Guard::If(self.lower_expr(cond))
|
||||
}
|
||||
});
|
||||
hir::Arm {
|
||||
hir_id: self.next_id(),
|
||||
attrs: self.lower_attrs(&arm.attrs),
|
||||
pat: self.lower_pat(&arm.pat),
|
||||
guard: match arm.guard {
|
||||
Some(ref x) => Some(hir::Guard::If(self.lower_expr(x))),
|
||||
_ => None,
|
||||
},
|
||||
pat,
|
||||
guard,
|
||||
body: self.lower_expr(&arm.body),
|
||||
span: arm.span,
|
||||
}
|
||||
|
@ -1160,6 +1160,7 @@ pub struct Arm<'hir> {
|
||||
#[derive(Debug, HashStable_Generic)]
|
||||
pub enum Guard<'hir> {
|
||||
If(&'hir Expr<'hir>),
|
||||
IfLet(&'hir Pat<'hir>, &'hir Expr<'hir>),
|
||||
}
|
||||
|
||||
#[derive(Debug, HashStable_Generic)]
|
||||
|
@ -1228,6 +1228,10 @@ pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm<'v>) {
|
||||
if let Some(ref g) = arm.guard {
|
||||
match g {
|
||||
Guard::If(ref e) => visitor.visit_expr(e),
|
||||
Guard::IfLet(ref pat, ref e) => {
|
||||
visitor.visit_pat(pat);
|
||||
visitor.visit_expr(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
visitor.visit_expr(&arm.body);
|
||||
|
@ -2002,6 +2002,15 @@ impl<'a> State<'a> {
|
||||
self.print_expr(&e);
|
||||
self.s.space();
|
||||
}
|
||||
hir::Guard::IfLet(pat, e) => {
|
||||
self.word_nbsp("if");
|
||||
self.word_nbsp("let");
|
||||
self.print_pat(&pat);
|
||||
self.s.space();
|
||||
self.word_space("=");
|
||||
self.print_expr(&e);
|
||||
self.s.space();
|
||||
}
|
||||
}
|
||||
}
|
||||
self.word_space("=>");
|
||||
|
@ -6,7 +6,6 @@ fn _if_let_guard() {
|
||||
match () {
|
||||
() if let 0 = 1 => {}
|
||||
//~^ ERROR `if let` guard is not implemented
|
||||
//~| ERROR `let` expressions are not supported here
|
||||
|
||||
() if (let 0 = 1) => {}
|
||||
//~^ ERROR `let` expressions in this position are experimental
|
||||
|
@ -169,15 +169,6 @@ LL | use_expr!((let 0 = 1));
|
||||
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
|
||||
= help: add `#![feature(let_chains)]` to the crate attributes to enable
|
||||
|
||||
error: `let` expressions are not supported here
|
||||
--> $DIR/feature-gate.rs:7:15
|
||||
|
|
||||
LL | () if let 0 = 1 => {}
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: only supported directly in conditions of `if`- and `while`-expressions
|
||||
= note: as well as when nested within `&&` and parenthesis in those conditions
|
||||
|
||||
error: `let` expressions are not supported here
|
||||
--> $DIR/feature-gate.rs:11:16
|
||||
|
|
||||
|
Loading…
Reference in New Issue
Block a user