forked from OSchip/llvm-project
[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
This commit is contained in:
parent
ae5d3e8c51
commit
bdbdf74822
|
@ -1750,6 +1750,20 @@ decltypeType()
|
|||
</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 @@ void f() {}
|
|||
</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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;",
|
||||
|
|
Loading…
Reference in New Issue