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
AST Matchers
------------
+- Add ``isInAnoymousNamespace`` matcher to match declarations in an anonymous namespace.
clang-format
------------
/// 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.
///
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;