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