[clang-tools-extra] [clang-tidy] New portability-avoid-pragma-comment (PR #215239)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 20 05:59:41 PDT 2026
https://github.com/t-a-james updated https://github.com/llvm/llvm-project/pull/215239
>From 5c76f8d1f42b643dc4f6a8b912d798af210e745a Mon Sep 17 00:00:00 2001
From: Tom James <tom.james at siemens.com>
Date: Mon, 10 Aug 2026 11:52:40 +0100
Subject: [PATCH 1/7] [clang-tidy] New portability-avoid-pragma-comment
Finds uses of `#pragma comment` and, for `lib` or `linker` comments,
suggests using the build system for improved portability.
`#pragma comment` is not widely supported outside of MSVC. Clang
supports the use of `#pragma comment` to link libraries on both Windows
and Linux, but other kinds are only supported on Windows. Using `pragma
comment` to change link flags may be unexpected in projects that prefer
to set these flags in the build system.
---
.../portability/AvoidPragmaCommentCheck.cpp | 50 +++++++++++++++++++
.../portability/AvoidPragmaCommentCheck.h | 37 ++++++++++++++
.../clang-tidy/portability/CMakeLists.txt | 1 +
.../portability/PortabilityTidyModule.cpp | 3 ++
clang-tools-extra/docs/ReleaseNotes.md | 6 +++
.../docs/clang-tidy/checks/list.md | 1 +
.../portability/avoid-pragma-comment.rst | 23 +++++++++
.../avoid-pragma-comment-linux.cpp | 21 ++++++++
.../avoid-pragma-comment-windows.cpp | 42 ++++++++++++++++
9 files changed, 184 insertions(+)
create mode 100644 clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp
create mode 100644 clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h
create mode 100644 clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp
diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp
new file mode 100644
index 0000000000000..1b2f5d92687b8
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp
@@ -0,0 +1,50 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "AvoidPragmaCommentCheck.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+
+#include <string>
+
+using namespace clang::ast_matchers;
+
+namespace clang::tidy::portability {
+
+static const internal::VariadicDynCastAllOfMatcher<Decl, PragmaCommentDecl>
+ // All other node matchers declared in this way are camelCase
+ // NOLINTNEXTLINE(readability-identifier-naming)
+ pragmaCommentDecl;
+
+void AvoidPragmaCommentCheck::registerMatchers(MatchFinder *Finder) {
+ Finder->addMatcher(pragmaCommentDecl().bind("pragma"), this);
+}
+
+void AvoidPragmaCommentCheck::check(const MatchFinder::MatchResult &Result) {
+ const auto *Pragma = Result.Nodes.getNodeAs<PragmaCommentDecl>("pragma");
+
+ std::string Msg{"avoid 'pragma comment' directive"};
+
+ // We can give specific advice about comments that add linker flags, but other
+ // kinds are too generic
+ const PragmaMSCommentKind &Kind = Pragma->getCommentKind();
+ switch (Kind) {
+ case PragmaMSCommentKind::PCK_Lib:
+ Msg.append("; use the build system to link libraries");
+ break;
+ case PragmaMSCommentKind::PCK_Linker:
+ Msg.append("; use the build system to set linker options");
+ break;
+ case PragmaMSCommentKind::PCK_Unknown:
+ llvm_unreachable("unexpected pragma comment kind");
+ default:
+ break;
+ }
+ diag(Pragma->getBeginLoc(), Msg);
+}
+
+} // namespace clang::tidy::portability
diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h
new file mode 100644
index 0000000000000..47f326374b97a
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_AVOIDPRAGMACOMMENTCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_AVOIDPRAGMACOMMENTCHECK_H
+
+#include "../ClangTidyCheck.h"
+
+namespace clang::tidy::portability {
+
+/// Finds uses of ``#pragma comment`` and for ``lib`` or ``linker`` comments
+/// suggests using the build system for improved portability.
+///
+/// Only the "lib" pragma comment type is implemented on Linux, the rest are
+/// Windows-only and should be caught by "-Wunknown-pragmas" on Linux.
+///
+/// For the user-facing documentation see:
+/// https://clang.llvm.org/extra/clang-tidy/checks/portability/avoid-pragma-comment.html
+class AvoidPragmaCommentCheck : public ClangTidyCheck {
+public:
+ AvoidPragmaCommentCheck(StringRef Name, ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context) {}
+ void registerMatchers(ast_matchers::MatchFinder *Finder) override;
+ void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+ bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
+ return LangOpts.CPlusPlus;
+ }
+};
+
+} // namespace clang::tidy::portability
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_AVOIDPRAGMACOMMENTCHECK_H
diff --git a/clang-tools-extra/clang-tidy/portability/CMakeLists.txt b/clang-tools-extra/clang-tidy/portability/CMakeLists.txt
index 170fedf52130e..f9bcb149b8145 100644
--- a/clang-tools-extra/clang-tidy/portability/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/portability/CMakeLists.txt
@@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS
)
add_clang_library(clangTidyPortabilityModule STATIC
+ AvoidPragmaCommentCheck.cpp
AvoidPragmaOnceCheck.cpp
NoAssemblerCheck.cpp
PortabilityTidyModule.cpp
diff --git a/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
index 1f2340502f685..c12ef3d20e871 100644
--- a/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
@@ -8,6 +8,7 @@
#include "../ClangTidy.h"
#include "../ClangTidyModule.h"
+#include "AvoidPragmaCommentCheck.h"
#include "AvoidPragmaOnceCheck.h"
#include "NoAssemblerCheck.h"
#include "RestrictSystemIncludesCheck.h"
@@ -22,6 +23,8 @@ namespace {
class PortabilityModule : public ClangTidyModule {
public:
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
+ CheckFactories.registerCheck<AvoidPragmaCommentCheck>(
+ "portability-avoid-pragma-comment");
CheckFactories.registerCheck<AvoidPragmaOnceCheck>(
"portability-avoid-pragma-once");
CheckFactories.registerCheck<NoAssemblerCheck>("portability-no-assembler");
diff --git a/clang-tools-extra/docs/ReleaseNotes.md b/clang-tools-extra/docs/ReleaseNotes.md
index 29de9aef9e4b6..0f1dcf1ed20de 100644
--- a/clang-tools-extra/docs/ReleaseNotes.md
+++ b/clang-tools-extra/docs/ReleaseNotes.md
@@ -106,6 +106,12 @@ infrastructure are described first, followed by tool-specific sections.
Finds calls to `value_or` (and alternative spellings `valueOr`,
`ValueOr`) on optional types where the return type is expensive to copy.
+- New {doc}`portability-avoid-pragma-comment
+ <clang-tidy/checks/portability/avoid-pragma-comment>` check.
+
+ Finds uses of `#pragma comment` and, for `lib` or `linker` comments, suggests
+ using the build system for improved portability.
+
#### New check aliases
#### Changes in existing checks
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.md b/clang-tools-extra/docs/clang-tidy/checks/list.md
index 77c9eafa7835c..5d279824714e7 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.md
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.md
@@ -372,6 +372,7 @@ readability/*
| {doc}`performance-unnecessary-copy-initialization <performance/unnecessary-copy-initialization>` | Yes |
| {doc}`performance-unnecessary-value-param <performance/unnecessary-value-param>` | Yes |
| {doc}`performance-use-std-move <performance/use-std-move>` | Yes |
+| {doc}`portability-avoid-pragma-comment <portability/avoid-pragma-comment>` | |
| {doc}`portability-avoid-pragma-once <portability/avoid-pragma-once>` | |
| {doc}`portability-no-assembler <portability/no-assembler>` | |
| {doc}`portability-restrict-system-includes <portability/restrict-system-includes>` | Yes |
diff --git a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
new file mode 100644
index 0000000000000..d38541710ac3c
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
@@ -0,0 +1,23 @@
+.. title:: clang-tidy - portability-avoid-pragma-comment
+
+portability-avoid-pragma-comment
+================================
+
+Finds uses of ``#pragma comment`` and, for ``lib`` or ``linker`` comments,
+suggests using the build system for improved portability.
+
+``#pragma comment`` is not widely supported outside of MSVC. Clang supports the
+use of ``#pragma comment`` to link libraries on both Windows and Linux, but
+other kinds are only supported on Windows. Using ``pragma comment`` to change
+link flags may be unexpected in projects that prefer to set these flags in the
+build system.
+
+.. code:: c++
+ // Clang supports the `lib` kind on Windows and Linux, but setting link flags
+ // outside the build system may be unexpected
+ #pragma comment(lib, "some_lib")
+ #pragma comment(linker, "some_linker_flag")
+
+ // Clang only supports the `compiler` and `user` kinds when targeting Windows
+ #pragma comment(compiler)
+ #pragma comment(user, "Some string")
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp
new file mode 100644
index 0000000000000..165371be06933
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp
@@ -0,0 +1,21 @@
+// Only the "lib" pragma comment type is implemented on Linux, the rest are
+// Windows-only. Therefore, this file always targets linux.
+// RUN: %check_clang_tidy %s portability-avoid-pragma-comment %t -- -- -target x86_64-unknown-linux-gnu
+
+#pragma comment(lib, "some_lib")
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+_Pragma("comment(lib, \"some_lib\")")
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+// Only the "lib" pragma comment type is implemented on Linux, the rest are
+// Windows-only and should be caught by "-Wunknown-pragmas" or
+// "-Wignored-pragmas" on Linux. They won't show up in the Linux AST, so
+// portability-avoid-pragma-comment won't detect the below instances.
+#pragma comment(linker, "some_linker_flag")
+#pragma comment(compiler)
+#pragma comment(user, "Some string")
+
+_Pragma("comment(linker, \"some_linker_flag\")")
+_Pragma("comment(compiler)")
+_Pragma("comment(user, \"Some string\")")
diff --git a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp
new file mode 100644
index 0000000000000..24166898c0691
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp
@@ -0,0 +1,42 @@
+// Only the "lib" pragma comment type is implemented on Linux, the rest are
+// Windows-only. Therefore, this file always targets windows-msvc.
+// RUN: %check_clang_tidy %s portability-avoid-pragma-comment %t -- -- -target x86_64-pc-windows-msvc
+
+
+#pragma comment(lib, "some_lib")
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+_Pragma("comment(lib, \"some_lib\")")
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+
+#pragma comment(linker, "some_linker_flag")
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
+
+#pragma comment(compiler)
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+#pragma comment(user, "Some string")
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+// __pragma() is a Microsoft-specific extension
+__pragma(comment(lib, "some_lib"))
+// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+__pragma(comment(linker, "some_linker_flag"))
+// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
+
+__pragma(comment(compiler))
+// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+__pragma(comment(user, "Some string"))
+// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+_Pragma("comment(linker, \"some_linker_flag\")")
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
+
+_Pragma("comment(compiler)")
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+_Pragma("comment(user, \"Some string\")")
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
\ No newline at end of file
>From f9246260b9c5192dcd1402910d1699494cf80bd2 Mon Sep 17 00:00:00 2001
From: Tom James <tom.james at siemens.com>
Date: Mon, 10 Aug 2026 12:22:37 +0100
Subject: [PATCH 2/7] fixup! [clang-tidy] New portability-avoid-pragma-comment
---
.../checks/portability/avoid-pragma-comment.rst | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
index d38541710ac3c..8fcc9146d2003 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
@@ -13,11 +13,12 @@ link flags may be unexpected in projects that prefer to set these flags in the
build system.
.. code:: c++
- // Clang supports the `lib` kind on Windows and Linux, but setting link flags
- // outside the build system may be unexpected
- #pragma comment(lib, "some_lib")
- #pragma comment(linker, "some_linker_flag")
- // Clang only supports the `compiler` and `user` kinds when targeting Windows
- #pragma comment(compiler)
- #pragma comment(user, "Some string")
\ No newline at end of file
+ // Clang supports the `lib` kind on Windows and Linux, but setting link flags
+ // outside the build system may be unexpected
+ #pragma comment(lib, "some_lib")
+ #pragma comment(linker, "some_linker_flag")
+
+ // Clang only supports the `compiler` and `user` kinds when targeting Windows
+ #pragma comment(compiler)
+ #pragma comment(user, "Some string")
\ No newline at end of file
>From 91dddd69a8d9aa8f76cf85d735f1da6dff8134ad Mon Sep 17 00:00:00 2001
From: Tom James <tom.james at siemens.com>
Date: Mon, 10 Aug 2026 12:36:02 +0100
Subject: [PATCH 3/7] fixup! [clang-tidy] New portability-avoid-pragma-comment
---
.../docs/clang-tidy/checks/portability/avoid-pragma-comment.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
index 8fcc9146d2003..2e333ab726a54 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
@@ -21,4 +21,4 @@ build system.
// Clang only supports the `compiler` and `user` kinds when targeting Windows
#pragma comment(compiler)
- #pragma comment(user, "Some string")
\ No newline at end of file
+ #pragma comment(user, "Some string")
>From a1d50fc52c44beb8dee8c1a3ea473f3700bd3e98 Mon Sep 17 00:00:00 2001
From: Tom James <tom.james at siemens.com>
Date: Mon, 10 Aug 2026 15:48:04 +0100
Subject: [PATCH 4/7] fixup! [clang-tidy] New portability-avoid-pragma-comment
---
.../clang-tidy/portability/AvoidPragmaCommentCheck.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h
index 47f326374b97a..8f11f9399f248 100644
--- a/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.h
@@ -28,7 +28,7 @@ class AvoidPragmaCommentCheck : public ClangTidyCheck {
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
- return LangOpts.CPlusPlus;
+ return LangOpts.CPlusPlus || LangOpts.C99;
}
};
>From 6dec90248926487b3c4bb0fbd04130e7d21c175f Mon Sep 17 00:00:00 2001
From: Tom James <tom.james at siemens.com>
Date: Mon, 10 Aug 2026 17:06:00 +0100
Subject: [PATCH 5/7] fixup! [clang-tidy] New portability-avoid-pragma-comment
---
.../portability/avoid-pragma-comment.md | 24 +++++++++++++++++++
.../portability/avoid-pragma-comment.rst | 24 -------------------
2 files changed, 24 insertions(+), 24 deletions(-)
create mode 100644 clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.md
delete mode 100644 clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
diff --git a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.md b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.md
new file mode 100644
index 0000000000000..46a43b6a2396e
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.md
@@ -0,0 +1,24 @@
+```{title} clang-tidy - portability-avoid-pragma-comment
+```
+
+# portability-avoid-pragma-comment
+
+Finds uses of `#pragma comment` and, for `lib` or `linker` comments, suggests
+using the build system for improved portability.
+
+`#pragma comment` is not widely supported outside of MSVC. Clang supports the
+use of `#pragma comment` to link libraries on both Windows and Linux, but other
+kinds are only supported on Windows. Using `pragma comment` to change link flags
+may be unexpected in projects that prefer to set these flags in the build
+system.
+
+```c++
+// Clang supports the `lib` kind on Windows and Linux, but setting link flags
+// outside the build system may be unexpected
+#pragma comment(lib, "some_lib")
+#pragma comment(linker, "some_linker_flag")
+
+// Clang only supports the `compiler` and `user` kinds when targeting Windows
+#pragma comment(compiler)
+#pragma comment(user, "Some string")
+```
diff --git a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
deleted file mode 100644
index 2e333ab726a54..0000000000000
--- a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-comment.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. title:: clang-tidy - portability-avoid-pragma-comment
-
-portability-avoid-pragma-comment
-================================
-
-Finds uses of ``#pragma comment`` and, for ``lib`` or ``linker`` comments,
-suggests using the build system for improved portability.
-
-``#pragma comment`` is not widely supported outside of MSVC. Clang supports the
-use of ``#pragma comment`` to link libraries on both Windows and Linux, but
-other kinds are only supported on Windows. Using ``pragma comment`` to change
-link flags may be unexpected in projects that prefer to set these flags in the
-build system.
-
-.. code:: c++
-
- // Clang supports the `lib` kind on Windows and Linux, but setting link flags
- // outside the build system may be unexpected
- #pragma comment(lib, "some_lib")
- #pragma comment(linker, "some_linker_flag")
-
- // Clang only supports the `compiler` and `user` kinds when targeting Windows
- #pragma comment(compiler)
- #pragma comment(user, "Some string")
>From 9a3d0f3ccb22947243b044a21dc76dc49043a286 Mon Sep 17 00:00:00 2001
From: Tom James <tom.james at siemens.com>
Date: Fri, 14 Aug 2026 15:48:40 +0100
Subject: [PATCH 6/7] fixup! [clang-tidy] New portability-avoid-pragma-comment
---
.../avoid-pragma-comment-linux.cpp | 21 --------
.../avoid-pragma-comment-windows.cpp | 42 ----------------
.../portability/avoid-pragma-comment.cpp | 49 +++++++++++++++++++
3 files changed, 49 insertions(+), 63 deletions(-)
delete mode 100644 clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp
delete mode 100644 clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp
diff --git a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp
deleted file mode 100644
index 165371be06933..0000000000000
--- a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-linux.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Only the "lib" pragma comment type is implemented on Linux, the rest are
-// Windows-only. Therefore, this file always targets linux.
-// RUN: %check_clang_tidy %s portability-avoid-pragma-comment %t -- -- -target x86_64-unknown-linux-gnu
-
-#pragma comment(lib, "some_lib")
-// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
-
-_Pragma("comment(lib, \"some_lib\")")
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
-
-// Only the "lib" pragma comment type is implemented on Linux, the rest are
-// Windows-only and should be caught by "-Wunknown-pragmas" or
-// "-Wignored-pragmas" on Linux. They won't show up in the Linux AST, so
-// portability-avoid-pragma-comment won't detect the below instances.
-#pragma comment(linker, "some_linker_flag")
-#pragma comment(compiler)
-#pragma comment(user, "Some string")
-
-_Pragma("comment(linker, \"some_linker_flag\")")
-_Pragma("comment(compiler)")
-_Pragma("comment(user, \"Some string\")")
diff --git a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp
deleted file mode 100644
index 24166898c0691..0000000000000
--- a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment-windows.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-// Only the "lib" pragma comment type is implemented on Linux, the rest are
-// Windows-only. Therefore, this file always targets windows-msvc.
-// RUN: %check_clang_tidy %s portability-avoid-pragma-comment %t -- -- -target x86_64-pc-windows-msvc
-
-
-#pragma comment(lib, "some_lib")
-// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
-
-_Pragma("comment(lib, \"some_lib\")")
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
-
-
-#pragma comment(linker, "some_linker_flag")
-// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
-
-#pragma comment(compiler)
-// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
-
-#pragma comment(user, "Some string")
-// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
-
-// __pragma() is a Microsoft-specific extension
-__pragma(comment(lib, "some_lib"))
-// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
-
-__pragma(comment(linker, "some_linker_flag"))
-// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
-
-__pragma(comment(compiler))
-// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
-
-__pragma(comment(user, "Some string"))
-// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
-
-_Pragma("comment(linker, \"some_linker_flag\")")
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
-
-_Pragma("comment(compiler)")
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
-
-_Pragma("comment(user, \"Some string\")")
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp
new file mode 100644
index 0000000000000..b1e4c4005c23d
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp
@@ -0,0 +1,49 @@
+// Only the "lib" pragma comment type is implemented on Linux, the rest are
+// Windows-only. We test for both platform targets.
+// RUN: %check_clang_tidy -check-suffixes=LINUX %s portability-avoid-pragma-comment %t -- -- -target x86_64-unknown-linux-gnu
+// RUN: %check_clang_tidy -check-suffixes=WINDOWS %s portability-avoid-pragma-comment %t -- -- -target x86_64-pc-windows-msvc
+
+#pragma comment(lib, "some_lib")
+// CHECK-MESSAGES-LINUX: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-2]]:9: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+_Pragma("comment(lib, \"some_lib\")")
+// CHECK-MESSAGES-LINUX: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-2]]:1: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+// The rest are Windows-only and should be caught by "-Wunknown-pragmas" or
+// "-Wignored-pragmas" on Linux. On Linux they won't show up in the AST, so
+// portability-avoid-pragma-comment won't detect them.
+
+#pragma comment(linker, "some_linker_flag")
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
+
+#pragma comment(compiler)
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+#pragma comment(user, "Some string")
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:9: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+_Pragma("comment(linker, \"some_linker_flag\")")
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
+
+_Pragma("comment(compiler)")
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+_Pragma("comment(user, \"Some string\")")
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:1: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+// __pragma() is a Microsoft-specific extension
+#ifdef _MSC_VER
+__pragma(comment(lib, "some_lib"))
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive; use the build system to link libraries [portability-avoid-pragma-comment]
+
+__pragma(comment(linker, "some_linker_flag"))
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive; use the build system to set linker options [portability-avoid-pragma-comment]
+
+__pragma(comment(compiler))
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+
+__pragma(comment(user, "Some string"))
+// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
+#endif
\ No newline at end of file
>From 41785538a8ebe57fd61d64fbbb161d70a2247ef1 Mon Sep 17 00:00:00 2001
From: Tom James <tom.james at siemens.com>
Date: Thu, 20 Aug 2026 13:58:43 +0100
Subject: [PATCH 7/7] fixup! [clang-tidy] New portability-avoid-pragma-comment
---
.../clang-tidy/portability/AvoidPragmaCommentCheck.cpp | 4 +---
.../clang-tidy/checkers/portability/avoid-pragma-comment.cpp | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp
index 1b2f5d92687b8..4cd4e630982e3 100644
--- a/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaCommentCheck.cpp
@@ -39,10 +39,8 @@ void AvoidPragmaCommentCheck::check(const MatchFinder::MatchResult &Result) {
case PragmaMSCommentKind::PCK_Linker:
Msg.append("; use the build system to set linker options");
break;
- case PragmaMSCommentKind::PCK_Unknown:
- llvm_unreachable("unexpected pragma comment kind");
default:
- break;
+ llvm_unreachable("unexpected pragma comment kind");
}
diag(Pragma->getBeginLoc(), Msg);
}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp
index b1e4c4005c23d..cb8cfbc0faf87 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-comment.cpp
@@ -46,4 +46,4 @@ __pragma(comment(compiler))
__pragma(comment(user, "Some string"))
// CHECK-MESSAGES-WINDOWS: :[[@LINE-1]]:10: warning: avoid 'pragma comment' directive [portability-avoid-pragma-comment]
-#endif
\ No newline at end of file
+#endif
More information about the cfe-commits
mailing list