https://github.com/dl8sd11 updated 
https://github.com/llvm/llvm-project/pull/140388

>From 5bc074dadddb094bf954388a95ecb818abe17b56 Mon Sep 17 00:00:00 2001
From: dl8sd11 <gcc...@google.com>
Date: Sat, 17 May 2025 17:23:26 +0000
Subject: [PATCH 1/7] [clang-tidy] Add avoid-pragma-once.

---
 .../portability/AvoidPragmaOnceCheck.cpp      | 49 +++++++++++++++++++
 .../portability/AvoidPragmaOnceCheck.h        | 34 +++++++++++++
 .../clang-tidy/portability/CMakeLists.txt     |  1 +
 .../portability/PortabilityTidyModule.cpp     |  3 ++
 clang-tools-extra/docs/ReleaseNotes.rst       |  5 ++
 .../docs/clang-tidy/checks/list.rst           |  1 +
 .../checks/portability/avoid-pragma-once.rst  | 12 +++++
 .../Inputs/avoid-pragma-once/lib.h            |  1 +
 .../portability/avoid-pragma-once.cpp         |  5 ++
 9 files changed, 111 insertions(+)
 create mode 100644 
clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
 create mode 100644 
clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
 create mode 100644 
clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib.h
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp

diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp 
b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
new file mode 100644
index 0000000000000..e13b2039ac366
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
@@ -0,0 +1,49 @@
+//===--- AvoidPragmaOnceCheck.cpp - clang-tidy 
----------------------------===//
+//
+// 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 "AvoidPragmaOnceCheck.h"
+
+#include "clang/Basic/SourceManager.h"
+#include "clang/Lex/PPCallbacks.h"
+#include "clang/Lex/Preprocessor.h"
+#include "llvm/ADT/StringRef.h"
+
+namespace clang::tidy::portability {
+
+class PragmaOnceCallbacks : public PPCallbacks {
+ public:
+  PragmaOnceCallbacks(AvoidPragmaOnceCheck *Check, const SourceManager &SM)
+      : Check(Check), SM(SM) {}
+  void PragmaDirective(SourceLocation Loc,
+                       PragmaIntroducerKind Introducer) override {
+    auto Str = llvm::StringRef(SM.getCharacterData(Loc));
+    if (!Str.consume_front("#")) {
+      return;
+    }
+    Str = Str.trim();
+    if (!Str.consume_front("pragma")) {
+      return;
+    }
+    Str = Str.trim();
+    if (Str.starts_with("once")) {
+      Check->diag(Loc, "Avoid pragma once.");
+    }
+  }
+
+ private:
+  AvoidPragmaOnceCheck *Check;
+  const SourceManager &SM;
+};
+
+void AvoidPragmaOnceCheck::registerPPCallbacks(const SourceManager &SM,
+                                               Preprocessor *PP,
+                                               Preprocessor *ModuleExpanderPP) 
{
+  PP->addPPCallbacks(std::make_unique<PragmaOnceCallbacks>(this, SM));
+}
+
+}  // namespace clang::tidy::portability
diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h 
b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
new file mode 100644
index 0000000000000..f5a9246f8af58
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
@@ -0,0 +1,34 @@
+//===--- AvoidPragmaOnceCheck.h - clang-tidy --------------------*- C++ 
-*-===//
+//
+// 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_AVOIDPRAGMAONCECHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_AVOIDPRAGMAONCECHECK_H
+
+#include "../ClangTidyCheck.h"
+
+namespace clang::tidy::portability {
+
+/// FIXME: Write a short description.
+///
+/// For the user-facing documentation see:
+/// 
http://clang.llvm.org/extra/clang-tidy/checks/portability/avoid-pragma-once.html
+class AvoidPragmaOnceCheck : public ClangTidyCheck {
+ public:
+  AvoidPragmaOnceCheck(StringRef Name, ClangTidyContext *Context)
+      : ClangTidyCheck(Name, Context) {}
+  bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
+    return LangOpts.CPlusPlus;
+  }
+
+  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
+                           Preprocessor *ModuleExpanderPP) override;
+};
+
+}  // namespace clang::tidy::portability
+
+#endif  // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_AVOIDPRAGMAONCECHECK_H
diff --git a/clang-tools-extra/clang-tidy/portability/CMakeLists.txt 
b/clang-tools-extra/clang-tidy/portability/CMakeLists.txt
index 5a38722a61481..73d74a550afc0 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
+  AvoidPragmaOnceCheck.cpp
   PortabilityTidyModule.cpp
   RestrictSystemIncludesCheck.cpp
   SIMDIntrinsicsCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp 
b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
index 316b98b46cf3f..a15cb36dfdaff 100644
--- a/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/portability/PortabilityTidyModule.cpp
@@ -9,6 +9,7 @@
 #include "../ClangTidy.h"
 #include "../ClangTidyModule.h"
 #include "../ClangTidyModuleRegistry.h"
+#include "AvoidPragmaOnceCheck.h"
 #include "RestrictSystemIncludesCheck.h"
 #include "SIMDIntrinsicsCheck.h"
 #include "StdAllocatorConstCheck.h"
@@ -20,6 +21,8 @@ namespace portability {
 class PortabilityModule : public ClangTidyModule {
 public:
   void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
+    CheckFactories.registerCheck<AvoidPragmaOnceCheck>(
+        "portability-avoid-pragma-once");
     CheckFactories.registerCheck<RestrictSystemIncludesCheck>(
         "portability-restrict-system-includes");
     CheckFactories.registerCheck<SIMDIntrinsicsCheck>(
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 9b29ab12e1bfa..2b8d37054716b 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -142,6 +142,11 @@ New checks
   Finds potentially erroneous calls to ``reset`` method on smart pointers when
   the pointee type also has a ``reset`` method.
 
+- New :doc:`portability-avoid-pragma-once
+  <clang-tidy/checks/portability/avoid-pragma-once>` check.
+
+  A check that catches pragma once.
+
 New check aliases
 ^^^^^^^^^^^^^^^^^
 
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst 
b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index 1ec476eef3420..607c526621cdf 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -351,6 +351,7 @@ Clang-Tidy Checks
    :doc:`performance-type-promotion-in-math-fn 
<performance/type-promotion-in-math-fn>`, "Yes"
    :doc:`performance-unnecessary-copy-initialization 
<performance/unnecessary-copy-initialization>`, "Yes"
    :doc:`performance-unnecessary-value-param 
<performance/unnecessary-value-param>`, "Yes"
+   :doc:`portability-avoid-pragma-once <portability/avoid-pragma-once>`, "Yes"
    :doc:`portability-restrict-system-includes 
<portability/restrict-system-includes>`, "Yes"
    :doc:`portability-simd-intrinsics <portability/simd-intrinsics>`,
    :doc:`portability-std-allocator-const <portability/std-allocator-const>`,
diff --git 
a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst 
b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
new file mode 100644
index 0000000000000..721511bf395c1
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
@@ -0,0 +1,12 @@
+.. title:: clang-tidy - portability-avoid-pragma-once
+
+portability-avoid-pragma-once
+=============================
+
+This check catches pragma once usage.
+
+For example:
+
+```
+#pragma once // Bad: Avoid pragma once.
+```
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib.h
 
b/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib.h
new file mode 100644
index 0000000000000..6f70f09beec22
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib.h
@@ -0,0 +1 @@
+#pragma once
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
new file mode 100644
index 0000000000000..46f452dfe1f77
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
@@ -0,0 +1,5 @@
+// RUN: %check_clang_tidy %s portability-avoid-pragma-once %t \
+// RUN:   -- -- -isystem %S/Inputs/avoid-pragma-once
+
+#include <lib.h>
+// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: Avoid pragma once. 
[portability-avoid-pragma-once]
\ No newline at end of file

>From 63ae6d77254cf1e0d11ba6022cf4c6a8c3e7f78b Mon Sep 17 00:00:00 2001
From: dl8sd11 <gcc...@google.com>
Date: Sat, 17 May 2025 17:53:43 +0000
Subject: [PATCH 2/7] Apply clang-format.

---
 .../clang-tidy/portability/AvoidPragmaOnceCheck.cpp         | 6 +++---
 .../clang-tidy/portability/AvoidPragmaOnceCheck.h           | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp 
b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
index e13b2039ac366..9a835efd4b9e7 100644
--- a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
@@ -16,7 +16,7 @@
 namespace clang::tidy::portability {
 
 class PragmaOnceCallbacks : public PPCallbacks {
- public:
+public:
   PragmaOnceCallbacks(AvoidPragmaOnceCheck *Check, const SourceManager &SM)
       : Check(Check), SM(SM) {}
   void PragmaDirective(SourceLocation Loc,
@@ -35,7 +35,7 @@ class PragmaOnceCallbacks : public PPCallbacks {
     }
   }
 
- private:
+private:
   AvoidPragmaOnceCheck *Check;
   const SourceManager &SM;
 };
@@ -46,4 +46,4 @@ void AvoidPragmaOnceCheck::registerPPCallbacks(const 
SourceManager &SM,
   PP->addPPCallbacks(std::make_unique<PragmaOnceCallbacks>(this, SM));
 }
 
-}  // namespace clang::tidy::portability
+} // namespace clang::tidy::portability
diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h 
b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
index f5a9246f8af58..7208872d416b4 100644
--- a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
@@ -18,7 +18,7 @@ namespace clang::tidy::portability {
 /// For the user-facing documentation see:
 /// 
http://clang.llvm.org/extra/clang-tidy/checks/portability/avoid-pragma-once.html
 class AvoidPragmaOnceCheck : public ClangTidyCheck {
- public:
+public:
   AvoidPragmaOnceCheck(StringRef Name, ClangTidyContext *Context)
       : ClangTidyCheck(Name, Context) {}
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
@@ -29,6 +29,6 @@ class AvoidPragmaOnceCheck : public ClangTidyCheck {
                            Preprocessor *ModuleExpanderPP) override;
 };
 
-}  // namespace clang::tidy::portability
+} // namespace clang::tidy::portability
 
-#endif  // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_AVOIDPRAGMAONCECHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PORTABILITY_AVOIDPRAGMAONCECHECK_H

>From 80899c5631e1c422ba8b59796c47e62ab3ee1b16 Mon Sep 17 00:00:00 2001
From: dl8sd11 <gcc...@google.com>
Date: Sun, 18 May 2025 04:41:51 +0000
Subject: [PATCH 3/7] Fix test by adding header-filter.

---
 .../clang-tidy/checkers/portability/avoid-pragma-once.cpp     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
index 46f452dfe1f77..b6695997d1945 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
@@ -1,5 +1,5 @@
 // RUN: %check_clang_tidy %s portability-avoid-pragma-once %t \
-// RUN:   -- -- -isystem %S/Inputs/avoid-pragma-once
+// RUN:   -header-filter=.* -- --  -I%S/Inputs/avoid-pragma-once
 
-#include <lib.h>
+#include "lib.h"
 // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: Avoid pragma once. 
[portability-avoid-pragma-once]
\ No newline at end of file

>From 8c9d519f951bc6a45949c99bbce8ac5809a4445d Mon Sep 17 00:00:00 2001
From: dl8sd11 <gcc...@google.com>
Date: Sun, 18 May 2025 05:35:47 +0000
Subject: [PATCH 4/7] Fix test message location.

---
 .../clang-tidy/checkers/portability/avoid-pragma-once.cpp     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
index b6695997d1945..e84ad10cb1d93 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
@@ -1,5 +1,5 @@
 // RUN: %check_clang_tidy %s portability-avoid-pragma-once %t \
-// RUN:   -header-filter=.* -- --  -I%S/Inputs/avoid-pragma-once
+// RUN:   -- --header-filter='.*' --  -I%S/Inputs/avoid-pragma-once
 
 #include "lib.h"
-// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: Avoid pragma once. 
[portability-avoid-pragma-once]
\ No newline at end of file
+// CHECK-MESSAGES: lib.h:1:1: warning: Avoid pragma once.
\ No newline at end of file

>From ce5553fedd7b245cac751b2b005551a737818d8a Mon Sep 17 00:00:00 2001
From: dl8sd11 <gcc...@google.com>
Date: Sun, 18 May 2025 14:08:14 +0000
Subject: [PATCH 5/7] Apply suggestions from vbvictor.

---
 .../portability/AvoidPragmaOnceCheck.cpp      |  3 ++-
 .../portability/AvoidPragmaOnceCheck.h        |  4 +++-
 clang-tools-extra/docs/ReleaseNotes.rst       |  3 ++-
 .../docs/clang-tidy/checks/list.rst           |  2 +-
 .../checks/portability/avoid-pragma-once.rst  | 22 ++++++++++++++-----
 .../avoid-pragma-once/{lib.h => lib0.h}       |  0
 .../Inputs/avoid-pragma-once/lib1.h           |  1 +
 .../Inputs/avoid-pragma-once/lib2.h           |  1 +
 .../portability/avoid-pragma-once.cpp         | 14 ++++++++++--
 9 files changed, 39 insertions(+), 11 deletions(-)
 rename 
clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/{lib.h
 => lib0.h} (100%)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib1.h
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib2.h

diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp 
b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
index 9a835efd4b9e7..e55fa9344d02e 100644
--- a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
@@ -31,7 +31,8 @@ class PragmaOnceCallbacks : public PPCallbacks {
     }
     Str = Str.trim();
     if (Str.starts_with("once")) {
-      Check->diag(Loc, "Avoid pragma once.");
+      Check->diag(Loc,
+                  "avoid 'pragma once' directive; use include guards instead");
     }
   }
 
diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h 
b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
index 7208872d416b4..d1eef409b9f2b 100644
--- a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.h
@@ -13,7 +13,9 @@
 
 namespace clang::tidy::portability {
 
-/// FIXME: Write a short description.
+/// Finds uses of ``#pragma once`` and suggests replacing them with standard
+/// include guards (``#ifndef``/``#define``/``#endif``) for improved
+/// portability.
 ///
 /// For the user-facing documentation see:
 /// 
http://clang.llvm.org/extra/clang-tidy/checks/portability/avoid-pragma-once.html
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 2b8d37054716b..cbc7bbcde6506 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -145,7 +145,8 @@ New checks
 - New :doc:`portability-avoid-pragma-once
   <clang-tidy/checks/portability/avoid-pragma-once>` check.
 
-  A check that catches pragma once.
+  Finds uses of ``#pragma once`` and suggests replacing them with standard
+  include guards (``#ifndef``/``#define``/``#endif``) for improved portability.
 
 New check aliases
 ^^^^^^^^^^^^^^^^^
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst 
b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index 607c526621cdf..5a79d61b1fd7e 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -351,7 +351,7 @@ Clang-Tidy Checks
    :doc:`performance-type-promotion-in-math-fn 
<performance/type-promotion-in-math-fn>`, "Yes"
    :doc:`performance-unnecessary-copy-initialization 
<performance/unnecessary-copy-initialization>`, "Yes"
    :doc:`performance-unnecessary-value-param 
<performance/unnecessary-value-param>`, "Yes"
-   :doc:`portability-avoid-pragma-once <portability/avoid-pragma-once>`, "Yes"
+   :doc:`portability-avoid-pragma-once <portability/avoid-pragma-once>`,
    :doc:`portability-restrict-system-includes 
<portability/restrict-system-includes>`, "Yes"
    :doc:`portability-simd-intrinsics <portability/simd-intrinsics>`,
    :doc:`portability-std-allocator-const <portability/std-allocator-const>`,
diff --git 
a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst 
b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
index 721511bf395c1..148f2e950265c 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
@@ -3,10 +3,22 @@
 portability-avoid-pragma-once
 =============================
 
-This check catches pragma once usage.
+Finds uses of ``#pragma once`` and suggests replacing them with standard
+include guards (``#ifndef``/``#define``/``#endif``) for improved portability.
 
-For example:
+`#pragma once` is a non-standard extension, despite being widely supported
+by modern compilers. Relying on it can lead to portability issues in
+environments.
 
-```
-#pragma once // Bad: Avoid pragma once.
-```
+Some older or specialized C/C++ compilers, particularly in embedded systems,
+may not fully support #pragma once.
+
+Also it can fail in certain file system configurations,like network drives
+or complex symbolic links, potentially leading to compilation issues.
+
+Consider the following header file:
+
+.. code:: c++
+
+  // my_header.h
+  #pragma once // warning: avoid 'pragma once' directive; use include guards 
instead
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib.h
 
b/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib0.h
similarity index 100%
rename from 
clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib.h
rename to 
clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib0.h
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib1.h
 
b/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib1.h
new file mode 100644
index 0000000000000..bd25511851d96
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib1.h
@@ -0,0 +1 @@
+# pragma once
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib2.h
 
b/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib2.h
new file mode 100644
index 0000000000000..bd47bc5c36795
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/portability/Inputs/avoid-pragma-once/lib2.h
@@ -0,0 +1 @@
+# pragma   once
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
index e84ad10cb1d93..3fc8e8a2421eb 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/portability/avoid-pragma-once.cpp
@@ -1,5 +1,15 @@
 // RUN: %check_clang_tidy %s portability-avoid-pragma-once %t \
 // RUN:   -- --header-filter='.*' --  -I%S/Inputs/avoid-pragma-once
 
-#include "lib.h"
-// CHECK-MESSAGES: lib.h:1:1: warning: Avoid pragma once.
\ No newline at end of file
+// #pragma once
+#include "lib0.h"
+// CHECK-MESSAGES: lib0.h:1:1:  warning: avoid 'pragma once' directive; use 
include guards instead
+
+
+// # pragma once
+#include "lib1.h"
+// CHECK-MESSAGES: lib1.h:1:1:  warning: avoid 'pragma once' directive; use 
include guards instead
+
+// # pragma   once 
+#include "lib2.h"
+// CHECK-MESSAGES: lib2.h:1:1:  warning: avoid 'pragma once' directive; use 
include guards instead

>From ccf539ef1b74f8b3ae6a0a55bae7d3744837c2e0 Mon Sep 17 00:00:00 2001
From: dl8sd11 <gcc...@google.com>
Date: Sun, 18 May 2025 14:47:17 +0000
Subject: [PATCH 6/7] Apply suggestions from EugeneZelenko.

---
 .../docs/clang-tidy/checks/portability/avoid-pragma-once.rst  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git 
a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst 
b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
index 148f2e950265c..9b908b1970060 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
@@ -6,12 +6,12 @@ portability-avoid-pragma-once
 Finds uses of ``#pragma once`` and suggests replacing them with standard
 include guards (``#ifndef``/``#define``/``#endif``) for improved portability.
 
-`#pragma once` is a non-standard extension, despite being widely supported
+``#pragma once`` is a non-standard extension, despite being widely supported
 by modern compilers. Relying on it can lead to portability issues in
 environments.
 
 Some older or specialized C/C++ compilers, particularly in embedded systems,
-may not fully support #pragma once.
+may not fully support ``#pragma once``.
 
 Also it can fail in certain file system configurations,like network drives
 or complex symbolic links, potentially leading to compilation issues.

>From 12a6d5895f9d91b3058b7b5abb038bae2bb90a2b Mon Sep 17 00:00:00 2001
From: dl8sd11 <gcc...@google.com>
Date: Sun, 18 May 2025 14:52:14 +0000
Subject: [PATCH 7/7] Apply suggestions from vbvictor.

---
 .../clang-tidy/portability/AvoidPragmaOnceCheck.cpp      | 9 +++------
 .../clang-tidy/checks/portability/avoid-pragma-once.rst  | 2 +-
 2 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp 
b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
index e55fa9344d02e..d9569d0b5c603 100644
--- a/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
+++ b/clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp
@@ -22,18 +22,15 @@ class PragmaOnceCallbacks : public PPCallbacks {
   void PragmaDirective(SourceLocation Loc,
                        PragmaIntroducerKind Introducer) override {
     auto Str = llvm::StringRef(SM.getCharacterData(Loc));
-    if (!Str.consume_front("#")) {
+    if (!Str.consume_front("#"))
       return;
-    }
     Str = Str.trim();
-    if (!Str.consume_front("pragma")) {
+    if (!Str.consume_front("pragma"))
       return;
-    }
     Str = Str.trim();
-    if (Str.starts_with("once")) {
+    if (Str.starts_with("once"))
       Check->diag(Loc,
                   "avoid 'pragma once' directive; use include guards instead");
-    }
   }
 
 private:
diff --git 
a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst 
b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
index 9b908b1970060..5903f4cb8e47c 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/portability/avoid-pragma-once.rst
@@ -8,7 +8,7 @@ include guards (``#ifndef``/``#define``/``#endif``) for 
improved portability.
 
 ``#pragma once`` is a non-standard extension, despite being widely supported
 by modern compilers. Relying on it can lead to portability issues in
-environments.
+some environments.
 
 Some older or specialized C/C++ compilers, particularly in embedded systems,
 may not fully support ``#pragma once``.

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

Reply via email to