Author: Congcong Cai Date: 2024-11-30T22:14:36+08:00 New Revision: f89fa238faa6a63168997a8a1d03c15b71da8080
URL: https://github.com/llvm/llvm-project/commit/f89fa238faa6a63168997a8a1d03c15b71da8080 DIFF: https://github.com/llvm/llvm-project/commit/f89fa238faa6a63168997a8a1d03c15b71da8080.diff LOG: [clang-tidy][use-internal-linkage]fix false positives for global overloaded operator new and operator delete (#117945) Added: Modified: clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp Removed: ################################################################################ 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 62577b9248fef3..ec666aeb2ad8ab 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -247,7 +247,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