Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres/collector.rs')
-rw-r--r--crates/hir-def/src/nameres/collector.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index e09ef4f205..7f1d19719d 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -6,7 +6,7 @@
use std::{cmp::Ordering, iter, mem, ops::Not};
use base_db::{CrateId, CrateOrigin, Dependency, LangCrateOrigin};
-use cfg::{CfgExpr, CfgOptions};
+use cfg::{CfgAtom, CfgExpr, CfgOptions};
use either::Either;
use hir_expand::{
attrs::{Attr, AttrId},
@@ -1324,13 +1324,21 @@ impl DefCollector<'_> {
};
// Skip #[test]/#[bench] expansion, which would merely result in more memory usage
- // due to duplicating functions into macro expansions
+ // due to duplicating functions into macro expansions, but only if `cfg(test)` is active,
+ // otherwise they are expanded to nothing and this can impact e.g. diagnostics (due to things
+ // being cfg'ed out).
+ // Ideally we will just expand them to nothing here. But we are only collecting macro calls,
+ // not expanding them, so we have no way to do that.
if matches!(
def.kind,
MacroDefKind::BuiltInAttr(_, expander)
if expander.is_test() || expander.is_bench()
) {
- return recollect_without(self);
+ let test_is_active =
+ self.cfg_options.check_atom(&CfgAtom::Flag(sym::test.clone()));
+ if test_is_active {
+ return recollect_without(self);
+ }
}
let call_id = || {