diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs index 5c81ec7ece11..0a1c23c2cc36 100644 --- a/crates/hir-def/src/expr_store/lower.rs +++ b/crates/hir-def/src/expr_store/lower.rs @@ -2431,7 +2431,7 @@ impl<'db> ExprCollector<'db> { expansion.statements().for_each(|stmt| this.collect_stmt(statements, stmt)); expansion.expr().and_then(|expr| match expr { ast::Expr::MacroExpr(mac) => this.collect_macro_as_stmt(statements, mac), - expr => Some(this.collect_expr(expr)), + expr => this.maybe_collect_expr(expr), }) } None => None, @@ -2468,8 +2468,7 @@ impl<'db> ExprCollector<'db> { if let Some(expr) = self.collect_macro_as_stmt(statements, mac) { statements.push(Statement::Expr { expr, has_semi }) } - } else { - let expr = self.collect_expr_opt(expr); + } else if let Some(expr) = expr.and_then(|expr| self.maybe_collect_expr(expr)) { statements.push(Statement::Expr { expr, has_semi }); } } diff --git a/crates/hir-def/src/expr_store/tests/body.rs b/crates/hir-def/src/expr_store/tests/body.rs index 21bb6698af77..c7b9edf3939f 100644 --- a/crates/hir-def/src/expr_store/tests/body.rs +++ b/crates/hir-def/src/expr_store/tests/body.rs @@ -706,6 +706,51 @@ fn foo() -> i64 { } #[cfg(false)] foo!() +} + "#, + expect![[r#" + fn foo() { + { + 5 + } + }"#]], + ); + pretty_print( + r#" +fn foo() -> i64 { + #[cfg(true)] + { + 5 + } + #[cfg(false)] + { + 4 + } + #[cfg(false)] + { + 3 + } +} + "#, + expect![[r#" + fn foo() { + { + 5 + } + }"#]], + ); + pretty_print( + r#" +macro_rules! m { + () => { + { 5 } + #[cfg(false)] + { 4 } + }; +} + +fn foo() -> i64 { + m!() } "#, expect![[r#"