[clang] 125ccd3 - [ASTMatchers] Add isInAnonymousNamespace narrowing matcher
Carlos Galvez via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 23 00:00:06 PST 2022
Author: Carlos Galvez
Date: 2022-12-23T07:39:03Z
New Revision: 125ccd3751472a0c709498f83671577ffed394a6
URL: https://github.com/llvm/llvm-project/commit/125ccd3751472a0c709498f83671577ffed394a6
DIFF: https://github.com/llvm/llvm-project/commit/125ccd3751472a0c709498f83671577ffed394a6.diff
LOG: [ASTMatchers] Add isInAnonymousNamespace narrowing matcher
Used in a couple clang-tidy checks so it could be extracted
out as its own matcher.
Differential Revision: https://reviews.llvm.org/D140328
Added:
Modified:
clang/docs/LibASTMatchersReference.html
clang/docs/ReleaseNotes.rst
clang/include/clang/ASTMatchers/ASTMatchers.h
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
Removed:
################################################################################
diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html
index 61844ffc9de90..f9cb9f2e942bb 100644
--- a/clang/docs/LibASTMatchersReference.html
+++ b/clang/docs/LibASTMatchersReference.html
@@ -3962,6 +3962,25 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
</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('isInAnonymousNamespace0')"><a name="isInAnonymousNamespace0Anchor">isInAnonymousNamespace</a></td><td></td></tr>
+<tr><td colspan="4" class="doc" id="isInAnonymousNamespace0"><pre>Matches declarations in an anonymous namespace.
+
+Given
+ class vector {};
+ namespace foo {
+ class vector {};
+ namespace {
+ class vector {}; // #1
+ }
+ }
+ namespace {
+ class vector {}; // #2
+ namespace foo {
+ class vector{}; // #3
+ }
+ }
+cxxRecordDecl(hasName("vector"), isInAnonymousNamespace()) will match #1, #2 and #3.
+</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('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8c288a98eec99..48ffafafb1bb7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -859,6 +859,7 @@ Build System Changes
AST Matchers
------------
+- Add ``isInAnoymousNamespace`` matcher to match declarations in an anonymous namespace.
clang-format
------------
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index dfea432c16adb..5d3d458b6409f 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -7813,6 +7813,30 @@ AST_MATCHER(NamespaceDecl, isAnonymous) {
/// cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
AST_MATCHER(Decl, isInStdNamespace) { return Node.isInStdNamespace(); }
+/// Matches declarations in an anonymous namespace.
+///
+/// Given
+/// \code
+/// class vector {};
+/// namespace foo {
+/// class vector {};
+/// namespace {
+/// class vector {}; // #1
+/// }
+/// }
+/// namespace {
+/// class vector {}; // #2
+/// namespace foo {
+/// class vector{}; // #3
+/// }
+/// }
+/// \endcode
+/// cxxRecordDecl(hasName("vector"), isInAnonymousNamespace()) will match
+/// #1, #2 and #3.
+AST_MATCHER(Decl, isInAnonymousNamespace) {
+ return Node.isInAnonymousNamespace();
+}
+
/// If the given case statement does not use the GNU case range
/// extension, matches the constant given in the statement.
///
diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
index 752a736ae800e..2c8b67f2644fd 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
@@ -3550,6 +3550,41 @@ TEST_P(ASTMatchersTest, InStdNamespace) {
cxxRecordDecl(hasName("vector"), isInStdNamespace())));
}
+TEST_P(ASTMatchersTest, InAnonymousNamespace) {
+ if (!GetParam().isCXX()) {
+ return;
+ }
+
+ EXPECT_TRUE(
+ notMatches("class vector {};"
+ "namespace foo {"
+ " class vector {};"
+ "}",
+ cxxRecordDecl(hasName("vector"), isInAnonymousNamespace())));
+
+ EXPECT_TRUE(
+ matches("namespace {"
+ " class vector {};"
+ "}",
+ cxxRecordDecl(hasName("vector"), isInAnonymousNamespace())));
+
+ EXPECT_TRUE(
+ matches("namespace foo {"
+ " namespace {"
+ " class vector {};"
+ " }"
+ "}",
+ cxxRecordDecl(hasName("vector"), isInAnonymousNamespace())));
+
+ EXPECT_TRUE(
+ matches("namespace {"
+ " namespace foo {"
+ " class vector {};"
+ " }"
+ "}",
+ cxxRecordDecl(hasName("vector"), isInAnonymousNamespace())));
+}
+
TEST_P(ASTMatchersTest, InStdNamespace_CXX11) {
if (!GetParam().isCXX11OrLater()) {
return;
More information about the cfe-commits
mailing list