Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/body/lower.rs')
| -rw-r--r-- | crates/hir-def/src/body/lower.rs | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/crates/hir-def/src/body/lower.rs b/crates/hir-def/src/body/lower.rs index e188d80eb8..049afa8227 100644 --- a/crates/hir-def/src/body/lower.rs +++ b/crates/hir-def/src/body/lower.rs @@ -690,12 +690,26 @@ impl ExprCollector<'_> { let prev_def_map = mem::replace(&mut self.expander.def_map, def_map); let prev_local_module = mem::replace(&mut self.expander.module, module); - let statements = block.statements().filter_map(|s| self.collect_stmt(s)).collect(); + let mut statements: Vec<_> = + block.statements().filter_map(|s| self.collect_stmt(s)).collect(); let tail = block.tail_expr().and_then(|e| self.maybe_collect_expr(e)); + let tail = tail.or_else(|| { + let stmt = statements.pop()?; + if let Statement::Expr { expr, has_semi: false } = stmt { + return Some(expr); + } + statements.push(stmt); + None + }); let syntax_node_ptr = AstPtr::new(&block.into()); let expr_id = self.alloc_expr( - Expr::Block { id: block_id, statements, tail, label: None }, + Expr::Block { + id: block_id, + statements: statements.into_boxed_slice(), + tail, + label: None, + }, syntax_node_ptr, ); |