https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/165659
>From 0f42a4416fbc86556d45df83fbbe269253b6eb8b Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Thu, 30 Oct 2025 13:12:26 +0800 Subject: [PATCH 1/4] [clang-tidy] Rename `cert-dcl58-cpp` to `bugprone-dont-modify-std-namespace` --- .../bugprone/BugproneTidyModule.cpp | 3 + .../clang-tidy/bugprone/CMakeLists.txt | 1 + .../DontModifyStdNamespaceCheck.cpp | 6 +- .../DontModifyStdNamespaceCheck.h | 12 ++-- .../clang-tidy/cert/CERTTidyModule.cpp | 5 +- .../clang-tidy/cert/CMakeLists.txt | 1 - clang-tools-extra/docs/ReleaseNotes.rst | 7 ++- .../bugprone/dont-modify-std-namespace.rst | 63 +++++++++++++++++++ .../docs/clang-tidy/checks/cert/dcl58-cpp.rst | 54 +--------------- .../docs/clang-tidy/checks/list.rst | 3 +- .../Inputs/Headers/system-header-simulation.h | 2 +- .../dont-modify-std-namespace.cpp} | 4 +- 12 files changed, 93 insertions(+), 68 deletions(-) rename clang-tools-extra/clang-tidy/{cert => bugprone}/DontModifyStdNamespaceCheck.cpp (97%) rename clang-tools-extra/clang-tidy/{cert => bugprone}/DontModifyStdNamespaceCheck.h (71%) create mode 100644 clang-tools-extra/docs/clang-tidy/checks/bugprone/dont-modify-std-namespace.rst rename clang-tools-extra/test/clang-tidy/checkers/{cert/dcl58-cpp.cpp => bugprone/dont-modify-std-namespace.cpp} (97%) diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index e6115f67656bc..6f30e4e232c81 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -25,6 +25,7 @@ #include "CrtpConstructorAccessibilityCheck.h" #include "DanglingHandleCheck.h" #include "DerivedMethodShadowingBaseMethodCheck.h" +#include "DontModifyStdNamespaceCheck.h" #include "DynamicStaticInitializersCheck.h" #include "EasilySwappableParametersCheck.h" #include "EmptyCatchCheck.h" @@ -141,6 +142,8 @@ class BugproneModule : public ClangTidyModule { "bugprone-dangling-handle"); CheckFactories.registerCheck<DerivedMethodShadowingBaseMethodCheck>( "bugprone-derived-method-shadowing-base-method"); + CheckFactories.registerCheck<DontModifyStdNamespaceCheck>( + "bugprone-dont-modify-std-namespace"); CheckFactories.registerCheck<DynamicStaticInitializersCheck>( "bugprone-dynamic-static-initializers"); CheckFactories.registerCheck<EasilySwappableParametersCheck>( diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index c8943e5b22ef8..358a73f36c9e6 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -21,6 +21,7 @@ add_clang_library(clangTidyBugproneModule STATIC CrtpConstructorAccessibilityCheck.cpp DanglingHandleCheck.cpp DerivedMethodShadowingBaseMethodCheck.cpp + DontModifyStdNamespaceCheck.cpp DynamicStaticInitializersCheck.cpp EasilySwappableParametersCheck.cpp EmptyCatchCheck.cpp diff --git a/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.cpp similarity index 97% rename from clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp rename to clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.cpp index 79fbc66b5f8a3..869120a9a0864 100644 --- a/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.cpp @@ -36,7 +36,7 @@ AST_POLYMORPHIC_MATCHER_P( } // namespace -namespace clang::tidy::cert { +namespace clang::tidy::bugprone { void DontModifyStdNamespaceCheck::registerMatchers(MatchFinder *Finder) { auto HasStdParent = @@ -96,7 +96,7 @@ void DontModifyStdNamespaceCheck::registerMatchers(MatchFinder *Finder) { .bind("decl"), this); } -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone static const NamespaceDecl *getTopLevelLexicalNamespaceDecl(const Decl *D) { const NamespaceDecl *LastNS = nullptr; @@ -108,7 +108,7 @@ static const NamespaceDecl *getTopLevelLexicalNamespaceDecl(const Decl *D) { return LastNS; } -void clang::tidy::cert::DontModifyStdNamespaceCheck::check( +void clang::tidy::bugprone::DontModifyStdNamespaceCheck::check( const MatchFinder::MatchResult &Result) { const auto *D = Result.Nodes.getNodeAs<Decl>("decl"); const auto *NS = Result.Nodes.getNodeAs<NamespaceDecl>("nmspc"); diff --git a/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.h b/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h similarity index 71% rename from clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.h rename to clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h index cfcd878644ddb..eb8125f4092d2 100644 --- a/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h @@ -6,18 +6,18 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DONT_MODIFY_STD_NAMESPACE_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DONT_MODIFY_STD_NAMESPACE_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONT_MODIFY_STD_NAMESPACE_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONT_MODIFY_STD_NAMESPACE_H #include "../ClangTidyCheck.h" -namespace clang::tidy::cert { +namespace clang::tidy::bugprone { /// Modification of the std or posix namespace can result in undefined behavior. /// This check warns for such modifications. /// /// For the user-facing documentation see: -/// https://clang.llvm.org/extra/clang-tidy/checks/cert/dcl58-cpp.html +/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/dont-modify-std-namespace.html class DontModifyStdNamespaceCheck : public ClangTidyCheck { public: DontModifyStdNamespaceCheck(StringRef Name, ClangTidyContext *Context) @@ -29,6 +29,6 @@ class DontModifyStdNamespaceCheck : public ClangTidyCheck { void check(const ast_matchers::MatchFinder::MatchResult &Result) override; }; -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CERT_DONT_MODIFY_STD_NAMESPACE_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONT_MODIFY_STD_NAMESPACE_H diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index c1ca2cec7a1eb..cdd3a8b54f99b 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -11,6 +11,7 @@ #include "../ClangTidyModuleRegistry.h" #include "../bugprone/BadSignalToKillThreadCheck.h" #include "../bugprone/CommandProcessorCheck.h" +#include "../bugprone/DontModifyStdNamespaceCheck.h" #include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h" #include "../bugprone/ReservedIdentifierCheck.h" #include "../bugprone/SignalHandlerCheck.h" @@ -35,7 +36,6 @@ #include "../readability/EnumInitialValueCheck.h" #include "../readability/UppercaseLiteralSuffixCheck.h" #include "DefaultOperatorNewAlignmentCheck.h" -#include "DontModifyStdNamespaceCheck.h" #include "FloatLoopCounter.h" #include "LimitedRandomnessCheck.h" #include "MutatingCopyCheck.h" @@ -251,7 +251,8 @@ class CERTModule : public ClangTidyModule { "cert-dcl51-cpp"); CheckFactories.registerCheck<misc::NewDeleteOverloadsCheck>( "cert-dcl54-cpp"); - CheckFactories.registerCheck<DontModifyStdNamespaceCheck>("cert-dcl58-cpp"); + CheckFactories.registerCheck<bugprone::DontModifyStdNamespaceCheck>( + "cert-dcl58-cpp"); CheckFactories.registerCheck<google::build::UnnamedNamespaceInHeaderCheck>( "cert-dcl59-cpp"); // ERR diff --git a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt index 453d1d30921e9..33965a3d236c8 100644 --- a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt @@ -6,7 +6,6 @@ set(LLVM_LINK_COMPONENTS add_clang_library(clangTidyCERTModule STATIC CERTTidyModule.cpp DefaultOperatorNewAlignmentCheck.cpp - DontModifyStdNamespaceCheck.cpp FloatLoopCounter.cpp LimitedRandomnessCheck.cpp MutatingCopyCheck.cpp diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 6701bf25df166..d1702bb9286de 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -244,6 +244,11 @@ New check aliases <clang-tidy/checks/modernize/avoid-variadic-functions>` keeping initial check as an alias to the new one. +- Renamed :doc:`cert-dcl58-cpp <clang-tidy/checks/cert/dcl58-cpp>` to + :doc:`bugprone-dont-modify-std-namespace + <clang-tidy/checks/bugprone/dont-modify-std-namespace>` + keeping initial check as an alias to the new one. + - Renamed :doc:`cert-env33-c <clang-tidy/checks/cert/env33-c>` to :doc:`bugprone-command-processor <clang-tidy/checks/bugprone/command-processor>` @@ -367,7 +372,7 @@ Changes in existing checks - Improved :doc:`misc-const-correctness <clang-tidy/checks/misc/const-correctness>` check to avoid false - positives when pointers is transferred to non-const references + positives when pointers is transferred to non-const references and avoid false positives of function pointer and fix false positives on return of non-const pointer. diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/dont-modify-std-namespace.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/dont-modify-std-namespace.rst new file mode 100644 index 0000000000000..9293fa0a42763 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/dont-modify-std-namespace.rst @@ -0,0 +1,63 @@ +.. title:: clang-tidy - bugprone-dont-modify-std-namespace + +bugprone-dont-modify-std-namespace +================================== + +Modification of the ``std`` or ``posix`` namespace can result in undefined +behavior. +This check warns for such modifications. +The ``std`` (or ``posix``) namespace is allowed to be extended with (class or +function) template specializations that depend on an user-defined type (a type +that is not defined in the standard system headers). + +The check detects the following (user provided) declarations in namespace ``std`` or ``posix``: + +- Anything that is not a template specialization. +- Explicit specializations of any standard library function template or class template, if it does not have any user-defined type as template argument. +- Explicit specializations of any member function of a standard library class template. +- Explicit specializations of any member function template of a standard library class or class template. +- Explicit or partial specialization of any member class template of a standard library class or class template. + +Examples: + +.. code-block:: c++ + + namespace std { + int x; // warning: modification of 'std' namespace can result in undefined behavior [bugprone-dont-modify-std-namespace] + } + + namespace posix::a { // warning: modification of 'posix' namespace can result in undefined behavior + } + + template <> + struct ::std::hash<long> { // warning: modification of 'std' namespace can result in undefined behavior + unsigned long operator()(const long &K) const { + return K; + } + }; + + struct MyData { long data; }; + + template <> + struct ::std::hash<MyData> { // no warning: specialization with user-defined type + unsigned long operator()(const MyData &K) const { + return K.data; + } + }; + + namespace std { + template <> + void swap<bool>(bool &a, bool &b); // warning: modification of 'std' namespace can result in undefined behavior + + template <> + bool less<void>::operator()<MyData &&, MyData &&>(MyData &&, MyData &&) const { // warning: modification of 'std' namespace can result in undefined behavior + return true; + } + } + +References +---------- + +This check corresponds to the CERT C++ Coding Standard rule +`DCL58-CPP. Do not modify the standard namespaces +<https://www.securecoding.cert.org/confluence/display/cplusplus/DCL58-CPP.+Do+not+modify+the+standard+namespaces>`_. diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst index fbcc6281a8898..ed2e4ec383c2e 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst @@ -3,57 +3,9 @@ cert-dcl58-cpp ============== -Modification of the ``std`` or ``posix`` namespace can result in undefined -behavior. -This check warns for such modifications. -The ``std`` (or ``posix``) namespace is allowed to be extended with (class or -function) template specializations that depend on an user-defined type (a type -that is not defined in the standard system headers). - -The check detects the following (user provided) declarations in namespace ``std`` or ``posix``: - -- Anything that is not a template specialization. -- Explicit specializations of any standard library function template or class template, if it does not have any user-defined type as template argument. -- Explicit specializations of any member function of a standard library class template. -- Explicit specializations of any member function template of a standard library class or class template. -- Explicit or partial specialization of any member class template of a standard library class or class template. - -Examples: - -.. code-block:: c++ - - namespace std { - int x; // warning: modification of 'std' namespace can result in undefined behavior [cert-dcl58-cpp] - } - - namespace posix::a { // warning: modification of 'posix' namespace can result in undefined behavior - } - - template <> - struct ::std::hash<long> { // warning: modification of 'std' namespace can result in undefined behavior - unsigned long operator()(const long &K) const { - return K; - } - }; - - struct MyData { long data; }; - - template <> - struct ::std::hash<MyData> { // no warning: specialization with user-defined type - unsigned long operator()(const MyData &K) const { - return K.data; - } - }; - - namespace std { - template <> - void swap<bool>(bool &a, bool &b); // warning: modification of 'std' namespace can result in undefined behavior - - template <> - bool less<void>::operator()<MyData &&, MyData &&>(MyData &&, MyData &&) const { // warning: modification of 'std' namespace can result in undefined behavior - return true; - } - } +The `cert-dcl58-cpp` is an aliaes, please see +`bugprone-dont-modify-std-namespace <../bugprone/dont-modify-std-namespace.html>`_ +for more information. This check corresponds to the CERT C++ Coding Standard rule `DCL58-CPP. Do not modify the standard namespaces diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index d3c89e469188d..27d444351c70f 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -93,6 +93,7 @@ Clang-Tidy Checks :doc:`bugprone-crtp-constructor-accessibility <bugprone/crtp-constructor-accessibility>`, "Yes" :doc:`bugprone-dangling-handle <bugprone/dangling-handle>`, :doc:`bugprone-derived-method-shadowing-base-method <bugprone/derived-method-shadowing-base-method>`, + :doc:`bugprone-dont-modify-std-namespace <bugprone/dont-modify-std-namespace>`, :doc:`bugprone-dynamic-static-initializers <bugprone/dynamic-static-initializers>`, :doc:`bugprone-easily-swappable-parameters <bugprone/easily-swappable-parameters>`, :doc:`bugprone-empty-catch <bugprone/empty-catch>`, @@ -173,7 +174,6 @@ Clang-Tidy Checks :doc:`bugprone-unused-return-value <bugprone/unused-return-value>`, :doc:`bugprone-use-after-move <bugprone/use-after-move>`, :doc:`bugprone-virtual-near-miss <bugprone/virtual-near-miss>`, "Yes" - :doc:`cert-dcl58-cpp <cert/dcl58-cpp>`, :doc:`cert-err33-c <cert/err33-c>`, :doc:`cert-err60-cpp <cert/err60-cpp>`, :doc:`cert-flp30-c <cert/flp30-c>`, @@ -441,6 +441,7 @@ Check aliases :doc:`cert-dcl50-cpp <cert/dcl50-cpp>`, :doc:`modernize-avoid-variadic-functions <modernize/avoid-variadic-functions>`, :doc:`cert-dcl51-cpp <cert/dcl51-cpp>`, :doc:`bugprone-reserved-identifier <bugprone/reserved-identifier>`, "Yes" :doc:`cert-dcl54-cpp <cert/dcl54-cpp>`, :doc:`misc-new-delete-overloads <misc/new-delete-overloads>`, + :docs:`cert-dcl58-cpp <cert/dcl58-cpp>`, :doc:`bugprone-dont-modify-std-namespace <bugprone/dont-modify-std-namespace>`, :doc:`cert-dcl59-cpp <cert/dcl59-cpp>`, :doc:`google-build-namespaces <google/build-namespaces>`, :doc:`cert-err09-cpp <cert/err09-cpp>`, :doc:`misc-throw-by-value-catch-by-reference <misc/throw-by-value-catch-by-reference>`, :doc:`cert-env33-c <cert/env33-c>`, :doc:`bugprone-command-processor <bugprone/command-processor>`, diff --git a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h index b6977cd9ce6c6..2c4293dafb3e2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h +++ b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h @@ -59,7 +59,7 @@ struct X {}; } // namespace std // Template specializations that are in a system-header file. -// The purpose is to test cert-dcl58-cpp (no warnings here). +// The purpose is to test bugprone-dont-modify-std-namespace (no warnings here). namespace std { template <> void swap<short>(short &, short &){}; diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/dcl58-cpp.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/dont-modify-std-namespace.cpp similarity index 97% rename from clang-tools-extra/test/clang-tidy/checkers/cert/dcl58-cpp.cpp rename to clang-tools-extra/test/clang-tidy/checkers/bugprone/dont-modify-std-namespace.cpp index 01964e7dc6c76..a53ba37d5ac95 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cert/dcl58-cpp.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/dont-modify-std-namespace.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy -std=c++17-or-later %s cert-dcl58-cpp %t -- -- -I %clang_tidy_headers +// RUN: %check_clang_tidy -std=c++17-or-later %s bugprone-dont-modify-std-namespace %t -- -- -I %clang_tidy_headers #include "system-header-simulation.h" @@ -15,7 +15,7 @@ namespace A { } namespace posix { -// CHECK-MESSAGES: :[[@LINE+2]]:11: warning: modification of 'posix' namespace can result in undefined behavior [cert-dcl58-cpp] +// CHECK-MESSAGES: :[[@LINE+2]]:11: warning: modification of 'posix' namespace can result in undefined behavior [bugprone-dont-modify-std-namespace] // CHECK-MESSAGES: :[[@LINE-2]]:11: note: 'posix' namespace opened here namespace foo { int foobar; >From e41ba1ce1fa4fe57a7305947feda71a0320e67c8 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Thu, 30 Oct 2025 14:49:47 +0800 Subject: [PATCH 2/4] fix format --- .../clang-tidy/bugprone/DontModifyStdNamespaceCheck.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h b/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h index eb8125f4092d2..751b2fd98c87b 100644 --- a/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONT_MODIFY_STD_NAMESPACE_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONT_MODIFY_STD_NAMESPACE_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONTMODIFYSTDNAMESPACECHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONTMODIFYSTDNAMESPACECHECK_H #include "../ClangTidyCheck.h" @@ -31,4 +31,4 @@ class DontModifyStdNamespaceCheck : public ClangTidyCheck { } // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONT_MODIFY_STD_NAMESPACE_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONTMODIFYSTDNAMESPACECHECK_H >From 6d1057400f2ff8b6848aee7ae8add080d33bc912 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Thu, 30 Oct 2025 14:57:18 +0800 Subject: [PATCH 3/4] fix docs --- clang-tools-extra/docs/clang-tidy/checks/list.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 27d444351c70f..056ed07516fb1 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -441,7 +441,7 @@ Check aliases :doc:`cert-dcl50-cpp <cert/dcl50-cpp>`, :doc:`modernize-avoid-variadic-functions <modernize/avoid-variadic-functions>`, :doc:`cert-dcl51-cpp <cert/dcl51-cpp>`, :doc:`bugprone-reserved-identifier <bugprone/reserved-identifier>`, "Yes" :doc:`cert-dcl54-cpp <cert/dcl54-cpp>`, :doc:`misc-new-delete-overloads <misc/new-delete-overloads>`, - :docs:`cert-dcl58-cpp <cert/dcl58-cpp>`, :doc:`bugprone-dont-modify-std-namespace <bugprone/dont-modify-std-namespace>`, + :doc:`cert-dcl58-cpp <cert/dcl58-cpp>`, :doc:`bugprone-dont-modify-std-namespace <bugprone/dont-modify-std-namespace>`, :doc:`cert-dcl59-cpp <cert/dcl59-cpp>`, :doc:`google-build-namespaces <google/build-namespaces>`, :doc:`cert-err09-cpp <cert/err09-cpp>`, :doc:`misc-throw-by-value-catch-by-reference <misc/throw-by-value-catch-by-reference>`, :doc:`cert-env33-c <cert/env33-c>`, :doc:`bugprone-command-processor <bugprone/command-processor>`, >From 677ff04961ac95605898bb042d2455b9c406b0cb Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Mon, 3 Nov 2025 09:33:18 +0800 Subject: [PATCH 4/4] rename --- .../bugprone/BugproneTidyModule.cpp | 6 +- .../clang-tidy/bugprone/CMakeLists.txt | 2 +- ....cpp => StdNamespaceModificationCheck.cpp} | 6 +- ...heck.h => StdNamespaceModificationCheck.h} | 12 +- .../clang-tidy/cert/CERTTidyModule.cpp | 4 +- clang-tools-extra/docs/ReleaseNotes.rst | 4 +- ...ace.rst => std-namespace-modification.rst} | 12 +- .../docs/clang-tidy/checks/cert/dcl58-cpp.rst | 2 +- .../docs/clang-tidy/checks/list.rst | 4 +- .../Inputs/Headers/system-header-simulation.h | 2 +- .../bugprone/dont-modify-std-namespace.cpp | 283 ------------------ 11 files changed, 27 insertions(+), 310 deletions(-) rename clang-tools-extra/clang-tidy/bugprone/{DontModifyStdNamespaceCheck.cpp => StdNamespaceModificationCheck.cpp} (96%) rename clang-tools-extra/clang-tidy/bugprone/{DontModifyStdNamespaceCheck.h => StdNamespaceModificationCheck.h} (66%) rename clang-tools-extra/docs/clang-tidy/checks/bugprone/{dont-modify-std-namespace.rst => std-namespace-modification.rst} (89%) delete mode 100644 clang-tools-extra/test/clang-tidy/checkers/bugprone/dont-modify-std-namespace.cpp diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index 6f30e4e232c81..5f0742d618df3 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -25,7 +25,6 @@ #include "CrtpConstructorAccessibilityCheck.h" #include "DanglingHandleCheck.h" #include "DerivedMethodShadowingBaseMethodCheck.h" -#include "DontModifyStdNamespaceCheck.h" #include "DynamicStaticInitializersCheck.h" #include "EasilySwappableParametersCheck.h" #include "EmptyCatchCheck.h" @@ -72,6 +71,7 @@ #include "SizeofExpressionCheck.h" #include "SpuriouslyWakeUpFunctionsCheck.h" #include "StandaloneEmptyCheck.h" +#include "StdNamespaceModificationCheck.h" #include "StringConstructorCheck.h" #include "StringIntegerAssignmentCheck.h" #include "StringLiteralWithEmbeddedNulCheck.h" @@ -142,8 +142,6 @@ class BugproneModule : public ClangTidyModule { "bugprone-dangling-handle"); CheckFactories.registerCheck<DerivedMethodShadowingBaseMethodCheck>( "bugprone-derived-method-shadowing-base-method"); - CheckFactories.registerCheck<DontModifyStdNamespaceCheck>( - "bugprone-dont-modify-std-namespace"); CheckFactories.registerCheck<DynamicStaticInitializersCheck>( "bugprone-dynamic-static-initializers"); CheckFactories.registerCheck<EasilySwappableParametersCheck>( @@ -234,6 +232,8 @@ class BugproneModule : public ClangTidyModule { "bugprone-spuriously-wake-up-functions"); CheckFactories.registerCheck<StandaloneEmptyCheck>( "bugprone-standalone-empty"); + CheckFactories.registerCheck<StdNamespaceModificationCheck>( + "bugprone-std-namespace-modification"); CheckFactories.registerCheck<StringConstructorCheck>( "bugprone-string-constructor"); CheckFactories.registerCheck<StringIntegerAssignmentCheck>( diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index 358a73f36c9e6..882e9aa708d4d 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -21,7 +21,6 @@ add_clang_library(clangTidyBugproneModule STATIC CrtpConstructorAccessibilityCheck.cpp DanglingHandleCheck.cpp DerivedMethodShadowingBaseMethodCheck.cpp - DontModifyStdNamespaceCheck.cpp DynamicStaticInitializersCheck.cpp EasilySwappableParametersCheck.cpp EmptyCatchCheck.cpp @@ -74,6 +73,7 @@ add_clang_library(clangTidyBugproneModule STATIC SmartPtrArrayMismatchCheck.cpp SpuriouslyWakeUpFunctionsCheck.cpp StandaloneEmptyCheck.cpp + StdNamespaceModificationCheck.cpp StringConstructorCheck.cpp StringIntegerAssignmentCheck.cpp StringLiteralWithEmbeddedNulCheck.cpp diff --git a/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp similarity index 96% rename from clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.cpp rename to clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp index 869120a9a0864..13e5c03d7c4d3 100644 --- a/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "DontModifyStdNamespaceCheck.h" +#include "StdNamespaceModificationCheck.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchersInternal.h" @@ -38,7 +38,7 @@ AST_POLYMORPHIC_MATCHER_P( namespace clang::tidy::bugprone { -void DontModifyStdNamespaceCheck::registerMatchers(MatchFinder *Finder) { +void StdNamespaceModificationCheck::registerMatchers(MatchFinder *Finder) { auto HasStdParent = hasDeclContext(namespaceDecl(hasAnyName("std", "posix"), unless(hasParent(namespaceDecl()))) @@ -108,7 +108,7 @@ static const NamespaceDecl *getTopLevelLexicalNamespaceDecl(const Decl *D) { return LastNS; } -void clang::tidy::bugprone::DontModifyStdNamespaceCheck::check( +void clang::tidy::bugprone::StdNamespaceModificationCheck::check( const MatchFinder::MatchResult &Result) { const auto *D = Result.Nodes.getNodeAs<Decl>("decl"); const auto *NS = Result.Nodes.getNodeAs<NamespaceDecl>("nmspc"); diff --git a/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.h similarity index 66% rename from clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h rename to clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.h index 751b2fd98c87b..0f62dc3d9ab70 100644 --- a/clang-tools-extra/clang-tidy/bugprone/DontModifyStdNamespaceCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.h @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONTMODIFYSTDNAMESPACECHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONTMODIFYSTDNAMESPACECHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_STDNAMESPACEMODIFICATIONCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_STDNAMESPACEMODIFICATIONCHECK_H #include "../ClangTidyCheck.h" @@ -17,10 +17,10 @@ namespace clang::tidy::bugprone { /// This check warns for such modifications. /// /// For the user-facing documentation see: -/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/dont-modify-std-namespace.html -class DontModifyStdNamespaceCheck : public ClangTidyCheck { +/// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/std-namespace-modification.html +class StdNamespaceModificationCheck : public ClangTidyCheck { public: - DontModifyStdNamespaceCheck(StringRef Name, ClangTidyContext *Context) + StdNamespaceModificationCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; @@ -31,4 +31,4 @@ class DontModifyStdNamespaceCheck : public ClangTidyCheck { } // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_DONTMODIFYSTDNAMESPACECHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_STDNAMESPACEMODIFICATIONCHECK_H diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index cdd3a8b54f99b..7fa95f05779e8 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -11,13 +11,13 @@ #include "../ClangTidyModuleRegistry.h" #include "../bugprone/BadSignalToKillThreadCheck.h" #include "../bugprone/CommandProcessorCheck.h" -#include "../bugprone/DontModifyStdNamespaceCheck.h" #include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h" #include "../bugprone/ReservedIdentifierCheck.h" #include "../bugprone/SignalHandlerCheck.h" #include "../bugprone/SignedCharMisuseCheck.h" #include "../bugprone/SizeofExpressionCheck.h" #include "../bugprone/SpuriouslyWakeUpFunctionsCheck.h" +#include "../bugprone/StdNamespaceModificationCheck.h" #include "../bugprone/SuspiciousMemoryComparisonCheck.h" #include "../bugprone/ThrowingStaticInitializationCheck.h" #include "../bugprone/UncheckedStringToNumberConversionCheck.h" @@ -251,7 +251,7 @@ class CERTModule : public ClangTidyModule { "cert-dcl51-cpp"); CheckFactories.registerCheck<misc::NewDeleteOverloadsCheck>( "cert-dcl54-cpp"); - CheckFactories.registerCheck<bugprone::DontModifyStdNamespaceCheck>( + CheckFactories.registerCheck<bugprone::StdNamespaceModificationCheck>( "cert-dcl58-cpp"); CheckFactories.registerCheck<google::build::UnnamedNamespaceInHeaderCheck>( "cert-dcl59-cpp"); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index d1702bb9286de..b9c18cc3033bf 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -245,8 +245,8 @@ New check aliases keeping initial check as an alias to the new one. - Renamed :doc:`cert-dcl58-cpp <clang-tidy/checks/cert/dcl58-cpp>` to - :doc:`bugprone-dont-modify-std-namespace - <clang-tidy/checks/bugprone/dont-modify-std-namespace>` + :doc:`bugprone-std-namespace-modification + <clang-tidy/checks/bugprone/std-namespace-modification>` keeping initial check as an alias to the new one. - Renamed :doc:`cert-env33-c <clang-tidy/checks/cert/env33-c>` to diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/dont-modify-std-namespace.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/std-namespace-modification.rst similarity index 89% rename from clang-tools-extra/docs/clang-tidy/checks/bugprone/dont-modify-std-namespace.rst rename to clang-tools-extra/docs/clang-tidy/checks/bugprone/std-namespace-modification.rst index 9293fa0a42763..c6e5608280264 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/dont-modify-std-namespace.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/std-namespace-modification.rst @@ -1,11 +1,11 @@ -.. title:: clang-tidy - bugprone-dont-modify-std-namespace +.. title:: clang-tidy - bugprone-std-namespace-modification -bugprone-dont-modify-std-namespace -================================== +bugprone-std-namespace-modification +=================================== + +Warns on modifications of the ``std`` or ``posix`` namespaces which can +result in undefined behavior. -Modification of the ``std`` or ``posix`` namespace can result in undefined -behavior. -This check warns for such modifications. The ``std`` (or ``posix``) namespace is allowed to be extended with (class or function) template specializations that depend on an user-defined type (a type that is not defined in the standard system headers). diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst index ed2e4ec383c2e..1b8c2c4f97dde 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/dcl58-cpp.rst @@ -4,7 +4,7 @@ cert-dcl58-cpp ============== The `cert-dcl58-cpp` is an aliaes, please see -`bugprone-dont-modify-std-namespace <../bugprone/dont-modify-std-namespace.html>`_ +`bugprone-std-namespace-modification <../bugprone/std-namespace-modification.html>`_ for more information. This check corresponds to the CERT C++ Coding Standard rule diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 056ed07516fb1..da815d124e9b6 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -93,7 +93,6 @@ Clang-Tidy Checks :doc:`bugprone-crtp-constructor-accessibility <bugprone/crtp-constructor-accessibility>`, "Yes" :doc:`bugprone-dangling-handle <bugprone/dangling-handle>`, :doc:`bugprone-derived-method-shadowing-base-method <bugprone/derived-method-shadowing-base-method>`, - :doc:`bugprone-dont-modify-std-namespace <bugprone/dont-modify-std-namespace>`, :doc:`bugprone-dynamic-static-initializers <bugprone/dynamic-static-initializers>`, :doc:`bugprone-easily-swappable-parameters <bugprone/easily-swappable-parameters>`, :doc:`bugprone-empty-catch <bugprone/empty-catch>`, @@ -140,6 +139,7 @@ Clang-Tidy Checks :doc:`bugprone-sizeof-expression <bugprone/sizeof-expression>`, :doc:`bugprone-spuriously-wake-up-functions <bugprone/spuriously-wake-up-functions>`, :doc:`bugprone-standalone-empty <bugprone/standalone-empty>`, "Yes" + :doc:`bugprone-std-namespace-modification <bugprone/std-namespace-modification>`, :doc:`bugprone-string-constructor <bugprone/string-constructor>`, "Yes" :doc:`bugprone-string-integer-assignment <bugprone/string-integer-assignment>`, "Yes" :doc:`bugprone-string-literal-with-embedded-nul <bugprone/string-literal-with-embedded-nul>`, @@ -441,7 +441,7 @@ Check aliases :doc:`cert-dcl50-cpp <cert/dcl50-cpp>`, :doc:`modernize-avoid-variadic-functions <modernize/avoid-variadic-functions>`, :doc:`cert-dcl51-cpp <cert/dcl51-cpp>`, :doc:`bugprone-reserved-identifier <bugprone/reserved-identifier>`, "Yes" :doc:`cert-dcl54-cpp <cert/dcl54-cpp>`, :doc:`misc-new-delete-overloads <misc/new-delete-overloads>`, - :doc:`cert-dcl58-cpp <cert/dcl58-cpp>`, :doc:`bugprone-dont-modify-std-namespace <bugprone/dont-modify-std-namespace>`, + :doc:`cert-dcl58-cpp <cert/dcl58-cpp>`, :doc:`bugprone-std-namespace-modification <bugprone/std-namespace-modification>`, :doc:`cert-dcl59-cpp <cert/dcl59-cpp>`, :doc:`google-build-namespaces <google/build-namespaces>`, :doc:`cert-err09-cpp <cert/err09-cpp>`, :doc:`misc-throw-by-value-catch-by-reference <misc/throw-by-value-catch-by-reference>`, :doc:`cert-env33-c <cert/env33-c>`, :doc:`bugprone-command-processor <bugprone/command-processor>`, diff --git a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h index 2c4293dafb3e2..0870f60eaa39b 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h +++ b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h @@ -59,7 +59,7 @@ struct X {}; } // namespace std // Template specializations that are in a system-header file. -// The purpose is to test bugprone-dont-modify-std-namespace (no warnings here). +// The purpose is to test bugprone-std-namespace-modification (no warnings here). namespace std { template <> void swap<short>(short &, short &){}; diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/dont-modify-std-namespace.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/dont-modify-std-namespace.cpp deleted file mode 100644 index a53ba37d5ac95..0000000000000 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/dont-modify-std-namespace.cpp +++ /dev/null @@ -1,283 +0,0 @@ -// RUN: %check_clang_tidy -std=c++17-or-later %s bugprone-dont-modify-std-namespace %t -- -- -I %clang_tidy_headers - -#include "system-header-simulation.h" - -namespace A { - namespace B { - int b; - } -} - -namespace A { - namespace B { - int c; - } -} - -namespace posix { -// CHECK-MESSAGES: :[[@LINE+2]]:11: warning: modification of 'posix' namespace can result in undefined behavior [bugprone-dont-modify-std-namespace] -// CHECK-MESSAGES: :[[@LINE-2]]:11: note: 'posix' namespace opened here -namespace foo { -int foobar; -} -} - -namespace std { -// CHECK-MESSAGES: :[[@LINE+2]]:5: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-2]]:11: note: 'std' namespace opened here -int stdInt; -// CHECK-MESSAGES: :[[@LINE+2]]:5: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-5]]:11: note: 'std' namespace opened here -int stdInt1; -} - -namespace foobar { - namespace std { - int bar; - } -} - -namespace posix { -// CHECK-MESSAGES: :[[@LINE+2]]:11: warning: modification of 'posix' namespace -// CHECK-MESSAGES: :[[@LINE-2]]:11: note: 'posix' namespace opened here -namespace std { -} -} // namespace posix - -namespace posix::a { -// CHECK-MESSAGES: :[[@LINE-1]]:18: warning: modification of 'posix' namespace -// CHECK-MESSAGES: :[[@LINE-2]]:11: note: 'posix' namespace opened here -} - -namespace std { -// no-warning: empty -} // namespace std - -namespace std { -// Warn for non-NamedDecls as well. -// CHECK-MESSAGES: :[[@LINE+2]]:1: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-3]]:11: note: 'std' namespace opened here -static_assert(1 == 1, "non-NamedDecl"); -} // namespace std - -enum class MyError { - ErrorA, - ErrorB -}; - -namespace std { -// no-warning: Class template specialized by a program-defined type. -template <> -struct is_error_code_enum<MyError> : std::true_type {}; - -// no-warning: Function template specialized by a program-defined type. -template<> -void swap<MyError>(MyError &a, MyError &b); -} - -using ConstBoolPtr = const bool *; - -namespace std { -// class template, builtin type -// CHECK-MESSAGES: :[[@LINE+3]]:8: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-3]]:11: note: 'std' namespace opened here -template <> -struct is_error_code_enum<bool> : std::true_type {}; -// function template, builtin type -// CHECK-MESSAGES: :[[@LINE+3]]:6: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-8]]:11: note: 'std' namespace opened here -template <> -void swap<bool>(bool &, bool &); -// CHECK-MESSAGES: :[[@LINE+3]]:6: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-12]]:11: note: 'std' namespace opened here -template <> -void swap<ConstBoolPtr>(ConstBoolPtr &, ConstBoolPtr &); -} // namespace std - -namespace std { -// class template, std type -// CHECK-MESSAGES: :[[@LINE+3]]:8: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-3]]:11: note: 'std' namespace opened here -template <> -struct is_error_code_enum<std::io_errc> : std::true_type {}; -// function template, std type -// CHECK-MESSAGES: :[[@LINE+3]]:6: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-8]]:11: note: 'std' namespace opened here -template <> -void swap<std::io_errc>(std::io_errc &, std::io_errc &); -} // namespace std - -// parameter pack, has program-defined type -namespace std { -// no-warning: there is one program-defined type. -template <> -class tuple<int, MyError, std::io_errc> {}; -} // namespace std - -// parameter pack, only builtin or std type -namespace std { -// Forbid variadic specializations over only `std::` or builtin types. -// CHECK-MESSAGES: :[[@LINE+3]]:7: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-3]]:11: note: 'std' namespace opened here -template <> -class tuple<int, const std::io_errc, float> {}; -} // namespace std - -namespace std { -// Test nested standard declarations. -// CHECK-MESSAGES: :[[@LINE+3]]:8: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-3]]:11: note: 'std' namespace opened here -template <> -struct is_error_code_enum<std::Outer::Inner> : std::true_type {}; -} // namespace std - -namespace std { -// Test nested namespace. -// CHECK-MESSAGES: :[[@LINE+3]]:8: warning: modification of 'std' namespace -// CHECK-MESSAGES: :[[@LINE-3]]:11: note: 'std' namespace opened here -template <> -struct is_error_code_enum<std::detail::X> : std::true_type {}; -} // namespace std - -// Test member function template specializations. -namespace std { -// CHECK-MESSAGES: :[[@LINE+3]]:18: warning: modification of 'std' namespace -// CHECK_MESSAGES: :[[@LINE-2]]:11: note: 'std' namespace opened here -template <> -bool less<void>::operator()<int &&, float &&>(int &&, float &&) const { - return true; -} -// CHECK-MESSAGES: :[[@LINE+3]]:18: warning: modification of 'std' namespace -// CHECK_MESSAGES: :[[@LINE-8]]:11: note: 'std' namespace opened here -template <> -bool less<void>::operator()<MyError &&, MyError &&>(MyError &&, MyError &&) const { - return true; -} -} // namespace std - -// Test member class template specializations. -namespace std { -// CHECK-MESSAGES: :[[@LINE+3]]:20: warning: modification of 'std' namespace -// CHECK_MESSAGES: :[[@LINE-2]]:11: note: 'std' namespace opened here -template <> -struct less<void>::X<bool> {}; -// CHECK-MESSAGES: :[[@LINE+3]]:20: warning: modification of 'std' namespace -// CHECK_MESSAGES: :[[@LINE-6]]:11: note: 'std' namespace opened here -template <> -struct less<void>::X<MyError> {}; -// CHECK-MESSAGES: :[[@LINE+3]]:20: warning: modification of 'std' namespace -// CHECK_MESSAGES: :[[@LINE-10]]:11: note: 'std' namespace opened here -template <typename T> -struct less<void>::X<MyError, T> {}; -} // namespace std - -// We did not open the 'std' namespace, but still specialized the member -// function of 'std::less'. -// CHECK-MESSAGES: :[[@LINE+3]]:23: warning: modification of 'std' namespace -// no-note: There is no opening of 'std' namespace, hence no note emitted. -template <> -bool std::less<void>::operator()<int &&, int &&>(int &&, int &&) const { - return true; -} - -namespace SpaceA { -namespace SpaceB { -class MapKey { - int Type = 0; - -public: - MapKey() = default; - int getType() const { return Type; } -}; -} // namespace SpaceB -} // namespace SpaceA - -// no-warning: Specializing for 'std::hash' for a program-defined type. -template <> -struct std::hash<::SpaceA::SpaceB::MapKey> { - // no-warning - unsigned long operator()(const ::SpaceA::SpaceB::MapKey &K) const { - return K.getType(); - } - // no-warning - bool operator()(const ::SpaceA::SpaceB::MapKey &K1, - const ::SpaceA::SpaceB::MapKey &K2) const { - return K1.getType() < K2.getType(); - } -}; - -using myint = int; - -// The type alias declaration is the same as typedef, does not introduce a -// program-defined type. -// CHECK-MESSAGES: :[[@LINE+2]]:13: warning: modification of 'std' namespace -template <> -struct std::hash<myint> { - // no-warning: The warning was already reported for the struct itself. - unsigned long operator()(const myint &K) const { - return K; - } - // no-warning: The warning was already reported for the struct itself. - bool operator()(const myint &K1, - const myint &K2) const { - return K1 < K2; - } -}; - -// CHECK-MESSAGES: :[[@LINE+2]]:15: warning: modification of 'std' namespace -template <> -struct ::std::hash<long> { - unsigned long operator()(const long &K) const { - return K; - } -}; - -namespace ranges { -namespace detail { -struct diffmax_t {}; -using LongT = long; -} // namespace detail -} // namespace ranges - -namespace std { -// no-warning: specialization with an user-defined type -template <> -struct numeric_limits<::ranges::detail::diffmax_t> { - static constexpr bool is_signed = true; - static constexpr bool is_integer = true; - static constexpr ::ranges::detail::diffmax_t max() noexcept { - return {}; - } -}; -inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_signed; -inline constexpr bool numeric_limits<::ranges::detail::diffmax_t>::is_integer; -} // namespace std - -namespace std { -// specialization with type alias to non-program-defined-type -// CHECK-MESSAGES: :[[@LINE+3]]:8: warning: modification of 'std' namespace -// CHECK_MESSAGES: :[[@LINE-3]]:11: note: 'std' namespace opened here -template <> -struct numeric_limits<::ranges::detail::LongT> { - static constexpr bool is_signed = true; - static constexpr bool is_integer = true; - static constexpr ::ranges::detail::LongT max() noexcept { - return 1; - } -}; -inline constexpr bool numeric_limits<::ranges::detail::LongT>::is_signed; -inline constexpr bool numeric_limits<::ranges::detail::LongT>::is_integer; -} // namespace std - -namespace no_crash { -struct A -{ - friend struct B; -}; - -struct B; - -template<typename> struct T {}; - -T<B> b; -} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
