1 //===- unittest/Tooling/ASTMatchersTest.cpp - AST matcher unit tests ------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "ASTMatchersTest.h"
11 #include "clang/ASTMatchers/ASTMatchers.h"
12 #include "clang/ASTMatchers/ASTMatchFinder.h"
13 #include "clang/Tooling/Tooling.h"
14 #include "gtest/gtest.h"
17 namespace ast_matchers {
19 #if GTEST_HAS_DEATH_TEST
20 TEST(HasNameDeathTest, DiesOnEmptyName) {
22 DeclarationMatcher HasEmptyName = record(hasName(""));
23 EXPECT_TRUE(notMatches("class X {};", HasEmptyName));
27 TEST(HasNameDeathTest, DiesOnEmptyPattern) {
29 DeclarationMatcher HasEmptyName = record(matchesName(""));
30 EXPECT_TRUE(notMatches("class X {};", HasEmptyName));
34 TEST(IsDerivedFromDeathTest, DiesOnEmptyBaseName) {
36 DeclarationMatcher IsDerivedFromEmpty = record(isDerivedFrom(""));
37 EXPECT_TRUE(notMatches("class X {};", IsDerivedFromEmpty));
42 TEST(Decl, MatchesDeclarations) {
43 EXPECT_TRUE(notMatches("", decl(usingDecl())));
44 EXPECT_TRUE(matches("namespace x { class X {}; } using x::X;",
48 TEST(NameableDeclaration, MatchesVariousDecls) {
49 DeclarationMatcher NamedX = nameableDeclaration(hasName("X"));
50 EXPECT_TRUE(matches("typedef int X;", NamedX));
51 EXPECT_TRUE(matches("int X;", NamedX));
52 EXPECT_TRUE(matches("class foo { virtual void X(); };", NamedX));
53 EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", NamedX));
54 EXPECT_TRUE(matches("void foo() { int X; }", NamedX));
55 EXPECT_TRUE(matches("namespace X { }", NamedX));
56 EXPECT_TRUE(matches("enum X { A, B, C };", NamedX));
58 EXPECT_TRUE(notMatches("#define X 1", NamedX));
61 TEST(NameableDeclaration, REMatchesVariousDecls) {
62 DeclarationMatcher NamedX = nameableDeclaration(matchesName("::X"));
63 EXPECT_TRUE(matches("typedef int Xa;", NamedX));
64 EXPECT_TRUE(matches("int Xb;", NamedX));
65 EXPECT_TRUE(matches("class foo { virtual void Xc(); };", NamedX));
66 EXPECT_TRUE(matches("void foo() try { } catch(int Xdef) { }", NamedX));
67 EXPECT_TRUE(matches("void foo() { int Xgh; }", NamedX));
68 EXPECT_TRUE(matches("namespace Xij { }", NamedX));
69 EXPECT_TRUE(matches("enum X { A, B, C };", NamedX));
71 EXPECT_TRUE(notMatches("#define Xkl 1", NamedX));
73 DeclarationMatcher StartsWithNo = nameableDeclaration(matchesName("::no"));
74 EXPECT_TRUE(matches("int no_foo;", StartsWithNo));
75 EXPECT_TRUE(matches("class foo { virtual void nobody(); };", StartsWithNo));
77 DeclarationMatcher Abc = nameableDeclaration(matchesName("a.*b.*c"));
78 EXPECT_TRUE(matches("int abc;", Abc));
79 EXPECT_TRUE(matches("int aFOObBARc;", Abc));
80 EXPECT_TRUE(notMatches("int cab;", Abc));
81 EXPECT_TRUE(matches("int cabc;", Abc));
84 TEST(DeclarationMatcher, MatchClass) {
85 DeclarationMatcher ClassMatcher(record());
86 #if !defined(_MSC_VER)
87 EXPECT_FALSE(matches("", ClassMatcher));
89 // Matches class type_info.
90 EXPECT_TRUE(matches("", ClassMatcher));
93 DeclarationMatcher ClassX = record(record(hasName("X")));
94 EXPECT_TRUE(matches("class X;", ClassX));
95 EXPECT_TRUE(matches("class X {};", ClassX));
96 EXPECT_TRUE(matches("template<class T> class X {};", ClassX));
97 EXPECT_TRUE(notMatches("", ClassX));
100 TEST(DeclarationMatcher, ClassIsDerived) {
101 DeclarationMatcher IsDerivedFromX = record(isDerivedFrom("X"));
103 EXPECT_TRUE(matches("class X {}; class Y : public X {};", IsDerivedFromX));
104 EXPECT_TRUE(matches("class X {}; class Y : public X {};", IsDerivedFromX));
105 EXPECT_TRUE(matches("class X {};", IsDerivedFromX));
106 EXPECT_TRUE(matches("class X;", IsDerivedFromX));
107 EXPECT_TRUE(notMatches("class Y;", IsDerivedFromX));
108 EXPECT_TRUE(notMatches("", IsDerivedFromX));
110 DeclarationMatcher ZIsDerivedFromX =
111 record(hasName("Z"), isDerivedFrom("X"));
113 matches("class X {}; class Y : public X {}; class Z : public Y {};",
116 matches("class X {};"
117 "template<class T> class Y : public X {};"
118 "class Z : public Y<int> {};", ZIsDerivedFromX));
119 EXPECT_TRUE(matches("class X {}; template<class T> class Z : public X {};",
122 matches("template<class T> class X {}; "
123 "template<class T> class Z : public X<T> {};",
126 matches("template<class T, class U=T> class X {}; "
127 "template<class T> class Z : public X<T> {};",
130 notMatches("template<class X> class A { class Z : public X {}; };",
133 matches("template<class X> class A { public: class Z : public X {}; }; "
134 "class X{}; void y() { A<X>::Z z; }", ZIsDerivedFromX));
136 matches("template <class T> class X {}; "
137 "template<class Y> class A { class Z : public X<Y> {}; };",
140 notMatches("template<template<class T> class X> class A { "
141 " class Z : public X<int> {}; };", ZIsDerivedFromX));
143 matches("template<template<class T> class X> class A { "
144 " public: class Z : public X<int> {}; }; "
145 "template<class T> class X {}; void y() { A<X>::Z z; }",
148 notMatches("template<class X> class A { class Z : public X::D {}; };",
151 matches("template<class X> class A { public: "
152 " class Z : public X::D {}; }; "
153 "class Y { public: class X {}; typedef X D; }; "
154 "void y() { A<Y>::Z z; }", ZIsDerivedFromX));
156 matches("class X {}; typedef X Y; class Z : public Y {};",
159 matches("template<class T> class Y { typedef typename T::U X; "
160 " class Z : public X {}; };", ZIsDerivedFromX));
161 EXPECT_TRUE(matches("class X {}; class Z : public ::X {};",
164 notMatches("template<class T> class X {}; "
165 "template<class T> class A { class Z : public X<T>::D {}; };",
168 matches("template<class T> class X { public: typedef X<T> D; }; "
169 "template<class T> class A { public: "
170 " class Z : public X<T>::D {}; }; void y() { A<int>::Z z; }",
173 notMatches("template<class X> class A { class Z : public X::D::E {}; };",
176 matches("class X {}; typedef X V; typedef V W; class Z : public W {};",
179 matches("class X {}; class Y : public X {}; "
180 "typedef Y V; typedef V W; class Z : public W {};",
183 matches("template<class T, class U> class X {}; "
184 "template<class T> class A { class Z : public X<T, int> {}; };",
187 notMatches("template<class X> class D { typedef X A; typedef A B; "
188 " typedef B C; class Z : public C {}; };",
191 matches("class X {}; typedef X A; typedef A B; "
192 "class Z : public B {};", ZIsDerivedFromX));
194 matches("class X {}; typedef X A; typedef A B; typedef B C; "
195 "class Z : public C {};", ZIsDerivedFromX));
197 matches("class U {}; typedef U X; typedef X V; "
198 "class Z : public V {};", ZIsDerivedFromX));
200 matches("class Base {}; typedef Base X; "
201 "class Z : public Base {};", ZIsDerivedFromX));
203 matches("class Base {}; typedef Base Base2; typedef Base2 X; "
204 "class Z : public Base {};", ZIsDerivedFromX));
206 notMatches("class Base {}; class Base2 {}; typedef Base2 X; "
207 "class Z : public Base {};", ZIsDerivedFromX));
209 matches("class A {}; typedef A X; typedef A Y; "
210 "class Z : public Y {};", ZIsDerivedFromX));
212 notMatches("template <typename T> class Z;"
213 "template <> class Z<void> {};"
214 "template <typename T> class Z : public Z<void> {};",
217 matches("template <typename T> class X;"
218 "template <> class X<void> {};"
219 "template <typename T> class X : public X<void> {};",
223 "template <typename T> class Z;"
224 "template <> class Z<void> {};"
225 "template <typename T> class Z : public Z<void>, public X {};",
228 // FIXME: Once we have better matchers for template type matching,
229 // get rid of the Variable(...) matching and match the right template
230 // declarations directly.
231 const char *RecursiveTemplateOneParameter =
232 "class Base1 {}; class Base2 {};"
233 "template <typename T> class Z;"
234 "template <> class Z<void> : public Base1 {};"
235 "template <> class Z<int> : public Base2 {};"
236 "template <> class Z<float> : public Z<void> {};"
237 "template <> class Z<double> : public Z<int> {};"
238 "template <typename T> class Z : public Z<float>, public Z<double> {};"
239 "void f() { Z<float> z_float; Z<double> z_double; Z<char> z_char; }";
241 RecursiveTemplateOneParameter,
242 variable(hasName("z_float"),
243 hasInitializer(hasType(record(isDerivedFrom("Base1")))))));
244 EXPECT_TRUE(notMatches(
245 RecursiveTemplateOneParameter,
248 hasInitializer(hasType(record(isDerivedFrom("Base2")))))));
250 RecursiveTemplateOneParameter,
253 hasInitializer(hasType(record(isDerivedFrom("Base1"),
254 isDerivedFrom("Base2")))))));
256 const char *RecursiveTemplateTwoParameters =
257 "class Base1 {}; class Base2 {};"
258 "template <typename T1, typename T2> class Z;"
259 "template <typename T> class Z<void, T> : public Base1 {};"
260 "template <typename T> class Z<int, T> : public Base2 {};"
261 "template <typename T> class Z<float, T> : public Z<void, T> {};"
262 "template <typename T> class Z<double, T> : public Z<int, T> {};"
263 "template <typename T1, typename T2> class Z : "
264 " public Z<float, T2>, public Z<double, T2> {};"
265 "void f() { Z<float, void> z_float; Z<double, void> z_double; "
266 " Z<char, void> z_char; }";
268 RecursiveTemplateTwoParameters,
271 hasInitializer(hasType(record(isDerivedFrom("Base1")))))));
272 EXPECT_TRUE(notMatches(
273 RecursiveTemplateTwoParameters,
276 hasInitializer(hasType(record(isDerivedFrom("Base2")))))));
278 RecursiveTemplateTwoParameters,
281 hasInitializer(hasType(record(isDerivedFrom("Base1"),
282 isDerivedFrom("Base2")))))));
284 "namespace ns { class X {}; class Y : public X {}; }",
285 record(isDerivedFrom("::ns::X"))));
286 EXPECT_TRUE(notMatches(
287 "class X {}; class Y : public X {};",
288 record(isDerivedFrom("::ns::X"))));
291 "class X {}; class Y : public X {};",
292 record(isDerivedFrom(record(hasName("X")).bind("test")))));
295 TEST(AllOf, AllOverloadsWork) {
296 const char Program[] =
297 "struct T { }; int f(int, T*); void g(int x) { T t; f(x, &t); }";
298 EXPECT_TRUE(matches(Program,
299 call(allOf(callee(function(hasName("f"))),
300 hasArgument(0, declarationReference(to(variable())))))));
301 EXPECT_TRUE(matches(Program,
302 call(allOf(callee(function(hasName("f"))),
303 hasArgument(0, declarationReference(to(variable()))),
304 hasArgument(1, hasType(pointsTo(record(hasName("T")))))))));
307 TEST(DeclarationMatcher, MatchAnyOf) {
308 DeclarationMatcher YOrZDerivedFromX =
309 record(anyOf(hasName("Y"), allOf(isDerivedFrom("X"), hasName("Z"))));
311 matches("class X {}; class Z : public X {};", YOrZDerivedFromX));
312 EXPECT_TRUE(matches("class Y {};", YOrZDerivedFromX));
314 notMatches("class X {}; class W : public X {};", YOrZDerivedFromX));
315 EXPECT_TRUE(notMatches("class Z {};", YOrZDerivedFromX));
317 DeclarationMatcher XOrYOrZOrU =
318 record(anyOf(hasName("X"), hasName("Y"), hasName("Z"), hasName("U")));
319 EXPECT_TRUE(matches("class X {};", XOrYOrZOrU));
320 EXPECT_TRUE(notMatches("class V {};", XOrYOrZOrU));
322 DeclarationMatcher XOrYOrZOrUOrV =
323 record(anyOf(hasName("X"), hasName("Y"), hasName("Z"), hasName("U"),
325 EXPECT_TRUE(matches("class X {};", XOrYOrZOrUOrV));
326 EXPECT_TRUE(matches("class Y {};", XOrYOrZOrUOrV));
327 EXPECT_TRUE(matches("class Z {};", XOrYOrZOrUOrV));
328 EXPECT_TRUE(matches("class U {};", XOrYOrZOrUOrV));
329 EXPECT_TRUE(matches("class V {};", XOrYOrZOrUOrV));
330 EXPECT_TRUE(notMatches("class A {};", XOrYOrZOrUOrV));
333 TEST(DeclarationMatcher, MatchHas) {
334 DeclarationMatcher HasClassX = record(has(record(hasName("X"))));
336 EXPECT_TRUE(matches("class Y { class X {}; };", HasClassX));
337 EXPECT_TRUE(matches("class X {};", HasClassX));
339 DeclarationMatcher YHasClassX =
340 record(hasName("Y"), has(record(hasName("X"))));
341 EXPECT_TRUE(matches("class Y { class X {}; };", YHasClassX));
342 EXPECT_TRUE(notMatches("class X {};", YHasClassX));
344 notMatches("class Y { class Z { class X {}; }; };", YHasClassX));
347 TEST(DeclarationMatcher, MatchHasRecursiveAllOf) {
348 DeclarationMatcher Recursive =
351 has(record(hasName("X"))),
352 has(record(hasName("Y"))),
355 has(record(hasName("A"))),
356 has(record(hasName("B"))),
405 TEST(DeclarationMatcher, MatchHasRecursiveAnyOf) {
406 DeclarationMatcher Recursive =
425 EXPECT_TRUE(matches("class F {};", Recursive));
426 EXPECT_TRUE(matches("class Z {};", Recursive));
427 EXPECT_TRUE(matches("class C {};", Recursive));
428 EXPECT_TRUE(matches("class M { class N { class X {}; }; };", Recursive));
429 EXPECT_TRUE(matches("class M { class N { class B {}; }; };", Recursive));
431 matches("class O1 { class O2 {"
432 " class M { class N { class B {}; }; }; "
433 "}; };", Recursive));
436 TEST(DeclarationMatcher, MatchNot) {
437 DeclarationMatcher NotClassX =
440 unless(hasName("Y")),
441 unless(hasName("X")));
442 EXPECT_TRUE(notMatches("", NotClassX));
443 EXPECT_TRUE(notMatches("class Y {};", NotClassX));
444 EXPECT_TRUE(matches("class Y {}; class Z : public Y {};", NotClassX));
445 EXPECT_TRUE(notMatches("class Y {}; class X : public Y {};", NotClassX));
447 notMatches("class Y {}; class Z {}; class X : public Y {};",
450 DeclarationMatcher ClassXHasNotClassY =
453 has(record(hasName("Z"))),
455 has(record(hasName("Y")))));
456 EXPECT_TRUE(matches("class X { class Z {}; };", ClassXHasNotClassY));
457 EXPECT_TRUE(notMatches("class X { class Y {}; class Z {}; };",
458 ClassXHasNotClassY));
461 TEST(DeclarationMatcher, HasDescendant) {
462 DeclarationMatcher ZDescendantClassX =
464 hasDescendant(record(hasName("X"))),
466 EXPECT_TRUE(matches("class Z { class X {}; };", ZDescendantClassX));
468 matches("class Z { class Y { class X {}; }; };", ZDescendantClassX));
470 matches("class Z { class A { class Y { class X {}; }; }; };",
473 matches("class Z { class A { class B { class Y { class X {}; }; }; }; };",
475 EXPECT_TRUE(notMatches("class Z {};", ZDescendantClassX));
477 DeclarationMatcher ZDescendantClassXHasClassY =
479 hasDescendant(record(has(record(hasName("Y"))),
482 EXPECT_TRUE(matches("class Z { class X { class Y {}; }; };",
483 ZDescendantClassXHasClassY));
485 matches("class Z { class A { class B { class X { class Y {}; }; }; }; };",
486 ZDescendantClassXHasClassY));
487 EXPECT_TRUE(notMatches(
498 "};", ZDescendantClassXHasClassY));
500 DeclarationMatcher ZDescendantClassXDescendantClassY =
502 hasDescendant(record(hasDescendant(record(hasName("Y"))),
506 matches("class Z { class A { class X { class B { class Y {}; }; }; }; };",
507 ZDescendantClassXDescendantClassY));
518 "};", ZDescendantClassXDescendantClassY));
521 TEST(Enum, DoesNotMatchClasses) {
522 EXPECT_TRUE(notMatches("class X {};", enumDecl(hasName("X"))));
525 TEST(Enum, MatchesEnums) {
526 EXPECT_TRUE(matches("enum X {};", enumDecl(hasName("X"))));
529 TEST(EnumConstant, Matches) {
530 DeclarationMatcher Matcher = enumConstant(hasName("A"));
531 EXPECT_TRUE(matches("enum X{ A };", Matcher));
532 EXPECT_TRUE(notMatches("enum X{ B };", Matcher));
533 EXPECT_TRUE(notMatches("enum X {};", Matcher));
536 TEST(StatementMatcher, Has) {
537 StatementMatcher HasVariableI =
539 hasType(pointsTo(record(hasName("X")))),
540 has(declarationReference(to(variable(hasName("i"))))));
543 "class X; X *x(int); void c() { int i; x(i); }", HasVariableI));
544 EXPECT_TRUE(notMatches(
545 "class X; X *x(int); void c() { int i; x(42); }", HasVariableI));
548 TEST(StatementMatcher, HasDescendant) {
549 StatementMatcher HasDescendantVariableI =
551 hasType(pointsTo(record(hasName("X")))),
552 hasDescendant(declarationReference(to(variable(hasName("i"))))));
555 "class X; X *x(bool); bool b(int); void c() { int i; x(b(i)); }",
556 HasDescendantVariableI));
557 EXPECT_TRUE(notMatches(
558 "class X; X *x(bool); bool b(int); void c() { int i; x(b(42)); }",
559 HasDescendantVariableI));
562 TEST(TypeMatcher, MatchesClassType) {
563 TypeMatcher TypeA = hasDeclaration(record(hasName("A")));
565 EXPECT_TRUE(matches("class A { public: A *a; };", TypeA));
566 EXPECT_TRUE(notMatches("class A {};", TypeA));
568 TypeMatcher TypeDerivedFromA = hasDeclaration(record(isDerivedFrom("A")));
570 EXPECT_TRUE(matches("class A {}; class B : public A { public: B *b; };",
572 EXPECT_TRUE(notMatches("class A {};", TypeA));
574 TypeMatcher TypeAHasClassB = hasDeclaration(
575 record(hasName("A"), has(record(hasName("B")))));
578 matches("class A { public: A *a; class B {}; };", TypeAHasClassB));
581 // Returns from Run whether 'bound_nodes' contain a Decl bound to 'Id', which
582 // can be dynamically casted to T.
583 // Optionally checks that the check succeeded a specific number of times.
584 template <typename T>
585 class VerifyIdIsBoundToDecl : public BoundNodesCallback {
587 // Create an object that checks that a node of type 'T' was bound to 'Id'.
588 // Does not check for a certain number of matches.
589 explicit VerifyIdIsBoundToDecl(const std::string& Id)
590 : Id(Id), ExpectedCount(-1), Count(0) {}
592 // Create an object that checks that a node of type 'T' was bound to 'Id'.
593 // Checks that there were exactly 'ExpectedCount' matches.
594 explicit VerifyIdIsBoundToDecl(const std::string& Id, int ExpectedCount)
595 : Id(Id), ExpectedCount(ExpectedCount), Count(0) {}
597 ~VerifyIdIsBoundToDecl() {
598 if (ExpectedCount != -1) {
599 EXPECT_EQ(ExpectedCount, Count);
603 virtual bool run(const BoundNodes *Nodes) {
604 if (Nodes->getDeclAs<T>(Id) != NULL) {
612 const std::string Id;
613 const int ExpectedCount;
616 template <typename T>
617 class VerifyIdIsBoundToStmt : public BoundNodesCallback {
619 explicit VerifyIdIsBoundToStmt(const std::string &Id) : Id(Id) {}
620 virtual bool run(const BoundNodes *Nodes) {
621 const T *Node = Nodes->getStmtAs<T>(Id);
625 const std::string Id;
628 TEST(Matcher, BindMatchedNodes) {
629 DeclarationMatcher ClassX = has(record(hasName("::X")).bind("x"));
631 EXPECT_TRUE(matchAndVerifyResultTrue("class X {};",
632 ClassX, new VerifyIdIsBoundToDecl<CXXRecordDecl>("x")));
634 EXPECT_TRUE(matchAndVerifyResultFalse("class X {};",
635 ClassX, new VerifyIdIsBoundToDecl<CXXRecordDecl>("other-id")));
637 TypeMatcher TypeAHasClassB = hasDeclaration(
638 record(hasName("A"), has(record(hasName("B")).bind("b"))));
640 EXPECT_TRUE(matchAndVerifyResultTrue("class A { public: A *a; class B {}; };",
642 new VerifyIdIsBoundToDecl<Decl>("b")));
644 StatementMatcher MethodX = call(callee(method(hasName("x")))).bind("x");
646 EXPECT_TRUE(matchAndVerifyResultTrue("class A { void x() { x(); } };",
648 new VerifyIdIsBoundToStmt<CXXMemberCallExpr>("x")));
651 TEST(Matcher, BindTheSameNameInAlternatives) {
652 StatementMatcher matcher = anyOf(
653 binaryOperator(hasOperatorName("+"),
654 hasLHS(expression().bind("x")),
655 hasRHS(integerLiteral(equals(0)))),
656 binaryOperator(hasOperatorName("+"),
657 hasLHS(integerLiteral(equals(0))),
658 hasRHS(expression().bind("x"))));
660 EXPECT_TRUE(matchAndVerifyResultTrue(
661 // The first branch of the matcher binds x to 0 but then fails.
662 // The second branch binds x to f() and succeeds.
663 "int f() { return 0 + f(); }",
665 new VerifyIdIsBoundToStmt<CallExpr>("x")));
668 TEST(HasType, TakesQualTypeMatcherAndMatchesExpr) {
669 TypeMatcher ClassX = hasDeclaration(record(hasName("X")));
671 matches("class X {}; void y(X &x) { x; }", expression(hasType(ClassX))));
673 notMatches("class X {}; void y(X *x) { x; }",
674 expression(hasType(ClassX))));
676 matches("class X {}; void y(X *x) { x; }",
677 expression(hasType(pointsTo(ClassX)))));
680 TEST(HasType, TakesQualTypeMatcherAndMatchesValueDecl) {
681 TypeMatcher ClassX = hasDeclaration(record(hasName("X")));
683 matches("class X {}; void y() { X x; }", variable(hasType(ClassX))));
685 notMatches("class X {}; void y() { X *x; }", variable(hasType(ClassX))));
687 matches("class X {}; void y() { X *x; }",
688 variable(hasType(pointsTo(ClassX)))));
691 TEST(HasType, TakesDeclMatcherAndMatchesExpr) {
692 DeclarationMatcher ClassX = record(hasName("X"));
694 matches("class X {}; void y(X &x) { x; }", expression(hasType(ClassX))));
696 notMatches("class X {}; void y(X *x) { x; }",
697 expression(hasType(ClassX))));
700 TEST(HasType, TakesDeclMatcherAndMatchesValueDecl) {
701 DeclarationMatcher ClassX = record(hasName("X"));
703 matches("class X {}; void y() { X x; }", variable(hasType(ClassX))));
705 notMatches("class X {}; void y() { X *x; }", variable(hasType(ClassX))));
708 TEST(Matcher, Call) {
709 // FIXME: Do we want to overload Call() to directly take
710 // Matcher<Decl>, too?
711 StatementMatcher MethodX = call(hasDeclaration(method(hasName("x"))));
713 EXPECT_TRUE(matches("class Y { void x() { x(); } };", MethodX));
714 EXPECT_TRUE(notMatches("class Y { void x() {} };", MethodX));
716 StatementMatcher MethodOnY = memberCall(on(hasType(record(hasName("Y")))));
719 matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
722 matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
725 notMatches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
728 notMatches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
731 notMatches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
734 StatementMatcher MethodOnYPointer =
735 memberCall(on(hasType(pointsTo(record(hasName("Y"))))));
738 matches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
741 matches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
744 matches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
747 notMatches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
750 notMatches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
754 TEST(HasType, MatchesAsString) {
756 matches("class Y { public: void x(); }; void z() {Y* y; y->x(); }",
757 memberCall(on(hasType(asString("class Y *"))))));
758 EXPECT_TRUE(matches("class X { void x(int x) {} };",
759 method(hasParameter(0, hasType(asString("int"))))));
760 EXPECT_TRUE(matches("namespace ns { struct A {}; } struct B { ns::A a; };",
761 field(hasType(asString("ns::A")))));
762 EXPECT_TRUE(matches("namespace { struct A {}; } struct B { A a; };",
763 field(hasType(asString("struct <anonymous>::A")))));
766 TEST(Matcher, OverloadedOperatorCall) {
767 StatementMatcher OpCall = overloadedOperatorCall();
769 EXPECT_TRUE(matches("class Y { }; "
770 "bool operator!(Y x) { return false; }; "
771 "Y y; bool c = !y;", OpCall));
772 // No match -- special operators like "new", "delete"
773 // FIXME: operator new takes size_t, for which we need stddef.h, for which
774 // we need to figure out include paths in the test.
775 // EXPECT_TRUE(NotMatches("#include <stddef.h>\n"
777 // "void *operator new(size_t size) { return 0; } "
778 // "Y *y = new Y;", OpCall));
779 EXPECT_TRUE(notMatches("class Y { }; "
780 "void operator delete(void *p) { } "
781 "void a() {Y *y = new Y; delete y;}", OpCall));
783 EXPECT_TRUE(matches("class Y { }; "
784 "bool operator&&(Y x, Y y) { return true; }; "
785 "Y a; Y b; bool c = a && b;",
787 // No match -- normal operator, not an overloaded one.
788 EXPECT_TRUE(notMatches("bool x = true, y = true; bool t = x && y;", OpCall));
789 EXPECT_TRUE(notMatches("int t = 5 << 2;", OpCall));
792 TEST(Matcher, HasOperatorNameForOverloadedOperatorCall) {
793 StatementMatcher OpCallAndAnd =
794 overloadedOperatorCall(hasOverloadedOperatorName("&&"));
795 EXPECT_TRUE(matches("class Y { }; "
796 "bool operator&&(Y x, Y y) { return true; }; "
797 "Y a; Y b; bool c = a && b;", OpCallAndAnd));
798 StatementMatcher OpCallLessLess =
799 overloadedOperatorCall(hasOverloadedOperatorName("<<"));
800 EXPECT_TRUE(notMatches("class Y { }; "
801 "bool operator&&(Y x, Y y) { return true; }; "
802 "Y a; Y b; bool c = a && b;",
806 TEST(Matcher, ThisPointerType) {
807 StatementMatcher MethodOnY =
808 memberCall(thisPointerType(record(hasName("Y"))));
811 matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
814 matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
817 matches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
820 matches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
823 matches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
828 " public: virtual void x();"
830 "class X : public Y {"
831 " public: virtual void x();"
833 "void z() { X *x; x->Y::x(); }", MethodOnY));
836 TEST(Matcher, VariableUsage) {
837 StatementMatcher Reference =
838 declarationReference(to(
839 variable(hasInitializer(
840 memberCall(thisPointerType(record(hasName("Y"))))))));
847 "void z(const Y &y) {"
852 EXPECT_TRUE(notMatches(
857 "void z(const Y &y) {"
862 TEST(Matcher, FindsVarDeclInFuncitonParameter) {
865 variable(hasName("i"))));
868 TEST(Matcher, CalledVariable) {
869 StatementMatcher CallOnVariableY = expression(
870 memberCall(on(declarationReference(to(variable(hasName("y")))))));
873 "class Y { public: void x() { Y y; y.x(); } };", CallOnVariableY));
875 "class Y { public: void x() const { Y y; y.x(); } };", CallOnVariableY));
877 "class Y { public: void x(); };"
878 "class X : public Y { void z() { X y; y.x(); } };", CallOnVariableY));
880 "class Y { public: void x(); };"
881 "class X : public Y { void z() { X *y; y->x(); } };", CallOnVariableY));
882 EXPECT_TRUE(notMatches(
883 "class Y { public: void x(); };"
884 "class X : public Y { void z() { unsigned long y; ((X*)y)->x(); } };",
888 TEST(UnaryExprOrTypeTraitExpr, MatchesSizeOfAndAlignOf) {
889 EXPECT_TRUE(matches("void x() { int a = sizeof(a); }",
890 unaryExprOrTypeTraitExpr()));
891 EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }",
892 alignOfExpr(anything())));
893 // FIXME: Uncomment once alignof is enabled.
894 // EXPECT_TRUE(matches("void x() { int a = alignof(a); }",
895 // unaryExprOrTypeTraitExpr()));
896 // EXPECT_TRUE(notMatches("void x() { int a = alignof(a); }",
900 TEST(UnaryExpressionOrTypeTraitExpression, MatchesCorrectType) {
901 EXPECT_TRUE(matches("void x() { int a = sizeof(a); }", sizeOfExpr(
902 hasArgumentOfType(asString("int")))));
903 EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }", sizeOfExpr(
904 hasArgumentOfType(asString("float")))));
906 "struct A {}; void x() { A a; int b = sizeof(a); }",
907 sizeOfExpr(hasArgumentOfType(hasDeclaration(record(hasName("A")))))));
908 EXPECT_TRUE(notMatches("void x() { int a = sizeof(a); }", sizeOfExpr(
909 hasArgumentOfType(hasDeclaration(record(hasName("string")))))));
912 TEST(MemberExpression, DoesNotMatchClasses) {
913 EXPECT_TRUE(notMatches("class Y { void x() {} };", memberExpression()));
916 TEST(MemberExpression, MatchesMemberFunctionCall) {
917 EXPECT_TRUE(matches("class Y { void x() { x(); } };", memberExpression()));
920 TEST(MemberExpression, MatchesVariable) {
922 matches("class Y { void x() { this->y; } int y; };", memberExpression()));
924 matches("class Y { void x() { y; } int y; };", memberExpression()));
926 matches("class Y { void x() { Y y; y.y; } int y; };",
927 memberExpression()));
930 TEST(MemberExpression, MatchesStaticVariable) {
931 EXPECT_TRUE(matches("class Y { void x() { this->y; } static int y; };",
932 memberExpression()));
933 EXPECT_TRUE(notMatches("class Y { void x() { y; } static int y; };",
934 memberExpression()));
935 EXPECT_TRUE(notMatches("class Y { void x() { Y::y; } static int y; };",
936 memberExpression()));
939 TEST(IsInteger, MatchesIntegers) {
940 EXPECT_TRUE(matches("int i = 0;", variable(hasType(isInteger()))));
941 EXPECT_TRUE(matches("long long i = 0; void f(long long) { }; void g() {f(i);}",
942 call(hasArgument(0, declarationReference(
943 to(variable(hasType(isInteger()))))))));
946 TEST(IsInteger, ReportsNoFalsePositives) {
947 EXPECT_TRUE(notMatches("int *i;", variable(hasType(isInteger()))));
948 EXPECT_TRUE(notMatches("struct T {}; T t; void f(T *) { }; void g() {f(&t);}",
949 call(hasArgument(0, declarationReference(
950 to(variable(hasType(isInteger()))))))));
953 TEST(IsArrow, MatchesMemberVariablesViaArrow) {
954 EXPECT_TRUE(matches("class Y { void x() { this->y; } int y; };",
955 memberExpression(isArrow())));
956 EXPECT_TRUE(matches("class Y { void x() { y; } int y; };",
957 memberExpression(isArrow())));
958 EXPECT_TRUE(notMatches("class Y { void x() { (*this).y; } int y; };",
959 memberExpression(isArrow())));
962 TEST(IsArrow, MatchesStaticMemberVariablesViaArrow) {
963 EXPECT_TRUE(matches("class Y { void x() { this->y; } static int y; };",
964 memberExpression(isArrow())));
965 EXPECT_TRUE(notMatches("class Y { void x() { y; } static int y; };",
966 memberExpression(isArrow())));
967 EXPECT_TRUE(notMatches("class Y { void x() { (*this).y; } static int y; };",
968 memberExpression(isArrow())));
971 TEST(IsArrow, MatchesMemberCallsViaArrow) {
972 EXPECT_TRUE(matches("class Y { void x() { this->x(); } };",
973 memberExpression(isArrow())));
974 EXPECT_TRUE(matches("class Y { void x() { x(); } };",
975 memberExpression(isArrow())));
976 EXPECT_TRUE(notMatches("class Y { void x() { Y y; y.x(); } };",
977 memberExpression(isArrow())));
980 TEST(Callee, MatchesDeclarations) {
981 StatementMatcher CallMethodX = call(callee(method(hasName("x"))));
983 EXPECT_TRUE(matches("class Y { void x() { x(); } };", CallMethodX));
984 EXPECT_TRUE(notMatches("class Y { void x() {} };", CallMethodX));
987 TEST(Callee, MatchesMemberExpressions) {
988 EXPECT_TRUE(matches("class Y { void x() { this->x(); } };",
989 call(callee(memberExpression()))));
991 notMatches("class Y { void x() { this->x(); } };", call(callee(call()))));
994 TEST(Function, MatchesFunctionDeclarations) {
995 StatementMatcher CallFunctionF = call(callee(function(hasName("f"))));
997 EXPECT_TRUE(matches("void f() { f(); }", CallFunctionF));
998 EXPECT_TRUE(notMatches("void f() { }", CallFunctionF));
1000 #if !defined(_MSC_VER)
1001 // FIXME: Make this work for MSVC.
1002 // Dependent contexts, but a non-dependent call.
1003 EXPECT_TRUE(matches("void f(); template <int N> void g() { f(); }",
1006 matches("void f(); template <int N> struct S { void g() { f(); } };",
1010 // Depedent calls don't match.
1012 notMatches("void f(int); template <typename T> void g(T t) { f(t); }",
1015 notMatches("void f(int);"
1016 "template <typename T> struct S { void g(T t) { f(t); } };",
1020 TEST(Matcher, Argument) {
1021 StatementMatcher CallArgumentY = expression(call(
1022 hasArgument(0, declarationReference(to(variable(hasName("y")))))));
1024 EXPECT_TRUE(matches("void x(int) { int y; x(y); }", CallArgumentY));
1026 matches("class X { void x(int) { int y; x(y); } };", CallArgumentY));
1027 EXPECT_TRUE(notMatches("void x(int) { int z; x(z); }", CallArgumentY));
1029 StatementMatcher WrongIndex = expression(call(
1030 hasArgument(42, declarationReference(to(variable(hasName("y")))))));
1031 EXPECT_TRUE(notMatches("void x(int) { int y; x(y); }", WrongIndex));
1034 TEST(Matcher, AnyArgument) {
1035 StatementMatcher CallArgumentY = expression(call(
1036 hasAnyArgument(declarationReference(to(variable(hasName("y")))))));
1037 EXPECT_TRUE(matches("void x(int, int) { int y; x(1, y); }", CallArgumentY));
1038 EXPECT_TRUE(matches("void x(int, int) { int y; x(y, 42); }", CallArgumentY));
1039 EXPECT_TRUE(notMatches("void x(int, int) { x(1, 2); }", CallArgumentY));
1042 TEST(Matcher, ArgumentCount) {
1043 StatementMatcher Call1Arg = expression(call(argumentCountIs(1)));
1045 EXPECT_TRUE(matches("void x(int) { x(0); }", Call1Arg));
1046 EXPECT_TRUE(matches("class X { void x(int) { x(0); } };", Call1Arg));
1047 EXPECT_TRUE(notMatches("void x(int, int) { x(0, 0); }", Call1Arg));
1050 TEST(Matcher, References) {
1051 DeclarationMatcher ReferenceClassX = variable(
1052 hasType(references(record(hasName("X")))));
1053 EXPECT_TRUE(matches("class X {}; void y(X y) { X &x = y; }",
1056 matches("class X {}; void y(X y) { const X &x = y; }", ReferenceClassX));
1058 notMatches("class X {}; void y(X y) { X x = y; }", ReferenceClassX));
1060 notMatches("class X {}; void y(X *y) { X *&x = y; }", ReferenceClassX));
1063 TEST(HasParameter, CallsInnerMatcher) {
1064 EXPECT_TRUE(matches("class X { void x(int) {} };",
1065 method(hasParameter(0, variable()))));
1066 EXPECT_TRUE(notMatches("class X { void x(int) {} };",
1067 method(hasParameter(0, hasName("x")))));
1070 TEST(HasParameter, DoesNotMatchIfIndexOutOfBounds) {
1071 EXPECT_TRUE(notMatches("class X { void x(int) {} };",
1072 method(hasParameter(42, variable()))));
1075 TEST(HasType, MatchesParameterVariableTypesStrictly) {
1076 EXPECT_TRUE(matches("class X { void x(X x) {} };",
1077 method(hasParameter(0, hasType(record(hasName("X")))))));
1078 EXPECT_TRUE(notMatches("class X { void x(const X &x) {} };",
1079 method(hasParameter(0, hasType(record(hasName("X")))))));
1080 EXPECT_TRUE(matches("class X { void x(const X *x) {} };",
1081 method(hasParameter(0, hasType(pointsTo(record(hasName("X"))))))));
1082 EXPECT_TRUE(matches("class X { void x(const X &x) {} };",
1083 method(hasParameter(0, hasType(references(record(hasName("X"))))))));
1086 TEST(HasAnyParameter, MatchesIndependentlyOfPosition) {
1087 EXPECT_TRUE(matches("class Y {}; class X { void x(X x, Y y) {} };",
1088 method(hasAnyParameter(hasType(record(hasName("X")))))));
1089 EXPECT_TRUE(matches("class Y {}; class X { void x(Y y, X x) {} };",
1090 method(hasAnyParameter(hasType(record(hasName("X")))))));
1093 TEST(Returns, MatchesReturnTypes) {
1094 EXPECT_TRUE(matches("class Y { int f() { return 1; } };",
1095 function(returns(asString("int")))));
1096 EXPECT_TRUE(notMatches("class Y { int f() { return 1; } };",
1097 function(returns(asString("float")))));
1098 EXPECT_TRUE(matches("class Y { Y getMe() { return *this; } };",
1099 function(returns(hasDeclaration(record(hasName("Y")))))));
1102 TEST(IsExternC, MatchesExternCFunctionDeclarations) {
1103 EXPECT_TRUE(matches("extern \"C\" void f() {}", function(isExternC())));
1104 EXPECT_TRUE(matches("extern \"C\" { void f() {} }", function(isExternC())));
1105 EXPECT_TRUE(notMatches("void f() {}", function(isExternC())));
1108 TEST(HasAnyParameter, DoesntMatchIfInnerMatcherDoesntMatch) {
1109 EXPECT_TRUE(notMatches("class Y {}; class X { void x(int) {} };",
1110 method(hasAnyParameter(hasType(record(hasName("X")))))));
1113 TEST(HasAnyParameter, DoesNotMatchThisPointer) {
1114 EXPECT_TRUE(notMatches("class Y {}; class X { void x() {} };",
1115 method(hasAnyParameter(hasType(pointsTo(record(hasName("X"))))))));
1118 TEST(HasName, MatchesParameterVariableDeclartions) {
1119 EXPECT_TRUE(matches("class Y {}; class X { void x(int x) {} };",
1120 method(hasAnyParameter(hasName("x")))));
1121 EXPECT_TRUE(notMatches("class Y {}; class X { void x(int) {} };",
1122 method(hasAnyParameter(hasName("x")))));
1125 TEST(Matcher, MatchesClassTemplateSpecialization) {
1126 EXPECT_TRUE(matches("template<typename T> struct A {};"
1127 "template<> struct A<int> {};",
1128 classTemplateSpecialization()));
1129 EXPECT_TRUE(matches("template<typename T> struct A {}; A<int> a;",
1130 classTemplateSpecialization()));
1131 EXPECT_TRUE(notMatches("template<typename T> struct A {};",
1132 classTemplateSpecialization()));
1135 TEST(Matcher, MatchesTypeTemplateArgument) {
1136 EXPECT_TRUE(matches(
1137 "template<typename T> struct B {};"
1139 classTemplateSpecialization(hasAnyTemplateArgument(refersToType(
1140 asString("int"))))));
1143 TEST(Matcher, MatchesDeclarationReferenceTemplateArgument) {
1144 EXPECT_TRUE(matches(
1145 "struct B { int next; };"
1146 "template<int(B::*next_ptr)> struct A {};"
1148 classTemplateSpecialization(hasAnyTemplateArgument(
1149 refersToDeclaration(field(hasName("next")))))));
1152 TEST(Matcher, MatchesSpecificArgument) {
1153 EXPECT_TRUE(matches(
1154 "template<typename T, typename U> class A {};"
1156 classTemplateSpecialization(hasTemplateArgument(
1157 1, refersToType(asString("int"))))));
1158 EXPECT_TRUE(notMatches(
1159 "template<typename T, typename U> class A {};"
1161 classTemplateSpecialization(hasTemplateArgument(
1162 1, refersToType(asString("int"))))));
1165 TEST(Matcher, ConstructorCall) {
1166 StatementMatcher Constructor = expression(constructorCall());
1169 matches("class X { public: X(); }; void x() { X x; }", Constructor));
1171 matches("class X { public: X(); }; void x() { X x = X(); }",
1174 matches("class X { public: X(int); }; void x() { X x = 0; }",
1176 EXPECT_TRUE(matches("class X {}; void x(int) { X x; }", Constructor));
1179 TEST(Matcher, ConstructorArgument) {
1180 StatementMatcher Constructor = expression(constructorCall(
1181 hasArgument(0, declarationReference(to(variable(hasName("y")))))));
1184 matches("class X { public: X(int); }; void x() { int y; X x(y); }",
1187 matches("class X { public: X(int); }; void x() { int y; X x = X(y); }",
1190 matches("class X { public: X(int); }; void x() { int y; X x = y; }",
1193 notMatches("class X { public: X(int); }; void x() { int z; X x(z); }",
1196 StatementMatcher WrongIndex = expression(constructorCall(
1197 hasArgument(42, declarationReference(to(variable(hasName("y")))))));
1199 notMatches("class X { public: X(int); }; void x() { int y; X x(y); }",
1203 TEST(Matcher, ConstructorArgumentCount) {
1204 StatementMatcher Constructor1Arg =
1205 expression(constructorCall(argumentCountIs(1)));
1208 matches("class X { public: X(int); }; void x() { X x(0); }",
1211 matches("class X { public: X(int); }; void x() { X x = X(0); }",
1214 matches("class X { public: X(int); }; void x() { X x = 0; }",
1217 notMatches("class X { public: X(int, int); }; void x() { X x(0, 0); }",
1221 TEST(Matcher, BindTemporaryExpression) {
1222 StatementMatcher TempExpression = expression(bindTemporaryExpression());
1224 std::string ClassString = "class string { public: string(); ~string(); }; ";
1227 matches(ClassString +
1228 "string GetStringByValue();"
1229 "void FunctionTakesString(string s);"
1230 "void run() { FunctionTakesString(GetStringByValue()); }",
1234 notMatches(ClassString +
1235 "string* GetStringPointer(); "
1236 "void FunctionTakesStringPtr(string* s);"
1238 " string* s = GetStringPointer();"
1239 " FunctionTakesStringPtr(GetStringPointer());"
1240 " FunctionTakesStringPtr(s);"
1245 notMatches("class no_dtor {};"
1246 "no_dtor GetObjByValue();"
1247 "void ConsumeObj(no_dtor param);"
1248 "void run() { ConsumeObj(GetObjByValue()); }",
1252 TEST(ConstructorDeclaration, SimpleCase) {
1253 EXPECT_TRUE(matches("class Foo { Foo(int i); };",
1254 constructor(ofClass(hasName("Foo")))));
1255 EXPECT_TRUE(notMatches("class Foo { Foo(int i); };",
1256 constructor(ofClass(hasName("Bar")))));
1259 TEST(ConstructorDeclaration, IsImplicit) {
1260 // This one doesn't match because the constructor is not added by the
1261 // compiler (it is not needed).
1262 EXPECT_TRUE(notMatches("class Foo { };",
1263 constructor(isImplicit())));
1264 // The compiler added the implicit default constructor.
1265 EXPECT_TRUE(matches("class Foo { }; Foo* f = new Foo();",
1266 constructor(isImplicit())));
1267 EXPECT_TRUE(matches("class Foo { Foo(){} };",
1268 constructor(unless(isImplicit()))));
1271 TEST(DestructorDeclaration, MatchesVirtualDestructor) {
1272 EXPECT_TRUE(matches("class Foo { virtual ~Foo(); };",
1273 destructor(ofClass(hasName("Foo")))));
1276 TEST(DestructorDeclaration, DoesNotMatchImplicitDestructor) {
1277 EXPECT_TRUE(notMatches("class Foo {};", destructor(ofClass(hasName("Foo")))));
1280 TEST(HasAnyConstructorInitializer, SimpleCase) {
1281 EXPECT_TRUE(notMatches(
1282 "class Foo { Foo() { } };",
1283 constructor(hasAnyConstructorInitializer(anything()))));
1284 EXPECT_TRUE(matches(
1286 " Foo() : foo_() { }"
1289 constructor(hasAnyConstructorInitializer(anything()))));
1292 TEST(HasAnyConstructorInitializer, ForField) {
1293 static const char Code[] =
1296 " Foo() : foo_() { }"
1300 EXPECT_TRUE(matches(Code, constructor(hasAnyConstructorInitializer(
1301 forField(hasType(record(hasName("Baz"))))))));
1302 EXPECT_TRUE(matches(Code, constructor(hasAnyConstructorInitializer(
1303 forField(hasName("foo_"))))));
1304 EXPECT_TRUE(notMatches(Code, constructor(hasAnyConstructorInitializer(
1305 forField(hasType(record(hasName("Bar"))))))));
1308 TEST(HasAnyConstructorInitializer, WithInitializer) {
1309 static const char Code[] =
1311 " Foo() : foo_(0) { }"
1314 EXPECT_TRUE(matches(Code, constructor(hasAnyConstructorInitializer(
1315 withInitializer(integerLiteral(equals(0)))))));
1316 EXPECT_TRUE(notMatches(Code, constructor(hasAnyConstructorInitializer(
1317 withInitializer(integerLiteral(equals(1)))))));
1320 TEST(HasAnyConstructorInitializer, IsWritten) {
1321 static const char Code[] =
1322 "struct Bar { Bar(){} };"
1324 " Foo() : foo_() { }"
1328 EXPECT_TRUE(matches(Code, constructor(hasAnyConstructorInitializer(
1329 allOf(forField(hasName("foo_")), isWritten())))));
1330 EXPECT_TRUE(notMatches(Code, constructor(hasAnyConstructorInitializer(
1331 allOf(forField(hasName("bar_")), isWritten())))));
1332 EXPECT_TRUE(matches(Code, constructor(hasAnyConstructorInitializer(
1333 allOf(forField(hasName("bar_")), unless(isWritten()))))));
1336 TEST(Matcher, NewExpression) {
1337 StatementMatcher New = expression(newExpression());
1339 EXPECT_TRUE(matches("class X { public: X(); }; void x() { new X; }", New));
1341 matches("class X { public: X(); }; void x() { new X(); }", New));
1343 matches("class X { public: X(int); }; void x() { new X(0); }", New));
1344 EXPECT_TRUE(matches("class X {}; void x(int) { new X; }", New));
1347 TEST(Matcher, NewExpressionArgument) {
1348 StatementMatcher New = expression(constructorCall(
1350 0, declarationReference(to(variable(hasName("y")))))));
1353 matches("class X { public: X(int); }; void x() { int y; new X(y); }",
1356 matches("class X { public: X(int); }; void x() { int y; new X(y); }",
1359 notMatches("class X { public: X(int); }; void x() { int z; new X(z); }",
1362 StatementMatcher WrongIndex = expression(constructorCall(
1364 42, declarationReference(to(variable(hasName("y")))))));
1366 notMatches("class X { public: X(int); }; void x() { int y; new X(y); }",
1370 TEST(Matcher, NewExpressionArgumentCount) {
1371 StatementMatcher New = constructorCall(argumentCountIs(1));
1374 matches("class X { public: X(int); }; void x() { new X(0); }", New));
1376 notMatches("class X { public: X(int, int); }; void x() { new X(0, 0); }",
1380 TEST(Matcher, DeleteExpression) {
1381 EXPECT_TRUE(matches("struct A {}; void f(A* a) { delete a; }",
1382 deleteExpression()));
1385 TEST(Matcher, DefaultArgument) {
1386 StatementMatcher Arg = defaultArgument();
1388 EXPECT_TRUE(matches("void x(int, int = 0) { int y; x(y); }", Arg));
1390 matches("class X { void x(int, int = 0) { int y; x(y); } };", Arg));
1391 EXPECT_TRUE(notMatches("void x(int, int = 0) { int y; x(y, 0); }", Arg));
1394 TEST(Matcher, StringLiterals) {
1395 StatementMatcher Literal = expression(stringLiteral());
1396 EXPECT_TRUE(matches("const char *s = \"string\";", Literal));
1398 EXPECT_TRUE(matches("const wchar_t *s = L\"string\";", Literal));
1399 // with escaped characters
1400 EXPECT_TRUE(matches("const char *s = \"\x05five\";", Literal));
1401 // no matching -- though the data type is the same, there is no string literal
1402 EXPECT_TRUE(notMatches("const char s[1] = {'a'};", Literal));
1405 TEST(Matcher, CharacterLiterals) {
1406 StatementMatcher CharLiteral = expression(characterLiteral());
1407 EXPECT_TRUE(matches("const char c = 'c';", CharLiteral));
1409 EXPECT_TRUE(matches("const char c = L'c';", CharLiteral));
1410 // wide character, Hex encoded, NOT MATCHED!
1411 EXPECT_TRUE(notMatches("const wchar_t c = 0x2126;", CharLiteral));
1412 EXPECT_TRUE(notMatches("const char c = 0x1;", CharLiteral));
1415 TEST(Matcher, IntegerLiterals) {
1416 StatementMatcher HasIntLiteral = expression(integerLiteral());
1417 EXPECT_TRUE(matches("int i = 10;", HasIntLiteral));
1418 EXPECT_TRUE(matches("int i = 0x1AB;", HasIntLiteral));
1419 EXPECT_TRUE(matches("int i = 10L;", HasIntLiteral));
1420 EXPECT_TRUE(matches("int i = 10U;", HasIntLiteral));
1422 // Non-matching cases (character literals, float and double)
1423 EXPECT_TRUE(notMatches("int i = L'a';",
1424 HasIntLiteral)); // this is actually a character
1425 // literal cast to int
1426 EXPECT_TRUE(notMatches("int i = 'a';", HasIntLiteral));
1427 EXPECT_TRUE(notMatches("int i = 1e10;", HasIntLiteral));
1428 EXPECT_TRUE(notMatches("int i = 10.0;", HasIntLiteral));
1431 TEST(Matcher, Conditions) {
1432 StatementMatcher Condition = ifStmt(hasCondition(boolLiteral(equals(true))));
1434 EXPECT_TRUE(matches("void x() { if (true) {} }", Condition));
1435 EXPECT_TRUE(notMatches("void x() { if (false) {} }", Condition));
1436 EXPECT_TRUE(notMatches("void x() { bool a = true; if (a) {} }", Condition));
1437 EXPECT_TRUE(notMatches("void x() { if (true || false) {} }", Condition));
1438 EXPECT_TRUE(notMatches("void x() { if (1) {} }", Condition));
1441 TEST(MatchBinaryOperator, HasOperatorName) {
1442 StatementMatcher OperatorOr = binaryOperator(hasOperatorName("||"));
1444 EXPECT_TRUE(matches("void x() { true || false; }", OperatorOr));
1445 EXPECT_TRUE(notMatches("void x() { true && false; }", OperatorOr));
1448 TEST(MatchBinaryOperator, HasLHSAndHasRHS) {
1449 StatementMatcher OperatorTrueFalse =
1450 binaryOperator(hasLHS(boolLiteral(equals(true))),
1451 hasRHS(boolLiteral(equals(false))));
1453 EXPECT_TRUE(matches("void x() { true || false; }", OperatorTrueFalse));
1454 EXPECT_TRUE(matches("void x() { true && false; }", OperatorTrueFalse));
1455 EXPECT_TRUE(notMatches("void x() { false || true; }", OperatorTrueFalse));
1458 TEST(MatchBinaryOperator, HasEitherOperand) {
1459 StatementMatcher HasOperand =
1460 binaryOperator(hasEitherOperand(boolLiteral(equals(false))));
1462 EXPECT_TRUE(matches("void x() { true || false; }", HasOperand));
1463 EXPECT_TRUE(matches("void x() { false && true; }", HasOperand));
1464 EXPECT_TRUE(notMatches("void x() { true || true; }", HasOperand));
1467 TEST(Matcher, BinaryOperatorTypes) {
1468 // Integration test that verifies the AST provides all binary operators in
1470 // FIXME: Operator ','
1472 matches("void x() { 3, 4; }", binaryOperator(hasOperatorName(","))));
1474 matches("bool b; bool c = (b = true);",
1475 binaryOperator(hasOperatorName("="))));
1477 matches("bool b = 1 != 2;", binaryOperator(hasOperatorName("!="))));
1479 matches("bool b = 1 == 2;", binaryOperator(hasOperatorName("=="))));
1480 EXPECT_TRUE(matches("bool b = 1 < 2;", binaryOperator(hasOperatorName("<"))));
1482 matches("bool b = 1 <= 2;", binaryOperator(hasOperatorName("<="))));
1484 matches("int i = 1 << 2;", binaryOperator(hasOperatorName("<<"))));
1486 matches("int i = 1; int j = (i <<= 2);",
1487 binaryOperator(hasOperatorName("<<="))));
1488 EXPECT_TRUE(matches("bool b = 1 > 2;", binaryOperator(hasOperatorName(">"))));
1490 matches("bool b = 1 >= 2;", binaryOperator(hasOperatorName(">="))));
1492 matches("int i = 1 >> 2;", binaryOperator(hasOperatorName(">>"))));
1494 matches("int i = 1; int j = (i >>= 2);",
1495 binaryOperator(hasOperatorName(">>="))));
1497 matches("int i = 42 ^ 23;", binaryOperator(hasOperatorName("^"))));
1499 matches("int i = 42; int j = (i ^= 42);",
1500 binaryOperator(hasOperatorName("^="))));
1502 matches("int i = 42 % 23;", binaryOperator(hasOperatorName("%"))));
1504 matches("int i = 42; int j = (i %= 42);",
1505 binaryOperator(hasOperatorName("%="))));
1507 matches("bool b = 42 &23;", binaryOperator(hasOperatorName("&"))));
1509 matches("bool b = true && false;",
1510 binaryOperator(hasOperatorName("&&"))));
1512 matches("bool b = true; bool c = (b &= false);",
1513 binaryOperator(hasOperatorName("&="))));
1515 matches("bool b = 42 | 23;", binaryOperator(hasOperatorName("|"))));
1517 matches("bool b = true || false;",
1518 binaryOperator(hasOperatorName("||"))));
1520 matches("bool b = true; bool c = (b |= false);",
1521 binaryOperator(hasOperatorName("|="))));
1523 matches("int i = 42 *23;", binaryOperator(hasOperatorName("*"))));
1525 matches("int i = 42; int j = (i *= 23);",
1526 binaryOperator(hasOperatorName("*="))));
1528 matches("int i = 42 / 23;", binaryOperator(hasOperatorName("/"))));
1530 matches("int i = 42; int j = (i /= 23);",
1531 binaryOperator(hasOperatorName("/="))));
1533 matches("int i = 42 + 23;", binaryOperator(hasOperatorName("+"))));
1535 matches("int i = 42; int j = (i += 23);",
1536 binaryOperator(hasOperatorName("+="))));
1538 matches("int i = 42 - 23;", binaryOperator(hasOperatorName("-"))));
1540 matches("int i = 42; int j = (i -= 23);",
1541 binaryOperator(hasOperatorName("-="))));
1543 matches("struct A { void x() { void (A::*a)(); (this->*a)(); } };",
1544 binaryOperator(hasOperatorName("->*"))));
1546 matches("struct A { void x() { void (A::*a)(); ((*this).*a)(); } };",
1547 binaryOperator(hasOperatorName(".*"))));
1549 // Member expressions as operators are not supported in matches.
1551 notMatches("struct A { void x(A *a) { a->x(this); } };",
1552 binaryOperator(hasOperatorName("->"))));
1554 // Initializer assignments are not represented as operator equals.
1556 notMatches("bool b = true;", binaryOperator(hasOperatorName("="))));
1558 // Array indexing is not represented as operator.
1559 EXPECT_TRUE(notMatches("int a[42]; void x() { a[23]; }", unaryOperator()));
1561 // Overloaded operators do not match at all.
1562 EXPECT_TRUE(notMatches(
1563 "struct A { bool operator&&(const A &a) const { return false; } };"
1564 "void x() { A a, b; a && b; }",
1568 TEST(MatchUnaryOperator, HasOperatorName) {
1569 StatementMatcher OperatorNot = unaryOperator(hasOperatorName("!"));
1571 EXPECT_TRUE(matches("void x() { !true; } ", OperatorNot));
1572 EXPECT_TRUE(notMatches("void x() { true; } ", OperatorNot));
1575 TEST(MatchUnaryOperator, HasUnaryOperand) {
1576 StatementMatcher OperatorOnFalse =
1577 unaryOperator(hasUnaryOperand(boolLiteral(equals(false))));
1579 EXPECT_TRUE(matches("void x() { !false; }", OperatorOnFalse));
1580 EXPECT_TRUE(notMatches("void x() { !true; }", OperatorOnFalse));
1583 TEST(Matcher, UnaryOperatorTypes) {
1584 // Integration test that verifies the AST provides all unary operators in
1586 EXPECT_TRUE(matches("bool b = !true;", unaryOperator(hasOperatorName("!"))));
1588 matches("bool b; bool *p = &b;", unaryOperator(hasOperatorName("&"))));
1589 EXPECT_TRUE(matches("int i = ~ 1;", unaryOperator(hasOperatorName("~"))));
1591 matches("bool *p; bool b = *p;", unaryOperator(hasOperatorName("*"))));
1593 matches("int i; int j = +i;", unaryOperator(hasOperatorName("+"))));
1595 matches("int i; int j = -i;", unaryOperator(hasOperatorName("-"))));
1597 matches("int i; int j = ++i;", unaryOperator(hasOperatorName("++"))));
1599 matches("int i; int j = i++;", unaryOperator(hasOperatorName("++"))));
1601 matches("int i; int j = --i;", unaryOperator(hasOperatorName("--"))));
1603 matches("int i; int j = i--;", unaryOperator(hasOperatorName("--"))));
1605 // We don't match conversion operators.
1606 EXPECT_TRUE(notMatches("int i; double d = (double)i;", unaryOperator()));
1608 // Function calls are not represented as operator.
1609 EXPECT_TRUE(notMatches("void f(); void x() { f(); }", unaryOperator()));
1611 // Overloaded operators do not match at all.
1612 // FIXME: We probably want to add that.
1613 EXPECT_TRUE(notMatches(
1614 "struct A { bool operator!() const { return false; } };"
1615 "void x() { A a; !a; }", unaryOperator(hasOperatorName("!"))));
1618 TEST(Matcher, ConditionalOperator) {
1619 StatementMatcher Conditional = conditionalOperator(
1620 hasCondition(boolLiteral(equals(true))),
1621 hasTrueExpression(boolLiteral(equals(false))));
1623 EXPECT_TRUE(matches("void x() { true ? false : true; }", Conditional));
1624 EXPECT_TRUE(notMatches("void x() { false ? false : true; }", Conditional));
1625 EXPECT_TRUE(notMatches("void x() { true ? true : false; }", Conditional));
1627 StatementMatcher ConditionalFalse = conditionalOperator(
1628 hasFalseExpression(boolLiteral(equals(false))));
1630 EXPECT_TRUE(matches("void x() { true ? true : false; }", ConditionalFalse));
1632 notMatches("void x() { true ? false : true; }", ConditionalFalse));
1635 TEST(ArraySubscriptMatchers, ArraySubscripts) {
1636 EXPECT_TRUE(matches("int i[2]; void f() { i[1] = 1; }",
1637 arraySubscriptExpr()));
1638 EXPECT_TRUE(notMatches("int i; void f() { i = 1; }",
1639 arraySubscriptExpr()));
1642 TEST(ArraySubscriptMatchers, ArrayIndex) {
1643 EXPECT_TRUE(matches(
1644 "int i[2]; void f() { i[1] = 1; }",
1645 arraySubscriptExpr(hasIndex(integerLiteral(equals(1))))));
1646 EXPECT_TRUE(matches(
1647 "int i[2]; void f() { 1[i] = 1; }",
1648 arraySubscriptExpr(hasIndex(integerLiteral(equals(1))))));
1649 EXPECT_TRUE(notMatches(
1650 "int i[2]; void f() { i[1] = 1; }",
1651 arraySubscriptExpr(hasIndex(integerLiteral(equals(0))))));
1654 TEST(ArraySubscriptMatchers, MatchesArrayBase) {
1655 EXPECT_TRUE(matches(
1656 "int i[2]; void f() { i[1] = 2; }",
1657 arraySubscriptExpr(hasBase(implicitCast(
1658 hasSourceExpression(declarationReference()))))));
1661 TEST(Matcher, HasNameSupportsNamespaces) {
1662 EXPECT_TRUE(matches("namespace a { namespace b { class C; } }",
1663 record(hasName("a::b::C"))));
1664 EXPECT_TRUE(matches("namespace a { namespace b { class C; } }",
1665 record(hasName("::a::b::C"))));
1666 EXPECT_TRUE(matches("namespace a { namespace b { class C; } }",
1667 record(hasName("b::C"))));
1668 EXPECT_TRUE(matches("namespace a { namespace b { class C; } }",
1669 record(hasName("C"))));
1670 EXPECT_TRUE(notMatches("namespace a { namespace b { class C; } }",
1671 record(hasName("c::b::C"))));
1672 EXPECT_TRUE(notMatches("namespace a { namespace b { class C; } }",
1673 record(hasName("a::c::C"))));
1674 EXPECT_TRUE(notMatches("namespace a { namespace b { class C; } }",
1675 record(hasName("a::b::A"))));
1676 EXPECT_TRUE(notMatches("namespace a { namespace b { class C; } }",
1677 record(hasName("::C"))));
1678 EXPECT_TRUE(notMatches("namespace a { namespace b { class C; } }",
1679 record(hasName("::b::C"))));
1680 EXPECT_TRUE(notMatches("namespace a { namespace b { class C; } }",
1681 record(hasName("z::a::b::C"))));
1682 EXPECT_TRUE(notMatches("namespace a { namespace b { class C; } }",
1683 record(hasName("a+b::C"))));
1684 EXPECT_TRUE(notMatches("namespace a { namespace b { class AC; } }",
1685 record(hasName("C"))));
1688 TEST(Matcher, HasNameSupportsOuterClasses) {
1690 matches("class A { class B { class C; }; };", record(hasName("A::B::C"))));
1692 matches("class A { class B { class C; }; };",
1693 record(hasName("::A::B::C"))));
1695 matches("class A { class B { class C; }; };", record(hasName("B::C"))));
1697 matches("class A { class B { class C; }; };", record(hasName("C"))));
1699 notMatches("class A { class B { class C; }; };",
1700 record(hasName("c::B::C"))));
1702 notMatches("class A { class B { class C; }; };",
1703 record(hasName("A::c::C"))));
1705 notMatches("class A { class B { class C; }; };",
1706 record(hasName("A::B::A"))));
1708 notMatches("class A { class B { class C; }; };", record(hasName("::C"))));
1710 notMatches("class A { class B { class C; }; };",
1711 record(hasName("::B::C"))));
1712 EXPECT_TRUE(notMatches("class A { class B { class C; }; };",
1713 record(hasName("z::A::B::C"))));
1715 notMatches("class A { class B { class C; }; };",
1716 record(hasName("A+B::C"))));
1719 TEST(Matcher, IsDefinition) {
1720 DeclarationMatcher DefinitionOfClassA =
1721 record(hasName("A"), isDefinition());
1722 EXPECT_TRUE(matches("class A {};", DefinitionOfClassA));
1723 EXPECT_TRUE(notMatches("class A;", DefinitionOfClassA));
1725 DeclarationMatcher DefinitionOfVariableA =
1726 variable(hasName("a"), isDefinition());
1727 EXPECT_TRUE(matches("int a;", DefinitionOfVariableA));
1728 EXPECT_TRUE(notMatches("extern int a;", DefinitionOfVariableA));
1730 DeclarationMatcher DefinitionOfMethodA =
1731 method(hasName("a"), isDefinition());
1732 EXPECT_TRUE(matches("class A { void a() {} };", DefinitionOfMethodA));
1733 EXPECT_TRUE(notMatches("class A { void a(); };", DefinitionOfMethodA));
1736 TEST(Matcher, OfClass) {
1737 StatementMatcher Constructor = constructorCall(hasDeclaration(method(
1738 ofClass(hasName("X")))));
1741 matches("class X { public: X(); }; void x(int) { X x; }", Constructor));
1743 matches("class X { public: X(); }; void x(int) { X x = X(); }",
1746 notMatches("class Y { public: Y(); }; void x(int) { Y y; }",
1750 TEST(Matcher, VisitsTemplateInstantiations) {
1751 EXPECT_TRUE(matches(
1752 "class A { public: void x(); };"
1753 "template <typename T> class B { public: void y() { T t; t.x(); } };"
1754 "void f() { B<A> b; b.y(); }", call(callee(method(hasName("x"))))));
1756 EXPECT_TRUE(matches(
1757 "class A { public: void x(); };"
1760 " template <typename T> class B { public: void y() { T t; t.x(); } };"
1763 " C::B<A> b; b.y();"
1764 "}", record(hasName("C"),
1765 hasDescendant(call(callee(method(hasName("x"))))))));
1768 TEST(Matcher, HandlesNullQualTypes) {
1769 // FIXME: Add a Type matcher so we can replace uses of this
1770 // variable with Type(True())
1771 const TypeMatcher AnyType = anything();
1773 // We don't really care whether this matcher succeeds; we're testing that
1774 // it completes without crashing.
1775 EXPECT_TRUE(matches(
1777 "template <typename T>"
1779 " T local_t(t /* this becomes a null QualType in the AST */);"
1784 expression(hasType(TypeMatcher(
1786 TypeMatcher(hasDeclaration(anything())),
1789 // Other QualType matchers should go here.
1793 // For testing AST_MATCHER_P().
1794 AST_MATCHER_P(Decl, just, internal::Matcher<Decl>, AMatcher) {
1795 // Make sure all special variables are used: node, match_finder,
1796 // bound_nodes_builder, and the parameter named 'AMatcher'.
1797 return AMatcher.matches(Node, Finder, Builder);
1800 TEST(AstMatcherPMacro, Works) {
1801 DeclarationMatcher HasClassB = just(has(record(hasName("B")).bind("b")));
1803 EXPECT_TRUE(matchAndVerifyResultTrue("class A { class B {}; };",
1804 HasClassB, new VerifyIdIsBoundToDecl<Decl>("b")));
1806 EXPECT_TRUE(matchAndVerifyResultFalse("class A { class B {}; };",
1807 HasClassB, new VerifyIdIsBoundToDecl<Decl>("a")));
1809 EXPECT_TRUE(matchAndVerifyResultFalse("class A { class C {}; };",
1810 HasClassB, new VerifyIdIsBoundToDecl<Decl>("b")));
1813 AST_POLYMORPHIC_MATCHER_P(
1814 polymorphicHas, internal::Matcher<Decl>, AMatcher) {
1815 TOOLING_COMPILE_ASSERT((llvm::is_same<NodeType, Decl>::value) ||
1816 (llvm::is_same<NodeType, Stmt>::value),
1817 assert_node_type_is_accessible);
1818 internal::TypedBaseMatcher<Decl> ChildMatcher(AMatcher);
1819 return Finder->matchesChildOf(
1820 Node, ChildMatcher, Builder,
1821 ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses,
1822 ASTMatchFinder::BK_First);
1825 TEST(AstPolymorphicMatcherPMacro, Works) {
1826 DeclarationMatcher HasClassB = polymorphicHas(record(hasName("B")).bind("b"));
1828 EXPECT_TRUE(matchAndVerifyResultTrue("class A { class B {}; };",
1829 HasClassB, new VerifyIdIsBoundToDecl<Decl>("b")));
1831 EXPECT_TRUE(matchAndVerifyResultFalse("class A { class B {}; };",
1832 HasClassB, new VerifyIdIsBoundToDecl<Decl>("a")));
1834 EXPECT_TRUE(matchAndVerifyResultFalse("class A { class C {}; };",
1835 HasClassB, new VerifyIdIsBoundToDecl<Decl>("b")));
1837 StatementMatcher StatementHasClassB =
1838 polymorphicHas(record(hasName("B")));
1840 EXPECT_TRUE(matches("void x() { class B {}; }", StatementHasClassB));
1843 TEST(For, FindsForLoops) {
1844 EXPECT_TRUE(matches("void f() { for(;;); }", forStmt()));
1845 EXPECT_TRUE(matches("void f() { if(true) for(;;); }", forStmt()));
1848 TEST(For, ForLoopInternals) {
1849 EXPECT_TRUE(matches("void f(){ int i; for (; i < 3 ; ); }",
1850 forStmt(hasCondition(anything()))));
1851 EXPECT_TRUE(matches("void f() { for (int i = 0; ;); }",
1852 forStmt(hasLoopInit(anything()))));
1855 TEST(For, NegativeForLoopInternals) {
1856 EXPECT_TRUE(notMatches("void f(){ for (int i = 0; ; ++i); }",
1857 forStmt(hasCondition(expression()))));
1858 EXPECT_TRUE(notMatches("void f() {int i; for (; i < 4; ++i) {} }",
1859 forStmt(hasLoopInit(anything()))));
1862 TEST(For, ReportsNoFalsePositives) {
1863 EXPECT_TRUE(notMatches("void f() { ; }", forStmt()));
1864 EXPECT_TRUE(notMatches("void f() { if(true); }", forStmt()));
1867 TEST(CompoundStatement, HandlesSimpleCases) {
1868 EXPECT_TRUE(notMatches("void f();", compoundStatement()));
1869 EXPECT_TRUE(matches("void f() {}", compoundStatement()));
1870 EXPECT_TRUE(matches("void f() {{}}", compoundStatement()));
1873 TEST(CompoundStatement, DoesNotMatchEmptyStruct) {
1874 // It's not a compound statement just because there's "{}" in the source
1875 // text. This is an AST search, not grep.
1876 EXPECT_TRUE(notMatches("namespace n { struct S {}; }",
1877 compoundStatement()));
1878 EXPECT_TRUE(matches("namespace n { struct S { void f() {{}} }; }",
1879 compoundStatement()));
1882 TEST(HasBody, FindsBodyOfForWhileDoLoops) {
1883 EXPECT_TRUE(matches("void f() { for(;;) {} }",
1884 forStmt(hasBody(compoundStatement()))));
1885 EXPECT_TRUE(notMatches("void f() { for(;;); }",
1886 forStmt(hasBody(compoundStatement()))));
1887 EXPECT_TRUE(matches("void f() { while(true) {} }",
1888 whileStmt(hasBody(compoundStatement()))));
1889 EXPECT_TRUE(matches("void f() { do {} while(true); }",
1890 doStmt(hasBody(compoundStatement()))));
1893 TEST(HasAnySubstatement, MatchesForTopLevelCompoundStatement) {
1894 // The simplest case: every compound statement is in a function
1895 // definition, and the function body itself must be a compound
1897 EXPECT_TRUE(matches("void f() { for (;;); }",
1898 compoundStatement(hasAnySubstatement(forStmt()))));
1901 TEST(HasAnySubstatement, IsNotRecursive) {
1902 // It's really "has any immediate substatement".
1903 EXPECT_TRUE(notMatches("void f() { if (true) for (;;); }",
1904 compoundStatement(hasAnySubstatement(forStmt()))));
1907 TEST(HasAnySubstatement, MatchesInNestedCompoundStatements) {
1908 EXPECT_TRUE(matches("void f() { if (true) { for (;;); } }",
1909 compoundStatement(hasAnySubstatement(forStmt()))));
1912 TEST(HasAnySubstatement, FindsSubstatementBetweenOthers) {
1913 EXPECT_TRUE(matches("void f() { 1; 2; 3; for (;;); 4; 5; 6; }",
1914 compoundStatement(hasAnySubstatement(forStmt()))));
1917 TEST(StatementCountIs, FindsNoStatementsInAnEmptyCompoundStatement) {
1918 EXPECT_TRUE(matches("void f() { }",
1919 compoundStatement(statementCountIs(0))));
1920 EXPECT_TRUE(notMatches("void f() {}",
1921 compoundStatement(statementCountIs(1))));
1924 TEST(StatementCountIs, AppearsToMatchOnlyOneCount) {
1925 EXPECT_TRUE(matches("void f() { 1; }",
1926 compoundStatement(statementCountIs(1))));
1927 EXPECT_TRUE(notMatches("void f() { 1; }",
1928 compoundStatement(statementCountIs(0))));
1929 EXPECT_TRUE(notMatches("void f() { 1; }",
1930 compoundStatement(statementCountIs(2))));
1933 TEST(StatementCountIs, WorksWithMultipleStatements) {
1934 EXPECT_TRUE(matches("void f() { 1; 2; 3; }",
1935 compoundStatement(statementCountIs(3))));
1938 TEST(StatementCountIs, WorksWithNestedCompoundStatements) {
1939 EXPECT_TRUE(matches("void f() { { 1; } { 1; 2; 3; 4; } }",
1940 compoundStatement(statementCountIs(1))));
1941 EXPECT_TRUE(matches("void f() { { 1; } { 1; 2; 3; 4; } }",
1942 compoundStatement(statementCountIs(2))));
1943 EXPECT_TRUE(notMatches("void f() { { 1; } { 1; 2; 3; 4; } }",
1944 compoundStatement(statementCountIs(3))));
1945 EXPECT_TRUE(matches("void f() { { 1; } { 1; 2; 3; 4; } }",
1946 compoundStatement(statementCountIs(4))));
1949 TEST(Member, WorksInSimplestCase) {
1950 EXPECT_TRUE(matches("struct { int first; } s; int i(s.first);",
1951 memberExpression(member(hasName("first")))));
1954 TEST(Member, DoesNotMatchTheBaseExpression) {
1955 // Don't pick out the wrong part of the member expression, this should
1956 // be checking the member (name) only.
1957 EXPECT_TRUE(notMatches("struct { int i; } first; int i(first.i);",
1958 memberExpression(member(hasName("first")))));
1961 TEST(Member, MatchesInMemberFunctionCall) {
1962 EXPECT_TRUE(matches("void f() {"
1963 " struct { void first() {}; } s;"
1966 memberExpression(member(hasName("first")))));
1969 TEST(HasObjectExpression, DoesNotMatchMember) {
1970 EXPECT_TRUE(notMatches(
1971 "class X {}; struct Z { X m; }; void f(Z z) { z.m; }",
1972 memberExpression(hasObjectExpression(hasType(record(hasName("X")))))));
1975 TEST(HasObjectExpression, MatchesBaseOfVariable) {
1976 EXPECT_TRUE(matches(
1977 "struct X { int m; }; void f(X x) { x.m; }",
1978 memberExpression(hasObjectExpression(hasType(record(hasName("X")))))));
1979 EXPECT_TRUE(matches(
1980 "struct X { int m; }; void f(X* x) { x->m; }",
1981 memberExpression(hasObjectExpression(
1982 hasType(pointsTo(record(hasName("X"))))))));
1985 TEST(HasObjectExpression,
1986 MatchesObjectExpressionOfImplicitlyFormedMemberExpression) {
1987 EXPECT_TRUE(matches(
1988 "class X {}; struct S { X m; void f() { this->m; } };",
1989 memberExpression(hasObjectExpression(
1990 hasType(pointsTo(record(hasName("S"))))))));
1991 EXPECT_TRUE(matches(
1992 "class X {}; struct S { X m; void f() { m; } };",
1993 memberExpression(hasObjectExpression(
1994 hasType(pointsTo(record(hasName("S"))))))));
1997 TEST(Field, DoesNotMatchNonFieldMembers) {
1998 EXPECT_TRUE(notMatches("class X { void m(); };", field(hasName("m"))));
1999 EXPECT_TRUE(notMatches("class X { class m {}; };", field(hasName("m"))));
2000 EXPECT_TRUE(notMatches("class X { enum { m }; };", field(hasName("m"))));
2001 EXPECT_TRUE(notMatches("class X { enum m {}; };", field(hasName("m"))));
2004 TEST(Field, MatchesField) {
2005 EXPECT_TRUE(matches("class X { int m; };", field(hasName("m"))));
2008 TEST(IsConstQualified, MatchesConstInt) {
2009 EXPECT_TRUE(matches("const int i = 42;",
2010 variable(hasType(isConstQualified()))));
2013 TEST(IsConstQualified, MatchesConstPointer) {
2014 EXPECT_TRUE(matches("int i = 42; int* const p(&i);",
2015 variable(hasType(isConstQualified()))));
2018 TEST(IsConstQualified, MatchesThroughTypedef) {
2019 EXPECT_TRUE(matches("typedef const int const_int; const_int i = 42;",
2020 variable(hasType(isConstQualified()))));
2021 EXPECT_TRUE(matches("typedef int* int_ptr; const int_ptr p(0);",
2022 variable(hasType(isConstQualified()))));
2025 TEST(IsConstQualified, DoesNotMatchInappropriately) {
2026 EXPECT_TRUE(notMatches("typedef int nonconst_int; nonconst_int i = 42;",
2027 variable(hasType(isConstQualified()))));
2028 EXPECT_TRUE(notMatches("int const* p;",
2029 variable(hasType(isConstQualified()))));
2032 TEST(CastExpression, MatchesExplicitCasts) {
2033 EXPECT_TRUE(matches("char *p = reinterpret_cast<char *>(&p);",
2034 expression(castExpr())));
2035 EXPECT_TRUE(matches("void *p = (void *)(&p);", expression(castExpr())));
2036 EXPECT_TRUE(matches("char q, *p = const_cast<char *>(&q);",
2037 expression(castExpr())));
2038 EXPECT_TRUE(matches("char c = char(0);", expression(castExpr())));
2040 TEST(CastExpression, MatchesImplicitCasts) {
2041 // This test creates an implicit cast from int to char.
2042 EXPECT_TRUE(matches("char c = 0;", expression(castExpr())));
2043 // This test creates an implicit cast from lvalue to rvalue.
2044 EXPECT_TRUE(matches("char c = 0, d = c;", expression(castExpr())));
2047 TEST(CastExpression, DoesNotMatchNonCasts) {
2048 EXPECT_TRUE(notMatches("char c = '0';", expression(castExpr())));
2049 EXPECT_TRUE(notMatches("char c, &q = c;", expression(castExpr())));
2050 EXPECT_TRUE(notMatches("int i = (0);", expression(castExpr())));
2051 EXPECT_TRUE(notMatches("int i = 0;", expression(castExpr())));
2054 TEST(ReinterpretCast, MatchesSimpleCase) {
2055 EXPECT_TRUE(matches("char* p = reinterpret_cast<char*>(&p);",
2056 expression(reinterpretCast())));
2059 TEST(ReinterpretCast, DoesNotMatchOtherCasts) {
2060 EXPECT_TRUE(notMatches("char* p = (char*)(&p);",
2061 expression(reinterpretCast())));
2062 EXPECT_TRUE(notMatches("char q, *p = const_cast<char*>(&q);",
2063 expression(reinterpretCast())));
2064 EXPECT_TRUE(notMatches("void* p = static_cast<void*>(&p);",
2065 expression(reinterpretCast())));
2066 EXPECT_TRUE(notMatches("struct B { virtual ~B() {} }; struct D : B {};"
2068 "D* p = dynamic_cast<D*>(&b);",
2069 expression(reinterpretCast())));
2072 TEST(FunctionalCast, MatchesSimpleCase) {
2073 std::string foo_class = "class Foo { public: Foo(char*); };";
2074 EXPECT_TRUE(matches(foo_class + "void r() { Foo f = Foo(\"hello world\"); }",
2075 expression(functionalCast())));
2078 TEST(FunctionalCast, DoesNotMatchOtherCasts) {
2079 std::string FooClass = "class Foo { public: Foo(char*); };";
2081 notMatches(FooClass + "void r() { Foo f = (Foo) \"hello world\"; }",
2082 expression(functionalCast())));
2084 notMatches(FooClass + "void r() { Foo f = \"hello world\"; }",
2085 expression(functionalCast())));
2088 TEST(DynamicCast, MatchesSimpleCase) {
2089 EXPECT_TRUE(matches("struct B { virtual ~B() {} }; struct D : B {};"
2091 "D* p = dynamic_cast<D*>(&b);",
2092 expression(dynamicCast())));
2095 TEST(StaticCast, MatchesSimpleCase) {
2096 EXPECT_TRUE(matches("void* p(static_cast<void*>(&p));",
2097 expression(staticCast())));
2100 TEST(StaticCast, DoesNotMatchOtherCasts) {
2101 EXPECT_TRUE(notMatches("char* p = (char*)(&p);",
2102 expression(staticCast())));
2103 EXPECT_TRUE(notMatches("char q, *p = const_cast<char*>(&q);",
2104 expression(staticCast())));
2105 EXPECT_TRUE(notMatches("void* p = reinterpret_cast<char*>(&p);",
2106 expression(staticCast())));
2107 EXPECT_TRUE(notMatches("struct B { virtual ~B() {} }; struct D : B {};"
2109 "D* p = dynamic_cast<D*>(&b);",
2110 expression(staticCast())));
2113 TEST(HasDestinationType, MatchesSimpleCase) {
2114 EXPECT_TRUE(matches("char* p = static_cast<char*>(0);",
2116 staticCast(hasDestinationType(
2117 pointsTo(TypeMatcher(anything())))))));
2120 TEST(HasImplicitDestinationType, MatchesSimpleCase) {
2121 // This test creates an implicit const cast.
2122 EXPECT_TRUE(matches("int x; const int i = x;",
2123 expression(implicitCast(
2124 hasImplicitDestinationType(isInteger())))));
2125 // This test creates an implicit array-to-pointer cast.
2126 EXPECT_TRUE(matches("int arr[3]; int *p = arr;",
2127 expression(implicitCast(hasImplicitDestinationType(
2128 pointsTo(TypeMatcher(anything())))))));
2131 TEST(HasImplicitDestinationType, DoesNotMatchIncorrectly) {
2132 // This test creates an implicit cast from int to char.
2133 EXPECT_TRUE(notMatches("char c = 0;",
2134 expression(implicitCast(hasImplicitDestinationType(
2135 unless(anything()))))));
2136 // This test creates an implicit array-to-pointer cast.
2137 EXPECT_TRUE(notMatches("int arr[3]; int *p = arr;",
2138 expression(implicitCast(hasImplicitDestinationType(
2139 unless(anything()))))));
2142 TEST(ImplicitCast, MatchesSimpleCase) {
2143 // This test creates an implicit const cast.
2144 EXPECT_TRUE(matches("int x = 0; const int y = x;",
2145 variable(hasInitializer(implicitCast()))));
2146 // This test creates an implicit cast from int to char.
2147 EXPECT_TRUE(matches("char c = 0;",
2148 variable(hasInitializer(implicitCast()))));
2149 // This test creates an implicit array-to-pointer cast.
2150 EXPECT_TRUE(matches("int arr[6]; int *p = arr;",
2151 variable(hasInitializer(implicitCast()))));
2154 TEST(ImplicitCast, DoesNotMatchIncorrectly) {
2155 // This test verifies that implicitCast() matches exactly when implicit casts
2156 // are present, and that it ignores explicit and paren casts.
2158 // These two test cases have no casts.
2159 EXPECT_TRUE(notMatches("int x = 0;",
2160 variable(hasInitializer(implicitCast()))));
2161 EXPECT_TRUE(notMatches("int x = 0, &y = x;",
2162 variable(hasInitializer(implicitCast()))));
2164 EXPECT_TRUE(notMatches("int x = 0; double d = (double) x;",
2165 variable(hasInitializer(implicitCast()))));
2166 EXPECT_TRUE(notMatches("const int *p; int *q = const_cast<int *>(p);",
2167 variable(hasInitializer(implicitCast()))));
2169 EXPECT_TRUE(notMatches("int x = (0);",
2170 variable(hasInitializer(implicitCast()))));
2173 TEST(IgnoringImpCasts, MatchesImpCasts) {
2174 // This test checks that ignoringImpCasts matches when implicit casts are
2175 // present and its inner matcher alone does not match.
2176 // Note that this test creates an implicit const cast.
2177 EXPECT_TRUE(matches("int x = 0; const int y = x;",
2178 variable(hasInitializer(ignoringImpCasts(
2179 declarationReference(to(variable(hasName("x")))))))));
2180 // This test creates an implict cast from int to char.
2181 EXPECT_TRUE(matches("char x = 0;",
2182 variable(hasInitializer(ignoringImpCasts(
2183 integerLiteral(equals(0)))))));
2186 TEST(IgnoringImpCasts, DoesNotMatchIncorrectly) {
2187 // These tests verify that ignoringImpCasts does not match if the inner
2188 // matcher does not match.
2189 // Note that the first test creates an implicit const cast.
2190 EXPECT_TRUE(notMatches("int x; const int y = x;",
2191 variable(hasInitializer(ignoringImpCasts(
2192 unless(anything()))))));
2193 EXPECT_TRUE(notMatches("int x; int y = x;",
2194 variable(hasInitializer(ignoringImpCasts(
2195 unless(anything()))))));
2197 // These tests verify that ignoringImplictCasts does not look through explicit
2198 // casts or parentheses.
2199 EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);",
2200 variable(hasInitializer(ignoringImpCasts(
2201 integerLiteral())))));
2202 EXPECT_TRUE(notMatches("int i = (0);",
2203 variable(hasInitializer(ignoringImpCasts(
2204 integerLiteral())))));
2205 EXPECT_TRUE(notMatches("float i = (float)0;",
2206 variable(hasInitializer(ignoringImpCasts(
2207 integerLiteral())))));
2208 EXPECT_TRUE(notMatches("float i = float(0);",
2209 variable(hasInitializer(ignoringImpCasts(
2210 integerLiteral())))));
2213 TEST(IgnoringImpCasts, MatchesWithoutImpCasts) {
2214 // This test verifies that expressions that do not have implicit casts
2215 // still match the inner matcher.
2216 EXPECT_TRUE(matches("int x = 0; int &y = x;",
2217 variable(hasInitializer(ignoringImpCasts(
2218 declarationReference(to(variable(hasName("x")))))))));
2221 TEST(IgnoringParenCasts, MatchesParenCasts) {
2222 // This test checks that ignoringParenCasts matches when parentheses and/or
2223 // casts are present and its inner matcher alone does not match.
2224 EXPECT_TRUE(matches("int x = (0);",
2225 variable(hasInitializer(ignoringParenCasts(
2226 integerLiteral(equals(0)))))));
2227 EXPECT_TRUE(matches("int x = (((((0)))));",
2228 variable(hasInitializer(ignoringParenCasts(
2229 integerLiteral(equals(0)))))));
2231 // This test creates an implict cast from int to char in addition to the
2233 EXPECT_TRUE(matches("char x = (0);",
2234 variable(hasInitializer(ignoringParenCasts(
2235 integerLiteral(equals(0)))))));
2237 EXPECT_TRUE(matches("char x = (char)0;",
2238 variable(hasInitializer(ignoringParenCasts(
2239 integerLiteral(equals(0)))))));
2240 EXPECT_TRUE(matches("char* p = static_cast<char*>(0);",
2241 variable(hasInitializer(ignoringParenCasts(
2242 integerLiteral(equals(0)))))));
2245 TEST(IgnoringParenCasts, MatchesWithoutParenCasts) {
2246 // This test verifies that expressions that do not have any casts still match.
2247 EXPECT_TRUE(matches("int x = 0;",
2248 variable(hasInitializer(ignoringParenCasts(
2249 integerLiteral(equals(0)))))));
2252 TEST(IgnoringParenCasts, DoesNotMatchIncorrectly) {
2253 // These tests verify that ignoringImpCasts does not match if the inner
2254 // matcher does not match.
2255 EXPECT_TRUE(notMatches("int x = ((0));",
2256 variable(hasInitializer(ignoringParenCasts(
2257 unless(anything()))))));
2259 // This test creates an implicit cast from int to char in addition to the
2261 EXPECT_TRUE(notMatches("char x = ((0));",
2262 variable(hasInitializer(ignoringParenCasts(
2263 unless(anything()))))));
2265 EXPECT_TRUE(notMatches("char *x = static_cast<char *>((0));",
2266 variable(hasInitializer(ignoringParenCasts(
2267 unless(anything()))))));
2270 TEST(IgnoringParenAndImpCasts, MatchesParenImpCasts) {
2271 // This test checks that ignoringParenAndImpCasts matches when
2272 // parentheses and/or implicit casts are present and its inner matcher alone
2274 // Note that this test creates an implicit const cast.
2275 EXPECT_TRUE(matches("int x = 0; const int y = x;",
2276 variable(hasInitializer(ignoringParenImpCasts(
2277 declarationReference(to(variable(hasName("x")))))))));
2278 // This test creates an implicit cast from int to char.
2279 EXPECT_TRUE(matches("const char x = (0);",
2280 variable(hasInitializer(ignoringParenImpCasts(
2281 integerLiteral(equals(0)))))));
2284 TEST(IgnoringParenAndImpCasts, MatchesWithoutParenImpCasts) {
2285 // This test verifies that expressions that do not have parentheses or
2286 // implicit casts still match.
2287 EXPECT_TRUE(matches("int x = 0; int &y = x;",
2288 variable(hasInitializer(ignoringParenImpCasts(
2289 declarationReference(to(variable(hasName("x")))))))));
2290 EXPECT_TRUE(matches("int x = 0;",
2291 variable(hasInitializer(ignoringParenImpCasts(
2292 integerLiteral(equals(0)))))));
2295 TEST(IgnoringParenAndImpCasts, DoesNotMatchIncorrectly) {
2296 // These tests verify that ignoringParenImpCasts does not match if
2297 // the inner matcher does not match.
2298 // This test creates an implicit cast.
2299 EXPECT_TRUE(notMatches("char c = ((3));",
2300 variable(hasInitializer(ignoringParenImpCasts(
2301 unless(anything()))))));
2302 // These tests verify that ignoringParenAndImplictCasts does not look
2303 // through explicit casts.
2304 EXPECT_TRUE(notMatches("float y = (float(0));",
2305 variable(hasInitializer(ignoringParenImpCasts(
2306 integerLiteral())))));
2307 EXPECT_TRUE(notMatches("float y = (float)0;",
2308 variable(hasInitializer(ignoringParenImpCasts(
2309 integerLiteral())))));
2310 EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);",
2311 variable(hasInitializer(ignoringParenImpCasts(
2312 integerLiteral())))));
2315 TEST(HasSourceExpression, MatchesImplicitCasts) {
2316 EXPECT_TRUE(matches("class string {}; class URL { public: URL(string s); };"
2317 "void r() {string a_string; URL url = a_string; }",
2318 expression(implicitCast(
2319 hasSourceExpression(constructorCall())))));
2322 TEST(HasSourceExpression, MatchesExplicitCasts) {
2323 EXPECT_TRUE(matches("float x = static_cast<float>(42);",
2324 expression(explicitCast(
2325 hasSourceExpression(hasDescendant(
2326 expression(integerLiteral())))))));
2329 TEST(Statement, DoesNotMatchDeclarations) {
2330 EXPECT_TRUE(notMatches("class X {};", statement()));
2333 TEST(Statement, MatchesCompoundStatments) {
2334 EXPECT_TRUE(matches("void x() {}", statement()));
2337 TEST(DeclarationStatement, DoesNotMatchCompoundStatements) {
2338 EXPECT_TRUE(notMatches("void x() {}", declarationStatement()));
2341 TEST(DeclarationStatement, MatchesVariableDeclarationStatements) {
2342 EXPECT_TRUE(matches("void x() { int a; }", declarationStatement()));
2345 TEST(InitListExpression, MatchesInitListExpression) {
2346 EXPECT_TRUE(matches("int a[] = { 1, 2 };",
2347 initListExpr(hasType(asString("int [2]")))));
2348 EXPECT_TRUE(matches("struct B { int x, y; }; B b = { 5, 6 };",
2349 initListExpr(hasType(record(hasName("B"))))));
2352 TEST(UsingDeclaration, MatchesUsingDeclarations) {
2353 EXPECT_TRUE(matches("namespace X { int x; } using X::x;",
2357 TEST(UsingDeclaration, MatchesShadowUsingDelcarations) {
2358 EXPECT_TRUE(matches("namespace f { int a; } using f::a;",
2359 usingDecl(hasAnyUsingShadowDecl(hasName("a")))));
2362 TEST(UsingDeclaration, MatchesSpecificTarget) {
2363 EXPECT_TRUE(matches("namespace f { int a; void b(); } using f::b;",
2364 usingDecl(hasAnyUsingShadowDecl(
2365 hasTargetDecl(function())))));
2366 EXPECT_TRUE(notMatches("namespace f { int a; void b(); } using f::a;",
2367 usingDecl(hasAnyUsingShadowDecl(
2368 hasTargetDecl(function())))));
2371 TEST(UsingDeclaration, ThroughUsingDeclaration) {
2372 EXPECT_TRUE(matches(
2373 "namespace a { void f(); } using a::f; void g() { f(); }",
2374 declarationReference(throughUsingDecl(anything()))));
2375 EXPECT_TRUE(notMatches(
2376 "namespace a { void f(); } using a::f; void g() { a::f(); }",
2377 declarationReference(throughUsingDecl(anything()))));
2380 TEST(While, MatchesWhileLoops) {
2381 EXPECT_TRUE(notMatches("void x() {}", whileStmt()));
2382 EXPECT_TRUE(matches("void x() { while(true); }", whileStmt()));
2383 EXPECT_TRUE(notMatches("void x() { do {} while(true); }", whileStmt()));
2386 TEST(Do, MatchesDoLoops) {
2387 EXPECT_TRUE(matches("void x() { do {} while(true); }", doStmt()));
2388 EXPECT_TRUE(matches("void x() { do ; while(false); }", doStmt()));
2391 TEST(Do, DoesNotMatchWhileLoops) {
2392 EXPECT_TRUE(notMatches("void x() { while(true) {} }", doStmt()));
2395 TEST(SwitchCase, MatchesCase) {
2396 EXPECT_TRUE(matches("void x() { switch(42) { case 42:; } }", switchCase()));
2397 EXPECT_TRUE(matches("void x() { switch(42) { default:; } }", switchCase()));
2398 EXPECT_TRUE(matches("void x() { switch(42) default:; }", switchCase()));
2399 EXPECT_TRUE(notMatches("void x() { switch(42) {} }", switchCase()));
2402 TEST(HasConditionVariableStatement, DoesNotMatchCondition) {
2403 EXPECT_TRUE(notMatches(
2404 "void x() { if(true) {} }",
2405 ifStmt(hasConditionVariableStatement(declarationStatement()))));
2406 EXPECT_TRUE(notMatches(
2407 "void x() { int x; if((x = 42)) {} }",
2408 ifStmt(hasConditionVariableStatement(declarationStatement()))));
2411 TEST(HasConditionVariableStatement, MatchesConditionVariables) {
2412 EXPECT_TRUE(matches(
2413 "void x() { if(int* a = 0) {} }",
2414 ifStmt(hasConditionVariableStatement(declarationStatement()))));
2417 TEST(ForEach, BindsOneNode) {
2418 EXPECT_TRUE(matchAndVerifyResultTrue("class C { int x; };",
2419 record(hasName("C"), forEach(field(hasName("x")).bind("x"))),
2420 new VerifyIdIsBoundToDecl<FieldDecl>("x", 1)));
2423 TEST(ForEach, BindsMultipleNodes) {
2424 EXPECT_TRUE(matchAndVerifyResultTrue("class C { int x; int y; int z; };",
2425 record(hasName("C"), forEach(field().bind("f"))),
2426 new VerifyIdIsBoundToDecl<FieldDecl>("f", 3)));
2429 TEST(ForEach, BindsRecursiveCombinations) {
2430 EXPECT_TRUE(matchAndVerifyResultTrue(
2431 "class C { class D { int x; int y; }; class E { int y; int z; }; };",
2432 record(hasName("C"), forEach(record(forEach(field().bind("f"))))),
2433 new VerifyIdIsBoundToDecl<FieldDecl>("f", 4)));
2436 TEST(ForEachDescendant, BindsOneNode) {
2437 EXPECT_TRUE(matchAndVerifyResultTrue("class C { class D { int x; }; };",
2438 record(hasName("C"), forEachDescendant(field(hasName("x")).bind("x"))),
2439 new VerifyIdIsBoundToDecl<FieldDecl>("x", 1)));
2442 TEST(ForEachDescendant, BindsMultipleNodes) {
2443 EXPECT_TRUE(matchAndVerifyResultTrue(
2444 "class C { class D { int x; int y; }; "
2445 " class E { class F { int y; int z; }; }; };",
2446 record(hasName("C"), forEachDescendant(field().bind("f"))),
2447 new VerifyIdIsBoundToDecl<FieldDecl>("f", 4)));
2450 TEST(ForEachDescendant, BindsRecursiveCombinations) {
2451 EXPECT_TRUE(matchAndVerifyResultTrue(
2452 "class C { class D { "
2453 " class E { class F { class G { int y; int z; }; }; }; }; };",
2454 record(hasName("C"), forEachDescendant(record(
2455 forEachDescendant(field().bind("f"))))),
2456 new VerifyIdIsBoundToDecl<FieldDecl>("f", 8)));
2460 TEST(IsTemplateInstantiation, MatchesImplicitClassTemplateInstantiation) {
2461 // Make sure that we can both match the class by name (::X) and by the type
2462 // the template was instantiated with (via a field).
2464 EXPECT_TRUE(matches(
2465 "template <typename T> class X {}; class A {}; X<A> x;",
2466 record(hasName("::X"), isTemplateInstantiation())));
2468 EXPECT_TRUE(matches(
2469 "template <typename T> class X { T t; }; class A {}; X<A> x;",
2470 record(isTemplateInstantiation(), hasDescendant(
2471 field(hasType(record(hasName("A"))))))));
2474 TEST(IsTemplateInstantiation, MatchesImplicitFunctionTemplateInstantiation) {
2475 EXPECT_TRUE(matches(
2476 "template <typename T> void f(T t) {} class A {}; void g() { f(A()); }",
2477 function(hasParameter(0, hasType(record(hasName("A")))),
2478 isTemplateInstantiation())));
2481 TEST(IsTemplateInstantiation, MatchesExplicitClassTemplateInstantiation) {
2482 EXPECT_TRUE(matches(
2483 "template <typename T> class X { T t; }; class A {};"
2484 "template class X<A>;",
2485 record(isTemplateInstantiation(), hasDescendant(
2486 field(hasType(record(hasName("A"))))))));
2489 TEST(IsTemplateInstantiation,
2490 MatchesInstantiationOfPartiallySpecializedClassTemplate) {
2491 EXPECT_TRUE(matches(
2492 "template <typename T> class X {};"
2493 "template <typename T> class X<T*> {}; class A {}; X<A*> x;",
2494 record(hasName("::X"), isTemplateInstantiation())));
2497 TEST(IsTemplateInstantiation,
2498 MatchesInstantiationOfClassTemplateNestedInNonTemplate) {
2499 EXPECT_TRUE(matches(
2502 " template <typename U> class Y { U u; };"
2505 record(hasName("::X::Y"), isTemplateInstantiation())));
2508 TEST(IsTemplateInstantiation, DoesNotMatchInstantiationsInsideOfInstantiation) {
2509 // FIXME: Figure out whether this makes sense. It doesn't affect the
2510 // normal use case as long as the uppermost instantiation always is marked
2511 // as template instantiation, but it might be confusing as a predicate.
2512 EXPECT_TRUE(matches(
2514 "template <typename T> class X {"
2515 " template <typename U> class Y { U u; };"
2518 record(hasName("::X<A>::Y"), unless(isTemplateInstantiation()))));
2521 TEST(IsTemplateInstantiation, DoesNotMatchExplicitClassTemplateSpecialization) {
2522 EXPECT_TRUE(notMatches(
2523 "template <typename T> class X {}; class A {};"
2524 "template <> class X<A> {}; X<A> x;",
2525 record(hasName("::X"), isTemplateInstantiation())));
2528 TEST(IsTemplateInstantiation, DoesNotMatchNonTemplate) {
2529 EXPECT_TRUE(notMatches(
2530 "class A {}; class Y { A a; };",
2531 record(isTemplateInstantiation())));
2534 } // end namespace ast_matchers
2535 } // end namespace clang