Author: gribozavr Date: Fri May 3 05:50:00 2019 New Revision: 359876 URL: http://llvm.org/viewvc/llvm-project?rev=359876&view=rev Log: Added an AST matcher for declarations that are in the `std` namespace
Reviewers: alexfh Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D61480 Modified: cfe/trunk/docs/LibASTMatchersReference.html cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h cfe/trunk/lib/AST/DeclBase.cpp cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp Modified: cfe/trunk/docs/LibASTMatchersReference.html URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=359876&r1=359875&r2=359876&view=diff ============================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html (original) +++ cfe/trunk/docs/LibASTMatchersReference.html Fri May 3 05:50:00 2019 @@ -2827,6 +2827,29 @@ by the compiler (eg. implicit default/co </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('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr> +<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces. + +Given + class vector {}; + namespace foo { + class vector {}; + namespace std { + class vector {}; + } + } + namespace std { + inline namespace __1 { + class vector {}; // #1 + namespace experimental { + class vector {}; + } + } + } +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('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations. Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=359876&r1=359875&r2=359876&view=diff ============================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original) +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Fri May 3 05:50:00 2019 @@ -6212,6 +6212,29 @@ AST_MATCHER(NamespaceDecl, isAnonymous) return Node.isAnonymousNamespace(); } +/// Matches declarations in the namespace `std`, but not in nested namespaces. +/// +/// Given +/// \code +/// class vector {}; +/// namespace foo { +/// class vector {}; +/// namespace std { +/// class vector {}; +/// } +/// } +/// namespace std { +/// inline namespace __1 { +/// class vector {}; // #1 +/// namespace experimental { +/// class vector {}; +/// } +/// } +/// } +/// \endcode +/// cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. +AST_MATCHER(Decl, isInStdNamespace) { return Node.isInStdNamespace(); } + /// If the given case statement does not use the GNU case range /// extension, matches the constant given in the statement. /// Modified: cfe/trunk/lib/AST/DeclBase.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=359876&r1=359875&r2=359876&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclBase.cpp (original) +++ cfe/trunk/lib/AST/DeclBase.cpp Fri May 3 05:50:00 2019 @@ -354,7 +354,8 @@ bool Decl::isInAnonymousNamespace() cons } bool Decl::isInStdNamespace() const { - return getDeclContext()->isStdNamespace(); + const DeclContext *DC = getDeclContext(); + return DC && DC->isStdNamespace(); } TranslationUnitDecl *Decl::getTranslationUnitDecl() { Modified: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp?rev=359876&r1=359875&r2=359876&view=diff ============================================================================== --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp (original) +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp Fri May 3 05:50:00 2019 @@ -366,6 +366,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(isExternC); REGISTER_MATCHER(isFinal); REGISTER_MATCHER(isImplicit); + REGISTER_MATCHER(isInStdNamespace); REGISTER_MATCHER(isInTemplateInstantiation); REGISTER_MATCHER(isInline); REGISTER_MATCHER(isInstanceMessage); Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp?rev=359876&r1=359875&r2=359876&view=diff ============================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp (original) +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp Fri May 3 05:50:00 2019 @@ -2031,6 +2031,57 @@ TEST(NS, Anonymous) { EXPECT_TRUE(matches("namespace {}", namespaceDecl(isAnonymous()))); } +TEST(DeclarationMatcher, InStdNamespace) { + EXPECT_TRUE(notMatches("class vector {};" + "namespace foo {" + " class vector {};" + "}" + "namespace foo {" + " namespace std {" + " class vector {};" + " }" + "}", + cxxRecordDecl(hasName("vector"), isInStdNamespace()))); + + EXPECT_TRUE(matches("namespace std {" + " class vector {};" + "}", + cxxRecordDecl(hasName("vector"), isInStdNamespace()))); + EXPECT_TRUE(matches("namespace std {" + " inline namespace __1 {" + " class vector {};" + " }" + "}", + cxxRecordDecl(hasName("vector"), isInStdNamespace()))); + EXPECT_TRUE(notMatches("namespace std {" + " inline namespace __1 {" + " inline namespace __fs {" + " namespace filesystem {" + " inline namespace v1 {" + " class path {};" + " }" + " }" + " }" + " }" + "}", + cxxRecordDecl(hasName("path"), isInStdNamespace()))); + EXPECT_TRUE( + matches("namespace std {" + " inline namespace __1 {" + " inline namespace __fs {" + " namespace filesystem {" + " inline namespace v1 {" + " class path {};" + " }" + " }" + " }" + " }" + "}", + cxxRecordDecl(hasName("path"), + hasAncestor(namespaceDecl(hasName("filesystem"), + isInStdNamespace()))))); +} + TEST(EqualsBoundNodeMatcher, QualType) { EXPECT_TRUE(matches( "int i = 1;", varDecl(hasType(qualType().bind("type")), _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits