[ASTMatchers] Fix isDerivedFrom for recursive templates

Differential Revision: https://reviews.llvm.org/D77612
This commit is contained in:
Jan Korous 2020-04-15 12:47:24 -07:00
parent 7b6ff8bf1f
commit 14d89bfbe0
2 changed files with 16 additions and 3 deletions

View File

@ -916,9 +916,8 @@ bool MatchASTVisitor::classIsDerivedFrom(const CXXRecordDecl *Declaration,
if (!ClassDecl)
continue;
if (ClassDecl == Declaration) {
// This can happen for recursive template definitions; if the
// current declaration did not match, we can safely return false.
return false;
// This can happen for recursive template definitions.
continue;
}
BoundNodesTreeBuilder Result(*Builder);
if (Base.matches(*ClassDecl, this, &Result)) {

View File

@ -453,6 +453,20 @@ TEST(DeclarationMatcher, ClassIsDerived) {
EXPECT_TRUE(notMatches("class X;", IsDerivedFromX));
EXPECT_TRUE(notMatches("class Y;", IsDerivedFromX));
EXPECT_TRUE(notMatches("", IsDerivedFromX));
EXPECT_TRUE(matches("class X {}; template<int N> class Y : Y<N-1>, X {};",
IsDerivedFromX));
EXPECT_TRUE(matches("class X {}; template<int N> class Y : X, Y<N-1> {};",
IsDerivedFromX));
DeclarationMatcher IsZDerivedFromX = cxxRecordDecl(hasName("Z"),
isDerivedFrom("X"));
EXPECT_TRUE(
matches(
"class X {};"
"template<int N> class Y : Y<N-1> {};"
"template<> class Y<0> : X {};"
"class Z : Y<1> {};",
IsZDerivedFromX));
DeclarationMatcher IsDirectlyDerivedFromX =
cxxRecordDecl(isDirectlyDerivedFrom("X"));