[clang] [clang-tools-extra] [clang-tidy][use-internal-linkage]fix false positives for ExportDecl (PR #117901)
Congcong Cai via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 28 05:36:02 PST 2024
https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/117901
>From d1d0722e833a9b66206c008a4cd3f6c5b4548b5c Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Wed, 27 Nov 2024 23:08:55 +0800
Subject: [PATCH 1/4] [ast-matcher] add `exportDecl` matcher
---
clang/docs/ReleaseNotes.rst | 2 ++
clang/include/clang/ASTMatchers/ASTMatchers.h | 11 +++++++++++
clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 1 +
3 files changed, 14 insertions(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 356b091c13af4f..4dfbd03d7756f2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -926,6 +926,8 @@ AST Matchers
- Ensure ``hasName`` matches template specializations across inline namespaces,
making `matchesNodeFullSlow` and `matchesNodeFullFast` consistent.
+- Add ``exportDecl`` matches export declaration.
+
clang-format
------------
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index 4bcaa953a61af2..efad600a3c58cd 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -1236,6 +1236,17 @@ AST_MATCHER_P(TemplateArgument, equalsIntegralValue,
extern const internal::VariadicDynCastAllOfMatcher<Stmt,
ObjCAutoreleasePoolStmt> autoreleasePoolStmt;
+/// Matches any export declaration.
+///
+/// Example matches following declarations.
+/// \code
+/// export void foo();
+/// export { void foo(); }
+/// export namespace { void foo(); }
+/// export int v;
+/// \endcode
+extern const internal::VariadicDynCastAllOfMatcher<Decl, ExportDecl> exportDecl;
+
/// Matches any value declaration.
///
/// Example matches A, B, C and F
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
index 46dd44e6f2b24f..cdbdb65195409f 100644
--- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
@@ -799,6 +799,7 @@ const internal::VariadicDynCastAllOfMatcher<TypeLoc, ElaboratedTypeLoc>
const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryExprOrTypeTraitExpr>
unaryExprOrTypeTraitExpr;
+const internal::VariadicDynCastAllOfMatcher<Decl, ExportDecl> exportDecl;
const internal::VariadicDynCastAllOfMatcher<Decl, ValueDecl> valueDecl;
const internal::VariadicDynCastAllOfMatcher<Decl, CXXConstructorDecl>
cxxConstructorDecl;
>From 3e521e700690cf3bbadf1ca800957c1fed6e6eb9 Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Wed, 27 Nov 2024 23:41:57 +0800
Subject: [PATCH 2/4] [clang-tidy][use-internal-linkage]fix false positives for
`ExportDecl`
C++20 modules supports to declare external linkage by `ExportDecl`.
---
.../misc/UseInternalLinkageCheck.cpp | 2 +-
clang-tools-extra/docs/ReleaseNotes.rst | 3 ++-
.../checks/misc/use-internal-linkage.rst | 5 +++++
.../misc/use-internal-linkage-module.cpp | 20 +++++++++++++++++++
4 files changed, 28 insertions(+), 2 deletions(-)
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-module.cpp
diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
index 71eb2d94cd4f26..0656238a0e6767 100644
--- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
@@ -101,7 +101,7 @@ void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) {
// 3. template
isExplicitTemplateSpecialization(),
// 4. friend
- hasAncestor(friendDecl()))));
+ hasAncestor(decl(anyOf(friendDecl(), exportDecl()))))));
Finder->addMatcher(
functionDecl(Common, hasBody(), unless(cxxMethodDecl()), unless(isMain()))
.bind("fn"),
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index f050391110385e..42b1e4e9fd1fe4 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 C++20 export declarations.
- Improved :doc:`modernize-avoid-c-arrays
<clang-tidy/checks/modernize/avoid-c-arrays>` check to suggest using
diff --git a/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst b/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst
index b8bbcc62706101..508b0cac09a912 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst
@@ -29,6 +29,11 @@ Example:
void fn3(); // without function body in all declaration, maybe external linkage
void fn3();
+ // export declarations
+ export void fn4() {}
+ export namespace t { void fn5() {} }
+ export int v2;
+
Options
-------
diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-module.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-module.cpp
new file mode 100644
index 00000000000000..9b0d8cde429b6b
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-module.cpp
@@ -0,0 +1,20 @@
+// RUN: %check_clang_tidy -std=c++20 %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
+
+module;
+
+export module test;
+
+export void single_export_fn() {}
+export int single_export_var;
+
+export {
+ void group_export_fn1() {}
+ void group_export_fn2() {}
+ int group_export_var1;
+ int group_export_var2;
+}
+
+export namespace aa {
+void namespace_export_fn() {}
+int namespace_export_var;
+} // namespace aa
>From 04acf88916647fee078a3b0d66ac6c7379be3613 Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Thu, 28 Nov 2024 06:46:58 +0800
Subject: [PATCH 3/4] add doc and test
---
clang/docs/LibASTMatchersReference.html | 11 +++++++++++
.../unittests/ASTMatchers/ASTMatchersNodeTest.cpp | 15 +++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html
index c6307954d7f1bb..f18e9cf1341696 100644
--- a/clang/docs/LibASTMatchersReference.html
+++ b/clang/docs/LibASTMatchersReference.html
@@ -804,6 +804,17 @@ <h2 id="decl-matchers">Node Matchers</h2>
</pre></td></tr>
+<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('exportDecl0')"><a name="exportDecl0Anchor">exportDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1ExportDecl.html">ExportDecl</a>>...</td></tr>
+<tr><td colspan="4" class="doc" id="exportDecl0"><pre>Matches any export declaration.
+
+Example matches following declarations.
+ export void foo();
+ export { void foo(); }
+ export namespace { void foo(); }
+ export int v;
+</pre></td></tr>
+
+
<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>>...</td></tr>
<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
index ebf548eb254313..9bc287e07224aa 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp
@@ -189,6 +189,21 @@ TEST(ASTMatchersTestCUDA, HasAttrCUDA) {
hasAttr(clang::attr::CUDAGlobal)));
}
+TEST_P(ASTMatchersTest, ExportDecl) {
+ if (!GetParam().isCXX20OrLater()) {
+ return;
+ }
+ const std::string moduleHeader = "module;export module ast_matcher_test;";
+ EXPECT_TRUE(matches(moduleHeader + "export void foo();",
+ exportDecl(has(functionDecl()))));
+ EXPECT_TRUE(matches(moduleHeader + "export { void foo(); int v; }",
+ exportDecl(has(functionDecl()))));
+ EXPECT_TRUE(matches(moduleHeader + "export { void foo(); int v; }",
+ exportDecl(has(varDecl()))));
+ EXPECT_TRUE(matches(moduleHeader + "export namespace aa { void foo(); }",
+ exportDecl(has(namespaceDecl()))));
+}
+
TEST_P(ASTMatchersTest, ValueDecl) {
if (!GetParam().isCXX()) {
// FIXME: Fix this test in non-C++ language modes.
>From 27f092f9fdc673eccac73eb12804469231f16aa8 Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Thu, 28 Nov 2024 21:35:46 +0800
Subject: [PATCH 4/4] fix
---
.../clang-tidy/misc/UseInternalLinkageCheck.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
index 0656238a0e6767..81f30e2fa3647f 100644
--- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
@@ -100,8 +100,11 @@ void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) {
isExternStorageClass(), isExternC(),
// 3. template
isExplicitTemplateSpecialization(),
- // 4. friend
- hasAncestor(decl(anyOf(friendDecl(), exportDecl()))))));
+ hasAncestor(decl(anyOf(
+ // 4. friend
+ friendDecl(),
+ // 5. module export decl
+ exportDecl()))))));
Finder->addMatcher(
functionDecl(Common, hasBody(), unless(cxxMethodDecl()), unless(isMain()))
.bind("fn"),
More information about the cfe-commits
mailing list