-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang-tidy][use-internal-linkage]fix false positives for global overloaded operator new and operator delete #117945
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang-tools-extra @llvm/pr-subscribers-clang Author: Congcong Cai (HerrCai0907) ChangesFull diff: https://github.com/llvm/llvm-project/pull/117945.diff 4 Files Affected:
diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
index 71eb2d94cd4f26..0f05d16870ffff 100644
--- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
@@ -15,7 +15,10 @@
#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/SetVector.h"
+#include "llvm/ADT/SmallVector.h"
using namespace clang::ast_matchers;
@@ -78,6 +81,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 +122,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..f441254f0b1af2 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 = unsigned long;
+}
+void * operator new(std::size_t);
+void * operator new[](std::size_t);
+void operator delete(void*);
+void operator delete[](void*);
+// gh117489 end
diff --git a/clang/test/Sema/function-redecl.c b/clang/test/Sema/function-redecl.c
index 3aeef00733d1f4..a1b7b4dc8a8599 100644
--- a/clang/test/Sema/function-redecl.c
+++ b/clang/test/Sema/function-redecl.c
@@ -43,7 +43,7 @@ void test(void) {
}
extern void g3(int); // expected-note{{previous declaration is here}}
-static void g3(int x) { } // expected-error{{static declaration of 'g3' follows non-static declaration}}
+static void g3(int x) { } // expected-error{{static declaration of 'g3' }}
void test2(void) {
extern int f2; // expected-note 2 {{previous definition is here}}
|
clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
Outdated
Show resolved
Hide resolved
7d0f420
to
a5c9f45
Compare
…loaded operator new and operator delete
a5c9f45
to
4cbe6e0
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/52/builds/4138 Here is the relevant piece of the build log for the reference
|
No description provided.