From d47834ee1b8fce7956272e27c9403021940fec8e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 14 Jul 2020 18:31:48 +0200 Subject: [PATCH] Guard against infinite macro expansions closes #4463 --- crates/ra_hir_def/src/nameres/collector.rs | 5 ++++ crates/ra_hir_def/src/nameres/tests/macros.rs | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index a35ac1024b..e55cc1e55b 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs @@ -717,6 +717,11 @@ impl DefCollector<'_> { macro_call_id: MacroCallId, depth: usize, ) { + if depth > 100 { + mark::hit!(macro_expansion_overflow); + log::warn!("macro expansion is too deep"); + return; + } let file_id: HirFileId = macro_call_id.as_file(); let item_tree = self.db.item_tree(file_id); let mod_dir = self.mod_dirs[&module_id].clone(); diff --git a/crates/ra_hir_def/src/nameres/tests/macros.rs b/crates/ra_hir_def/src/nameres/tests/macros.rs index 84480d9f6c..c52341a077 100644 --- a/crates/ra_hir_def/src/nameres/tests/macros.rs +++ b/crates/ra_hir_def/src/nameres/tests/macros.rs @@ -660,3 +660,27 @@ fn expand_multiple_derive() { ); assert_eq!(map.modules[map.root].scope.impls().len(), 2); } + +#[test] +fn macro_expansion_overflow() { + mark::check!(macro_expansion_overflow); + compute_crate_def_map( + " +macro_rules! a { + ($e:expr; $($t:tt)*) => { + b!($($t)*); + }; + () => {}; +} + +macro_rules! b { + (static = $e:expr; $($t:tt)*) => { + a!($e; $($t)*); + }; + () => {}; +} + +b! { static = #[] (); } +", + ); +}