https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/117945
>From 4cbe6e08f950d9d3075fa7a1da889b7566bef6c5 Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Thu, 28 Nov 2024 08:15:34 +0800 Subject: [PATCH] [clang-tidy][use-internal-linkage]fix false positives for global overloaded operator new and operator delete --- .../misc/UseInternalLinkageCheck.cpp | 23 ++++++++++++++++++- clang-tools-extra/docs/ReleaseNotes.rst | 3 ++- .../misc/use-internal-linkage-func.cpp | 10 ++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp index 71eb2d94cd4f26..0c417f6374bc50 100644 --- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp @@ -15,7 +15,9 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Lex/Token.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallVector.h" using namespace clang::ast_matchers; @@ -78,6 +80,22 @@ AST_POLYMORPHIC_MATCHER(isExternStorageClass, return Node.getStorageClass() == SC_Extern; } +AST_MATCHER(FunctionDecl, isAllocationOrDeallocationOverloadedFunction) { + // [basic.stc.dynamic.allocation] + // An allocation function that is not a class member function shall belong to + // the global scope and not have a name with internal linkage. + // [basic.stc.dynamic.deallocation] + // A deallocation function that is not a class member function shall belong to + // the global scope and not have a name with internal linkage. + static const llvm::DenseSet<OverloadedOperatorKind> OverloadedOperators{ + OverloadedOperatorKind::OO_New, + OverloadedOperatorKind::OO_Array_New, + OverloadedOperatorKind::OO_Delete, + OverloadedOperatorKind::OO_Array_Delete, + }; + return OverloadedOperators.contains(Node.getOverloadedOperator()); +} + } // namespace UseInternalLinkageCheck::UseInternalLinkageCheck(StringRef Name, @@ -103,7 +121,10 @@ void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) { // 4. friend hasAncestor(friendDecl())))); Finder->addMatcher( - functionDecl(Common, hasBody(), unless(cxxMethodDecl()), unless(isMain())) + functionDecl(Common, hasBody(), + unless(anyOf(cxxMethodDecl(), + isAllocationOrDeallocationOverloadedFunction(), + isMain()))) .bind("fn"), this); Finder->addMatcher(varDecl(Common, hasGlobalStorage()).bind("var"), this); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index f050391110385e..9641d3a0711259 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -237,7 +237,8 @@ Changes in existing checks - Improved :doc:`misc-use-internal-linkage <clang-tidy/checks/misc/use-internal-linkage>` check to insert ``static`` keyword before type qualifiers such as ``const`` and ``volatile`` and fix - false positives for function declaration without body. + false positives for function declaration without body and fix false positives + for global scoped overloaded ``operator new`` and ``operator delete``. - Improved :doc:`modernize-avoid-c-arrays <clang-tidy/checks/modernize/avoid-c-arrays>` check to suggest using diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp index bf0d2c2513e562..68951fcf0aaac9 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp @@ -85,3 +85,13 @@ void func_with_body() {} void func_without_body(); void func_without_body(); } + +// gh117489 start +namespace std { +using size_t = decltype(sizeof(int)); +} +void * operator new(std::size_t) { return nullptr; } +void * operator new[](std::size_t) { return nullptr; } +void operator delete(void*) noexcept {} +void operator delete[](void*) noexcept {} +// gh117489 end _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits