File tree Expand file tree Collapse file tree 2 files changed +25
-0
lines changed Expand file tree Collapse file tree 2 files changed +25
-0
lines changed Original file line number Diff line number Diff line change @@ -275,6 +275,12 @@ llvm::SmallVector<Header> headersForSymbol(const Symbol &S,
275
275
// are already ranked in the stdlib mapping.
276
276
if (H.kind () == Header::Standard)
277
277
continue ;
278
+ // Don't apply name match hints to exporting headers. As they usually have
279
+ // names similar to the original header, e.g. foo_wrapper/foo.h vs
280
+ // foo/foo.h, but shouldn't be preferred (unless marked as the public
281
+ // interface).
282
+ if ((H.Hint & Hints::OriginHeader) == Hints::None)
283
+ continue ;
278
284
if (nameMatch (SymbolName, H))
279
285
H.Hint |= Hints::PreferredHeader;
280
286
}
Original file line number Diff line number Diff line change @@ -628,5 +628,24 @@ TEST_F(HeadersForSymbolTest, StandardHeaders) {
628
628
tooling::stdlib::Header::named (" <assert.h>" )));
629
629
}
630
630
631
+ TEST_F (HeadersForSymbolTest, ExporterNoNameMatch) {
632
+ Inputs.Code = R"cpp(
633
+ #include "exporter/foo.h"
634
+ #include "foo_public.h"
635
+ )cpp" ;
636
+ Inputs.ExtraArgs .emplace_back (" -I." );
637
+ // Deliberately named as foo_public to make sure it doesn't get name-match
638
+ // boost and also gets lexicographically bigger order than "exporter/foo.h".
639
+ Inputs.ExtraFiles [" foo_public.h" ] = guard (R"cpp(
640
+ struct foo {};
641
+ )cpp" );
642
+ Inputs.ExtraFiles [" exporter/foo.h" ] = guard (R"cpp(
643
+ #include "foo_public.h" // IWYU pragma: export
644
+ )cpp" );
645
+ buildAST ();
646
+ EXPECT_THAT (headersForFoo (), ElementsAre (physicalHeader (" foo_public.h" ),
647
+ physicalHeader (" exporter/foo.h" )));
648
+ }
649
+
631
650
} // namespace
632
651
} // namespace clang::include_cleaner
You can’t perform that action at this time.
0 commit comments