xref: /aosp_15_r20/external/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //= unittests/ASTMatchers/ASTMatchersTraversalTest.cpp - matchers unit tests =//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //`
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #include "ASTMatchersTest.h"
11*67e74705SXin Li #include "clang/AST/PrettyPrinter.h"
12*67e74705SXin Li #include "clang/ASTMatchers/ASTMatchFinder.h"
13*67e74705SXin Li #include "clang/ASTMatchers/ASTMatchers.h"
14*67e74705SXin Li #include "clang/Tooling/Tooling.h"
15*67e74705SXin Li #include "llvm/ADT/Triple.h"
16*67e74705SXin Li #include "llvm/Support/Host.h"
17*67e74705SXin Li #include "gtest/gtest.h"
18*67e74705SXin Li 
19*67e74705SXin Li namespace clang {
20*67e74705SXin Li namespace ast_matchers {
21*67e74705SXin Li 
TEST(DeclarationMatcher,hasMethod)22*67e74705SXin Li TEST(DeclarationMatcher, hasMethod) {
23*67e74705SXin Li   EXPECT_TRUE(matches("class A { void func(); };",
24*67e74705SXin Li                       cxxRecordDecl(hasMethod(hasName("func")))));
25*67e74705SXin Li   EXPECT_TRUE(notMatches("class A { void func(); };",
26*67e74705SXin Li                          cxxRecordDecl(hasMethod(isPublic()))));
27*67e74705SXin Li }
28*67e74705SXin Li 
TEST(DeclarationMatcher,ClassDerivedFromDependentTemplateSpecialization)29*67e74705SXin Li TEST(DeclarationMatcher, ClassDerivedFromDependentTemplateSpecialization) {
30*67e74705SXin Li   EXPECT_TRUE(matches(
31*67e74705SXin Li     "template <typename T> struct A {"
32*67e74705SXin Li       "  template <typename T2> struct F {};"
33*67e74705SXin Li       "};"
34*67e74705SXin Li       "template <typename T> struct B : A<T>::template F<T> {};"
35*67e74705SXin Li       "B<int> b;",
36*67e74705SXin Li     cxxRecordDecl(hasName("B"), isDerivedFrom(recordDecl()))));
37*67e74705SXin Li }
38*67e74705SXin Li 
TEST(DeclarationMatcher,hasDeclContext)39*67e74705SXin Li TEST(DeclarationMatcher, hasDeclContext) {
40*67e74705SXin Li   EXPECT_TRUE(matches(
41*67e74705SXin Li     "namespace N {"
42*67e74705SXin Li       "  namespace M {"
43*67e74705SXin Li       "    class D {};"
44*67e74705SXin Li       "  }"
45*67e74705SXin Li       "}",
46*67e74705SXin Li     recordDecl(hasDeclContext(namespaceDecl(hasName("M"))))));
47*67e74705SXin Li   EXPECT_TRUE(notMatches(
48*67e74705SXin Li     "namespace N {"
49*67e74705SXin Li       "  namespace M {"
50*67e74705SXin Li       "    class D {};"
51*67e74705SXin Li       "  }"
52*67e74705SXin Li       "}",
53*67e74705SXin Li     recordDecl(hasDeclContext(namespaceDecl(hasName("N"))))));
54*67e74705SXin Li 
55*67e74705SXin Li   EXPECT_TRUE(matches("namespace {"
56*67e74705SXin Li                         "  namespace M {"
57*67e74705SXin Li                         "    class D {};"
58*67e74705SXin Li                         "  }"
59*67e74705SXin Li                         "}",
60*67e74705SXin Li                       recordDecl(hasDeclContext(namespaceDecl(
61*67e74705SXin Li                         hasName("M"), hasDeclContext(namespaceDecl()))))));
62*67e74705SXin Li 
63*67e74705SXin Li   EXPECT_TRUE(matches("class D{};", decl(hasDeclContext(decl()))));
64*67e74705SXin Li }
65*67e74705SXin Li 
TEST(HasDescendant,MatchesDescendantTypes)66*67e74705SXin Li TEST(HasDescendant, MatchesDescendantTypes) {
67*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int i = 3; }",
68*67e74705SXin Li                       decl(hasDescendant(loc(builtinType())))));
69*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int i = 3; }",
70*67e74705SXin Li                       stmt(hasDescendant(builtinType()))));
71*67e74705SXin Li 
72*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int i = 3; }",
73*67e74705SXin Li                       stmt(hasDescendant(loc(builtinType())))));
74*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int i = 3; }",
75*67e74705SXin Li                       stmt(hasDescendant(qualType(builtinType())))));
76*67e74705SXin Li 
77*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() { float f = 2.0f; }",
78*67e74705SXin Li                          stmt(hasDescendant(isInteger()))));
79*67e74705SXin Li 
80*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
81*67e74705SXin Li     "void f() { int a; float c; int d; int e; }",
82*67e74705SXin Li     functionDecl(forEachDescendant(
83*67e74705SXin Li       varDecl(hasDescendant(isInteger())).bind("x"))),
84*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 3)));
85*67e74705SXin Li }
86*67e74705SXin Li 
TEST(HasDescendant,MatchesDescendantsOfTypes)87*67e74705SXin Li TEST(HasDescendant, MatchesDescendantsOfTypes) {
88*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int*** i; }",
89*67e74705SXin Li                       qualType(hasDescendant(builtinType()))));
90*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int*** i; }",
91*67e74705SXin Li                       qualType(hasDescendant(
92*67e74705SXin Li                         pointerType(pointee(builtinType()))))));
93*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int*** i; }",
94*67e74705SXin Li                       typeLoc(hasDescendant(loc(builtinType())))));
95*67e74705SXin Li 
96*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
97*67e74705SXin Li     "void f() { int*** i; }",
98*67e74705SXin Li     qualType(asString("int ***"), forEachDescendant(pointerType().bind("x"))),
99*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Type>>("x", 2)));
100*67e74705SXin Li }
101*67e74705SXin Li 
102*67e74705SXin Li 
TEST(Has,MatchesChildrenOfTypes)103*67e74705SXin Li TEST(Has, MatchesChildrenOfTypes) {
104*67e74705SXin Li   EXPECT_TRUE(matches("int i;",
105*67e74705SXin Li                       varDecl(hasName("i"), has(isInteger()))));
106*67e74705SXin Li   EXPECT_TRUE(notMatches("int** i;",
107*67e74705SXin Li                          varDecl(hasName("i"), has(isInteger()))));
108*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
109*67e74705SXin Li     "int (*f)(float, int);",
110*67e74705SXin Li     qualType(functionType(), forEach(qualType(isInteger()).bind("x"))),
111*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<QualType>>("x", 2)));
112*67e74705SXin Li }
113*67e74705SXin Li 
TEST(Has,MatchesChildTypes)114*67e74705SXin Li TEST(Has, MatchesChildTypes) {
115*67e74705SXin Li   EXPECT_TRUE(matches(
116*67e74705SXin Li     "int* i;",
117*67e74705SXin Li     varDecl(hasName("i"), hasType(qualType(has(builtinType()))))));
118*67e74705SXin Li   EXPECT_TRUE(notMatches(
119*67e74705SXin Li     "int* i;",
120*67e74705SXin Li     varDecl(hasName("i"), hasType(qualType(has(pointerType()))))));
121*67e74705SXin Li }
122*67e74705SXin Li 
TEST(StatementMatcher,Has)123*67e74705SXin Li TEST(StatementMatcher, Has) {
124*67e74705SXin Li   StatementMatcher HasVariableI =
125*67e74705SXin Li       expr(hasType(pointsTo(recordDecl(hasName("X")))),
126*67e74705SXin Li            has(ignoringParenImpCasts(declRefExpr(to(varDecl(hasName("i")))))));
127*67e74705SXin Li 
128*67e74705SXin Li   EXPECT_TRUE(matches(
129*67e74705SXin Li     "class X; X *x(int); void c() { int i; x(i); }", HasVariableI));
130*67e74705SXin Li   EXPECT_TRUE(notMatches(
131*67e74705SXin Li     "class X; X *x(int); void c() { int i; x(42); }", HasVariableI));
132*67e74705SXin Li }
133*67e74705SXin Li 
TEST(StatementMatcher,HasDescendant)134*67e74705SXin Li TEST(StatementMatcher, HasDescendant) {
135*67e74705SXin Li   StatementMatcher HasDescendantVariableI =
136*67e74705SXin Li     expr(hasType(pointsTo(recordDecl(hasName("X")))),
137*67e74705SXin Li          hasDescendant(declRefExpr(to(varDecl(hasName("i"))))));
138*67e74705SXin Li 
139*67e74705SXin Li   EXPECT_TRUE(matches(
140*67e74705SXin Li     "class X; X *x(bool); bool b(int); void c() { int i; x(b(i)); }",
141*67e74705SXin Li     HasDescendantVariableI));
142*67e74705SXin Li   EXPECT_TRUE(notMatches(
143*67e74705SXin Li     "class X; X *x(bool); bool b(int); void c() { int i; x(b(42)); }",
144*67e74705SXin Li     HasDescendantVariableI));
145*67e74705SXin Li }
146*67e74705SXin Li 
TEST(TypeMatcher,MatchesClassType)147*67e74705SXin Li TEST(TypeMatcher, MatchesClassType) {
148*67e74705SXin Li   TypeMatcher TypeA = hasDeclaration(recordDecl(hasName("A")));
149*67e74705SXin Li 
150*67e74705SXin Li   EXPECT_TRUE(matches("class A { public: A *a; };", TypeA));
151*67e74705SXin Li   EXPECT_TRUE(notMatches("class A {};", TypeA));
152*67e74705SXin Li 
153*67e74705SXin Li   TypeMatcher TypeDerivedFromA =
154*67e74705SXin Li     hasDeclaration(cxxRecordDecl(isDerivedFrom("A")));
155*67e74705SXin Li 
156*67e74705SXin Li   EXPECT_TRUE(matches("class A {}; class B : public A { public: B *b; };",
157*67e74705SXin Li                       TypeDerivedFromA));
158*67e74705SXin Li   EXPECT_TRUE(notMatches("class A {};", TypeA));
159*67e74705SXin Li 
160*67e74705SXin Li   TypeMatcher TypeAHasClassB = hasDeclaration(
161*67e74705SXin Li     recordDecl(hasName("A"), has(recordDecl(hasName("B")))));
162*67e74705SXin Li 
163*67e74705SXin Li   EXPECT_TRUE(
164*67e74705SXin Li     matches("class A { public: A *a; class B {}; };", TypeAHasClassB));
165*67e74705SXin Li 
166*67e74705SXin Li   EXPECT_TRUE(matchesC("struct S {}; void f(void) { struct S s; }",
167*67e74705SXin Li                        varDecl(hasType(namedDecl(hasName("S"))))));
168*67e74705SXin Li }
169*67e74705SXin Li 
TEST(TypeMatcher,MatchesDeclTypes)170*67e74705SXin Li TEST(TypeMatcher, MatchesDeclTypes) {
171*67e74705SXin Li   // TypedefType -> TypedefNameDecl
172*67e74705SXin Li   EXPECT_TRUE(matches("typedef int I; void f(I i);",
173*67e74705SXin Li                       parmVarDecl(hasType(namedDecl(hasName("I"))))));
174*67e74705SXin Li   // ObjCObjectPointerType
175*67e74705SXin Li   EXPECT_TRUE(matchesObjC("@interface Foo @end void f(Foo *f);",
176*67e74705SXin Li                           parmVarDecl(hasType(objcObjectPointerType()))));
177*67e74705SXin Li   // ObjCObjectPointerType -> ObjCInterfaceType -> ObjCInterfaceDecl
178*67e74705SXin Li   EXPECT_TRUE(matchesObjC(
179*67e74705SXin Li     "@interface Foo @end void f(Foo *f);",
180*67e74705SXin Li     parmVarDecl(hasType(pointsTo(objcInterfaceDecl(hasName("Foo")))))));
181*67e74705SXin Li   // TemplateTypeParmType
182*67e74705SXin Li   EXPECT_TRUE(matches("template <typename T> void f(T t);",
183*67e74705SXin Li                       parmVarDecl(hasType(templateTypeParmType()))));
184*67e74705SXin Li   // TemplateTypeParmType -> TemplateTypeParmDecl
185*67e74705SXin Li   EXPECT_TRUE(matches("template <typename T> void f(T t);",
186*67e74705SXin Li                       parmVarDecl(hasType(namedDecl(hasName("T"))))));
187*67e74705SXin Li   // InjectedClassNameType
188*67e74705SXin Li   EXPECT_TRUE(matches("template <typename T> struct S {"
189*67e74705SXin Li                         "  void f(S s);"
190*67e74705SXin Li                         "};",
191*67e74705SXin Li                       parmVarDecl(hasType(injectedClassNameType()))));
192*67e74705SXin Li   EXPECT_TRUE(notMatches("template <typename T> struct S {"
193*67e74705SXin Li                            "  void g(S<T> s);"
194*67e74705SXin Li                            "};",
195*67e74705SXin Li                          parmVarDecl(hasType(injectedClassNameType()))));
196*67e74705SXin Li   // InjectedClassNameType -> CXXRecordDecl
197*67e74705SXin Li   EXPECT_TRUE(matches("template <typename T> struct S {"
198*67e74705SXin Li                         "  void f(S s);"
199*67e74705SXin Li                         "};",
200*67e74705SXin Li                       parmVarDecl(hasType(namedDecl(hasName("S"))))));
201*67e74705SXin Li 
202*67e74705SXin Li   static const char Using[] = "template <typename T>"
203*67e74705SXin Li     "struct Base {"
204*67e74705SXin Li     "  typedef T Foo;"
205*67e74705SXin Li     "};"
206*67e74705SXin Li     ""
207*67e74705SXin Li     "template <typename T>"
208*67e74705SXin Li     "struct S : private Base<T> {"
209*67e74705SXin Li     "  using typename Base<T>::Foo;"
210*67e74705SXin Li     "  void f(Foo);"
211*67e74705SXin Li     "};";
212*67e74705SXin Li   // UnresolvedUsingTypenameDecl
213*67e74705SXin Li   EXPECT_TRUE(matches(Using, unresolvedUsingTypenameDecl(hasName("Foo"))));
214*67e74705SXin Li   // UnresolvedUsingTypenameType -> UnresolvedUsingTypenameDecl
215*67e74705SXin Li   EXPECT_TRUE(matches(Using, parmVarDecl(hasType(namedDecl(hasName("Foo"))))));
216*67e74705SXin Li }
217*67e74705SXin Li 
TEST(HasDeclaration,HasDeclarationOfEnumType)218*67e74705SXin Li TEST(HasDeclaration, HasDeclarationOfEnumType) {
219*67e74705SXin Li   EXPECT_TRUE(matches("enum X {}; void y(X *x) { x; }",
220*67e74705SXin Li                       expr(hasType(pointsTo(
221*67e74705SXin Li                         qualType(hasDeclaration(enumDecl(hasName("X")))))))));
222*67e74705SXin Li }
223*67e74705SXin Li 
TEST(HasDeclaration,HasGetDeclTraitTest)224*67e74705SXin Li TEST(HasDeclaration, HasGetDeclTraitTest) {
225*67e74705SXin Li   EXPECT_TRUE(internal::has_getDecl<TypedefType>::value);
226*67e74705SXin Li   EXPECT_TRUE(internal::has_getDecl<RecordType>::value);
227*67e74705SXin Li   EXPECT_FALSE(internal::has_getDecl<TemplateSpecializationType>::value);
228*67e74705SXin Li }
229*67e74705SXin Li 
TEST(HasDeclaration,HasDeclarationOfTypeWithDecl)230*67e74705SXin Li TEST(HasDeclaration, HasDeclarationOfTypeWithDecl) {
231*67e74705SXin Li   EXPECT_TRUE(matches("typedef int X; X a;",
232*67e74705SXin Li                       varDecl(hasName("a"),
233*67e74705SXin Li                               hasType(typedefType(hasDeclaration(decl()))))));
234*67e74705SXin Li 
235*67e74705SXin Li   // FIXME: Add tests for other types with getDecl() (e.g. RecordType)
236*67e74705SXin Li }
237*67e74705SXin Li 
TEST(HasDeclaration,HasDeclarationOfTemplateSpecializationType)238*67e74705SXin Li TEST(HasDeclaration, HasDeclarationOfTemplateSpecializationType) {
239*67e74705SXin Li   EXPECT_TRUE(matches("template <typename T> class A {}; A<int> a;",
240*67e74705SXin Li                       varDecl(hasType(templateSpecializationType(
241*67e74705SXin Li                         hasDeclaration(namedDecl(hasName("A"))))))));
242*67e74705SXin Li }
243*67e74705SXin Li 
TEST(HasType,TakesQualTypeMatcherAndMatchesExpr)244*67e74705SXin Li TEST(HasType, TakesQualTypeMatcherAndMatchesExpr) {
245*67e74705SXin Li   TypeMatcher ClassX = hasDeclaration(recordDecl(hasName("X")));
246*67e74705SXin Li   EXPECT_TRUE(
247*67e74705SXin Li     matches("class X {}; void y(X &x) { x; }", expr(hasType(ClassX))));
248*67e74705SXin Li   EXPECT_TRUE(
249*67e74705SXin Li     notMatches("class X {}; void y(X *x) { x; }",
250*67e74705SXin Li                expr(hasType(ClassX))));
251*67e74705SXin Li   EXPECT_TRUE(
252*67e74705SXin Li     matches("class X {}; void y(X *x) { x; }",
253*67e74705SXin Li             expr(hasType(pointsTo(ClassX)))));
254*67e74705SXin Li }
255*67e74705SXin Li 
TEST(HasType,TakesQualTypeMatcherAndMatchesValueDecl)256*67e74705SXin Li TEST(HasType, TakesQualTypeMatcherAndMatchesValueDecl) {
257*67e74705SXin Li   TypeMatcher ClassX = hasDeclaration(recordDecl(hasName("X")));
258*67e74705SXin Li   EXPECT_TRUE(
259*67e74705SXin Li     matches("class X {}; void y() { X x; }", varDecl(hasType(ClassX))));
260*67e74705SXin Li   EXPECT_TRUE(
261*67e74705SXin Li     notMatches("class X {}; void y() { X *x; }", varDecl(hasType(ClassX))));
262*67e74705SXin Li   EXPECT_TRUE(
263*67e74705SXin Li     matches("class X {}; void y() { X *x; }",
264*67e74705SXin Li             varDecl(hasType(pointsTo(ClassX)))));
265*67e74705SXin Li }
266*67e74705SXin Li 
TEST(HasType,TakesDeclMatcherAndMatchesExpr)267*67e74705SXin Li TEST(HasType, TakesDeclMatcherAndMatchesExpr) {
268*67e74705SXin Li   DeclarationMatcher ClassX = recordDecl(hasName("X"));
269*67e74705SXin Li   EXPECT_TRUE(
270*67e74705SXin Li     matches("class X {}; void y(X &x) { x; }", expr(hasType(ClassX))));
271*67e74705SXin Li   EXPECT_TRUE(
272*67e74705SXin Li     notMatches("class X {}; void y(X *x) { x; }",
273*67e74705SXin Li                expr(hasType(ClassX))));
274*67e74705SXin Li }
275*67e74705SXin Li 
TEST(HasType,TakesDeclMatcherAndMatchesValueDecl)276*67e74705SXin Li TEST(HasType, TakesDeclMatcherAndMatchesValueDecl) {
277*67e74705SXin Li   DeclarationMatcher ClassX = recordDecl(hasName("X"));
278*67e74705SXin Li   EXPECT_TRUE(
279*67e74705SXin Li     matches("class X {}; void y() { X x; }", varDecl(hasType(ClassX))));
280*67e74705SXin Li   EXPECT_TRUE(
281*67e74705SXin Li     notMatches("class X {}; void y() { X *x; }", varDecl(hasType(ClassX))));
282*67e74705SXin Li }
283*67e74705SXin Li 
TEST(HasType,MatchesTypedefDecl)284*67e74705SXin Li TEST(HasType, MatchesTypedefDecl) {
285*67e74705SXin Li   EXPECT_TRUE(matches("typedef int X;", typedefDecl(hasType(asString("int")))));
286*67e74705SXin Li   EXPECT_TRUE(matches("typedef const int T;",
287*67e74705SXin Li                       typedefDecl(hasType(asString("const int")))));
288*67e74705SXin Li   EXPECT_TRUE(notMatches("typedef const int T;",
289*67e74705SXin Li                          typedefDecl(hasType(asString("int")))));
290*67e74705SXin Li   EXPECT_TRUE(matches("typedef int foo; typedef foo bar;",
291*67e74705SXin Li                       typedefDecl(hasType(asString("foo")), hasName("bar"))));
292*67e74705SXin Li }
293*67e74705SXin Li 
TEST(HasType,MatchesTypedefNameDecl)294*67e74705SXin Li TEST(HasType, MatchesTypedefNameDecl) {
295*67e74705SXin Li   EXPECT_TRUE(matches("using X = int;", typedefNameDecl(hasType(asString("int")))));
296*67e74705SXin Li   EXPECT_TRUE(matches("using T = const int;",
297*67e74705SXin Li                       typedefNameDecl(hasType(asString("const int")))));
298*67e74705SXin Li   EXPECT_TRUE(notMatches("using T = const int;",
299*67e74705SXin Li                          typedefNameDecl(hasType(asString("int")))));
300*67e74705SXin Li   EXPECT_TRUE(matches("using foo = int; using bar = foo;",
301*67e74705SXin Li                       typedefNameDecl(hasType(asString("foo")), hasName("bar"))));
302*67e74705SXin Li }
303*67e74705SXin Li 
TEST(HasTypeLoc,MatchesDeclaratorDecls)304*67e74705SXin Li TEST(HasTypeLoc, MatchesDeclaratorDecls) {
305*67e74705SXin Li   EXPECT_TRUE(matches("int x;",
306*67e74705SXin Li                       varDecl(hasName("x"), hasTypeLoc(loc(asString("int"))))));
307*67e74705SXin Li 
308*67e74705SXin Li   // Make sure we don't crash on implicit constructors.
309*67e74705SXin Li   EXPECT_TRUE(notMatches("class X {}; X x;",
310*67e74705SXin Li                          declaratorDecl(hasTypeLoc(loc(asString("int"))))));
311*67e74705SXin Li }
312*67e74705SXin Li 
313*67e74705SXin Li 
TEST(Callee,MatchesDeclarations)314*67e74705SXin Li TEST(Callee, MatchesDeclarations) {
315*67e74705SXin Li   StatementMatcher CallMethodX = callExpr(callee(cxxMethodDecl(hasName("x"))));
316*67e74705SXin Li 
317*67e74705SXin Li   EXPECT_TRUE(matches("class Y { void x() { x(); } };", CallMethodX));
318*67e74705SXin Li   EXPECT_TRUE(notMatches("class Y { void x() {} };", CallMethodX));
319*67e74705SXin Li 
320*67e74705SXin Li   CallMethodX = callExpr(callee(cxxConversionDecl()));
321*67e74705SXin Li   EXPECT_TRUE(
322*67e74705SXin Li     matches("struct Y { operator int() const; }; int i = Y();", CallMethodX));
323*67e74705SXin Li   EXPECT_TRUE(notMatches("struct Y { operator int() const; }; Y y = Y();",
324*67e74705SXin Li                          CallMethodX));
325*67e74705SXin Li }
326*67e74705SXin Li 
TEST(Callee,MatchesMemberExpressions)327*67e74705SXin Li TEST(Callee, MatchesMemberExpressions) {
328*67e74705SXin Li   EXPECT_TRUE(matches("class Y { void x() { this->x(); } };",
329*67e74705SXin Li                       callExpr(callee(memberExpr()))));
330*67e74705SXin Li   EXPECT_TRUE(
331*67e74705SXin Li     notMatches("class Y { void x() { this->x(); } };", callExpr(callee(callExpr()))));
332*67e74705SXin Li }
333*67e74705SXin Li 
TEST(Matcher,Argument)334*67e74705SXin Li TEST(Matcher, Argument) {
335*67e74705SXin Li   StatementMatcher CallArgumentY = callExpr(
336*67e74705SXin Li     hasArgument(0, declRefExpr(to(varDecl(hasName("y"))))));
337*67e74705SXin Li 
338*67e74705SXin Li   EXPECT_TRUE(matches("void x(int) { int y; x(y); }", CallArgumentY));
339*67e74705SXin Li   EXPECT_TRUE(
340*67e74705SXin Li     matches("class X { void x(int) { int y; x(y); } };", CallArgumentY));
341*67e74705SXin Li   EXPECT_TRUE(notMatches("void x(int) { int z; x(z); }", CallArgumentY));
342*67e74705SXin Li 
343*67e74705SXin Li   StatementMatcher WrongIndex = callExpr(
344*67e74705SXin Li     hasArgument(42, declRefExpr(to(varDecl(hasName("y"))))));
345*67e74705SXin Li   EXPECT_TRUE(notMatches("void x(int) { int y; x(y); }", WrongIndex));
346*67e74705SXin Li }
347*67e74705SXin Li 
TEST(Matcher,AnyArgument)348*67e74705SXin Li TEST(Matcher, AnyArgument) {
349*67e74705SXin Li   StatementMatcher CallArgumentY = callExpr(
350*67e74705SXin Li     hasAnyArgument(
351*67e74705SXin Li       ignoringParenImpCasts(declRefExpr(to(varDecl(hasName("y")))))));
352*67e74705SXin Li   EXPECT_TRUE(matches("void x(int, int) { int y; x(1, y); }", CallArgumentY));
353*67e74705SXin Li   EXPECT_TRUE(matches("void x(int, int) { int y; x(y, 42); }", CallArgumentY));
354*67e74705SXin Li   EXPECT_TRUE(notMatches("void x(int, int) { x(1, 2); }", CallArgumentY));
355*67e74705SXin Li 
356*67e74705SXin Li   StatementMatcher ImplicitCastedArgument = callExpr(
357*67e74705SXin Li     hasAnyArgument(implicitCastExpr()));
358*67e74705SXin Li   EXPECT_TRUE(matches("void x(long) { int y; x(y); }", ImplicitCastedArgument));
359*67e74705SXin Li }
360*67e74705SXin Li 
TEST(ForEachArgumentWithParam,ReportsNoFalsePositives)361*67e74705SXin Li TEST(ForEachArgumentWithParam, ReportsNoFalsePositives) {
362*67e74705SXin Li   StatementMatcher ArgumentY =
363*67e74705SXin Li     declRefExpr(to(varDecl(hasName("y")))).bind("arg");
364*67e74705SXin Li   DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
365*67e74705SXin Li   StatementMatcher CallExpr =
366*67e74705SXin Li     callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
367*67e74705SXin Li 
368*67e74705SXin Li   // IntParam does not match.
369*67e74705SXin Li   EXPECT_TRUE(notMatches("void f(int* i) { int* y; f(y); }", CallExpr));
370*67e74705SXin Li   // ArgumentY does not match.
371*67e74705SXin Li   EXPECT_TRUE(notMatches("void f(int i) { int x; f(x); }", CallExpr));
372*67e74705SXin Li }
373*67e74705SXin Li 
TEST(ForEachArgumentWithParam,MatchesCXXMemberCallExpr)374*67e74705SXin Li TEST(ForEachArgumentWithParam, MatchesCXXMemberCallExpr) {
375*67e74705SXin Li   StatementMatcher ArgumentY =
376*67e74705SXin Li     declRefExpr(to(varDecl(hasName("y")))).bind("arg");
377*67e74705SXin Li   DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
378*67e74705SXin Li   StatementMatcher CallExpr =
379*67e74705SXin Li     callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
380*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
381*67e74705SXin Li     "struct S {"
382*67e74705SXin Li       "  const S& operator[](int i) { return *this; }"
383*67e74705SXin Li       "};"
384*67e74705SXin Li       "void f(S S1) {"
385*67e74705SXin Li       "  int y = 1;"
386*67e74705SXin Li       "  S1[y];"
387*67e74705SXin Li       "}",
388*67e74705SXin Li     CallExpr, llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param", 1)));
389*67e74705SXin Li 
390*67e74705SXin Li   StatementMatcher CallExpr2 =
391*67e74705SXin Li     callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
392*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
393*67e74705SXin Li     "struct S {"
394*67e74705SXin Li       "  static void g(int i);"
395*67e74705SXin Li       "};"
396*67e74705SXin Li       "void f() {"
397*67e74705SXin Li       "  int y = 1;"
398*67e74705SXin Li       "  S::g(y);"
399*67e74705SXin Li       "}",
400*67e74705SXin Li     CallExpr2, llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param", 1)));
401*67e74705SXin Li }
402*67e74705SXin Li 
TEST(ForEachArgumentWithParam,MatchesCallExpr)403*67e74705SXin Li TEST(ForEachArgumentWithParam, MatchesCallExpr) {
404*67e74705SXin Li   StatementMatcher ArgumentY =
405*67e74705SXin Li     declRefExpr(to(varDecl(hasName("y")))).bind("arg");
406*67e74705SXin Li   DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
407*67e74705SXin Li   StatementMatcher CallExpr =
408*67e74705SXin Li     callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
409*67e74705SXin Li 
410*67e74705SXin Li   EXPECT_TRUE(
411*67e74705SXin Li     matchAndVerifyResultTrue("void f(int i) { int y; f(y); }", CallExpr,
412*67e74705SXin Li                              llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>(
413*67e74705SXin Li                                "param")));
414*67e74705SXin Li   EXPECT_TRUE(
415*67e74705SXin Li     matchAndVerifyResultTrue("void f(int i) { int y; f(y); }", CallExpr,
416*67e74705SXin Li                              llvm::make_unique<VerifyIdIsBoundTo<DeclRefExpr>>(
417*67e74705SXin Li                                "arg")));
418*67e74705SXin Li 
419*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
420*67e74705SXin Li     "void f(int i, int j) { int y; f(y, y); }", CallExpr,
421*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param", 2)));
422*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
423*67e74705SXin Li     "void f(int i, int j) { int y; f(y, y); }", CallExpr,
424*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<DeclRefExpr>>("arg", 2)));
425*67e74705SXin Li }
426*67e74705SXin Li 
TEST(ForEachArgumentWithParam,MatchesConstructExpr)427*67e74705SXin Li TEST(ForEachArgumentWithParam, MatchesConstructExpr) {
428*67e74705SXin Li   StatementMatcher ArgumentY =
429*67e74705SXin Li     declRefExpr(to(varDecl(hasName("y")))).bind("arg");
430*67e74705SXin Li   DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
431*67e74705SXin Li   StatementMatcher ConstructExpr =
432*67e74705SXin Li     cxxConstructExpr(forEachArgumentWithParam(ArgumentY, IntParam));
433*67e74705SXin Li 
434*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
435*67e74705SXin Li     "struct C {"
436*67e74705SXin Li       "  C(int i) {}"
437*67e74705SXin Li       "};"
438*67e74705SXin Li       "int y = 0;"
439*67e74705SXin Li       "C Obj(y);",
440*67e74705SXin Li     ConstructExpr,
441*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param")));
442*67e74705SXin Li }
443*67e74705SXin Li 
TEST(ForEachArgumentWithParam,HandlesBoundNodesForNonMatches)444*67e74705SXin Li TEST(ForEachArgumentWithParam, HandlesBoundNodesForNonMatches) {
445*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
446*67e74705SXin Li     "void g(int i, int j) {"
447*67e74705SXin Li       "  int a;"
448*67e74705SXin Li       "  int b;"
449*67e74705SXin Li       "  int c;"
450*67e74705SXin Li       "  g(a, 0);"
451*67e74705SXin Li       "  g(a, b);"
452*67e74705SXin Li       "  g(0, b);"
453*67e74705SXin Li       "}",
454*67e74705SXin Li     functionDecl(
455*67e74705SXin Li       forEachDescendant(varDecl().bind("v")),
456*67e74705SXin Li       forEachDescendant(callExpr(forEachArgumentWithParam(
457*67e74705SXin Li         declRefExpr(to(decl(equalsBoundNode("v")))), parmVarDecl())))),
458*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<VarDecl>>("v", 4)));
459*67e74705SXin Li }
460*67e74705SXin Li 
TEST(QualType,hasCanonicalType)461*67e74705SXin Li TEST(QualType, hasCanonicalType) {
462*67e74705SXin Li   EXPECT_TRUE(notMatches("typedef int &int_ref;"
463*67e74705SXin Li                            "int a;"
464*67e74705SXin Li                            "int_ref b = a;",
465*67e74705SXin Li                          varDecl(hasType(qualType(referenceType())))));
466*67e74705SXin Li   EXPECT_TRUE(
467*67e74705SXin Li     matches("typedef int &int_ref;"
468*67e74705SXin Li               "int a;"
469*67e74705SXin Li               "int_ref b = a;",
470*67e74705SXin Li             varDecl(hasType(qualType(hasCanonicalType(referenceType()))))));
471*67e74705SXin Li }
472*67e74705SXin Li 
TEST(HasParameter,CallsInnerMatcher)473*67e74705SXin Li TEST(HasParameter, CallsInnerMatcher) {
474*67e74705SXin Li   EXPECT_TRUE(matches("class X { void x(int) {} };",
475*67e74705SXin Li                       cxxMethodDecl(hasParameter(0, varDecl()))));
476*67e74705SXin Li   EXPECT_TRUE(notMatches("class X { void x(int) {} };",
477*67e74705SXin Li                          cxxMethodDecl(hasParameter(0, hasName("x")))));
478*67e74705SXin Li }
479*67e74705SXin Li 
TEST(HasParameter,DoesNotMatchIfIndexOutOfBounds)480*67e74705SXin Li TEST(HasParameter, DoesNotMatchIfIndexOutOfBounds) {
481*67e74705SXin Li   EXPECT_TRUE(notMatches("class X { void x(int) {} };",
482*67e74705SXin Li                          cxxMethodDecl(hasParameter(42, varDecl()))));
483*67e74705SXin Li }
484*67e74705SXin Li 
TEST(HasType,MatchesParameterVariableTypesStrictly)485*67e74705SXin Li TEST(HasType, MatchesParameterVariableTypesStrictly) {
486*67e74705SXin Li   EXPECT_TRUE(matches(
487*67e74705SXin Li     "class X { void x(X x) {} };",
488*67e74705SXin Li     cxxMethodDecl(hasParameter(0, hasType(recordDecl(hasName("X")))))));
489*67e74705SXin Li   EXPECT_TRUE(notMatches(
490*67e74705SXin Li     "class X { void x(const X &x) {} };",
491*67e74705SXin Li     cxxMethodDecl(hasParameter(0, hasType(recordDecl(hasName("X")))))));
492*67e74705SXin Li   EXPECT_TRUE(matches("class X { void x(const X *x) {} };",
493*67e74705SXin Li                       cxxMethodDecl(hasParameter(
494*67e74705SXin Li                         0, hasType(pointsTo(recordDecl(hasName("X"))))))));
495*67e74705SXin Li   EXPECT_TRUE(matches("class X { void x(const X &x) {} };",
496*67e74705SXin Li                       cxxMethodDecl(hasParameter(
497*67e74705SXin Li                         0, hasType(references(recordDecl(hasName("X"))))))));
498*67e74705SXin Li }
499*67e74705SXin Li 
TEST(HasAnyParameter,MatchesIndependentlyOfPosition)500*67e74705SXin Li TEST(HasAnyParameter, MatchesIndependentlyOfPosition) {
501*67e74705SXin Li   EXPECT_TRUE(matches(
502*67e74705SXin Li     "class Y {}; class X { void x(X x, Y y) {} };",
503*67e74705SXin Li     cxxMethodDecl(hasAnyParameter(hasType(recordDecl(hasName("X")))))));
504*67e74705SXin Li   EXPECT_TRUE(matches(
505*67e74705SXin Li     "class Y {}; class X { void x(Y y, X x) {} };",
506*67e74705SXin Li     cxxMethodDecl(hasAnyParameter(hasType(recordDecl(hasName("X")))))));
507*67e74705SXin Li }
508*67e74705SXin Li 
TEST(Returns,MatchesReturnTypes)509*67e74705SXin Li TEST(Returns, MatchesReturnTypes) {
510*67e74705SXin Li   EXPECT_TRUE(matches("class Y { int f() { return 1; } };",
511*67e74705SXin Li                       functionDecl(returns(asString("int")))));
512*67e74705SXin Li   EXPECT_TRUE(notMatches("class Y { int f() { return 1; } };",
513*67e74705SXin Li                          functionDecl(returns(asString("float")))));
514*67e74705SXin Li   EXPECT_TRUE(matches("class Y { Y getMe() { return *this; } };",
515*67e74705SXin Li                       functionDecl(returns(hasDeclaration(
516*67e74705SXin Li                         recordDecl(hasName("Y")))))));
517*67e74705SXin Li }
518*67e74705SXin Li 
TEST(HasAnyParameter,DoesntMatchIfInnerMatcherDoesntMatch)519*67e74705SXin Li TEST(HasAnyParameter, DoesntMatchIfInnerMatcherDoesntMatch) {
520*67e74705SXin Li   EXPECT_TRUE(notMatches(
521*67e74705SXin Li     "class Y {}; class X { void x(int) {} };",
522*67e74705SXin Li     cxxMethodDecl(hasAnyParameter(hasType(recordDecl(hasName("X")))))));
523*67e74705SXin Li }
524*67e74705SXin Li 
TEST(HasAnyParameter,DoesNotMatchThisPointer)525*67e74705SXin Li TEST(HasAnyParameter, DoesNotMatchThisPointer) {
526*67e74705SXin Li   EXPECT_TRUE(notMatches("class Y {}; class X { void x() {} };",
527*67e74705SXin Li                          cxxMethodDecl(hasAnyParameter(
528*67e74705SXin Li                            hasType(pointsTo(recordDecl(hasName("X"))))))));
529*67e74705SXin Li }
530*67e74705SXin Li 
TEST(HasName,MatchesParameterVariableDeclarations)531*67e74705SXin Li TEST(HasName, MatchesParameterVariableDeclarations) {
532*67e74705SXin Li   EXPECT_TRUE(matches("class Y {}; class X { void x(int x) {} };",
533*67e74705SXin Li                       cxxMethodDecl(hasAnyParameter(hasName("x")))));
534*67e74705SXin Li   EXPECT_TRUE(notMatches("class Y {}; class X { void x(int) {} };",
535*67e74705SXin Li                          cxxMethodDecl(hasAnyParameter(hasName("x")))));
536*67e74705SXin Li }
537*67e74705SXin Li 
TEST(Matcher,MatchesTypeTemplateArgument)538*67e74705SXin Li TEST(Matcher, MatchesTypeTemplateArgument) {
539*67e74705SXin Li   EXPECT_TRUE(matches(
540*67e74705SXin Li     "template<typename T> struct B {};"
541*67e74705SXin Li       "B<int> b;",
542*67e74705SXin Li     classTemplateSpecializationDecl(hasAnyTemplateArgument(refersToType(
543*67e74705SXin Li       asString("int"))))));
544*67e74705SXin Li }
545*67e74705SXin Li 
TEST(Matcher,MatchesDeclarationReferenceTemplateArgument)546*67e74705SXin Li TEST(Matcher, MatchesDeclarationReferenceTemplateArgument) {
547*67e74705SXin Li   EXPECT_TRUE(matches(
548*67e74705SXin Li     "struct B { int next; };"
549*67e74705SXin Li       "template<int(B::*next_ptr)> struct A {};"
550*67e74705SXin Li       "A<&B::next> a;",
551*67e74705SXin Li     classTemplateSpecializationDecl(hasAnyTemplateArgument(
552*67e74705SXin Li       refersToDeclaration(fieldDecl(hasName("next")))))));
553*67e74705SXin Li 
554*67e74705SXin Li   EXPECT_TRUE(notMatches(
555*67e74705SXin Li     "template <typename T> struct A {};"
556*67e74705SXin Li       "A<int> a;",
557*67e74705SXin Li     classTemplateSpecializationDecl(hasAnyTemplateArgument(
558*67e74705SXin Li       refersToDeclaration(decl())))));
559*67e74705SXin Li 
560*67e74705SXin Li   EXPECT_TRUE(matches(
561*67e74705SXin Li     "struct B { int next; };"
562*67e74705SXin Li       "template<int(B::*next_ptr)> struct A {};"
563*67e74705SXin Li       "A<&B::next> a;",
564*67e74705SXin Li     templateSpecializationType(hasAnyTemplateArgument(isExpr(
565*67e74705SXin Li       hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))));
566*67e74705SXin Li 
567*67e74705SXin Li   EXPECT_TRUE(notMatches(
568*67e74705SXin Li     "template <typename T> struct A {};"
569*67e74705SXin Li       "A<int> a;",
570*67e74705SXin Li     templateSpecializationType(hasAnyTemplateArgument(
571*67e74705SXin Li       refersToDeclaration(decl())))));
572*67e74705SXin Li }
573*67e74705SXin Li 
574*67e74705SXin Li 
TEST(Matcher,MatchesSpecificArgument)575*67e74705SXin Li TEST(Matcher, MatchesSpecificArgument) {
576*67e74705SXin Li   EXPECT_TRUE(matches(
577*67e74705SXin Li     "template<typename T, typename U> class A {};"
578*67e74705SXin Li       "A<bool, int> a;",
579*67e74705SXin Li     classTemplateSpecializationDecl(hasTemplateArgument(
580*67e74705SXin Li       1, refersToType(asString("int"))))));
581*67e74705SXin Li   EXPECT_TRUE(notMatches(
582*67e74705SXin Li     "template<typename T, typename U> class A {};"
583*67e74705SXin Li       "A<int, bool> a;",
584*67e74705SXin Li     classTemplateSpecializationDecl(hasTemplateArgument(
585*67e74705SXin Li       1, refersToType(asString("int"))))));
586*67e74705SXin Li 
587*67e74705SXin Li   EXPECT_TRUE(matches(
588*67e74705SXin Li     "template<typename T, typename U> class A {};"
589*67e74705SXin Li       "A<bool, int> a;",
590*67e74705SXin Li     templateSpecializationType(hasTemplateArgument(
591*67e74705SXin Li       1, refersToType(asString("int"))))));
592*67e74705SXin Li   EXPECT_TRUE(notMatches(
593*67e74705SXin Li     "template<typename T, typename U> class A {};"
594*67e74705SXin Li       "A<int, bool> a;",
595*67e74705SXin Li     templateSpecializationType(hasTemplateArgument(
596*67e74705SXin Li       1, refersToType(asString("int"))))));
597*67e74705SXin Li }
598*67e74705SXin Li 
TEST(TemplateArgument,Matches)599*67e74705SXin Li TEST(TemplateArgument, Matches) {
600*67e74705SXin Li   EXPECT_TRUE(matches("template<typename T> struct C {}; C<int> c;",
601*67e74705SXin Li                       classTemplateSpecializationDecl(
602*67e74705SXin Li                         hasAnyTemplateArgument(templateArgument()))));
603*67e74705SXin Li   EXPECT_TRUE(matches(
604*67e74705SXin Li     "template<typename T> struct C {}; C<int> c;",
605*67e74705SXin Li     templateSpecializationType(hasAnyTemplateArgument(templateArgument()))));
606*67e74705SXin Li }
607*67e74705SXin Li 
TEST(RefersToIntegralType,Matches)608*67e74705SXin Li TEST(RefersToIntegralType, Matches) {
609*67e74705SXin Li   EXPECT_TRUE(matches("template<int T> struct C {}; C<42> c;",
610*67e74705SXin Li                       classTemplateSpecializationDecl(
611*67e74705SXin Li                         hasAnyTemplateArgument(refersToIntegralType(
612*67e74705SXin Li                           asString("int"))))));
613*67e74705SXin Li   EXPECT_TRUE(notMatches("template<unsigned T> struct C {}; C<42> c;",
614*67e74705SXin Li                          classTemplateSpecializationDecl(hasAnyTemplateArgument(
615*67e74705SXin Li                            refersToIntegralType(asString("int"))))));
616*67e74705SXin Li }
617*67e74705SXin Li 
TEST(ConstructorDeclaration,SimpleCase)618*67e74705SXin Li TEST(ConstructorDeclaration, SimpleCase) {
619*67e74705SXin Li   EXPECT_TRUE(matches("class Foo { Foo(int i); };",
620*67e74705SXin Li                       cxxConstructorDecl(ofClass(hasName("Foo")))));
621*67e74705SXin Li   EXPECT_TRUE(notMatches("class Foo { Foo(int i); };",
622*67e74705SXin Li                          cxxConstructorDecl(ofClass(hasName("Bar")))));
623*67e74705SXin Li }
624*67e74705SXin Li 
TEST(DestructorDeclaration,MatchesVirtualDestructor)625*67e74705SXin Li TEST(DestructorDeclaration, MatchesVirtualDestructor) {
626*67e74705SXin Li   EXPECT_TRUE(matches("class Foo { virtual ~Foo(); };",
627*67e74705SXin Li                       cxxDestructorDecl(ofClass(hasName("Foo")))));
628*67e74705SXin Li }
629*67e74705SXin Li 
TEST(DestructorDeclaration,DoesNotMatchImplicitDestructor)630*67e74705SXin Li TEST(DestructorDeclaration, DoesNotMatchImplicitDestructor) {
631*67e74705SXin Li   EXPECT_TRUE(notMatches("class Foo {};",
632*67e74705SXin Li                          cxxDestructorDecl(ofClass(hasName("Foo")))));
633*67e74705SXin Li }
634*67e74705SXin Li 
TEST(HasAnyConstructorInitializer,SimpleCase)635*67e74705SXin Li TEST(HasAnyConstructorInitializer, SimpleCase) {
636*67e74705SXin Li   EXPECT_TRUE(
637*67e74705SXin Li     notMatches("class Foo { Foo() { } };",
638*67e74705SXin Li                cxxConstructorDecl(hasAnyConstructorInitializer(anything()))));
639*67e74705SXin Li   EXPECT_TRUE(
640*67e74705SXin Li     matches("class Foo {"
641*67e74705SXin Li               "  Foo() : foo_() { }"
642*67e74705SXin Li               "  int foo_;"
643*67e74705SXin Li               "};",
644*67e74705SXin Li             cxxConstructorDecl(hasAnyConstructorInitializer(anything()))));
645*67e74705SXin Li }
646*67e74705SXin Li 
TEST(HasAnyConstructorInitializer,ForField)647*67e74705SXin Li TEST(HasAnyConstructorInitializer, ForField) {
648*67e74705SXin Li   static const char Code[] =
649*67e74705SXin Li     "class Baz { };"
650*67e74705SXin Li       "class Foo {"
651*67e74705SXin Li       "  Foo() : foo_() { }"
652*67e74705SXin Li       "  Baz foo_;"
653*67e74705SXin Li       "  Baz bar_;"
654*67e74705SXin Li       "};";
655*67e74705SXin Li   EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
656*67e74705SXin Li     forField(hasType(recordDecl(hasName("Baz"))))))));
657*67e74705SXin Li   EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
658*67e74705SXin Li     forField(hasName("foo_"))))));
659*67e74705SXin Li   EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
660*67e74705SXin Li     forField(hasType(recordDecl(hasName("Bar"))))))));
661*67e74705SXin Li }
662*67e74705SXin Li 
TEST(HasAnyConstructorInitializer,WithInitializer)663*67e74705SXin Li TEST(HasAnyConstructorInitializer, WithInitializer) {
664*67e74705SXin Li   static const char Code[] =
665*67e74705SXin Li     "class Foo {"
666*67e74705SXin Li       "  Foo() : foo_(0) { }"
667*67e74705SXin Li       "  int foo_;"
668*67e74705SXin Li       "};";
669*67e74705SXin Li   EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
670*67e74705SXin Li     withInitializer(integerLiteral(equals(0)))))));
671*67e74705SXin Li   EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
672*67e74705SXin Li     withInitializer(integerLiteral(equals(1)))))));
673*67e74705SXin Li }
674*67e74705SXin Li 
TEST(HasAnyConstructorInitializer,IsWritten)675*67e74705SXin Li TEST(HasAnyConstructorInitializer, IsWritten) {
676*67e74705SXin Li   static const char Code[] =
677*67e74705SXin Li     "struct Bar { Bar(){} };"
678*67e74705SXin Li       "class Foo {"
679*67e74705SXin Li       "  Foo() : foo_() { }"
680*67e74705SXin Li       "  Bar foo_;"
681*67e74705SXin Li       "  Bar bar_;"
682*67e74705SXin Li       "};";
683*67e74705SXin Li   EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
684*67e74705SXin Li     allOf(forField(hasName("foo_")), isWritten())))));
685*67e74705SXin Li   EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
686*67e74705SXin Li     allOf(forField(hasName("bar_")), isWritten())))));
687*67e74705SXin Li   EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
688*67e74705SXin Li     allOf(forField(hasName("bar_")), unless(isWritten()))))));
689*67e74705SXin Li }
690*67e74705SXin Li 
TEST(HasAnyConstructorInitializer,IsBaseInitializer)691*67e74705SXin Li TEST(HasAnyConstructorInitializer, IsBaseInitializer) {
692*67e74705SXin Li   static const char Code[] =
693*67e74705SXin Li     "struct B {};"
694*67e74705SXin Li       "struct D : B {"
695*67e74705SXin Li       "  int I;"
696*67e74705SXin Li       "  D(int i) : I(i) {}"
697*67e74705SXin Li       "};"
698*67e74705SXin Li       "struct E : B {"
699*67e74705SXin Li       "  E() : B() {}"
700*67e74705SXin Li       "};";
701*67e74705SXin Li   EXPECT_TRUE(matches(Code, cxxConstructorDecl(allOf(
702*67e74705SXin Li     hasAnyConstructorInitializer(allOf(isBaseInitializer(), isWritten())),
703*67e74705SXin Li     hasName("E")))));
704*67e74705SXin Li   EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(allOf(
705*67e74705SXin Li     hasAnyConstructorInitializer(allOf(isBaseInitializer(), isWritten())),
706*67e74705SXin Li     hasName("D")))));
707*67e74705SXin Li   EXPECT_TRUE(matches(Code, cxxConstructorDecl(allOf(
708*67e74705SXin Li     hasAnyConstructorInitializer(allOf(isMemberInitializer(), isWritten())),
709*67e74705SXin Li     hasName("D")))));
710*67e74705SXin Li   EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(allOf(
711*67e74705SXin Li     hasAnyConstructorInitializer(allOf(isMemberInitializer(), isWritten())),
712*67e74705SXin Li     hasName("E")))));
713*67e74705SXin Li }
714*67e74705SXin Li 
TEST(IfStmt,ChildTraversalMatchers)715*67e74705SXin Li TEST(IfStmt, ChildTraversalMatchers) {
716*67e74705SXin Li   EXPECT_TRUE(matches("void f() { if (false) true; else false; }",
717*67e74705SXin Li                       ifStmt(hasThen(cxxBoolLiteral(equals(true))))));
718*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() { if (false) false; else true; }",
719*67e74705SXin Li                          ifStmt(hasThen(cxxBoolLiteral(equals(true))))));
720*67e74705SXin Li   EXPECT_TRUE(matches("void f() { if (false) false; else true; }",
721*67e74705SXin Li                       ifStmt(hasElse(cxxBoolLiteral(equals(true))))));
722*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() { if (false) true; else false; }",
723*67e74705SXin Li                          ifStmt(hasElse(cxxBoolLiteral(equals(true))))));
724*67e74705SXin Li }
725*67e74705SXin Li 
TEST(MatchBinaryOperator,HasOperatorName)726*67e74705SXin Li TEST(MatchBinaryOperator, HasOperatorName) {
727*67e74705SXin Li   StatementMatcher OperatorOr = binaryOperator(hasOperatorName("||"));
728*67e74705SXin Li 
729*67e74705SXin Li   EXPECT_TRUE(matches("void x() { true || false; }", OperatorOr));
730*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { true && false; }", OperatorOr));
731*67e74705SXin Li }
732*67e74705SXin Li 
TEST(MatchBinaryOperator,HasLHSAndHasRHS)733*67e74705SXin Li TEST(MatchBinaryOperator, HasLHSAndHasRHS) {
734*67e74705SXin Li   StatementMatcher OperatorTrueFalse =
735*67e74705SXin Li     binaryOperator(hasLHS(cxxBoolLiteral(equals(true))),
736*67e74705SXin Li                    hasRHS(cxxBoolLiteral(equals(false))));
737*67e74705SXin Li 
738*67e74705SXin Li   EXPECT_TRUE(matches("void x() { true || false; }", OperatorTrueFalse));
739*67e74705SXin Li   EXPECT_TRUE(matches("void x() { true && false; }", OperatorTrueFalse));
740*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { false || true; }", OperatorTrueFalse));
741*67e74705SXin Li 
742*67e74705SXin Li   StatementMatcher OperatorIntPointer = arraySubscriptExpr(
743*67e74705SXin Li     hasLHS(hasType(isInteger())), hasRHS(hasType(pointsTo(qualType()))));
744*67e74705SXin Li   EXPECT_TRUE(matches("void x() { 1[\"abc\"]; }", OperatorIntPointer));
745*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { \"abc\"[1]; }", OperatorIntPointer));
746*67e74705SXin Li }
747*67e74705SXin Li 
TEST(MatchBinaryOperator,HasEitherOperand)748*67e74705SXin Li TEST(MatchBinaryOperator, HasEitherOperand) {
749*67e74705SXin Li   StatementMatcher HasOperand =
750*67e74705SXin Li     binaryOperator(hasEitherOperand(cxxBoolLiteral(equals(false))));
751*67e74705SXin Li 
752*67e74705SXin Li   EXPECT_TRUE(matches("void x() { true || false; }", HasOperand));
753*67e74705SXin Li   EXPECT_TRUE(matches("void x() { false && true; }", HasOperand));
754*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { true || true; }", HasOperand));
755*67e74705SXin Li }
756*67e74705SXin Li 
TEST(Matcher,BinaryOperatorTypes)757*67e74705SXin Li TEST(Matcher, BinaryOperatorTypes) {
758*67e74705SXin Li   // Integration test that verifies the AST provides all binary operators in
759*67e74705SXin Li   // a way we expect.
760*67e74705SXin Li   // FIXME: Operator ','
761*67e74705SXin Li   EXPECT_TRUE(
762*67e74705SXin Li     matches("void x() { 3, 4; }", binaryOperator(hasOperatorName(","))));
763*67e74705SXin Li   EXPECT_TRUE(
764*67e74705SXin Li     matches("bool b; bool c = (b = true);",
765*67e74705SXin Li             binaryOperator(hasOperatorName("="))));
766*67e74705SXin Li   EXPECT_TRUE(
767*67e74705SXin Li     matches("bool b = 1 != 2;", binaryOperator(hasOperatorName("!="))));
768*67e74705SXin Li   EXPECT_TRUE(
769*67e74705SXin Li     matches("bool b = 1 == 2;", binaryOperator(hasOperatorName("=="))));
770*67e74705SXin Li   EXPECT_TRUE(matches("bool b = 1 < 2;", binaryOperator(hasOperatorName("<"))));
771*67e74705SXin Li   EXPECT_TRUE(
772*67e74705SXin Li     matches("bool b = 1 <= 2;", binaryOperator(hasOperatorName("<="))));
773*67e74705SXin Li   EXPECT_TRUE(
774*67e74705SXin Li     matches("int i = 1 << 2;", binaryOperator(hasOperatorName("<<"))));
775*67e74705SXin Li   EXPECT_TRUE(
776*67e74705SXin Li     matches("int i = 1; int j = (i <<= 2);",
777*67e74705SXin Li             binaryOperator(hasOperatorName("<<="))));
778*67e74705SXin Li   EXPECT_TRUE(matches("bool b = 1 > 2;", binaryOperator(hasOperatorName(">"))));
779*67e74705SXin Li   EXPECT_TRUE(
780*67e74705SXin Li     matches("bool b = 1 >= 2;", binaryOperator(hasOperatorName(">="))));
781*67e74705SXin Li   EXPECT_TRUE(
782*67e74705SXin Li     matches("int i = 1 >> 2;", binaryOperator(hasOperatorName(">>"))));
783*67e74705SXin Li   EXPECT_TRUE(
784*67e74705SXin Li     matches("int i = 1; int j = (i >>= 2);",
785*67e74705SXin Li             binaryOperator(hasOperatorName(">>="))));
786*67e74705SXin Li   EXPECT_TRUE(
787*67e74705SXin Li     matches("int i = 42 ^ 23;", binaryOperator(hasOperatorName("^"))));
788*67e74705SXin Li   EXPECT_TRUE(
789*67e74705SXin Li     matches("int i = 42; int j = (i ^= 42);",
790*67e74705SXin Li             binaryOperator(hasOperatorName("^="))));
791*67e74705SXin Li   EXPECT_TRUE(
792*67e74705SXin Li     matches("int i = 42 % 23;", binaryOperator(hasOperatorName("%"))));
793*67e74705SXin Li   EXPECT_TRUE(
794*67e74705SXin Li     matches("int i = 42; int j = (i %= 42);",
795*67e74705SXin Li             binaryOperator(hasOperatorName("%="))));
796*67e74705SXin Li   EXPECT_TRUE(
797*67e74705SXin Li     matches("bool b = 42  &23;", binaryOperator(hasOperatorName("&"))));
798*67e74705SXin Li   EXPECT_TRUE(
799*67e74705SXin Li     matches("bool b = true && false;",
800*67e74705SXin Li             binaryOperator(hasOperatorName("&&"))));
801*67e74705SXin Li   EXPECT_TRUE(
802*67e74705SXin Li     matches("bool b = true; bool c = (b &= false);",
803*67e74705SXin Li             binaryOperator(hasOperatorName("&="))));
804*67e74705SXin Li   EXPECT_TRUE(
805*67e74705SXin Li     matches("bool b = 42 | 23;", binaryOperator(hasOperatorName("|"))));
806*67e74705SXin Li   EXPECT_TRUE(
807*67e74705SXin Li     matches("bool b = true || false;",
808*67e74705SXin Li             binaryOperator(hasOperatorName("||"))));
809*67e74705SXin Li   EXPECT_TRUE(
810*67e74705SXin Li     matches("bool b = true; bool c = (b |= false);",
811*67e74705SXin Li             binaryOperator(hasOperatorName("|="))));
812*67e74705SXin Li   EXPECT_TRUE(
813*67e74705SXin Li     matches("int i = 42  *23;", binaryOperator(hasOperatorName("*"))));
814*67e74705SXin Li   EXPECT_TRUE(
815*67e74705SXin Li     matches("int i = 42; int j = (i *= 23);",
816*67e74705SXin Li             binaryOperator(hasOperatorName("*="))));
817*67e74705SXin Li   EXPECT_TRUE(
818*67e74705SXin Li     matches("int i = 42 / 23;", binaryOperator(hasOperatorName("/"))));
819*67e74705SXin Li   EXPECT_TRUE(
820*67e74705SXin Li     matches("int i = 42; int j = (i /= 23);",
821*67e74705SXin Li             binaryOperator(hasOperatorName("/="))));
822*67e74705SXin Li   EXPECT_TRUE(
823*67e74705SXin Li     matches("int i = 42 + 23;", binaryOperator(hasOperatorName("+"))));
824*67e74705SXin Li   EXPECT_TRUE(
825*67e74705SXin Li     matches("int i = 42; int j = (i += 23);",
826*67e74705SXin Li             binaryOperator(hasOperatorName("+="))));
827*67e74705SXin Li   EXPECT_TRUE(
828*67e74705SXin Li     matches("int i = 42 - 23;", binaryOperator(hasOperatorName("-"))));
829*67e74705SXin Li   EXPECT_TRUE(
830*67e74705SXin Li     matches("int i = 42; int j = (i -= 23);",
831*67e74705SXin Li             binaryOperator(hasOperatorName("-="))));
832*67e74705SXin Li   EXPECT_TRUE(
833*67e74705SXin Li     matches("struct A { void x() { void (A::*a)(); (this->*a)(); } };",
834*67e74705SXin Li             binaryOperator(hasOperatorName("->*"))));
835*67e74705SXin Li   EXPECT_TRUE(
836*67e74705SXin Li     matches("struct A { void x() { void (A::*a)(); ((*this).*a)(); } };",
837*67e74705SXin Li             binaryOperator(hasOperatorName(".*"))));
838*67e74705SXin Li 
839*67e74705SXin Li   // Member expressions as operators are not supported in matches.
840*67e74705SXin Li   EXPECT_TRUE(
841*67e74705SXin Li     notMatches("struct A { void x(A *a) { a->x(this); } };",
842*67e74705SXin Li                binaryOperator(hasOperatorName("->"))));
843*67e74705SXin Li 
844*67e74705SXin Li   // Initializer assignments are not represented as operator equals.
845*67e74705SXin Li   EXPECT_TRUE(
846*67e74705SXin Li     notMatches("bool b = true;", binaryOperator(hasOperatorName("="))));
847*67e74705SXin Li 
848*67e74705SXin Li   // Array indexing is not represented as operator.
849*67e74705SXin Li   EXPECT_TRUE(notMatches("int a[42]; void x() { a[23]; }", unaryOperator()));
850*67e74705SXin Li 
851*67e74705SXin Li   // Overloaded operators do not match at all.
852*67e74705SXin Li   EXPECT_TRUE(notMatches(
853*67e74705SXin Li     "struct A { bool operator&&(const A &a) const { return false; } };"
854*67e74705SXin Li       "void x() { A a, b; a && b; }",
855*67e74705SXin Li     binaryOperator()));
856*67e74705SXin Li }
857*67e74705SXin Li 
TEST(MatchUnaryOperator,HasOperatorName)858*67e74705SXin Li TEST(MatchUnaryOperator, HasOperatorName) {
859*67e74705SXin Li   StatementMatcher OperatorNot = unaryOperator(hasOperatorName("!"));
860*67e74705SXin Li 
861*67e74705SXin Li   EXPECT_TRUE(matches("void x() { !true; } ", OperatorNot));
862*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { true; } ", OperatorNot));
863*67e74705SXin Li }
864*67e74705SXin Li 
TEST(MatchUnaryOperator,HasUnaryOperand)865*67e74705SXin Li TEST(MatchUnaryOperator, HasUnaryOperand) {
866*67e74705SXin Li   StatementMatcher OperatorOnFalse =
867*67e74705SXin Li     unaryOperator(hasUnaryOperand(cxxBoolLiteral(equals(false))));
868*67e74705SXin Li 
869*67e74705SXin Li   EXPECT_TRUE(matches("void x() { !false; }", OperatorOnFalse));
870*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { !true; }", OperatorOnFalse));
871*67e74705SXin Li }
872*67e74705SXin Li 
TEST(Matcher,UnaryOperatorTypes)873*67e74705SXin Li TEST(Matcher, UnaryOperatorTypes) {
874*67e74705SXin Li   // Integration test that verifies the AST provides all unary operators in
875*67e74705SXin Li   // a way we expect.
876*67e74705SXin Li   EXPECT_TRUE(matches("bool b = !true;", unaryOperator(hasOperatorName("!"))));
877*67e74705SXin Li   EXPECT_TRUE(
878*67e74705SXin Li     matches("bool b; bool *p = &b;", unaryOperator(hasOperatorName("&"))));
879*67e74705SXin Li   EXPECT_TRUE(matches("int i = ~ 1;", unaryOperator(hasOperatorName("~"))));
880*67e74705SXin Li   EXPECT_TRUE(
881*67e74705SXin Li     matches("bool *p; bool b = *p;", unaryOperator(hasOperatorName("*"))));
882*67e74705SXin Li   EXPECT_TRUE(
883*67e74705SXin Li     matches("int i; int j = +i;", unaryOperator(hasOperatorName("+"))));
884*67e74705SXin Li   EXPECT_TRUE(
885*67e74705SXin Li     matches("int i; int j = -i;", unaryOperator(hasOperatorName("-"))));
886*67e74705SXin Li   EXPECT_TRUE(
887*67e74705SXin Li     matches("int i; int j = ++i;", unaryOperator(hasOperatorName("++"))));
888*67e74705SXin Li   EXPECT_TRUE(
889*67e74705SXin Li     matches("int i; int j = i++;", unaryOperator(hasOperatorName("++"))));
890*67e74705SXin Li   EXPECT_TRUE(
891*67e74705SXin Li     matches("int i; int j = --i;", unaryOperator(hasOperatorName("--"))));
892*67e74705SXin Li   EXPECT_TRUE(
893*67e74705SXin Li     matches("int i; int j = i--;", unaryOperator(hasOperatorName("--"))));
894*67e74705SXin Li 
895*67e74705SXin Li   // We don't match conversion operators.
896*67e74705SXin Li   EXPECT_TRUE(notMatches("int i; double d = (double)i;", unaryOperator()));
897*67e74705SXin Li 
898*67e74705SXin Li   // Function calls are not represented as operator.
899*67e74705SXin Li   EXPECT_TRUE(notMatches("void f(); void x() { f(); }", unaryOperator()));
900*67e74705SXin Li 
901*67e74705SXin Li   // Overloaded operators do not match at all.
902*67e74705SXin Li   // FIXME: We probably want to add that.
903*67e74705SXin Li   EXPECT_TRUE(notMatches(
904*67e74705SXin Li     "struct A { bool operator!() const { return false; } };"
905*67e74705SXin Li       "void x() { A a; !a; }", unaryOperator(hasOperatorName("!"))));
906*67e74705SXin Li }
907*67e74705SXin Li 
TEST(ArraySubscriptMatchers,ArrayIndex)908*67e74705SXin Li TEST(ArraySubscriptMatchers, ArrayIndex) {
909*67e74705SXin Li   EXPECT_TRUE(matches(
910*67e74705SXin Li     "int i[2]; void f() { i[1] = 1; }",
911*67e74705SXin Li     arraySubscriptExpr(hasIndex(integerLiteral(equals(1))))));
912*67e74705SXin Li   EXPECT_TRUE(matches(
913*67e74705SXin Li     "int i[2]; void f() { 1[i] = 1; }",
914*67e74705SXin Li     arraySubscriptExpr(hasIndex(integerLiteral(equals(1))))));
915*67e74705SXin Li   EXPECT_TRUE(notMatches(
916*67e74705SXin Li     "int i[2]; void f() { i[1] = 1; }",
917*67e74705SXin Li     arraySubscriptExpr(hasIndex(integerLiteral(equals(0))))));
918*67e74705SXin Li }
919*67e74705SXin Li 
TEST(ArraySubscriptMatchers,MatchesArrayBase)920*67e74705SXin Li TEST(ArraySubscriptMatchers, MatchesArrayBase) {
921*67e74705SXin Li   EXPECT_TRUE(matches(
922*67e74705SXin Li     "int i[2]; void f() { i[1] = 2; }",
923*67e74705SXin Li     arraySubscriptExpr(hasBase(implicitCastExpr(
924*67e74705SXin Li       hasSourceExpression(declRefExpr()))))));
925*67e74705SXin Li }
926*67e74705SXin Li 
TEST(Matcher,OfClass)927*67e74705SXin Li TEST(Matcher, OfClass) {
928*67e74705SXin Li   StatementMatcher Constructor = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
929*67e74705SXin Li     ofClass(hasName("X")))));
930*67e74705SXin Li 
931*67e74705SXin Li   EXPECT_TRUE(
932*67e74705SXin Li     matches("class X { public: X(); }; void x(int) { X x; }", Constructor));
933*67e74705SXin Li   EXPECT_TRUE(
934*67e74705SXin Li     matches("class X { public: X(); }; void x(int) { X x = X(); }",
935*67e74705SXin Li             Constructor));
936*67e74705SXin Li   EXPECT_TRUE(
937*67e74705SXin Li     notMatches("class Y { public: Y(); }; void x(int) { Y y; }",
938*67e74705SXin Li                Constructor));
939*67e74705SXin Li }
940*67e74705SXin Li 
TEST(Matcher,VisitsTemplateInstantiations)941*67e74705SXin Li TEST(Matcher, VisitsTemplateInstantiations) {
942*67e74705SXin Li   EXPECT_TRUE(matches(
943*67e74705SXin Li     "class A { public: void x(); };"
944*67e74705SXin Li       "template <typename T> class B { public: void y() { T t; t.x(); } };"
945*67e74705SXin Li       "void f() { B<A> b; b.y(); }",
946*67e74705SXin Li     callExpr(callee(cxxMethodDecl(hasName("x"))))));
947*67e74705SXin Li 
948*67e74705SXin Li   EXPECT_TRUE(matches(
949*67e74705SXin Li     "class A { public: void x(); };"
950*67e74705SXin Li       "class C {"
951*67e74705SXin Li       " public:"
952*67e74705SXin Li       "  template <typename T> class B { public: void y() { T t; t.x(); } };"
953*67e74705SXin Li       "};"
954*67e74705SXin Li       "void f() {"
955*67e74705SXin Li       "  C::B<A> b; b.y();"
956*67e74705SXin Li       "}",
957*67e74705SXin Li     recordDecl(hasName("C"), hasDescendant(callExpr(
958*67e74705SXin Li       callee(cxxMethodDecl(hasName("x"))))))));
959*67e74705SXin Li }
960*67e74705SXin Li 
TEST(Matcher,HasCondition)961*67e74705SXin Li TEST(Matcher, HasCondition) {
962*67e74705SXin Li   StatementMatcher IfStmt =
963*67e74705SXin Li     ifStmt(hasCondition(cxxBoolLiteral(equals(true))));
964*67e74705SXin Li   EXPECT_TRUE(matches("void x() { if (true) {} }", IfStmt));
965*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { if (false) {} }", IfStmt));
966*67e74705SXin Li 
967*67e74705SXin Li   StatementMatcher ForStmt =
968*67e74705SXin Li     forStmt(hasCondition(cxxBoolLiteral(equals(true))));
969*67e74705SXin Li   EXPECT_TRUE(matches("void x() { for (;true;) {} }", ForStmt));
970*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { for (;false;) {} }", ForStmt));
971*67e74705SXin Li 
972*67e74705SXin Li   StatementMatcher WhileStmt =
973*67e74705SXin Li     whileStmt(hasCondition(cxxBoolLiteral(equals(true))));
974*67e74705SXin Li   EXPECT_TRUE(matches("void x() { while (true) {} }", WhileStmt));
975*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { while (false) {} }", WhileStmt));
976*67e74705SXin Li 
977*67e74705SXin Li   StatementMatcher SwitchStmt =
978*67e74705SXin Li     switchStmt(hasCondition(integerLiteral(equals(42))));
979*67e74705SXin Li   EXPECT_TRUE(matches("void x() { switch (42) {case 42:;} }", SwitchStmt));
980*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { switch (43) {case 43:;} }", SwitchStmt));
981*67e74705SXin Li }
982*67e74705SXin Li 
TEST(For,ForLoopInternals)983*67e74705SXin Li TEST(For, ForLoopInternals) {
984*67e74705SXin Li   EXPECT_TRUE(matches("void f(){ int i; for (; i < 3 ; ); }",
985*67e74705SXin Li                       forStmt(hasCondition(anything()))));
986*67e74705SXin Li   EXPECT_TRUE(matches("void f() { for (int i = 0; ;); }",
987*67e74705SXin Li                       forStmt(hasLoopInit(anything()))));
988*67e74705SXin Li }
989*67e74705SXin Li 
TEST(For,ForRangeLoopInternals)990*67e74705SXin Li TEST(For, ForRangeLoopInternals) {
991*67e74705SXin Li   EXPECT_TRUE(matches("void f(){ int a[] {1, 2}; for (int i : a); }",
992*67e74705SXin Li                       cxxForRangeStmt(hasLoopVariable(anything()))));
993*67e74705SXin Li   EXPECT_TRUE(matches(
994*67e74705SXin Li     "void f(){ int a[] {1, 2}; for (int i : a); }",
995*67e74705SXin Li     cxxForRangeStmt(hasRangeInit(declRefExpr(to(varDecl(hasName("a"))))))));
996*67e74705SXin Li }
997*67e74705SXin Li 
TEST(For,NegativeForLoopInternals)998*67e74705SXin Li TEST(For, NegativeForLoopInternals) {
999*67e74705SXin Li   EXPECT_TRUE(notMatches("void f(){ for (int i = 0; ; ++i); }",
1000*67e74705SXin Li                          forStmt(hasCondition(expr()))));
1001*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() {int i; for (; i < 4; ++i) {} }",
1002*67e74705SXin Li                          forStmt(hasLoopInit(anything()))));
1003*67e74705SXin Li }
1004*67e74705SXin Li 
TEST(HasBody,FindsBodyOfForWhileDoLoops)1005*67e74705SXin Li TEST(HasBody, FindsBodyOfForWhileDoLoops) {
1006*67e74705SXin Li   EXPECT_TRUE(matches("void f() { for(;;) {} }",
1007*67e74705SXin Li                       forStmt(hasBody(compoundStmt()))));
1008*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() { for(;;); }",
1009*67e74705SXin Li                          forStmt(hasBody(compoundStmt()))));
1010*67e74705SXin Li   EXPECT_TRUE(matches("void f() { while(true) {} }",
1011*67e74705SXin Li                       whileStmt(hasBody(compoundStmt()))));
1012*67e74705SXin Li   EXPECT_TRUE(matches("void f() { do {} while(true); }",
1013*67e74705SXin Li                       doStmt(hasBody(compoundStmt()))));
1014*67e74705SXin Li   EXPECT_TRUE(matches("void f() { int p[2]; for (auto x : p) {} }",
1015*67e74705SXin Li                       cxxForRangeStmt(hasBody(compoundStmt()))));
1016*67e74705SXin Li   EXPECT_TRUE(matches("void f() {}", functionDecl(hasBody(compoundStmt()))));
1017*67e74705SXin Li   EXPECT_TRUE(notMatches("void f();", functionDecl(hasBody(compoundStmt()))));
1018*67e74705SXin Li   EXPECT_TRUE(matches("void f(); void f() {}",
1019*67e74705SXin Li                       functionDecl(hasBody(compoundStmt()))));
1020*67e74705SXin Li }
1021*67e74705SXin Li 
TEST(HasAnySubstatement,MatchesForTopLevelCompoundStatement)1022*67e74705SXin Li TEST(HasAnySubstatement, MatchesForTopLevelCompoundStatement) {
1023*67e74705SXin Li   // The simplest case: every compound statement is in a function
1024*67e74705SXin Li   // definition, and the function body itself must be a compound
1025*67e74705SXin Li   // statement.
1026*67e74705SXin Li   EXPECT_TRUE(matches("void f() { for (;;); }",
1027*67e74705SXin Li                       compoundStmt(hasAnySubstatement(forStmt()))));
1028*67e74705SXin Li }
1029*67e74705SXin Li 
TEST(HasAnySubstatement,IsNotRecursive)1030*67e74705SXin Li TEST(HasAnySubstatement, IsNotRecursive) {
1031*67e74705SXin Li   // It's really "has any immediate substatement".
1032*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() { if (true) for (;;); }",
1033*67e74705SXin Li                          compoundStmt(hasAnySubstatement(forStmt()))));
1034*67e74705SXin Li }
1035*67e74705SXin Li 
TEST(HasAnySubstatement,MatchesInNestedCompoundStatements)1036*67e74705SXin Li TEST(HasAnySubstatement, MatchesInNestedCompoundStatements) {
1037*67e74705SXin Li   EXPECT_TRUE(matches("void f() { if (true) { for (;;); } }",
1038*67e74705SXin Li                       compoundStmt(hasAnySubstatement(forStmt()))));
1039*67e74705SXin Li }
1040*67e74705SXin Li 
TEST(HasAnySubstatement,FindsSubstatementBetweenOthers)1041*67e74705SXin Li TEST(HasAnySubstatement, FindsSubstatementBetweenOthers) {
1042*67e74705SXin Li   EXPECT_TRUE(matches("void f() { 1; 2; 3; for (;;); 4; 5; 6; }",
1043*67e74705SXin Li                       compoundStmt(hasAnySubstatement(forStmt()))));
1044*67e74705SXin Li }
1045*67e74705SXin Li 
TEST(Member,MatchesMemberAllocationFunction)1046*67e74705SXin Li TEST(Member, MatchesMemberAllocationFunction) {
1047*67e74705SXin Li   // Fails in C++11 mode
1048*67e74705SXin Li   EXPECT_TRUE(matchesConditionally(
1049*67e74705SXin Li     "namespace std { typedef typeof(sizeof(int)) size_t; }"
1050*67e74705SXin Li       "class X { void *operator new(std::size_t); };",
1051*67e74705SXin Li     cxxMethodDecl(ofClass(hasName("X"))), true, "-std=gnu++98"));
1052*67e74705SXin Li 
1053*67e74705SXin Li   EXPECT_TRUE(matches("class X { void operator delete(void*); };",
1054*67e74705SXin Li                       cxxMethodDecl(ofClass(hasName("X")))));
1055*67e74705SXin Li 
1056*67e74705SXin Li   // Fails in C++11 mode
1057*67e74705SXin Li   EXPECT_TRUE(matchesConditionally(
1058*67e74705SXin Li     "namespace std { typedef typeof(sizeof(int)) size_t; }"
1059*67e74705SXin Li       "class X { void operator delete[](void*, std::size_t); };",
1060*67e74705SXin Li     cxxMethodDecl(ofClass(hasName("X"))), true, "-std=gnu++98"));
1061*67e74705SXin Li }
1062*67e74705SXin Li 
TEST(HasDestinationType,MatchesSimpleCase)1063*67e74705SXin Li TEST(HasDestinationType, MatchesSimpleCase) {
1064*67e74705SXin Li   EXPECT_TRUE(matches("char* p = static_cast<char*>(0);",
1065*67e74705SXin Li                       cxxStaticCastExpr(hasDestinationType(
1066*67e74705SXin Li                         pointsTo(TypeMatcher(anything()))))));
1067*67e74705SXin Li }
1068*67e74705SXin Li 
TEST(HasImplicitDestinationType,MatchesSimpleCase)1069*67e74705SXin Li TEST(HasImplicitDestinationType, MatchesSimpleCase) {
1070*67e74705SXin Li   // This test creates an implicit const cast.
1071*67e74705SXin Li   EXPECT_TRUE(matches("int x; const int i = x;",
1072*67e74705SXin Li                       implicitCastExpr(
1073*67e74705SXin Li                         hasImplicitDestinationType(isInteger()))));
1074*67e74705SXin Li   // This test creates an implicit array-to-pointer cast.
1075*67e74705SXin Li   EXPECT_TRUE(matches("int arr[3]; int *p = arr;",
1076*67e74705SXin Li                       implicitCastExpr(hasImplicitDestinationType(
1077*67e74705SXin Li                         pointsTo(TypeMatcher(anything()))))));
1078*67e74705SXin Li }
1079*67e74705SXin Li 
TEST(HasImplicitDestinationType,DoesNotMatchIncorrectly)1080*67e74705SXin Li TEST(HasImplicitDestinationType, DoesNotMatchIncorrectly) {
1081*67e74705SXin Li   // This test creates an implicit cast from int to char.
1082*67e74705SXin Li   EXPECT_TRUE(notMatches("char c = 0;",
1083*67e74705SXin Li                          implicitCastExpr(hasImplicitDestinationType(
1084*67e74705SXin Li                            unless(anything())))));
1085*67e74705SXin Li   // This test creates an implicit array-to-pointer cast.
1086*67e74705SXin Li   EXPECT_TRUE(notMatches("int arr[3]; int *p = arr;",
1087*67e74705SXin Li                          implicitCastExpr(hasImplicitDestinationType(
1088*67e74705SXin Li                            unless(anything())))));
1089*67e74705SXin Li }
1090*67e74705SXin Li 
TEST(IgnoringImplicit,MatchesImplicit)1091*67e74705SXin Li TEST(IgnoringImplicit, MatchesImplicit) {
1092*67e74705SXin Li   EXPECT_TRUE(matches("class C {}; C a = C();",
1093*67e74705SXin Li                       varDecl(has(ignoringImplicit(cxxConstructExpr())))));
1094*67e74705SXin Li }
1095*67e74705SXin Li 
TEST(IgnoringImplicit,DoesNotMatchIncorrectly)1096*67e74705SXin Li TEST(IgnoringImplicit, DoesNotMatchIncorrectly) {
1097*67e74705SXin Li   EXPECT_TRUE(
1098*67e74705SXin Li       notMatches("class C {}; C a = C();", varDecl(has(cxxConstructExpr()))));
1099*67e74705SXin Li }
1100*67e74705SXin Li 
TEST(IgnoringImpCasts,MatchesImpCasts)1101*67e74705SXin Li TEST(IgnoringImpCasts, MatchesImpCasts) {
1102*67e74705SXin Li   // This test checks that ignoringImpCasts matches when implicit casts are
1103*67e74705SXin Li   // present and its inner matcher alone does not match.
1104*67e74705SXin Li   // Note that this test creates an implicit const cast.
1105*67e74705SXin Li   EXPECT_TRUE(matches("int x = 0; const int y = x;",
1106*67e74705SXin Li                       varDecl(hasInitializer(ignoringImpCasts(
1107*67e74705SXin Li                         declRefExpr(to(varDecl(hasName("x")))))))));
1108*67e74705SXin Li   // This test creates an implict cast from int to char.
1109*67e74705SXin Li   EXPECT_TRUE(matches("char x = 0;",
1110*67e74705SXin Li                       varDecl(hasInitializer(ignoringImpCasts(
1111*67e74705SXin Li                         integerLiteral(equals(0)))))));
1112*67e74705SXin Li }
1113*67e74705SXin Li 
TEST(IgnoringImpCasts,DoesNotMatchIncorrectly)1114*67e74705SXin Li TEST(IgnoringImpCasts, DoesNotMatchIncorrectly) {
1115*67e74705SXin Li   // These tests verify that ignoringImpCasts does not match if the inner
1116*67e74705SXin Li   // matcher does not match.
1117*67e74705SXin Li   // Note that the first test creates an implicit const cast.
1118*67e74705SXin Li   EXPECT_TRUE(notMatches("int x; const int y = x;",
1119*67e74705SXin Li                          varDecl(hasInitializer(ignoringImpCasts(
1120*67e74705SXin Li                            unless(anything()))))));
1121*67e74705SXin Li   EXPECT_TRUE(notMatches("int x; int y = x;",
1122*67e74705SXin Li                          varDecl(hasInitializer(ignoringImpCasts(
1123*67e74705SXin Li                            unless(anything()))))));
1124*67e74705SXin Li 
1125*67e74705SXin Li   // These tests verify that ignoringImplictCasts does not look through explicit
1126*67e74705SXin Li   // casts or parentheses.
1127*67e74705SXin Li   EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);",
1128*67e74705SXin Li                          varDecl(hasInitializer(ignoringImpCasts(
1129*67e74705SXin Li                            integerLiteral())))));
1130*67e74705SXin Li   EXPECT_TRUE(notMatches("int i = (0);",
1131*67e74705SXin Li                          varDecl(hasInitializer(ignoringImpCasts(
1132*67e74705SXin Li                            integerLiteral())))));
1133*67e74705SXin Li   EXPECT_TRUE(notMatches("float i = (float)0;",
1134*67e74705SXin Li                          varDecl(hasInitializer(ignoringImpCasts(
1135*67e74705SXin Li                            integerLiteral())))));
1136*67e74705SXin Li   EXPECT_TRUE(notMatches("float i = float(0);",
1137*67e74705SXin Li                          varDecl(hasInitializer(ignoringImpCasts(
1138*67e74705SXin Li                            integerLiteral())))));
1139*67e74705SXin Li }
1140*67e74705SXin Li 
TEST(IgnoringImpCasts,MatchesWithoutImpCasts)1141*67e74705SXin Li TEST(IgnoringImpCasts, MatchesWithoutImpCasts) {
1142*67e74705SXin Li   // This test verifies that expressions that do not have implicit casts
1143*67e74705SXin Li   // still match the inner matcher.
1144*67e74705SXin Li   EXPECT_TRUE(matches("int x = 0; int &y = x;",
1145*67e74705SXin Li                       varDecl(hasInitializer(ignoringImpCasts(
1146*67e74705SXin Li                         declRefExpr(to(varDecl(hasName("x")))))))));
1147*67e74705SXin Li }
1148*67e74705SXin Li 
TEST(IgnoringParenCasts,MatchesParenCasts)1149*67e74705SXin Li TEST(IgnoringParenCasts, MatchesParenCasts) {
1150*67e74705SXin Li   // This test checks that ignoringParenCasts matches when parentheses and/or
1151*67e74705SXin Li   // casts are present and its inner matcher alone does not match.
1152*67e74705SXin Li   EXPECT_TRUE(matches("int x = (0);",
1153*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenCasts(
1154*67e74705SXin Li                         integerLiteral(equals(0)))))));
1155*67e74705SXin Li   EXPECT_TRUE(matches("int x = (((((0)))));",
1156*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenCasts(
1157*67e74705SXin Li                         integerLiteral(equals(0)))))));
1158*67e74705SXin Li 
1159*67e74705SXin Li   // This test creates an implict cast from int to char in addition to the
1160*67e74705SXin Li   // parentheses.
1161*67e74705SXin Li   EXPECT_TRUE(matches("char x = (0);",
1162*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenCasts(
1163*67e74705SXin Li                         integerLiteral(equals(0)))))));
1164*67e74705SXin Li 
1165*67e74705SXin Li   EXPECT_TRUE(matches("char x = (char)0;",
1166*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenCasts(
1167*67e74705SXin Li                         integerLiteral(equals(0)))))));
1168*67e74705SXin Li   EXPECT_TRUE(matches("char* p = static_cast<char*>(0);",
1169*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenCasts(
1170*67e74705SXin Li                         integerLiteral(equals(0)))))));
1171*67e74705SXin Li }
1172*67e74705SXin Li 
TEST(IgnoringParenCasts,MatchesWithoutParenCasts)1173*67e74705SXin Li TEST(IgnoringParenCasts, MatchesWithoutParenCasts) {
1174*67e74705SXin Li   // This test verifies that expressions that do not have any casts still match.
1175*67e74705SXin Li   EXPECT_TRUE(matches("int x = 0;",
1176*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenCasts(
1177*67e74705SXin Li                         integerLiteral(equals(0)))))));
1178*67e74705SXin Li }
1179*67e74705SXin Li 
TEST(IgnoringParenCasts,DoesNotMatchIncorrectly)1180*67e74705SXin Li TEST(IgnoringParenCasts, DoesNotMatchIncorrectly) {
1181*67e74705SXin Li   // These tests verify that ignoringImpCasts does not match if the inner
1182*67e74705SXin Li   // matcher does not match.
1183*67e74705SXin Li   EXPECT_TRUE(notMatches("int x = ((0));",
1184*67e74705SXin Li                          varDecl(hasInitializer(ignoringParenCasts(
1185*67e74705SXin Li                            unless(anything()))))));
1186*67e74705SXin Li 
1187*67e74705SXin Li   // This test creates an implicit cast from int to char in addition to the
1188*67e74705SXin Li   // parentheses.
1189*67e74705SXin Li   EXPECT_TRUE(notMatches("char x = ((0));",
1190*67e74705SXin Li                          varDecl(hasInitializer(ignoringParenCasts(
1191*67e74705SXin Li                            unless(anything()))))));
1192*67e74705SXin Li 
1193*67e74705SXin Li   EXPECT_TRUE(notMatches("char *x = static_cast<char *>((0));",
1194*67e74705SXin Li                          varDecl(hasInitializer(ignoringParenCasts(
1195*67e74705SXin Li                            unless(anything()))))));
1196*67e74705SXin Li }
1197*67e74705SXin Li 
TEST(IgnoringParenAndImpCasts,MatchesParenImpCasts)1198*67e74705SXin Li TEST(IgnoringParenAndImpCasts, MatchesParenImpCasts) {
1199*67e74705SXin Li   // This test checks that ignoringParenAndImpCasts matches when
1200*67e74705SXin Li   // parentheses and/or implicit casts are present and its inner matcher alone
1201*67e74705SXin Li   // does not match.
1202*67e74705SXin Li   // Note that this test creates an implicit const cast.
1203*67e74705SXin Li   EXPECT_TRUE(matches("int x = 0; const int y = x;",
1204*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenImpCasts(
1205*67e74705SXin Li                         declRefExpr(to(varDecl(hasName("x")))))))));
1206*67e74705SXin Li   // This test creates an implicit cast from int to char.
1207*67e74705SXin Li   EXPECT_TRUE(matches("const char x = (0);",
1208*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenImpCasts(
1209*67e74705SXin Li                         integerLiteral(equals(0)))))));
1210*67e74705SXin Li }
1211*67e74705SXin Li 
TEST(IgnoringParenAndImpCasts,MatchesWithoutParenImpCasts)1212*67e74705SXin Li TEST(IgnoringParenAndImpCasts, MatchesWithoutParenImpCasts) {
1213*67e74705SXin Li   // This test verifies that expressions that do not have parentheses or
1214*67e74705SXin Li   // implicit casts still match.
1215*67e74705SXin Li   EXPECT_TRUE(matches("int x = 0; int &y = x;",
1216*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenImpCasts(
1217*67e74705SXin Li                         declRefExpr(to(varDecl(hasName("x")))))))));
1218*67e74705SXin Li   EXPECT_TRUE(matches("int x = 0;",
1219*67e74705SXin Li                       varDecl(hasInitializer(ignoringParenImpCasts(
1220*67e74705SXin Li                         integerLiteral(equals(0)))))));
1221*67e74705SXin Li }
1222*67e74705SXin Li 
TEST(IgnoringParenAndImpCasts,DoesNotMatchIncorrectly)1223*67e74705SXin Li TEST(IgnoringParenAndImpCasts, DoesNotMatchIncorrectly) {
1224*67e74705SXin Li   // These tests verify that ignoringParenImpCasts does not match if
1225*67e74705SXin Li   // the inner matcher does not match.
1226*67e74705SXin Li   // This test creates an implicit cast.
1227*67e74705SXin Li   EXPECT_TRUE(notMatches("char c = ((3));",
1228*67e74705SXin Li                          varDecl(hasInitializer(ignoringParenImpCasts(
1229*67e74705SXin Li                            unless(anything()))))));
1230*67e74705SXin Li   // These tests verify that ignoringParenAndImplictCasts does not look
1231*67e74705SXin Li   // through explicit casts.
1232*67e74705SXin Li   EXPECT_TRUE(notMatches("float y = (float(0));",
1233*67e74705SXin Li                          varDecl(hasInitializer(ignoringParenImpCasts(
1234*67e74705SXin Li                            integerLiteral())))));
1235*67e74705SXin Li   EXPECT_TRUE(notMatches("float y = (float)0;",
1236*67e74705SXin Li                          varDecl(hasInitializer(ignoringParenImpCasts(
1237*67e74705SXin Li                            integerLiteral())))));
1238*67e74705SXin Li   EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);",
1239*67e74705SXin Li                          varDecl(hasInitializer(ignoringParenImpCasts(
1240*67e74705SXin Li                            integerLiteral())))));
1241*67e74705SXin Li }
1242*67e74705SXin Li 
TEST(HasSourceExpression,MatchesImplicitCasts)1243*67e74705SXin Li TEST(HasSourceExpression, MatchesImplicitCasts) {
1244*67e74705SXin Li   EXPECT_TRUE(matches("class string {}; class URL { public: URL(string s); };"
1245*67e74705SXin Li                         "void r() {string a_string; URL url = a_string; }",
1246*67e74705SXin Li                       implicitCastExpr(
1247*67e74705SXin Li                         hasSourceExpression(cxxConstructExpr()))));
1248*67e74705SXin Li }
1249*67e74705SXin Li 
TEST(HasSourceExpression,MatchesExplicitCasts)1250*67e74705SXin Li TEST(HasSourceExpression, MatchesExplicitCasts) {
1251*67e74705SXin Li   EXPECT_TRUE(matches("float x = static_cast<float>(42);",
1252*67e74705SXin Li                       explicitCastExpr(
1253*67e74705SXin Li                         hasSourceExpression(hasDescendant(
1254*67e74705SXin Li                           expr(integerLiteral()))))));
1255*67e74705SXin Li }
1256*67e74705SXin Li 
TEST(UsingDeclaration,MatchesSpecificTarget)1257*67e74705SXin Li TEST(UsingDeclaration, MatchesSpecificTarget) {
1258*67e74705SXin Li   EXPECT_TRUE(matches("namespace f { int a; void b(); } using f::b;",
1259*67e74705SXin Li                       usingDecl(hasAnyUsingShadowDecl(
1260*67e74705SXin Li                         hasTargetDecl(functionDecl())))));
1261*67e74705SXin Li   EXPECT_TRUE(notMatches("namespace f { int a; void b(); } using f::a;",
1262*67e74705SXin Li                          usingDecl(hasAnyUsingShadowDecl(
1263*67e74705SXin Li                            hasTargetDecl(functionDecl())))));
1264*67e74705SXin Li }
1265*67e74705SXin Li 
TEST(UsingDeclaration,ThroughUsingDeclaration)1266*67e74705SXin Li TEST(UsingDeclaration, ThroughUsingDeclaration) {
1267*67e74705SXin Li   EXPECT_TRUE(matches(
1268*67e74705SXin Li     "namespace a { void f(); } using a::f; void g() { f(); }",
1269*67e74705SXin Li     declRefExpr(throughUsingDecl(anything()))));
1270*67e74705SXin Li   EXPECT_TRUE(notMatches(
1271*67e74705SXin Li     "namespace a { void f(); } using a::f; void g() { a::f(); }",
1272*67e74705SXin Li     declRefExpr(throughUsingDecl(anything()))));
1273*67e74705SXin Li }
1274*67e74705SXin Li 
TEST(SingleDecl,IsSingleDecl)1275*67e74705SXin Li TEST(SingleDecl, IsSingleDecl) {
1276*67e74705SXin Li   StatementMatcher SingleDeclStmt =
1277*67e74705SXin Li     declStmt(hasSingleDecl(varDecl(hasInitializer(anything()))));
1278*67e74705SXin Li   EXPECT_TRUE(matches("void f() {int a = 4;}", SingleDeclStmt));
1279*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() {int a;}", SingleDeclStmt));
1280*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() {int a = 4, b = 3;}",
1281*67e74705SXin Li                          SingleDeclStmt));
1282*67e74705SXin Li }
1283*67e74705SXin Li 
TEST(DeclStmt,ContainsDeclaration)1284*67e74705SXin Li TEST(DeclStmt, ContainsDeclaration) {
1285*67e74705SXin Li   DeclarationMatcher MatchesInit = varDecl(hasInitializer(anything()));
1286*67e74705SXin Li 
1287*67e74705SXin Li   EXPECT_TRUE(matches("void f() {int a = 4;}",
1288*67e74705SXin Li                       declStmt(containsDeclaration(0, MatchesInit))));
1289*67e74705SXin Li   EXPECT_TRUE(matches("void f() {int a = 4, b = 3;}",
1290*67e74705SXin Li                       declStmt(containsDeclaration(0, MatchesInit),
1291*67e74705SXin Li                                containsDeclaration(1, MatchesInit))));
1292*67e74705SXin Li   unsigned WrongIndex = 42;
1293*67e74705SXin Li   EXPECT_TRUE(notMatches("void f() {int a = 4, b = 3;}",
1294*67e74705SXin Li                          declStmt(containsDeclaration(WrongIndex,
1295*67e74705SXin Li                                                       MatchesInit))));
1296*67e74705SXin Li }
1297*67e74705SXin Li 
TEST(SwitchCase,MatchesEachCase)1298*67e74705SXin Li TEST(SwitchCase, MatchesEachCase) {
1299*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { switch(42); }",
1300*67e74705SXin Li                          switchStmt(forEachSwitchCase(caseStmt()))));
1301*67e74705SXin Li   EXPECT_TRUE(matches("void x() { switch(42) case 42:; }",
1302*67e74705SXin Li                       switchStmt(forEachSwitchCase(caseStmt()))));
1303*67e74705SXin Li   EXPECT_TRUE(matches("void x() { switch(42) { case 42:; } }",
1304*67e74705SXin Li                       switchStmt(forEachSwitchCase(caseStmt()))));
1305*67e74705SXin Li   EXPECT_TRUE(notMatches(
1306*67e74705SXin Li     "void x() { if (1) switch(42) { case 42: switch (42) { default:; } } }",
1307*67e74705SXin Li     ifStmt(has(switchStmt(forEachSwitchCase(defaultStmt()))))));
1308*67e74705SXin Li   EXPECT_TRUE(matches("void x() { switch(42) { case 1+1: case 4:; } }",
1309*67e74705SXin Li                       switchStmt(forEachSwitchCase(
1310*67e74705SXin Li                         caseStmt(hasCaseConstant(integerLiteral()))))));
1311*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { switch(42) { case 1+1: case 2+2:; } }",
1312*67e74705SXin Li                          switchStmt(forEachSwitchCase(
1313*67e74705SXin Li                            caseStmt(hasCaseConstant(integerLiteral()))))));
1314*67e74705SXin Li   EXPECT_TRUE(notMatches("void x() { switch(42) { case 1 ... 2:; } }",
1315*67e74705SXin Li                          switchStmt(forEachSwitchCase(
1316*67e74705SXin Li                            caseStmt(hasCaseConstant(integerLiteral()))))));
1317*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1318*67e74705SXin Li     "void x() { switch (42) { case 1: case 2: case 3: default:; } }",
1319*67e74705SXin Li     switchStmt(forEachSwitchCase(caseStmt().bind("x"))),
1320*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<CaseStmt>>("x", 3)));
1321*67e74705SXin Li }
1322*67e74705SXin Li 
TEST(ForEachConstructorInitializer,MatchesInitializers)1323*67e74705SXin Li TEST(ForEachConstructorInitializer, MatchesInitializers) {
1324*67e74705SXin Li   EXPECT_TRUE(matches(
1325*67e74705SXin Li     "struct X { X() : i(42), j(42) {} int i, j; };",
1326*67e74705SXin Li     cxxConstructorDecl(forEachConstructorInitializer(cxxCtorInitializer()))));
1327*67e74705SXin Li }
1328*67e74705SXin Li 
TEST(HasConditionVariableStatement,DoesNotMatchCondition)1329*67e74705SXin Li TEST(HasConditionVariableStatement, DoesNotMatchCondition) {
1330*67e74705SXin Li   EXPECT_TRUE(notMatches(
1331*67e74705SXin Li     "void x() { if(true) {} }",
1332*67e74705SXin Li     ifStmt(hasConditionVariableStatement(declStmt()))));
1333*67e74705SXin Li   EXPECT_TRUE(notMatches(
1334*67e74705SXin Li     "void x() { int x; if((x = 42)) {} }",
1335*67e74705SXin Li     ifStmt(hasConditionVariableStatement(declStmt()))));
1336*67e74705SXin Li }
1337*67e74705SXin Li 
TEST(HasConditionVariableStatement,MatchesConditionVariables)1338*67e74705SXin Li TEST(HasConditionVariableStatement, MatchesConditionVariables) {
1339*67e74705SXin Li   EXPECT_TRUE(matches(
1340*67e74705SXin Li     "void x() { if(int* a = 0) {} }",
1341*67e74705SXin Li     ifStmt(hasConditionVariableStatement(declStmt()))));
1342*67e74705SXin Li }
1343*67e74705SXin Li 
TEST(ForEach,BindsOneNode)1344*67e74705SXin Li TEST(ForEach, BindsOneNode) {
1345*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue("class C { int x; };",
1346*67e74705SXin Li                                        recordDecl(hasName("C"), forEach(fieldDecl(hasName("x")).bind("x"))),
1347*67e74705SXin Li                                        llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("x", 1)));
1348*67e74705SXin Li }
1349*67e74705SXin Li 
TEST(ForEach,BindsMultipleNodes)1350*67e74705SXin Li TEST(ForEach, BindsMultipleNodes) {
1351*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue("class C { int x; int y; int z; };",
1352*67e74705SXin Li                                        recordDecl(hasName("C"), forEach(fieldDecl().bind("f"))),
1353*67e74705SXin Li                                        llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 3)));
1354*67e74705SXin Li }
1355*67e74705SXin Li 
TEST(ForEach,BindsRecursiveCombinations)1356*67e74705SXin Li TEST(ForEach, BindsRecursiveCombinations) {
1357*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1358*67e74705SXin Li     "class C { class D { int x; int y; }; class E { int y; int z; }; };",
1359*67e74705SXin Li     recordDecl(hasName("C"),
1360*67e74705SXin Li                forEach(recordDecl(forEach(fieldDecl().bind("f"))))),
1361*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 4)));
1362*67e74705SXin Li }
1363*67e74705SXin Li 
TEST(ForEachDescendant,BindsOneNode)1364*67e74705SXin Li TEST(ForEachDescendant, BindsOneNode) {
1365*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue("class C { class D { int x; }; };",
1366*67e74705SXin Li                                        recordDecl(hasName("C"),
1367*67e74705SXin Li                                                   forEachDescendant(fieldDecl(hasName("x")).bind("x"))),
1368*67e74705SXin Li                                        llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("x", 1)));
1369*67e74705SXin Li }
1370*67e74705SXin Li 
TEST(ForEachDescendant,NestedForEachDescendant)1371*67e74705SXin Li TEST(ForEachDescendant, NestedForEachDescendant) {
1372*67e74705SXin Li   DeclarationMatcher m = recordDecl(
1373*67e74705SXin Li     isDefinition(), decl().bind("x"), hasName("C"));
1374*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1375*67e74705SXin Li     "class A { class B { class C {}; }; };",
1376*67e74705SXin Li     recordDecl(hasName("A"), anyOf(m, forEachDescendant(m))),
1377*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", "C")));
1378*67e74705SXin Li 
1379*67e74705SXin Li   // Check that a partial match of 'm' that binds 'x' in the
1380*67e74705SXin Li   // first part of anyOf(m, anything()) will not overwrite the
1381*67e74705SXin Li   // binding created by the earlier binding in the hasDescendant.
1382*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1383*67e74705SXin Li     "class A { class B { class C {}; }; };",
1384*67e74705SXin Li     recordDecl(hasName("A"), allOf(hasDescendant(m), anyOf(m, anything()))),
1385*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", "C")));
1386*67e74705SXin Li }
1387*67e74705SXin Li 
TEST(ForEachDescendant,BindsMultipleNodes)1388*67e74705SXin Li TEST(ForEachDescendant, BindsMultipleNodes) {
1389*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1390*67e74705SXin Li     "class C { class D { int x; int y; }; "
1391*67e74705SXin Li       "          class E { class F { int y; int z; }; }; };",
1392*67e74705SXin Li     recordDecl(hasName("C"), forEachDescendant(fieldDecl().bind("f"))),
1393*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 4)));
1394*67e74705SXin Li }
1395*67e74705SXin Li 
TEST(ForEachDescendant,BindsRecursiveCombinations)1396*67e74705SXin Li TEST(ForEachDescendant, BindsRecursiveCombinations) {
1397*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1398*67e74705SXin Li     "class C { class D { "
1399*67e74705SXin Li       "          class E { class F { class G { int y; int z; }; }; }; }; };",
1400*67e74705SXin Li     recordDecl(hasName("C"), forEachDescendant(recordDecl(
1401*67e74705SXin Li       forEachDescendant(fieldDecl().bind("f"))))),
1402*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 8)));
1403*67e74705SXin Li }
1404*67e74705SXin Li 
TEST(ForEachDescendant,BindsCombinations)1405*67e74705SXin Li TEST(ForEachDescendant, BindsCombinations) {
1406*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1407*67e74705SXin Li     "void f() { if(true) {} if (true) {} while (true) {} if (true) {} while "
1408*67e74705SXin Li       "(true) {} }",
1409*67e74705SXin Li     compoundStmt(forEachDescendant(ifStmt().bind("if")),
1410*67e74705SXin Li                  forEachDescendant(whileStmt().bind("while"))),
1411*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<IfStmt>>("if", 6)));
1412*67e74705SXin Li }
1413*67e74705SXin Li 
TEST(Has,DoesNotDeleteBindings)1414*67e74705SXin Li TEST(Has, DoesNotDeleteBindings) {
1415*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1416*67e74705SXin Li     "class X { int a; };", recordDecl(decl().bind("x"), has(fieldDecl())),
1417*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1418*67e74705SXin Li }
1419*67e74705SXin Li 
TEST(LoopingMatchers,DoNotOverwritePreviousMatchResultOnFailure)1420*67e74705SXin Li TEST(LoopingMatchers, DoNotOverwritePreviousMatchResultOnFailure) {
1421*67e74705SXin Li   // Those matchers cover all the cases where an inner matcher is called
1422*67e74705SXin Li   // and there is not a 1:1 relationship between the match of the outer
1423*67e74705SXin Li   // matcher and the match of the inner matcher.
1424*67e74705SXin Li   // The pattern to look for is:
1425*67e74705SXin Li   //   ... return InnerMatcher.matches(...); ...
1426*67e74705SXin Li   // In which case no special handling is needed.
1427*67e74705SXin Li   //
1428*67e74705SXin Li   // On the other hand, if there are multiple alternative matches
1429*67e74705SXin Li   // (for example forEach*) or matches might be discarded (for example has*)
1430*67e74705SXin Li   // the implementation must make sure that the discarded matches do not
1431*67e74705SXin Li   // affect the bindings.
1432*67e74705SXin Li   // When new such matchers are added, add a test here that:
1433*67e74705SXin Li   // - matches a simple node, and binds it as the first thing in the matcher:
1434*67e74705SXin Li   //     recordDecl(decl().bind("x"), hasName("X")))
1435*67e74705SXin Li   // - uses the matcher under test afterwards in a way that not the first
1436*67e74705SXin Li   //   alternative is matched; for anyOf, that means the first branch
1437*67e74705SXin Li   //   would need to return false; for hasAncestor, it means that not
1438*67e74705SXin Li   //   the direct parent matches the inner matcher.
1439*67e74705SXin Li 
1440*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1441*67e74705SXin Li     "class X { int y; };",
1442*67e74705SXin Li     recordDecl(
1443*67e74705SXin Li       recordDecl().bind("x"), hasName("::X"),
1444*67e74705SXin Li       anyOf(forEachDescendant(recordDecl(hasName("Y"))), anything())),
1445*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("x", 1)));
1446*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1447*67e74705SXin Li     "class X {};", recordDecl(recordDecl().bind("x"), hasName("::X"),
1448*67e74705SXin Li                               anyOf(unless(anything()), anything())),
1449*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("x", 1)));
1450*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1451*67e74705SXin Li     "template<typename T1, typename T2> class X {}; X<float, int> x;",
1452*67e74705SXin Li     classTemplateSpecializationDecl(
1453*67e74705SXin Li       decl().bind("x"),
1454*67e74705SXin Li       hasAnyTemplateArgument(refersToType(asString("int")))),
1455*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1456*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1457*67e74705SXin Li     "class X { void f(); void g(); };",
1458*67e74705SXin Li     cxxRecordDecl(decl().bind("x"), hasMethod(hasName("g"))),
1459*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1460*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1461*67e74705SXin Li     "class X { X() : a(1), b(2) {} double a; int b; };",
1462*67e74705SXin Li     recordDecl(decl().bind("x"),
1463*67e74705SXin Li                has(cxxConstructorDecl(
1464*67e74705SXin Li                  hasAnyConstructorInitializer(forField(hasName("b")))))),
1465*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1466*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1467*67e74705SXin Li     "void x(int, int) { x(0, 42); }",
1468*67e74705SXin Li     callExpr(expr().bind("x"), hasAnyArgument(integerLiteral(equals(42)))),
1469*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Expr>>("x", 1)));
1470*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1471*67e74705SXin Li     "void x(int, int y) {}",
1472*67e74705SXin Li     functionDecl(decl().bind("x"), hasAnyParameter(hasName("y"))),
1473*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1474*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1475*67e74705SXin Li     "void x() { return; if (true) {} }",
1476*67e74705SXin Li     functionDecl(decl().bind("x"),
1477*67e74705SXin Li                  has(compoundStmt(hasAnySubstatement(ifStmt())))),
1478*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1479*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1480*67e74705SXin Li     "namespace X { void b(int); void b(); }"
1481*67e74705SXin Li       "using X::b;",
1482*67e74705SXin Li     usingDecl(decl().bind("x"), hasAnyUsingShadowDecl(hasTargetDecl(
1483*67e74705SXin Li       functionDecl(parameterCountIs(1))))),
1484*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1485*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1486*67e74705SXin Li     "class A{}; class B{}; class C : B, A {};",
1487*67e74705SXin Li     cxxRecordDecl(decl().bind("x"), isDerivedFrom("::A")),
1488*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1489*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1490*67e74705SXin Li     "class A{}; typedef A B; typedef A C; typedef A D;"
1491*67e74705SXin Li       "class E : A {};",
1492*67e74705SXin Li     cxxRecordDecl(decl().bind("x"), isDerivedFrom("C")),
1493*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1494*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1495*67e74705SXin Li     "class A { class B { void f() {} }; };",
1496*67e74705SXin Li     functionDecl(decl().bind("x"), hasAncestor(recordDecl(hasName("::A")))),
1497*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1498*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1499*67e74705SXin Li     "template <typename T> struct A { struct B {"
1500*67e74705SXin Li       "  void f() { if(true) {} }"
1501*67e74705SXin Li       "}; };"
1502*67e74705SXin Li       "void t() { A<int>::B b; b.f(); }",
1503*67e74705SXin Li     ifStmt(stmt().bind("x"), hasAncestor(recordDecl(hasName("::A")))),
1504*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Stmt>>("x", 2)));
1505*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1506*67e74705SXin Li     "class A {};",
1507*67e74705SXin Li     recordDecl(hasName("::A"), decl().bind("x"), unless(hasName("fooble"))),
1508*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1509*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1510*67e74705SXin Li     "class A { A() : s(), i(42) {} const char *s; int i; };",
1511*67e74705SXin Li     cxxConstructorDecl(hasName("::A::A"), decl().bind("x"),
1512*67e74705SXin Li                        forEachConstructorInitializer(forField(hasName("i")))),
1513*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
1514*67e74705SXin Li }
1515*67e74705SXin Li 
TEST(ForEachDescendant,BindsCorrectNodes)1516*67e74705SXin Li TEST(ForEachDescendant, BindsCorrectNodes) {
1517*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1518*67e74705SXin Li     "class C { void f(); int i; };",
1519*67e74705SXin Li     recordDecl(hasName("C"), forEachDescendant(decl().bind("decl"))),
1520*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("decl", 1)));
1521*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1522*67e74705SXin Li     "class C { void f() {} int i; };",
1523*67e74705SXin Li     recordDecl(hasName("C"), forEachDescendant(decl().bind("decl"))),
1524*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("decl", 1)));
1525*67e74705SXin Li }
1526*67e74705SXin Li 
TEST(FindAll,BindsNodeOnMatch)1527*67e74705SXin Li TEST(FindAll, BindsNodeOnMatch) {
1528*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1529*67e74705SXin Li     "class A {};",
1530*67e74705SXin Li     recordDecl(hasName("::A"), findAll(recordDecl(hasName("::A")).bind("v"))),
1531*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("v", 1)));
1532*67e74705SXin Li }
1533*67e74705SXin Li 
TEST(FindAll,BindsDescendantNodeOnMatch)1534*67e74705SXin Li TEST(FindAll, BindsDescendantNodeOnMatch) {
1535*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1536*67e74705SXin Li     "class A { int a; int b; };",
1537*67e74705SXin Li     recordDecl(hasName("::A"), findAll(fieldDecl().bind("v"))),
1538*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 2)));
1539*67e74705SXin Li }
1540*67e74705SXin Li 
TEST(FindAll,BindsNodeAndDescendantNodesOnOneMatch)1541*67e74705SXin Li TEST(FindAll, BindsNodeAndDescendantNodesOnOneMatch) {
1542*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1543*67e74705SXin Li     "class A { int a; int b; };",
1544*67e74705SXin Li     recordDecl(hasName("::A"),
1545*67e74705SXin Li                findAll(decl(anyOf(recordDecl(hasName("::A")).bind("v"),
1546*67e74705SXin Li                                   fieldDecl().bind("v"))))),
1547*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<Decl>>("v", 3)));
1548*67e74705SXin Li 
1549*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1550*67e74705SXin Li     "class A { class B {}; class C {}; };",
1551*67e74705SXin Li     recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("v"))),
1552*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("v", 3)));
1553*67e74705SXin Li }
1554*67e74705SXin Li 
TEST(HasAncenstor,MatchesDeclarationAncestors)1555*67e74705SXin Li TEST(HasAncenstor, MatchesDeclarationAncestors) {
1556*67e74705SXin Li   EXPECT_TRUE(matches(
1557*67e74705SXin Li     "class A { class B { class C {}; }; };",
1558*67e74705SXin Li     recordDecl(hasName("C"), hasAncestor(recordDecl(hasName("A"))))));
1559*67e74705SXin Li }
1560*67e74705SXin Li 
TEST(HasAncenstor,FailsIfNoAncestorMatches)1561*67e74705SXin Li TEST(HasAncenstor, FailsIfNoAncestorMatches) {
1562*67e74705SXin Li   EXPECT_TRUE(notMatches(
1563*67e74705SXin Li     "class A { class B { class C {}; }; };",
1564*67e74705SXin Li     recordDecl(hasName("C"), hasAncestor(recordDecl(hasName("X"))))));
1565*67e74705SXin Li }
1566*67e74705SXin Li 
TEST(HasAncestor,MatchesDeclarationsThatGetVisitedLater)1567*67e74705SXin Li TEST(HasAncestor, MatchesDeclarationsThatGetVisitedLater) {
1568*67e74705SXin Li   EXPECT_TRUE(matches(
1569*67e74705SXin Li     "class A { class B { void f() { C c; } class C {}; }; };",
1570*67e74705SXin Li     varDecl(hasName("c"), hasType(recordDecl(hasName("C"),
1571*67e74705SXin Li                                              hasAncestor(recordDecl(hasName("A"))))))));
1572*67e74705SXin Li }
1573*67e74705SXin Li 
TEST(HasAncenstor,MatchesStatementAncestors)1574*67e74705SXin Li TEST(HasAncenstor, MatchesStatementAncestors) {
1575*67e74705SXin Li   EXPECT_TRUE(matches(
1576*67e74705SXin Li     "void f() { if (true) { while (false) { 42; } } }",
1577*67e74705SXin Li     integerLiteral(equals(42), hasAncestor(ifStmt()))));
1578*67e74705SXin Li }
1579*67e74705SXin Li 
TEST(HasAncestor,DrillsThroughDifferentHierarchies)1580*67e74705SXin Li TEST(HasAncestor, DrillsThroughDifferentHierarchies) {
1581*67e74705SXin Li   EXPECT_TRUE(matches(
1582*67e74705SXin Li     "void f() { if (true) { int x = 42; } }",
1583*67e74705SXin Li     integerLiteral(equals(42), hasAncestor(functionDecl(hasName("f"))))));
1584*67e74705SXin Li }
1585*67e74705SXin Li 
TEST(HasAncestor,BindsRecursiveCombinations)1586*67e74705SXin Li TEST(HasAncestor, BindsRecursiveCombinations) {
1587*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1588*67e74705SXin Li     "class C { class D { class E { class F { int y; }; }; }; };",
1589*67e74705SXin Li     fieldDecl(hasAncestor(recordDecl(hasAncestor(recordDecl().bind("r"))))),
1590*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("r", 1)));
1591*67e74705SXin Li }
1592*67e74705SXin Li 
TEST(HasAncestor,BindsCombinationsWithHasDescendant)1593*67e74705SXin Li TEST(HasAncestor, BindsCombinationsWithHasDescendant) {
1594*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1595*67e74705SXin Li     "class C { class D { class E { class F { int y; }; }; }; };",
1596*67e74705SXin Li     fieldDecl(hasAncestor(
1597*67e74705SXin Li       decl(
1598*67e74705SXin Li         hasDescendant(recordDecl(isDefinition(),
1599*67e74705SXin Li                                  hasAncestor(recordDecl())))
1600*67e74705SXin Li       ).bind("d")
1601*67e74705SXin Li     )),
1602*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("d", "E")));
1603*67e74705SXin Li }
1604*67e74705SXin Li 
TEST(HasAncestor,MatchesClosestAncestor)1605*67e74705SXin Li TEST(HasAncestor, MatchesClosestAncestor) {
1606*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1607*67e74705SXin Li     "template <typename T> struct C {"
1608*67e74705SXin Li       "  void f(int) {"
1609*67e74705SXin Li       "    struct I { void g(T) { int x; } } i; i.g(42);"
1610*67e74705SXin Li       "  }"
1611*67e74705SXin Li       "};"
1612*67e74705SXin Li       "template struct C<int>;",
1613*67e74705SXin Li     varDecl(hasName("x"),
1614*67e74705SXin Li             hasAncestor(functionDecl(hasParameter(
1615*67e74705SXin Li               0, varDecl(hasType(asString("int"))))).bind("f"))).bind("v"),
1616*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("f", "g", 2)));
1617*67e74705SXin Li }
1618*67e74705SXin Li 
TEST(HasAncestor,MatchesInTemplateInstantiations)1619*67e74705SXin Li TEST(HasAncestor, MatchesInTemplateInstantiations) {
1620*67e74705SXin Li   EXPECT_TRUE(matches(
1621*67e74705SXin Li     "template <typename T> struct A { struct B { struct C { T t; }; }; }; "
1622*67e74705SXin Li       "A<int>::B::C a;",
1623*67e74705SXin Li     fieldDecl(hasType(asString("int")),
1624*67e74705SXin Li               hasAncestor(recordDecl(hasName("A"))))));
1625*67e74705SXin Li }
1626*67e74705SXin Li 
TEST(HasAncestor,MatchesInImplicitCode)1627*67e74705SXin Li TEST(HasAncestor, MatchesInImplicitCode) {
1628*67e74705SXin Li   EXPECT_TRUE(matches(
1629*67e74705SXin Li     "struct X {}; struct A { A() {} X x; };",
1630*67e74705SXin Li     cxxConstructorDecl(
1631*67e74705SXin Li       hasAnyConstructorInitializer(withInitializer(expr(
1632*67e74705SXin Li         hasAncestor(recordDecl(hasName("A")))))))));
1633*67e74705SXin Li }
1634*67e74705SXin Li 
TEST(HasParent,MatchesOnlyParent)1635*67e74705SXin Li TEST(HasParent, MatchesOnlyParent) {
1636*67e74705SXin Li   EXPECT_TRUE(matches(
1637*67e74705SXin Li     "void f() { if (true) { int x = 42; } }",
1638*67e74705SXin Li     compoundStmt(hasParent(ifStmt()))));
1639*67e74705SXin Li   EXPECT_TRUE(notMatches(
1640*67e74705SXin Li     "void f() { for (;;) { int x = 42; } }",
1641*67e74705SXin Li     compoundStmt(hasParent(ifStmt()))));
1642*67e74705SXin Li   EXPECT_TRUE(notMatches(
1643*67e74705SXin Li     "void f() { if (true) for (;;) { int x = 42; } }",
1644*67e74705SXin Li     compoundStmt(hasParent(ifStmt()))));
1645*67e74705SXin Li }
1646*67e74705SXin Li 
TEST(HasAncestor,MatchesAllAncestors)1647*67e74705SXin Li TEST(HasAncestor, MatchesAllAncestors) {
1648*67e74705SXin Li   EXPECT_TRUE(matches(
1649*67e74705SXin Li     "template <typename T> struct C { static void f() { 42; } };"
1650*67e74705SXin Li       "void t() { C<int>::f(); }",
1651*67e74705SXin Li     integerLiteral(
1652*67e74705SXin Li       equals(42),
1653*67e74705SXin Li       allOf(
1654*67e74705SXin Li         hasAncestor(cxxRecordDecl(isTemplateInstantiation())),
1655*67e74705SXin Li         hasAncestor(cxxRecordDecl(unless(isTemplateInstantiation())))))));
1656*67e74705SXin Li }
1657*67e74705SXin Li 
TEST(HasAncestor,ImplicitArrayCopyCtorDeclRefExpr)1658*67e74705SXin Li TEST(HasAncestor, ImplicitArrayCopyCtorDeclRefExpr) {
1659*67e74705SXin Li   EXPECT_TRUE(matches("struct MyClass {\n"
1660*67e74705SXin Li                         "  int c[1];\n"
1661*67e74705SXin Li                         "  static MyClass Create() { return MyClass(); }\n"
1662*67e74705SXin Li                         "};",
1663*67e74705SXin Li                       declRefExpr(to(decl(hasAncestor(decl()))))));
1664*67e74705SXin Li }
1665*67e74705SXin Li 
TEST(HasAncestor,AnonymousUnionMemberExpr)1666*67e74705SXin Li TEST(HasAncestor, AnonymousUnionMemberExpr) {
1667*67e74705SXin Li   EXPECT_TRUE(matches("int F() {\n"
1668*67e74705SXin Li                         "  union { int i; };\n"
1669*67e74705SXin Li                         "  return i;\n"
1670*67e74705SXin Li                         "}\n",
1671*67e74705SXin Li                       memberExpr(member(hasAncestor(decl())))));
1672*67e74705SXin Li   EXPECT_TRUE(matches("void f() {\n"
1673*67e74705SXin Li                         "  struct {\n"
1674*67e74705SXin Li                         "    struct { int a; int b; };\n"
1675*67e74705SXin Li                         "  } s;\n"
1676*67e74705SXin Li                         "  s.a = 4;\n"
1677*67e74705SXin Li                         "}\n",
1678*67e74705SXin Li                       memberExpr(member(hasAncestor(decl())))));
1679*67e74705SXin Li   EXPECT_TRUE(matches("void f() {\n"
1680*67e74705SXin Li                         "  struct {\n"
1681*67e74705SXin Li                         "    struct { int a; int b; };\n"
1682*67e74705SXin Li                         "  } s;\n"
1683*67e74705SXin Li                         "  s.a = 4;\n"
1684*67e74705SXin Li                         "}\n",
1685*67e74705SXin Li                       declRefExpr(to(decl(hasAncestor(decl()))))));
1686*67e74705SXin Li }
TEST(HasAncestor,NonParmDependentTemplateParmVarDeclRefExpr)1687*67e74705SXin Li TEST(HasAncestor, NonParmDependentTemplateParmVarDeclRefExpr) {
1688*67e74705SXin Li   EXPECT_TRUE(matches("struct PartitionAllocator {\n"
1689*67e74705SXin Li                         "  template<typename T>\n"
1690*67e74705SXin Li                         "  static int quantizedSize(int count) {\n"
1691*67e74705SXin Li                         "    return count;\n"
1692*67e74705SXin Li                         "  }\n"
1693*67e74705SXin Li                         "  void f() { quantizedSize<int>(10); }\n"
1694*67e74705SXin Li                         "};",
1695*67e74705SXin Li                       declRefExpr(to(decl(hasAncestor(decl()))))));
1696*67e74705SXin Li }
1697*67e74705SXin Li 
TEST(HasAncestor,AddressOfExplicitSpecializationFunction)1698*67e74705SXin Li TEST(HasAncestor, AddressOfExplicitSpecializationFunction) {
1699*67e74705SXin Li   EXPECT_TRUE(matches("template <class T> void f();\n"
1700*67e74705SXin Li                         "template <> void f<int>();\n"
1701*67e74705SXin Li                         "void (*get_f())() { return f<int>; }\n",
1702*67e74705SXin Li                       declRefExpr(to(decl(hasAncestor(decl()))))));
1703*67e74705SXin Li }
1704*67e74705SXin Li 
TEST(HasParent,MatchesAllParents)1705*67e74705SXin Li TEST(HasParent, MatchesAllParents) {
1706*67e74705SXin Li   EXPECT_TRUE(matches(
1707*67e74705SXin Li     "template <typename T> struct C { static void f() { 42; } };"
1708*67e74705SXin Li       "void t() { C<int>::f(); }",
1709*67e74705SXin Li     integerLiteral(
1710*67e74705SXin Li       equals(42),
1711*67e74705SXin Li       hasParent(compoundStmt(hasParent(functionDecl(
1712*67e74705SXin Li         hasParent(cxxRecordDecl(isTemplateInstantiation())))))))));
1713*67e74705SXin Li   EXPECT_TRUE(
1714*67e74705SXin Li     matches("template <typename T> struct C { static void f() { 42; } };"
1715*67e74705SXin Li               "void t() { C<int>::f(); }",
1716*67e74705SXin Li             integerLiteral(
1717*67e74705SXin Li               equals(42),
1718*67e74705SXin Li               hasParent(compoundStmt(hasParent(functionDecl(hasParent(
1719*67e74705SXin Li                 cxxRecordDecl(unless(isTemplateInstantiation()))))))))));
1720*67e74705SXin Li   EXPECT_TRUE(matches(
1721*67e74705SXin Li     "template <typename T> struct C { static void f() { 42; } };"
1722*67e74705SXin Li       "void t() { C<int>::f(); }",
1723*67e74705SXin Li     integerLiteral(equals(42),
1724*67e74705SXin Li                    hasParent(compoundStmt(
1725*67e74705SXin Li                      allOf(hasParent(functionDecl(hasParent(
1726*67e74705SXin Li                        cxxRecordDecl(isTemplateInstantiation())))),
1727*67e74705SXin Li                            hasParent(functionDecl(hasParent(cxxRecordDecl(
1728*67e74705SXin Li                              unless(isTemplateInstantiation())))))))))));
1729*67e74705SXin Li   EXPECT_TRUE(
1730*67e74705SXin Li     notMatches("template <typename T> struct C { static void f() {} };"
1731*67e74705SXin Li                  "void t() { C<int>::f(); }",
1732*67e74705SXin Li                compoundStmt(hasParent(recordDecl()))));
1733*67e74705SXin Li }
1734*67e74705SXin Li 
TEST(HasParent,NoDuplicateParents)1735*67e74705SXin Li TEST(HasParent, NoDuplicateParents) {
1736*67e74705SXin Li   class HasDuplicateParents : public BoundNodesCallback {
1737*67e74705SXin Li   public:
1738*67e74705SXin Li     bool run(const BoundNodes *Nodes) override { return false; }
1739*67e74705SXin Li     bool run(const BoundNodes *Nodes, ASTContext *Context) override {
1740*67e74705SXin Li       const Stmt *Node = Nodes->getNodeAs<Stmt>("node");
1741*67e74705SXin Li       std::set<const void *> Parents;
1742*67e74705SXin Li       for (const auto &Parent : Context->getParents(*Node)) {
1743*67e74705SXin Li         if (!Parents.insert(Parent.getMemoizationData()).second) {
1744*67e74705SXin Li           return true;
1745*67e74705SXin Li         }
1746*67e74705SXin Li       }
1747*67e74705SXin Li       return false;
1748*67e74705SXin Li     }
1749*67e74705SXin Li   };
1750*67e74705SXin Li   EXPECT_FALSE(matchAndVerifyResultTrue(
1751*67e74705SXin Li     "template <typename T> int Foo() { return 1 + 2; }\n"
1752*67e74705SXin Li       "int x = Foo<int>() + Foo<unsigned>();",
1753*67e74705SXin Li     stmt().bind("node"), llvm::make_unique<HasDuplicateParents>()));
1754*67e74705SXin Li }
1755*67e74705SXin Li 
TEST(TypeMatching,PointeeTypes)1756*67e74705SXin Li TEST(TypeMatching, PointeeTypes) {
1757*67e74705SXin Li   EXPECT_TRUE(matches("int b; int &a = b;",
1758*67e74705SXin Li                       referenceType(pointee(builtinType()))));
1759*67e74705SXin Li   EXPECT_TRUE(matches("int *a;", pointerType(pointee(builtinType()))));
1760*67e74705SXin Li 
1761*67e74705SXin Li   EXPECT_TRUE(matches("int *a;",
1762*67e74705SXin Li                       loc(pointerType(pointee(builtinType())))));
1763*67e74705SXin Li 
1764*67e74705SXin Li   EXPECT_TRUE(matches(
1765*67e74705SXin Li     "int const *A;",
1766*67e74705SXin Li     pointerType(pointee(isConstQualified(), builtinType()))));
1767*67e74705SXin Li   EXPECT_TRUE(notMatches(
1768*67e74705SXin Li     "int *A;",
1769*67e74705SXin Li     pointerType(pointee(isConstQualified(), builtinType()))));
1770*67e74705SXin Li }
1771*67e74705SXin Li 
TEST(ElaboratedTypeNarrowing,hasQualifier)1772*67e74705SXin Li TEST(ElaboratedTypeNarrowing, hasQualifier) {
1773*67e74705SXin Li   EXPECT_TRUE(matches(
1774*67e74705SXin Li     "namespace N {"
1775*67e74705SXin Li       "  namespace M {"
1776*67e74705SXin Li       "    class D {};"
1777*67e74705SXin Li       "  }"
1778*67e74705SXin Li       "}"
1779*67e74705SXin Li       "N::M::D d;",
1780*67e74705SXin Li     elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))))));
1781*67e74705SXin Li   EXPECT_TRUE(notMatches(
1782*67e74705SXin Li     "namespace M {"
1783*67e74705SXin Li       "  class D {};"
1784*67e74705SXin Li       "}"
1785*67e74705SXin Li       "M::D d;",
1786*67e74705SXin Li     elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))))));
1787*67e74705SXin Li   EXPECT_TRUE(notMatches(
1788*67e74705SXin Li     "struct D {"
1789*67e74705SXin Li       "} d;",
1790*67e74705SXin Li     elaboratedType(hasQualifier(nestedNameSpecifier()))));
1791*67e74705SXin Li }
1792*67e74705SXin Li 
TEST(ElaboratedTypeNarrowing,namesType)1793*67e74705SXin Li TEST(ElaboratedTypeNarrowing, namesType) {
1794*67e74705SXin Li   EXPECT_TRUE(matches(
1795*67e74705SXin Li     "namespace N {"
1796*67e74705SXin Li       "  namespace M {"
1797*67e74705SXin Li       "    class D {};"
1798*67e74705SXin Li       "  }"
1799*67e74705SXin Li       "}"
1800*67e74705SXin Li       "N::M::D d;",
1801*67e74705SXin Li     elaboratedType(elaboratedType(namesType(recordType(
1802*67e74705SXin Li       hasDeclaration(namedDecl(hasName("D")))))))));
1803*67e74705SXin Li   EXPECT_TRUE(notMatches(
1804*67e74705SXin Li     "namespace M {"
1805*67e74705SXin Li       "  class D {};"
1806*67e74705SXin Li       "}"
1807*67e74705SXin Li       "M::D d;",
1808*67e74705SXin Li     elaboratedType(elaboratedType(namesType(typedefType())))));
1809*67e74705SXin Li }
1810*67e74705SXin Li 
TEST(NNS,BindsNestedNameSpecifiers)1811*67e74705SXin Li TEST(NNS, BindsNestedNameSpecifiers) {
1812*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1813*67e74705SXin Li     "namespace ns { struct E { struct B {}; }; } ns::E::B b;",
1814*67e74705SXin Li     nestedNameSpecifier(specifiesType(asString("struct ns::E"))).bind("nns"),
1815*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifier>>(
1816*67e74705SXin Li       "nns", "ns::struct E::")));
1817*67e74705SXin Li }
1818*67e74705SXin Li 
TEST(NNS,BindsNestedNameSpecifierLocs)1819*67e74705SXin Li TEST(NNS, BindsNestedNameSpecifierLocs) {
1820*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1821*67e74705SXin Li     "namespace ns { struct B {}; } ns::B b;",
1822*67e74705SXin Li     loc(nestedNameSpecifier()).bind("loc"),
1823*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifierLoc>>("loc", 1)));
1824*67e74705SXin Li }
1825*67e74705SXin Li 
TEST(NNS,DescendantsOfNestedNameSpecifiers)1826*67e74705SXin Li TEST(NNS, DescendantsOfNestedNameSpecifiers) {
1827*67e74705SXin Li   std::string Fragment =
1828*67e74705SXin Li     "namespace a { struct A { struct B { struct C {}; }; }; };"
1829*67e74705SXin Li       "void f() { a::A::B::C c; }";
1830*67e74705SXin Li   EXPECT_TRUE(matches(
1831*67e74705SXin Li     Fragment,
1832*67e74705SXin Li     nestedNameSpecifier(specifiesType(asString("struct a::A::B")),
1833*67e74705SXin Li                         hasDescendant(nestedNameSpecifier(
1834*67e74705SXin Li                           specifiesNamespace(hasName("a")))))));
1835*67e74705SXin Li   EXPECT_TRUE(notMatches(
1836*67e74705SXin Li     Fragment,
1837*67e74705SXin Li     nestedNameSpecifier(specifiesType(asString("struct a::A::B")),
1838*67e74705SXin Li                         has(nestedNameSpecifier(
1839*67e74705SXin Li                           specifiesNamespace(hasName("a")))))));
1840*67e74705SXin Li   EXPECT_TRUE(matches(
1841*67e74705SXin Li     Fragment,
1842*67e74705SXin Li     nestedNameSpecifier(specifiesType(asString("struct a::A")),
1843*67e74705SXin Li                         has(nestedNameSpecifier(
1844*67e74705SXin Li                           specifiesNamespace(hasName("a")))))));
1845*67e74705SXin Li 
1846*67e74705SXin Li   // Not really useful because a NestedNameSpecifier can af at most one child,
1847*67e74705SXin Li   // but to complete the interface.
1848*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1849*67e74705SXin Li     Fragment,
1850*67e74705SXin Li     nestedNameSpecifier(specifiesType(asString("struct a::A::B")),
1851*67e74705SXin Li                         forEach(nestedNameSpecifier().bind("x"))),
1852*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifier>>("x", 1)));
1853*67e74705SXin Li }
1854*67e74705SXin Li 
TEST(NNS,NestedNameSpecifiersAsDescendants)1855*67e74705SXin Li TEST(NNS, NestedNameSpecifiersAsDescendants) {
1856*67e74705SXin Li   std::string Fragment =
1857*67e74705SXin Li     "namespace a { struct A { struct B { struct C {}; }; }; };"
1858*67e74705SXin Li       "void f() { a::A::B::C c; }";
1859*67e74705SXin Li   EXPECT_TRUE(matches(
1860*67e74705SXin Li     Fragment,
1861*67e74705SXin Li     decl(hasDescendant(nestedNameSpecifier(specifiesType(
1862*67e74705SXin Li       asString("struct a::A")))))));
1863*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1864*67e74705SXin Li     Fragment,
1865*67e74705SXin Li     functionDecl(hasName("f"),
1866*67e74705SXin Li                  forEachDescendant(nestedNameSpecifier().bind("x"))),
1867*67e74705SXin Li     // Nested names: a, a::A and a::A::B.
1868*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifier>>("x", 3)));
1869*67e74705SXin Li }
1870*67e74705SXin Li 
TEST(NNSLoc,DescendantsOfNestedNameSpecifierLocs)1871*67e74705SXin Li TEST(NNSLoc, DescendantsOfNestedNameSpecifierLocs) {
1872*67e74705SXin Li   std::string Fragment =
1873*67e74705SXin Li     "namespace a { struct A { struct B { struct C {}; }; }; };"
1874*67e74705SXin Li       "void f() { a::A::B::C c; }";
1875*67e74705SXin Li   EXPECT_TRUE(matches(
1876*67e74705SXin Li     Fragment,
1877*67e74705SXin Li     nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A::B"))),
1878*67e74705SXin Li                            hasDescendant(loc(nestedNameSpecifier(
1879*67e74705SXin Li                              specifiesNamespace(hasName("a"))))))));
1880*67e74705SXin Li   EXPECT_TRUE(notMatches(
1881*67e74705SXin Li     Fragment,
1882*67e74705SXin Li     nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A::B"))),
1883*67e74705SXin Li                            has(loc(nestedNameSpecifier(
1884*67e74705SXin Li                              specifiesNamespace(hasName("a"))))))));
1885*67e74705SXin Li   EXPECT_TRUE(matches(
1886*67e74705SXin Li     Fragment,
1887*67e74705SXin Li     nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A"))),
1888*67e74705SXin Li                            has(loc(nestedNameSpecifier(
1889*67e74705SXin Li                              specifiesNamespace(hasName("a"))))))));
1890*67e74705SXin Li 
1891*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1892*67e74705SXin Li     Fragment,
1893*67e74705SXin Li     nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A::B"))),
1894*67e74705SXin Li                            forEach(nestedNameSpecifierLoc().bind("x"))),
1895*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifierLoc>>("x", 1)));
1896*67e74705SXin Li }
1897*67e74705SXin Li 
TEST(NNSLoc,NestedNameSpecifierLocsAsDescendants)1898*67e74705SXin Li TEST(NNSLoc, NestedNameSpecifierLocsAsDescendants) {
1899*67e74705SXin Li   std::string Fragment =
1900*67e74705SXin Li     "namespace a { struct A { struct B { struct C {}; }; }; };"
1901*67e74705SXin Li       "void f() { a::A::B::C c; }";
1902*67e74705SXin Li   EXPECT_TRUE(matches(
1903*67e74705SXin Li     Fragment,
1904*67e74705SXin Li     decl(hasDescendant(loc(nestedNameSpecifier(specifiesType(
1905*67e74705SXin Li       asString("struct a::A"))))))));
1906*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1907*67e74705SXin Li     Fragment,
1908*67e74705SXin Li     functionDecl(hasName("f"),
1909*67e74705SXin Li                  forEachDescendant(nestedNameSpecifierLoc().bind("x"))),
1910*67e74705SXin Li     // Nested names: a, a::A and a::A::B.
1911*67e74705SXin Li     llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifierLoc>>("x", 3)));
1912*67e74705SXin Li }
1913*67e74705SXin Li template <typename T> class VerifyMatchOnNode : public BoundNodesCallback {
1914*67e74705SXin Li public:
VerifyMatchOnNode(StringRef Id,const internal::Matcher<T> & InnerMatcher,StringRef InnerId)1915*67e74705SXin Li   VerifyMatchOnNode(StringRef Id, const internal::Matcher<T> &InnerMatcher,
1916*67e74705SXin Li                     StringRef InnerId)
1917*67e74705SXin Li     : Id(Id), InnerMatcher(InnerMatcher), InnerId(InnerId) {
1918*67e74705SXin Li   }
1919*67e74705SXin Li 
run(const BoundNodes * Nodes)1920*67e74705SXin Li   bool run(const BoundNodes *Nodes) override { return false; }
1921*67e74705SXin Li 
run(const BoundNodes * Nodes,ASTContext * Context)1922*67e74705SXin Li   bool run(const BoundNodes *Nodes, ASTContext *Context) override {
1923*67e74705SXin Li     const T *Node = Nodes->getNodeAs<T>(Id);
1924*67e74705SXin Li     return selectFirst<T>(InnerId, match(InnerMatcher, *Node, *Context)) !=
1925*67e74705SXin Li       nullptr;
1926*67e74705SXin Li   }
1927*67e74705SXin Li private:
1928*67e74705SXin Li   std::string Id;
1929*67e74705SXin Li   internal::Matcher<T> InnerMatcher;
1930*67e74705SXin Li   std::string InnerId;
1931*67e74705SXin Li };
1932*67e74705SXin Li 
TEST(MatchFinder,CanMatchDeclarationsRecursively)1933*67e74705SXin Li TEST(MatchFinder, CanMatchDeclarationsRecursively) {
1934*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1935*67e74705SXin Li     "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
1936*67e74705SXin Li     llvm::make_unique<VerifyMatchOnNode<Decl>>(
1937*67e74705SXin Li       "X", decl(hasDescendant(recordDecl(hasName("X::Y")).bind("Y"))),
1938*67e74705SXin Li       "Y")));
1939*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultFalse(
1940*67e74705SXin Li     "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
1941*67e74705SXin Li     llvm::make_unique<VerifyMatchOnNode<Decl>>(
1942*67e74705SXin Li       "X", decl(hasDescendant(recordDecl(hasName("X::Z")).bind("Z"))),
1943*67e74705SXin Li       "Z")));
1944*67e74705SXin Li }
1945*67e74705SXin Li 
TEST(MatchFinder,CanMatchStatementsRecursively)1946*67e74705SXin Li TEST(MatchFinder, CanMatchStatementsRecursively) {
1947*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1948*67e74705SXin Li     "void f() { if (1) { for (;;) { } } }", ifStmt().bind("if"),
1949*67e74705SXin Li     llvm::make_unique<VerifyMatchOnNode<Stmt>>(
1950*67e74705SXin Li       "if", stmt(hasDescendant(forStmt().bind("for"))), "for")));
1951*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultFalse(
1952*67e74705SXin Li     "void f() { if (1) { for (;;) { } } }", ifStmt().bind("if"),
1953*67e74705SXin Li     llvm::make_unique<VerifyMatchOnNode<Stmt>>(
1954*67e74705SXin Li       "if", stmt(hasDescendant(declStmt().bind("decl"))), "decl")));
1955*67e74705SXin Li }
1956*67e74705SXin Li 
TEST(MatchFinder,CanMatchSingleNodesRecursively)1957*67e74705SXin Li TEST(MatchFinder, CanMatchSingleNodesRecursively) {
1958*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
1959*67e74705SXin Li     "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
1960*67e74705SXin Li     llvm::make_unique<VerifyMatchOnNode<Decl>>(
1961*67e74705SXin Li       "X", recordDecl(has(recordDecl(hasName("X::Y")).bind("Y"))), "Y")));
1962*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultFalse(
1963*67e74705SXin Li     "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
1964*67e74705SXin Li     llvm::make_unique<VerifyMatchOnNode<Decl>>(
1965*67e74705SXin Li       "X", recordDecl(has(recordDecl(hasName("X::Z")).bind("Z"))), "Z")));
1966*67e74705SXin Li }
1967*67e74705SXin Li 
TEST(StatementMatcher,HasReturnValue)1968*67e74705SXin Li TEST(StatementMatcher, HasReturnValue) {
1969*67e74705SXin Li   StatementMatcher RetVal = returnStmt(hasReturnValue(binaryOperator()));
1970*67e74705SXin Li   EXPECT_TRUE(matches("int F() { int a, b; return a + b; }", RetVal));
1971*67e74705SXin Li   EXPECT_FALSE(matches("int F() { int a; return a; }", RetVal));
1972*67e74705SXin Li   EXPECT_FALSE(matches("void F() { return; }", RetVal));
1973*67e74705SXin Li }
1974*67e74705SXin Li 
TEST(StatementMatcher,ForFunction)1975*67e74705SXin Li TEST(StatementMatcher, ForFunction) {
1976*67e74705SXin Li   const auto CppString1 =
1977*67e74705SXin Li     "struct PosVec {"
1978*67e74705SXin Li       "  PosVec& operator=(const PosVec&) {"
1979*67e74705SXin Li       "    auto x = [] { return 1; };"
1980*67e74705SXin Li       "    return *this;"
1981*67e74705SXin Li       "  }"
1982*67e74705SXin Li       "};";
1983*67e74705SXin Li   const auto CppString2 =
1984*67e74705SXin Li     "void F() {"
1985*67e74705SXin Li       "  struct S {"
1986*67e74705SXin Li       "    void F2() {"
1987*67e74705SXin Li       "       return;"
1988*67e74705SXin Li       "    }"
1989*67e74705SXin Li       "  };"
1990*67e74705SXin Li       "}";
1991*67e74705SXin Li   EXPECT_TRUE(
1992*67e74705SXin Li     matches(
1993*67e74705SXin Li       CppString1,
1994*67e74705SXin Li       returnStmt(forFunction(hasName("operator=")),
1995*67e74705SXin Li                  has(unaryOperator(hasOperatorName("*"))))));
1996*67e74705SXin Li   EXPECT_TRUE(
1997*67e74705SXin Li     notMatches(
1998*67e74705SXin Li       CppString1,
1999*67e74705SXin Li       returnStmt(forFunction(hasName("operator=")),
2000*67e74705SXin Li                  has(integerLiteral()))));
2001*67e74705SXin Li   EXPECT_TRUE(
2002*67e74705SXin Li     matches(
2003*67e74705SXin Li       CppString1,
2004*67e74705SXin Li       returnStmt(forFunction(hasName("operator()")),
2005*67e74705SXin Li                  has(integerLiteral()))));
2006*67e74705SXin Li   EXPECT_TRUE(matches(CppString2, returnStmt(forFunction(hasName("F2")))));
2007*67e74705SXin Li   EXPECT_TRUE(notMatches(CppString2, returnStmt(forFunction(hasName("F")))));
2008*67e74705SXin Li }
2009*67e74705SXin Li 
TEST(Matcher,ForEachOverriden)2010*67e74705SXin Li TEST(Matcher, ForEachOverriden) {
2011*67e74705SXin Li   const auto ForEachOverriddenInClass = [](const char *ClassName) {
2012*67e74705SXin Li     return cxxMethodDecl(ofClass(hasName(ClassName)), isVirtual(),
2013*67e74705SXin Li                          forEachOverridden(cxxMethodDecl().bind("overridden")))
2014*67e74705SXin Li         .bind("override");
2015*67e74705SXin Li   };
2016*67e74705SXin Li   static const char Code1[] = "class A { virtual void f(); };"
2017*67e74705SXin Li                               "class B : public A { void f(); };"
2018*67e74705SXin Li                               "class C : public B { void f(); };";
2019*67e74705SXin Li   // C::f overrides A::f.
2020*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
2021*67e74705SXin Li       Code1, ForEachOverriddenInClass("C"),
2022*67e74705SXin Li       llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 1)));
2023*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
2024*67e74705SXin Li       Code1, ForEachOverriddenInClass("C"),
2025*67e74705SXin Li       llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f",
2026*67e74705SXin Li                                                           1)));
2027*67e74705SXin Li   // B::f overrides A::f.
2028*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
2029*67e74705SXin Li       Code1, ForEachOverriddenInClass("B"),
2030*67e74705SXin Li       llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 1)));
2031*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
2032*67e74705SXin Li       Code1, ForEachOverriddenInClass("B"),
2033*67e74705SXin Li       llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f",
2034*67e74705SXin Li                                                           1)));
2035*67e74705SXin Li   // A::f overrides nothing.
2036*67e74705SXin Li   EXPECT_TRUE(notMatches(Code1, ForEachOverriddenInClass("A")));
2037*67e74705SXin Li 
2038*67e74705SXin Li   static const char Code2[] =
2039*67e74705SXin Li       "class A1 { virtual void f(); };"
2040*67e74705SXin Li       "class A2 { virtual void f(); };"
2041*67e74705SXin Li       "class B : public A1, public A2 { void f(); };";
2042*67e74705SXin Li   // B::f overrides A1::f and A2::f. This produces two matches.
2043*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
2044*67e74705SXin Li       Code2, ForEachOverriddenInClass("B"),
2045*67e74705SXin Li       llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 2)));
2046*67e74705SXin Li   EXPECT_TRUE(matchAndVerifyResultTrue(
2047*67e74705SXin Li       Code2, ForEachOverriddenInClass("B"),
2048*67e74705SXin Li       llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f",
2049*67e74705SXin Li                                                           2)));
2050*67e74705SXin Li   // A1::f overrides nothing.
2051*67e74705SXin Li   EXPECT_TRUE(notMatches(Code2, ForEachOverriddenInClass("A1")));
2052*67e74705SXin Li }
2053*67e74705SXin Li 
2054*67e74705SXin Li } // namespace ast_matchers
2055*67e74705SXin Li } // namespace clang
2056