mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-15 01:17:27 +00:00
Auto merge of #13027 - jonas-schievink:fix-mismatch-with-trailing-empty-macro, r=jonas-schievink
fix: Fix incorrect type mismatch with `cfg_if!` and other macros in expression position Fixes https://github.com/rust-lang/rust-analyzer/issues/12940 This is a bit of a hack, ideally `MacroStmts` would not exist at all after HIR lowering, but that requires changing how the lowering code works.
This commit is contained in:
commit
3903243192
2 changed files with 26 additions and 1 deletions
|
@ -551,9 +551,17 @@ impl ExprCollector<'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast::Expr::MacroStmts(e) => {
|
ast::Expr::MacroStmts(e) => {
|
||||||
let statements = e.statements().filter_map(|s| self.collect_stmt(s)).collect();
|
let statements: Box<[_]> =
|
||||||
|
e.statements().filter_map(|s| self.collect_stmt(s)).collect();
|
||||||
let tail = e.expr().map(|e| self.collect_expr(e));
|
let tail = e.expr().map(|e| self.collect_expr(e));
|
||||||
|
|
||||||
|
if e.syntax().children().next().is_none() {
|
||||||
|
// HACK: make sure that macros that expand to nothing aren't treated as a `()`
|
||||||
|
// expression when used in block tail position.
|
||||||
|
cov_mark::hit!(empty_macro_in_trailing_position_is_removed);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
self.alloc_expr(Expr::MacroStmts { tail, statements }, syntax_ptr)
|
self.alloc_expr(Expr::MacroStmts { tail, statements }, syntax_ptr)
|
||||||
}
|
}
|
||||||
ast::Expr::UnderscoreExpr(_) => self.alloc_expr(Expr::Underscore, syntax_ptr),
|
ast::Expr::UnderscoreExpr(_) => self.alloc_expr(Expr::Underscore, syntax_ptr),
|
||||||
|
|
|
@ -1648,3 +1648,20 @@ fn main() {
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn trailing_empty_macro() {
|
||||||
|
cov_mark::check!(empty_macro_in_trailing_position_is_removed);
|
||||||
|
check_no_mismatches(
|
||||||
|
r#"
|
||||||
|
macro_rules! m2 {
|
||||||
|
($($t:tt)*) => {$($t)*};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn macrostmts() -> u8 {
|
||||||
|
m2! { 0 }
|
||||||
|
m2! {}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue