https://github.com/kadircet created 
https://github.com/llvm/llvm-project/pull/152142

None

From 3c36f12e451a38fc1c785abc81ac76b7b9808cf0 Mon Sep 17 00:00:00 2001
From: Kadir Cetinkaya <kadir...@google.com>
Date: Tue, 5 Aug 2025 15:52:53 +0200
Subject: [PATCH] [include-cleaner] Respect language when tracking IWYU pragmas
 on stdlib headers

---
 .../include-cleaner/lib/Record.cpp            | 10 ++++++---
 .../include-cleaner/unittests/RecordTest.cpp  | 21 +++++++++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/clang-tools-extra/include-cleaner/lib/Record.cpp 
b/clang-tools-extra/include-cleaner/lib/Record.cpp
index 4dc217d3f41da..439346143dae6 100644
--- a/clang-tools-extra/include-cleaner/lib/Record.cpp
+++ b/clang-tools-extra/include-cleaner/lib/Record.cpp
@@ -14,6 +14,7 @@
 #include "clang/Basic/FileEntry.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/LLVM.h"
+#include "clang/Basic/LangOptions.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Specifiers.h"
@@ -179,8 +180,10 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
   RecordPragma(const CompilerInstance &CI, PragmaIncludes *Out)
       : RecordPragma(CI.getPreprocessor(), Out) {}
   RecordPragma(const Preprocessor &P, PragmaIncludes *Out)
-      : SM(P.getSourceManager()), HeaderInfo(P.getHeaderSearchInfo()), 
Out(Out),
-        Arena(std::make_shared<llvm::BumpPtrAllocator>()),
+      : SM(P.getSourceManager()), HeaderInfo(P.getHeaderSearchInfo()),
+        L(P.getLangOpts().CPlusPlus ? tooling::stdlib::Lang::CXX
+                                    : tooling::stdlib::Lang::C),
+        Out(Out), Arena(std::make_shared<llvm::BumpPtrAllocator>()),
         UniqueStrings(*Arena),
         MainFileStem(llvm::sys::path::stem(
             SM.getNonBuiltinFilenameForID(SM.getMainFileID()).value_or(""))) {}
@@ -224,7 +227,7 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
     std::optional<Header> IncludedHeader;
     if (IsAngled)
       if (auto StandardHeader =
-              tooling::stdlib::Header::named("<" + FileName.str() + ">")) {
+              tooling::stdlib::Header::named("<" + FileName.str() + ">", L)) {
         IncludedHeader = *StandardHeader;
       }
     if (!IncludedHeader && File)
@@ -363,6 +366,7 @@ class PragmaIncludes::RecordPragma : public PPCallbacks, 
public CommentHandler {
   bool InMainFile = false;
   const SourceManager &SM;
   const HeaderSearch &HeaderInfo;
+  const tooling::stdlib::Lang L;
   PragmaIncludes *Out;
   std::shared_ptr<llvm::BumpPtrAllocator> Arena;
   /// Intern table for strings. Contents are on the arena.
diff --git a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
index 91d2697712b6e..c88848ed35580 100644
--- a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
@@ -18,6 +18,7 @@
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Frontend/FrontendOptions.h"
 #include "clang/Serialization/PCHContainerOperations.h"
+#include "clang/Testing/CommandLineArgs.h"
 #include "clang/Testing/TestAST.h"
 #include "clang/Tooling/Inclusions/StandardLibrary.h"
 #include "llvm/ADT/ArrayRef.h"
@@ -514,6 +515,26 @@ TEST_F(PragmaIncludeTest, IWYUExportForStandardHeaders) {
               testing::UnorderedElementsAre(FileNamed("export.h")));
 }
 
+TEST_F(PragmaIncludeTest, IWYUExportForStandardHeadersRespectsLang) {
+  Inputs.Code = R"cpp(
+    #include "export.h"
+  )cpp";
+  Inputs.Language = TestLanguage::Lang_C99;
+  Inputs.ExtraFiles["export.h"] = R"cpp(
+    #include <stdlib.h> // IWYU pragma: export
+  )cpp";
+  Inputs.ExtraFiles["stdlib.h"] = "";
+  Inputs.ExtraArgs = {"-isystem."};
+  TestAST Processed = build();
+  auto &FM = Processed.fileManager();
+  EXPECT_THAT(PI.getExporters(*tooling::stdlib::Header::named(
+                                  "<stdlib.h>", tooling::stdlib::Lang::C),
+                              FM),
+              testing::UnorderedElementsAre(FileNamed("export.h")));
+  EXPECT_THAT(PI.getExporters(llvm::cantFail(FM.getFileRef("stdlib.h")), FM),
+              testing::UnorderedElementsAre(FileNamed("export.h")));
+}
+
 TEST_F(PragmaIncludeTest, IWYUExportBlock) {
   Inputs.Code = R"cpp(// Line 1
    #include "normal.h"

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to