This revision was automatically updated to reflect the committed changes. Closed by commit rG14d89bfbe0b4: [ASTMatchers] Fix isDerivedFrom for recursive templates (authored by jkorous). Herald added a project: clang. Herald added a subscriber: cfe-commits.
Changed prior to commit: https://reviews.llvm.org/D77612?vs=255561&id=257815#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D77612/new/ https://reviews.llvm.org/D77612 Files: clang/lib/ASTMatchers/ASTMatchFinder.cpp clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp Index: clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -453,6 +453,20 @@ 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")); Index: clang/lib/ASTMatchers/ASTMatchFinder.cpp =================================================================== --- clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -916,9 +916,8 @@ 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)) {
Index: clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -453,6 +453,20 @@ 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")); Index: clang/lib/ASTMatchers/ASTMatchFinder.cpp =================================================================== --- clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -916,9 +916,8 @@ 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)) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits