From f0637e4e185e8c3dda694004d1dfd31126ed1fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Fri, 19 Feb 2021 17:00:31 -0800 Subject: [PATCH] Lower condition of `if` expression before it's "then" block Fix #82290, fix #82250. --- compiler/rustc_ast_lowering/src/expr.rs | 3 ++- src/test/ui/pattern/issue-82290.rs | 7 +++++++ src/test/ui/pattern/issue-82290.stderr | 20 ++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/pattern/issue-82290.rs create mode 100644 src/test/ui/pattern/issue-82290.stderr diff --git a/compiler/rustc_ast_lowering/src/expr.rs b/compiler/rustc_ast_lowering/src/expr.rs index b118c0eaed4f3..6d44feec2c496 100644 --- a/compiler/rustc_ast_lowering/src/expr.rs +++ b/compiler/rustc_ast_lowering/src/expr.rs @@ -347,8 +347,9 @@ impl<'hir> LoweringContext<'_, 'hir> { ) -> hir::ExprKind<'hir> { macro_rules! make_if { ($opt:expr) => {{ + let cond = self.lower_expr(cond); let then_expr = self.lower_block_expr(then); - hir::ExprKind::If(self.lower_expr(cond), self.arena.alloc(then_expr), $opt) + hir::ExprKind::If(cond, self.arena.alloc(then_expr), $opt) }}; } if let Some(rslt) = else_opt { diff --git a/src/test/ui/pattern/issue-82290.rs b/src/test/ui/pattern/issue-82290.rs new file mode 100644 index 0000000000000..67f0274fe7436 --- /dev/null +++ b/src/test/ui/pattern/issue-82290.rs @@ -0,0 +1,7 @@ +#![feature(let_chains)] //~ WARN the feature `let_chains` is incomplete + +fn main() { + if true && let x = 1 { //~ ERROR `let` expressions are not supported here + let _ = x; + } +} diff --git a/src/test/ui/pattern/issue-82290.stderr b/src/test/ui/pattern/issue-82290.stderr new file mode 100644 index 0000000000000..65ef018dc9737 --- /dev/null +++ b/src/test/ui/pattern/issue-82290.stderr @@ -0,0 +1,20 @@ +error: `let` expressions are not supported here + --> $DIR/issue-82290.rs:4:16 + | +LL | if true && let x = 1 { + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +warning: the feature `let_chains` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-82290.rs:1:12 + | +LL | #![feature(let_chains)] + | ^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53667 for more information + +error: aborting due to previous error; 1 warning emitted +