diff --git a/crates/hir_expand/src/eager.rs b/crates/hir_expand/src/eager.rs index 6354b090d8..ae7b51a088 100644 --- a/crates/hir_expand/src/eager.rs +++ b/crates/hir_expand/src/eager.rs @@ -218,6 +218,12 @@ fn eager_macro_recur( } }; + // check if the whole original sytnax is replaced + // Note that SyntaxRewriter cannot replace the root node itself + if child.syntax() == &original { + return Ok(insert); + } + rewriter.replace(child.syntax(), &insert); } diff --git a/crates/hir_ty/src/tests/macros.rs b/crates/hir_ty/src/tests/macros.rs index 23b79abc45..c64f0b5b53 100644 --- a/crates/hir_ty/src/tests/macros.rs +++ b/crates/hir_ty/src/tests/macros.rs @@ -570,6 +570,52 @@ fn bar() -> u32 {0} ); } +#[test] +fn infer_builtin_macros_include_str() { + check_types( + r#" +//- /main.rs +#[rustc_builtin_macro] +macro_rules! include_str {() => {}} + +fn main() { + let a = include_str!("foo.rs"); + a; +} //^ &str + +//- /foo.rs +hello +"#, + ); +} + +#[test] +fn infer_builtin_macros_include_str_with_lazy_nested() { + check_types( + r#" +//- /main.rs +#[rustc_builtin_macro] +macro_rules! concat {() => {}} +#[rustc_builtin_macro] +macro_rules! include_str {() => {}} + +macro_rules! m { + ($x:expr) => { + concat!("foo", $x) + }; +} + +fn main() { + let a = include_str!(m!(".rs")); + a; +} //^ &str + +//- /foo.rs +hello +"#, + ); +} + #[test] #[ignore] fn include_accidentally_quadratic() {