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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits