Author: Haojian Wu Date: 2020-02-03T12:11:44+01:00 New Revision: bdbdf748225525bb18cd0ffeb51c3e713f7b8e1b
URL: https://github.com/llvm/llvm-project/commit/bdbdf748225525bb18cd0ffeb51c3e713f7b8e1b DIFF: https://github.com/llvm/llvm-project/commit/bdbdf748225525bb18cd0ffeb51c3e713f7b8e1b.diff LOG: [clang][AST] Add an AST matcher for deducedTemplateSpeializationType. Summary: misc-unused-using clang-tidy check needs this matcher to fix a false positive of C++17 deduced class template types. Reviewers: gribozavr2 Reviewed By: gribozavr2 Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D73869 Added: Modified: clang/docs/LibASTMatchersReference.html clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp Removed: ################################################################################ diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index 95328dcd82eb..3d2ff477853f 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -1750,6 +1750,20 @@ <h2 id="decl-matchers">Node Matchers</h2> </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr> +<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class +template types. + +Given + template <typename T> + class C { public: C(T); }; + + C c(123); +deducedTemplateSpecializationType() matches the type in the declaration +of the variable c. +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>>...</td></tr> <tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression. @@ -3522,7 +3536,7 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2> </pre></td></tr> -<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>const std::string Name</td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr> <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. Supports specifying enclosing namespaces or classes by prefixing the name diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 4fdbf3e3ba6e..2bd24ef4cf6b 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -6030,6 +6030,21 @@ extern const AstTypeMatcher<EnumType> enumType; extern const AstTypeMatcher<TemplateSpecializationType> templateSpecializationType; +/// Matches C++17 deduced template specialization types, e.g. deduced class +/// template types. +/// +/// Given +/// \code +/// template <typename T> +/// class C { public: C(T); }; +/// +/// C c(123); +/// \endcode +/// \c deducedTemplateSpecializationType() matches the type in the declaration +/// of the variable \c c. +extern const AstTypeMatcher<DeducedTemplateSpecializationType> + deducedTemplateSpecializationType; + /// Matches types nodes representing unary type transformations. /// /// Given: diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 8c6dcfaaf52f..7344c622cc9d 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -202,6 +202,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(declStmt); REGISTER_MATCHER(declaratorDecl); REGISTER_MATCHER(decltypeType); + REGISTER_MATCHER(deducedTemplateSpecializationType); REGISTER_MATCHER(defaultStmt); REGISTER_MATCHER(dependentSizedArrayType); REGISTER_MATCHER(designatedInitExpr); diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp index 1fdaf66f285c..b603d764e3a6 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1458,6 +1458,12 @@ TEST(TypeMatching, MatchesTemplateSpecializationType) { templateSpecializationType())); } +TEST(TypeMatching, MatchesDeucedTemplateSpecializationType) { + EXPECT_TRUE(matches("template <typename T> class A{ public: A(T) {} }; A a(1);", + deducedTemplateSpecializationType(), + LanguageMode::Cxx17OrLater)); +} + TEST(TypeMatching, MatchesRecordType) { EXPECT_TRUE(matches("class C{}; C c;", recordType())); EXPECT_TRUE(matches("struct S{}; S s;", _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits