Skip to content

Commit 49ea3ae

Browse files
committed
[include-cleaner] Make sure exports of stdlib also works for physical files
This was creating discrepancy in cases where we might have a physical file entry (e.g. because we followed a source location from a stdlib file) and tried to find its exporters.
1 parent e582fe6 commit 49ea3ae

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

clang-tools-extra/include-cleaner/lib/Record.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,17 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, public CommentHandler {
232232
void checkForExport(FileID IncludingFile, int HashLine,
233233
std::optional<Header> IncludedHeader,
234234
OptionalFileEntryRef IncludedFile) {
235+
auto AddExport = [&] {
236+
auto ExportingFileName = SM.getFileEntryForID(IncludingFile)->getName();
237+
if (IncludedFile) {
238+
Out->IWYUExportBy[IncludedFile->getUniqueID()].push_back(
239+
ExportingFileName);
240+
}
241+
if (IncludedHeader && IncludedHeader->kind() == Header::Standard) {
242+
Out->StdIWYUExportBy[IncludedHeader->standard()].push_back(
243+
ExportingFileName);
244+
}
245+
};
235246
if (ExportStack.empty())
236247
return;
237248
auto &Top = ExportStack.back();
@@ -240,20 +251,7 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, public CommentHandler {
240251
// Make sure current include is covered by the export pragma.
241252
if ((Top.Block && HashLine > Top.SeenAtLine) ||
242253
Top.SeenAtLine == HashLine) {
243-
if (IncludedHeader) {
244-
switch (IncludedHeader->kind()) {
245-
case Header::Physical:
246-
Out->IWYUExportBy[IncludedHeader->physical().getUniqueID()]
247-
.push_back(Top.Path);
248-
break;
249-
case Header::Standard:
250-
Out->StdIWYUExportBy[IncludedHeader->standard()].push_back(Top.Path);
251-
break;
252-
case Header::Verbatim:
253-
assert(false && "unexpected Verbatim header");
254-
break;
255-
}
256-
}
254+
AddExport();
257255
// main-file #include with export pragma should never be removed.
258256
if (Top.SeenAtFile == SM.getMainFileID() && IncludedFile)
259257
Out->ShouldKeep.insert(IncludedFile->getUniqueID());

clang-tools-extra/include-cleaner/unittests/RecordTest.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,8 @@ TEST_F(PragmaIncludeTest, IWYUExportForStandardHeaders) {
452452
auto &FM = Processed.fileManager();
453453
EXPECT_THAT(PI.getExporters(*tooling::stdlib::Header::named("<string>"), FM),
454454
testing::UnorderedElementsAre(FileNamed("export.h")));
455+
EXPECT_THAT(PI.getExporters(llvm::cantFail(FM.getFileRef("string")), FM),
456+
testing::UnorderedElementsAre(FileNamed("export.h")));
455457
}
456458

457459
TEST_F(PragmaIncludeTest, IWYUExportBlock) {

0 commit comments

Comments
 (0)