[clang] [clang] fix hasAnyBase not binding submatchers (PR #67939)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 1 16:42:01 PDT 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
<details>
<summary>Changes</summary>
The BoundNodesTreeBuilder used in the BaseSpecMatcher was the original
and was reset to its original state if a match occurred.
The matcher now uses the local copy in the inner matcher.
Fixes #<!-- -->65421
---
Full diff: https://github.com/llvm/llvm-project/pull/67939.diff
2 Files Affected:
- (modified) clang/lib/ASTMatchers/ASTMatchersInternal.cpp (+1-1)
- (modified) clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp (+13)
``````````diff
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
index 40688107215f287..435bbdeda22066e 100644
--- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
@@ -87,7 +87,7 @@ bool matchesAnyBase(const CXXRecordDecl &Node,
[Finder, Builder, &BaseSpecMatcher](const CXXBaseSpecifier *BaseSpec,
CXXBasePath &IgnoredParam) {
BoundNodesTreeBuilder Result(*Builder);
- if (BaseSpecMatcher.matches(*BaseSpec, Finder, Builder)) {
+ if (BaseSpecMatcher.matches(*BaseSpec, Finder, &Result)) {
*Builder = std::move(Result);
return true;
}
diff --git a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
index 89954711804aa57..d4a695b974bf0e5 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -8,6 +8,7 @@
#include "ASTMatchersTest.h"
#include "clang/AST/Attrs.inc"
+#include "clang/AST/DeclCXX.h"
#include "clang/AST/PrettyPrinter.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
@@ -5457,6 +5458,18 @@ TEST(HasParent, NoDuplicateParents) {
stmt().bind("node"), std::make_unique<HasDuplicateParents>()));
}
+TEST(HasAnyBase, BindsInnerBoundNodes) {
+ EXPECT_TRUE(matchAndVerifyResultTrue(
+ "struct Inner {}; struct Proxy : Inner {}; struct Main : public "
+ "Proxy {};",
+ cxxRecordDecl(hasName("Main"),
+ hasAnyBase(cxxBaseSpecifier(hasType(
+ cxxRecordDecl(hasName("Inner")).bind("base-class")))))
+ .bind("class"),
+ std::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("base-class",
+ "Inner")));
+}
+
TEST(TypeMatching, PointeeTypes) {
EXPECT_TRUE(matches("int b; int &a = b;",
referenceType(pointee(builtinType()))));
``````````
</details>
https://github.com/llvm/llvm-project/pull/67939
More information about the cfe-commits
mailing list