forked from OSchip/llvm-project
Fixes a bug in DynTypedNode.
Two DynTypedNodes can be equal if they do not have the same node type, because DynTypedNodes for the same underlying object might have been created from different types (for example, Decl vs VarDecl). llvm-svn: 204722
This commit is contained in:
parent
86f318e8b4
commit
ce68f7714a
|
@ -212,8 +212,8 @@ public:
|
|||
return getMemoizationData() < Other.getMemoizationData();
|
||||
}
|
||||
bool operator==(const DynTypedNode &Other) const {
|
||||
// Nodes with different types cannot be equal.
|
||||
if (!NodeKind.isSame(Other.NodeKind))
|
||||
if (!NodeKind.isBaseOf(Other.NodeKind) &&
|
||||
!Other.NodeKind.isBaseOf(NodeKind))
|
||||
return false;
|
||||
|
||||
// FIXME: Implement for other types.
|
||||
|
|
|
@ -4260,7 +4260,6 @@ TEST(EqualsBoundNodeMatcher, Type) {
|
|||
}
|
||||
|
||||
TEST(EqualsBoundNodeMatcher, UsingForEachDescendant) {
|
||||
|
||||
EXPECT_TRUE(matchAndVerifyResultTrue(
|
||||
"int f() {"
|
||||
" if (1) {"
|
||||
|
@ -4294,5 +4293,37 @@ TEST(EqualsBoundNodeMatcher, FiltersMatchedCombinations) {
|
|||
new VerifyIdIsBoundTo<VarDecl>("d", 5)));
|
||||
}
|
||||
|
||||
TEST(EqualsBoundNodeMatcher, UnlessDescendantsOfAncestorsMatch) {
|
||||
EXPECT_TRUE(matchAndVerifyResultTrue(
|
||||
"struct StringRef { int size() const; const char* data() const; };"
|
||||
"void f(StringRef v) {"
|
||||
" v.data();"
|
||||
"}",
|
||||
memberCallExpr(
|
||||
callee(methodDecl(hasName("data"))),
|
||||
on(declRefExpr(to(varDecl(hasType(recordDecl(hasName("StringRef"))))
|
||||
.bind("var")))),
|
||||
unless(hasAncestor(stmt(hasDescendant(memberCallExpr(
|
||||
callee(methodDecl(anyOf(hasName("size"), hasName("length")))),
|
||||
on(declRefExpr(to(varDecl(equalsBoundNode("var")))))))))))
|
||||
.bind("data"),
|
||||
new VerifyIdIsBoundTo<Expr>("data", 1)));
|
||||
|
||||
EXPECT_FALSE(matches(
|
||||
"struct StringRef { int size() const; const char* data() const; };"
|
||||
"void f(StringRef v) {"
|
||||
" v.data();"
|
||||
" v.size();"
|
||||
"}",
|
||||
memberCallExpr(
|
||||
callee(methodDecl(hasName("data"))),
|
||||
on(declRefExpr(to(varDecl(hasType(recordDecl(hasName("StringRef"))))
|
||||
.bind("var")))),
|
||||
unless(hasAncestor(stmt(hasDescendant(memberCallExpr(
|
||||
callee(methodDecl(anyOf(hasName("size"), hasName("length")))),
|
||||
on(declRefExpr(to(varDecl(equalsBoundNode("var")))))))))))
|
||||
.bind("data")));
|
||||
}
|
||||
|
||||
} // end namespace ast_matchers
|
||||
} // end namespace clang
|
||||
|
|
Loading…
Reference in New Issue