14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//= unittests/ASTMatchers/ASTMatchersTraversalTest.cpp - matchers unit tests =//
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//`
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// License. See LICENSE.TXT for details.
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===//
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "ASTMatchersTest.h"
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/AST/PrettyPrinter.h"
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/ASTMatchers/ASTMatchFinder.h"
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/ASTMatchers/ASTMatchers.h"
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Tooling/Tooling.h"
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/ADT/Triple.h"
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "llvm/Support/Host.h"
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "gtest/gtest.h"
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace clang {
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace ast_matchers {
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(DeclarationMatcher, hasMethod) {
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class A { void func(); };",
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxRecordDecl(hasMethod(hasName("func")))));
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class A { void func(); };",
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         cxxRecordDecl(hasMethod(isPublic()))));
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(DeclarationMatcher, ClassDerivedFromDependentTemplateSpecialization) {
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct A {"
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  template <typename T2> struct F {};"
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};"
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "template <typename T> struct B : A<T>::template F<T> {};"
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "B<int> b;",
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxRecordDecl(hasName("B"), isDerivedFrom(recordDecl()))));
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(DeclarationMatcher, hasDeclContext) {
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace N {"
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  namespace M {"
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    class D {};"
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  }"
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}",
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasDeclContext(namespaceDecl(hasName("M"))))));
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace N {"
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  namespace M {"
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    class D {};"
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  }"
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}",
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasDeclContext(namespaceDecl(hasName("N"))))));
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("namespace {"
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  namespace M {"
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "    class D {};"
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  }"
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "}",
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      recordDecl(hasDeclContext(namespaceDecl(
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasName("M"), hasDeclContext(namespaceDecl()))))));
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class D{};", decl(hasDeclContext(decl()))));
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasDescendant, MatchesDescendantTypes) {
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int i = 3; }",
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      decl(hasDescendant(loc(builtinType())))));
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int i = 3; }",
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      stmt(hasDescendant(builtinType()))));
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int i = 3; }",
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      stmt(hasDescendant(loc(builtinType())))));
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int i = 3; }",
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      stmt(hasDescendant(qualType(builtinType())))));
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() { float f = 2.0f; }",
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         stmt(hasDescendant(isInteger()))));
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { int a; float c; int d; int e; }",
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    functionDecl(forEachDescendant(
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      varDecl(hasDescendant(isInteger())).bind("x"))),
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 3)));
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasDescendant, MatchesDescendantsOfTypes) {
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int*** i; }",
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      qualType(hasDescendant(builtinType()))));
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int*** i; }",
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      qualType(hasDescendant(
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        pointerType(pointee(builtinType()))))));
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int*** i; }",
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      typeLoc(hasDescendant(loc(builtinType())))));
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { int*** i; }",
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    qualType(asString("int ***"), forEachDescendant(pointerType().bind("x"))),
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Type>>("x", 2)));
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Has, MatchesChildrenOfTypes) {
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int i;",
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasName("i"), has(isInteger()))));
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int** i;",
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasName("i"), has(isInteger()))));
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int (*f)(float, int);",
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    qualType(functionType(), forEach(qualType(isInteger()).bind("x"))),
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<QualType>>("x", 2)));
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Has, MatchesChildTypes) {
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int* i;",
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    varDecl(hasName("i"), hasType(qualType(has(builtinType()))))));
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int* i;",
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    varDecl(hasName("i"), hasType(qualType(has(pointerType()))))));
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(StatementMatcher, Has) {
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher HasVariableI =
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      expr(hasType(pointsTo(recordDecl(hasName("X")))),
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           has(ignoringParenImpCasts(declRefExpr(to(varDecl(hasName("i")))))));
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X; X *x(int); void c() { int i; x(i); }", HasVariableI));
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X; X *x(int); void c() { int i; x(42); }", HasVariableI));
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(StatementMatcher, HasDescendant) {
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher HasDescendantVariableI =
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    expr(hasType(pointsTo(recordDecl(hasName("X")))),
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         hasDescendant(declRefExpr(to(varDecl(hasName("i"))))));
1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X; X *x(bool); bool b(int); void c() { int i; x(b(i)); }",
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    HasDescendantVariableI));
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X; X *x(bool); bool b(int); void c() { int i; x(b(42)); }",
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    HasDescendantVariableI));
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(TypeMatcher, MatchesClassType) {
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TypeMatcher TypeA = hasDeclaration(recordDecl(hasName("A")));
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class A { public: A *a; };", TypeA));
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class A {};", TypeA));
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TypeMatcher TypeDerivedFromA =
1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasDeclaration(cxxRecordDecl(isDerivedFrom("A")));
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class A {}; class B : public A { public: B *b; };",
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      TypeDerivedFromA));
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class A {};", TypeA));
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TypeMatcher TypeAHasClassB = hasDeclaration(
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("A"), has(recordDecl(hasName("B")))));
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class A { public: A *a; class B {}; };", TypeAHasClassB));
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchesC("struct S {}; void f(void) { struct S s; }",
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       varDecl(hasType(namedDecl(hasName("S"))))));
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(TypeMatcher, MatchesDeclTypes) {
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // TypedefType -> TypedefNameDecl
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("typedef int I; void f(I i);",
1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      parmVarDecl(hasType(namedDecl(hasName("I"))))));
1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // ObjCObjectPointerType
1754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchesObjC("@interface Foo @end void f(Foo *f);",
1764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          parmVarDecl(hasType(objcObjectPointerType()))));
1774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // ObjCObjectPointerType -> ObjCInterfaceType -> ObjCInterfaceDecl
1784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchesObjC(
1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "@interface Foo @end void f(Foo *f);",
1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    parmVarDecl(hasType(pointsTo(objcInterfaceDecl(hasName("Foo")))))));
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // TemplateTypeParmType
1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template <typename T> void f(T t);",
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      parmVarDecl(hasType(templateTypeParmType()))));
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // TemplateTypeParmType -> TemplateTypeParmDecl
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template <typename T> void f(T t);",
1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      parmVarDecl(hasType(namedDecl(hasName("T"))))));
1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // InjectedClassNameType
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template <typename T> struct S {"
1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  void f(S s);"
1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "};",
1914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      parmVarDecl(hasType(injectedClassNameType()))));
1924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("template <typename T> struct S {"
1934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           "  void g(S<T> s);"
1944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           "};",
1954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         parmVarDecl(hasType(injectedClassNameType()))));
1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // InjectedClassNameType -> CXXRecordDecl
1974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template <typename T> struct S {"
1984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  void f(S s);"
1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "};",
2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      parmVarDecl(hasType(namedDecl(hasName("S"))))));
2014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const char Using[] = "template <typename T>"
2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct Base {"
2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "  typedef T Foo;"
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "};"
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ""
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T>"
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct S : private Base<T> {"
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "  using typename Base<T>::Foo;"
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "  void f(Foo);"
2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "};";
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // UnresolvedUsingTypenameDecl
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Using, unresolvedUsingTypenameDecl(hasName("Foo"))));
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // UnresolvedUsingTypenameType -> UnresolvedUsingTypenameDecl
2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Using, parmVarDecl(hasType(namedDecl(hasName("Foo"))))));
2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasDeclaration, HasDeclarationOfEnumType) {
2194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("enum X {}; void y(X *x) { x; }",
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      expr(hasType(pointsTo(
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        qualType(hasDeclaration(enumDecl(hasName("X")))))))));
2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasDeclaration, HasGetDeclTraitTest) {
2254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(internal::has_getDecl<TypedefType>::value);
2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(internal::has_getDecl<RecordType>::value);
2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_FALSE(internal::has_getDecl<TemplateSpecializationType>::value);
2284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasDeclaration, HasDeclarationOfTypeWithDecl) {
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("typedef int X; X a;",
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasName("a"),
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              hasType(typedefType(hasDeclaration(decl()))))));
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: Add tests for other types with getDecl() (e.g. RecordType)
2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasDeclaration, HasDeclarationOfTemplateSpecializationType) {
2394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template <typename T> class A {}; A<int> a;",
2404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasType(templateSpecializationType(
2414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasDeclaration(namedDecl(hasName("A"))))))));
2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasType, TakesQualTypeMatcherAndMatchesExpr) {
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TypeMatcher ClassX = hasDeclaration(recordDecl(hasName("X")));
2464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X {}; void y(X &x) { x; }", expr(hasType(ClassX))));
2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("class X {}; void y(X *x) { x; }",
2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               expr(hasType(ClassX))));
2514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X {}; void y(X *x) { x; }",
2534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            expr(hasType(pointsTo(ClassX)))));
2544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasType, TakesQualTypeMatcherAndMatchesValueDecl) {
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TypeMatcher ClassX = hasDeclaration(recordDecl(hasName("X")));
2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X {}; void y() { X x; }", varDecl(hasType(ClassX))));
2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("class X {}; void y() { X *x; }", varDecl(hasType(ClassX))));
2624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X {}; void y() { X *x; }",
2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            varDecl(hasType(pointsTo(ClassX)))));
2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasType, TakesDeclMatcherAndMatchesExpr) {
2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher ClassX = recordDecl(hasName("X"));
2694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X {}; void y(X &x) { x; }", expr(hasType(ClassX))));
2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("class X {}; void y(X *x) { x; }",
2734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               expr(hasType(ClassX))));
2744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasType, TakesDeclMatcherAndMatchesValueDecl) {
2774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher ClassX = recordDecl(hasName("X"));
2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X {}; void y() { X x; }", varDecl(hasType(ClassX))));
2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("class X {}; void y() { X *x; }", varDecl(hasType(ClassX))));
2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasType, MatchesTypedefDecl) {
2854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("typedef int X;", typedefDecl(hasType(asString("int")))));
2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("typedef const int T;",
2874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      typedefDecl(hasType(asString("const int")))));
2884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("typedef const int T;",
2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         typedefDecl(hasType(asString("int")))));
2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("typedef int foo; typedef foo bar;",
2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      typedefDecl(hasType(asString("foo")), hasName("bar"))));
2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasType, MatchesTypedefNameDecl) {
2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("using X = int;", typedefNameDecl(hasType(asString("int")))));
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("using T = const int;",
2974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      typedefNameDecl(hasType(asString("const int")))));
2984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("using T = const int;",
2994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         typedefNameDecl(hasType(asString("int")))));
3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("using foo = int; using bar = foo;",
3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      typedefNameDecl(hasType(asString("foo")), hasName("bar"))));
3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3044967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasTypeLoc, MatchesDeclaratorDecls) {
3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x;",
3064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasName("x"), hasTypeLoc(loc(asString("int"))))));
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Make sure we don't crash on implicit constructors.
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class X {}; X x;",
3104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         declaratorDecl(hasTypeLoc(loc(asString("int"))))));
3114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3144967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Callee, MatchesDeclarations) {
3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher CallMethodX = callExpr(callee(cxxMethodDecl(hasName("x"))));
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class Y { void x() { x(); } };", CallMethodX));
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class Y { void x() {} };", CallMethodX));
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CallMethodX = callExpr(callee(cxxConversionDecl()));
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("struct Y { operator int() const; }; int i = Y();", CallMethodX));
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("struct Y { operator int() const; }; Y y = Y();",
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         CallMethodX));
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3274967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Callee, MatchesMemberExpressions) {
3284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class Y { void x() { this->x(); } };",
3294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      callExpr(callee(memberExpr()))));
3304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("class Y { void x() { this->x(); } };", callExpr(callee(callExpr()))));
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3344967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, Argument) {
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher CallArgumentY = callExpr(
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasArgument(0, declRefExpr(to(varDecl(hasName("y"))))));
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x(int) { int y; x(y); }", CallArgumentY));
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X { void x(int) { int y; x(y); } };", CallArgumentY));
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x(int) { int z; x(z); }", CallArgumentY));
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher WrongIndex = callExpr(
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasArgument(42, declRefExpr(to(varDecl(hasName("y"))))));
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x(int) { int y; x(y); }", WrongIndex));
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, AnyArgument) {
3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher CallArgumentY = callExpr(
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasAnyArgument(
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ignoringParenImpCasts(declRefExpr(to(varDecl(hasName("y")))))));
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x(int, int) { int y; x(1, y); }", CallArgumentY));
3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x(int, int) { int y; x(y, 42); }", CallArgumentY));
3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x(int, int) { x(1, 2); }", CallArgumentY));
3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher ImplicitCastedArgument = callExpr(
3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasAnyArgument(implicitCastExpr()));
3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x(long) { int y; x(y); }", ImplicitCastedArgument));
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachArgumentWithParam, ReportsNoFalsePositives) {
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher ArgumentY =
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    declRefExpr(to(varDecl(hasName("y")))).bind("arg");
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher CallExpr =
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // IntParam does not match.
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f(int* i) { int* y; f(y); }", CallExpr));
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // ArgumentY does not match.
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f(int i) { int x; f(x); }", CallExpr));
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachArgumentWithParam, MatchesCXXMemberCallExpr) {
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher ArgumentY =
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    declRefExpr(to(varDecl(hasName("y")))).bind("arg");
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher CallExpr =
3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct S {"
3824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  const S& operator[](int i) { return *this; }"
3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};"
3844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f(S S1) {"
3854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  int y = 1;"
3864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  S1[y];"
3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}",
3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    CallExpr, llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param", 1)));
3894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher CallExpr2 =
3914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
3924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct S {"
3944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  static void g(int i);"
3954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};"
3964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f() {"
3974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  int y = 1;"
3984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  S::g(y);"
3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}",
4004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    CallExpr2, llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param", 1)));
4014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4034967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachArgumentWithParam, MatchesCallExpr) {
4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher ArgumentY =
4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    declRefExpr(to(varDecl(hasName("y")))).bind("arg");
4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
4074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher CallExpr =
4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    callExpr(forEachArgumentWithParam(ArgumentY, IntParam));
4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
4114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matchAndVerifyResultTrue("void f(int i) { int y; f(y); }", CallExpr,
4124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>(
4134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               "param")));
4144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
4154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matchAndVerifyResultTrue("void f(int i) { int y; f(y); }", CallExpr,
4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             llvm::make_unique<VerifyIdIsBoundTo<DeclRefExpr>>(
4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               "arg")));
4184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
4204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f(int i, int j) { int y; f(y, y); }", CallExpr,
4214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param", 2)));
4224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
4234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f(int i, int j) { int y; f(y, y); }", CallExpr,
4244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<DeclRefExpr>>("arg", 2)));
4254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4274967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachArgumentWithParam, MatchesConstructExpr) {
4284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher ArgumentY =
4294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    declRefExpr(to(varDecl(hasName("y")))).bind("arg");
4304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher IntParam = parmVarDecl(hasType(isInteger())).bind("param");
4314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher ConstructExpr =
4324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxConstructExpr(forEachArgumentWithParam(ArgumentY, IntParam));
4334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
4354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct C {"
4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  C(int i) {}"
4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};"
4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "int y = 0;"
4394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "C Obj(y);",
4404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ConstructExpr,
4414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<ParmVarDecl>>("param")));
4424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4444967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachArgumentWithParam, HandlesBoundNodesForNonMatches) {
4454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
4464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void g(int i, int j) {"
4474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  int a;"
4484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  int b;"
4494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  int c;"
4504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  g(a, 0);"
4514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  g(a, b);"
4524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  g(0, b);"
4534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}",
4544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    functionDecl(
4554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      forEachDescendant(varDecl().bind("v")),
4564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      forEachDescendant(callExpr(forEachArgumentWithParam(
4574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        declRefExpr(to(decl(equalsBoundNode("v")))), parmVarDecl())))),
4584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<VarDecl>>("v", 4)));
4594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4614967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(QualType, hasCanonicalType) {
4624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("typedef int &int_ref;"
4634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           "int a;"
4644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           "int_ref b = a;",
4654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasType(qualType(referenceType())))));
4664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
4674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("typedef int &int_ref;"
4684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              "int a;"
4694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              "int_ref b = a;",
4704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            varDecl(hasType(qualType(hasCanonicalType(referenceType()))))));
4714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4734967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasParameter, CallsInnerMatcher) {
4744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class X { void x(int) {} };",
4754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxMethodDecl(hasParameter(0, varDecl()))));
4764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class X { void x(int) {} };",
4774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         cxxMethodDecl(hasParameter(0, hasName("x")))));
4784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4804967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasParameter, DoesNotMatchIfIndexOutOfBounds) {
4814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class X { void x(int) {} };",
4824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         cxxMethodDecl(hasParameter(42, varDecl()))));
4834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4854967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasType, MatchesParameterVariableTypesStrictly) {
4864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
4874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { void x(X x) {} };",
4884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxMethodDecl(hasParameter(0, hasType(recordDecl(hasName("X")))))));
4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
4904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { void x(const X &x) {} };",
4914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxMethodDecl(hasParameter(0, hasType(recordDecl(hasName("X")))))));
4924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class X { void x(const X *x) {} };",
4934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxMethodDecl(hasParameter(
4944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        0, hasType(pointsTo(recordDecl(hasName("X"))))))));
4954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class X { void x(const X &x) {} };",
4964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxMethodDecl(hasParameter(
4974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        0, hasType(references(recordDecl(hasName("X"))))))));
4984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5004967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyParameter, MatchesIndependentlyOfPosition) {
5014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
5024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class Y {}; class X { void x(X x, Y y) {} };",
5034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxMethodDecl(hasAnyParameter(hasType(recordDecl(hasName("X")))))));
5044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
5054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class Y {}; class X { void x(Y y, X x) {} };",
5064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxMethodDecl(hasAnyParameter(hasType(recordDecl(hasName("X")))))));
5074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5094967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Returns, MatchesReturnTypes) {
5104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class Y { int f() { return 1; } };",
5114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      functionDecl(returns(asString("int")))));
5124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class Y { int f() { return 1; } };",
5134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         functionDecl(returns(asString("float")))));
5144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class Y { Y getMe() { return *this; } };",
5154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      functionDecl(returns(hasDeclaration(
5164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        recordDecl(hasName("Y")))))));
5174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5194967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyParameter, DoesntMatchIfInnerMatcherDoesntMatch) {
5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class Y {}; class X { void x(int) {} };",
5224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxMethodDecl(hasAnyParameter(hasType(recordDecl(hasName("X")))))));
5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5254967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyParameter, DoesNotMatchThisPointer) {
5264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class Y {}; class X { void x() {} };",
5274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         cxxMethodDecl(hasAnyParameter(
5284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           hasType(pointsTo(recordDecl(hasName("X"))))))));
5294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5314967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasName, MatchesParameterVariableDeclarations) {
5324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class Y {}; class X { void x(int x) {} };",
5334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxMethodDecl(hasAnyParameter(hasName("x")))));
5344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class Y {}; class X { void x(int) {} };",
5354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         cxxMethodDecl(hasAnyParameter(hasName("x")))));
5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5384967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, MatchesTypeTemplateArgument) {
5394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
5404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template<typename T> struct B {};"
5414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "B<int> b;",
5424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    classTemplateSpecializationDecl(hasAnyTemplateArgument(refersToType(
5434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      asString("int"))))));
5444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5464967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, MatchesDeclarationReferenceTemplateArgument) {
5474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
5484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct B { int next; };"
5494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "template<int(B::*next_ptr)> struct A {};"
5504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<&B::next> a;",
5514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    classTemplateSpecializationDecl(hasAnyTemplateArgument(
5524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      refersToDeclaration(fieldDecl(hasName("next")))))));
5534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
5554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct A {};"
5564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<int> a;",
5574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    classTemplateSpecializationDecl(hasAnyTemplateArgument(
5584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      refersToDeclaration(decl())))));
5594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
5614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct B { int next; };"
5624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "template<int(B::*next_ptr)> struct A {};"
5634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<&B::next> a;",
5644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    templateSpecializationType(hasAnyTemplateArgument(isExpr(
5654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))));
5664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
5684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct A {};"
5694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<int> a;",
5704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    templateSpecializationType(hasAnyTemplateArgument(
5714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      refersToDeclaration(decl())))));
5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, MatchesSpecificArgument) {
5764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
5774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template<typename T, typename U> class A {};"
5784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<bool, int> a;",
5794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    classTemplateSpecializationDecl(hasTemplateArgument(
5804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      1, refersToType(asString("int"))))));
5814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
5824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template<typename T, typename U> class A {};"
5834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<int, bool> a;",
5844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    classTemplateSpecializationDecl(hasTemplateArgument(
5854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      1, refersToType(asString("int"))))));
5864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
5884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template<typename T, typename U> class A {};"
5894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<bool, int> a;",
5904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    templateSpecializationType(hasTemplateArgument(
5914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      1, refersToType(asString("int"))))));
5924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
5934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template<typename T, typename U> class A {};"
5944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<int, bool> a;",
5954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    templateSpecializationType(hasTemplateArgument(
5964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      1, refersToType(asString("int"))))));
5974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5994967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(TemplateArgument, Matches) {
6004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template<typename T> struct C {}; C<int> c;",
6014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      classTemplateSpecializationDecl(
6024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasAnyTemplateArgument(templateArgument()))));
6034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
6044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template<typename T> struct C {}; C<int> c;",
6054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    templateSpecializationType(hasAnyTemplateArgument(templateArgument()))));
6064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6084967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(RefersToIntegralType, Matches) {
6094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template<int T> struct C {}; C<42> c;",
6104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      classTemplateSpecializationDecl(
6114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasAnyTemplateArgument(refersToIntegralType(
6124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          asString("int"))))));
6134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("template<unsigned T> struct C {}; C<42> c;",
6144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         classTemplateSpecializationDecl(hasAnyTemplateArgument(
6154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           refersToIntegralType(asString("int"))))));
6164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6184967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ConstructorDeclaration, SimpleCase) {
6194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class Foo { Foo(int i); };",
6204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxConstructorDecl(ofClass(hasName("Foo")))));
6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class Foo { Foo(int i); };",
6224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         cxxConstructorDecl(ofClass(hasName("Bar")))));
6234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6254967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(DestructorDeclaration, MatchesVirtualDestructor) {
6264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class Foo { virtual ~Foo(); };",
6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxDestructorDecl(ofClass(hasName("Foo")))));
6284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6304967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(DestructorDeclaration, DoesNotMatchImplicitDestructor) {
6314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("class Foo {};",
6324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         cxxDestructorDecl(ofClass(hasName("Foo")))));
6334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6354967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyConstructorInitializer, SimpleCase) {
6364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
6374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("class Foo { Foo() { } };",
6384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               cxxConstructorDecl(hasAnyConstructorInitializer(anything()))));
6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class Foo {"
6414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              "  Foo() : foo_() { }"
6424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              "  int foo_;"
6434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              "};",
6444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            cxxConstructorDecl(hasAnyConstructorInitializer(anything()))));
6454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6474967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyConstructorInitializer, ForField) {
6484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const char Code[] =
6494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class Baz { };"
6504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class Foo {"
6514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  Foo() : foo_() { }"
6524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  Baz foo_;"
6534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  Baz bar_;"
6544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};";
6554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    forField(hasType(recordDecl(hasName("Baz"))))))));
6574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    forField(hasName("foo_"))))));
6594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    forField(hasType(recordDecl(hasName("Bar"))))))));
6614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6634967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyConstructorInitializer, WithInitializer) {
6644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const char Code[] =
6654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class Foo {"
6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  Foo() : foo_(0) { }"
6674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  int foo_;"
6684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};";
6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    withInitializer(integerLiteral(equals(0)))))));
6714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    withInitializer(integerLiteral(equals(1)))))));
6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6754967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyConstructorInitializer, IsWritten) {
6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const char Code[] =
6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct Bar { Bar(){} };"
6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class Foo {"
6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  Foo() : foo_() { }"
6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  Bar foo_;"
6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  Bar bar_;"
6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};";
6834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    allOf(forField(hasName("foo_")), isWritten())))));
6854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    allOf(forField(hasName("bar_")), isWritten())))));
6874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Code, cxxConstructorDecl(hasAnyConstructorInitializer(
6884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    allOf(forField(hasName("bar_")), unless(isWritten()))))));
6894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6914967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnyConstructorInitializer, IsBaseInitializer) {
6924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const char Code[] =
6934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct B {};"
6944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "struct D : B {"
6954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  int I;"
6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  D(int i) : I(i) {}"
6974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};"
6984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "struct E : B {"
6994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  E() : B() {}"
7004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};";
7014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Code, cxxConstructorDecl(allOf(
7024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasAnyConstructorInitializer(allOf(isBaseInitializer(), isWritten())),
7034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasName("E")))));
7044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(allOf(
7054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasAnyConstructorInitializer(allOf(isBaseInitializer(), isWritten())),
7064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasName("D")))));
7074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(Code, cxxConstructorDecl(allOf(
7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasAnyConstructorInitializer(allOf(isMemberInitializer(), isWritten())),
7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasName("D")))));
7104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(Code, cxxConstructorDecl(allOf(
7114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasAnyConstructorInitializer(allOf(isMemberInitializer(), isWritten())),
7124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasName("E")))));
7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7154967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IfStmt, ChildTraversalMatchers) {
7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { if (false) true; else false; }",
7174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      ifStmt(hasThen(cxxBoolLiteral(equals(true))))));
7184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() { if (false) false; else true; }",
7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         ifStmt(hasThen(cxxBoolLiteral(equals(true))))));
7204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { if (false) false; else true; }",
7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      ifStmt(hasElse(cxxBoolLiteral(equals(true))))));
7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() { if (false) true; else false; }",
7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         ifStmt(hasElse(cxxBoolLiteral(equals(true))))));
7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7264967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchBinaryOperator, HasOperatorName) {
7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher OperatorOr = binaryOperator(hasOperatorName("||"));
7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { true || false; }", OperatorOr));
7304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { true && false; }", OperatorOr));
7314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7334967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchBinaryOperator, HasLHSAndHasRHS) {
7344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher OperatorTrueFalse =
7354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    binaryOperator(hasLHS(cxxBoolLiteral(equals(true))),
7364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                   hasRHS(cxxBoolLiteral(equals(false))));
7374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { true || false; }", OperatorTrueFalse));
7394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { true && false; }", OperatorTrueFalse));
7404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { false || true; }", OperatorTrueFalse));
7414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher OperatorIntPointer = arraySubscriptExpr(
7434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    hasLHS(hasType(isInteger())), hasRHS(hasType(pointsTo(qualType()))));
7444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { 1[\"abc\"]; }", OperatorIntPointer));
7454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { \"abc\"[1]; }", OperatorIntPointer));
7464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7484967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchBinaryOperator, HasEitherOperand) {
7494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher HasOperand =
7504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    binaryOperator(hasEitherOperand(cxxBoolLiteral(equals(false))));
7514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { true || false; }", HasOperand));
7534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { false && true; }", HasOperand));
7544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { true || true; }", HasOperand));
7554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7574967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, BinaryOperatorTypes) {
7584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Integration test that verifies the AST provides all binary operators in
7594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // a way we expect.
7604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: Operator ','
7614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("void x() { 3, 4; }", binaryOperator(hasOperatorName(","))));
7634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b; bool c = (b = true);",
7654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("="))));
7664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = 1 != 2;", binaryOperator(hasOperatorName("!="))));
7684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = 1 == 2;", binaryOperator(hasOperatorName("=="))));
7704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("bool b = 1 < 2;", binaryOperator(hasOperatorName("<"))));
7714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = 1 <= 2;", binaryOperator(hasOperatorName("<="))));
7734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 1 << 2;", binaryOperator(hasOperatorName("<<"))));
7754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 1; int j = (i <<= 2);",
7774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("<<="))));
7784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("bool b = 1 > 2;", binaryOperator(hasOperatorName(">"))));
7794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = 1 >= 2;", binaryOperator(hasOperatorName(">="))));
7814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 1 >> 2;", binaryOperator(hasOperatorName(">>"))));
7834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 1; int j = (i >>= 2);",
7854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName(">>="))));
7864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42 ^ 23;", binaryOperator(hasOperatorName("^"))));
7884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42; int j = (i ^= 42);",
7904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("^="))));
7914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42 % 23;", binaryOperator(hasOperatorName("%"))));
7934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42; int j = (i %= 42);",
7954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("%="))));
7964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = 42  &23;", binaryOperator(hasOperatorName("&"))));
7984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
7994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = true && false;",
8004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("&&"))));
8014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = true; bool c = (b &= false);",
8034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("&="))));
8044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = 42 | 23;", binaryOperator(hasOperatorName("|"))));
8064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = true || false;",
8084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("||"))));
8094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b = true; bool c = (b |= false);",
8114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("|="))));
8124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42  *23;", binaryOperator(hasOperatorName("*"))));
8144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42; int j = (i *= 23);",
8164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("*="))));
8174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42 / 23;", binaryOperator(hasOperatorName("/"))));
8194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42; int j = (i /= 23);",
8214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("/="))));
8224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42 + 23;", binaryOperator(hasOperatorName("+"))));
8244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42; int j = (i += 23);",
8264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("+="))));
8274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42 - 23;", binaryOperator(hasOperatorName("-"))));
8294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i = 42; int j = (i -= 23);",
8314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("-="))));
8324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("struct A { void x() { void (A::*a)(); (this->*a)(); } };",
8344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName("->*"))));
8354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("struct A { void x() { void (A::*a)(); ((*this).*a)(); } };",
8374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            binaryOperator(hasOperatorName(".*"))));
8384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Member expressions as operators are not supported in matches.
8404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("struct A { void x(A *a) { a->x(this); } };",
8424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               binaryOperator(hasOperatorName("->"))));
8434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Initializer assignments are not represented as operator equals.
8454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("bool b = true;", binaryOperator(hasOperatorName("="))));
8474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Array indexing is not represented as operator.
8494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int a[42]; void x() { a[23]; }", unaryOperator()));
8504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Overloaded operators do not match at all.
8524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
8534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct A { bool operator&&(const A &a) const { return false; } };"
8544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void x() { A a, b; a && b; }",
8554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    binaryOperator()));
8564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
8574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8584967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchUnaryOperator, HasOperatorName) {
8594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher OperatorNot = unaryOperator(hasOperatorName("!"));
8604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { !true; } ", OperatorNot));
8624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { true; } ", OperatorNot));
8634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
8644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8654967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchUnaryOperator, HasUnaryOperand) {
8664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher OperatorOnFalse =
8674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    unaryOperator(hasUnaryOperand(cxxBoolLiteral(equals(false))));
8684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { !false; }", OperatorOnFalse));
8704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { !true; }", OperatorOnFalse));
8714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
8724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8734967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, UnaryOperatorTypes) {
8744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Integration test that verifies the AST provides all unary operators in
8754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // a way we expect.
8764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("bool b = !true;", unaryOperator(hasOperatorName("!"))));
8774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool b; bool *p = &b;", unaryOperator(hasOperatorName("&"))));
8794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int i = ~ 1;", unaryOperator(hasOperatorName("~"))));
8804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("bool *p; bool b = *p;", unaryOperator(hasOperatorName("*"))));
8824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i; int j = +i;", unaryOperator(hasOperatorName("+"))));
8844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i; int j = -i;", unaryOperator(hasOperatorName("-"))));
8864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i; int j = ++i;", unaryOperator(hasOperatorName("++"))));
8884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i; int j = i++;", unaryOperator(hasOperatorName("++"))));
8904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i; int j = --i;", unaryOperator(hasOperatorName("--"))));
8924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
8934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("int i; int j = i--;", unaryOperator(hasOperatorName("--"))));
8944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // We don't match conversion operators.
8964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int i; double d = (double)i;", unaryOperator()));
8974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
8984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Function calls are not represented as operator.
8994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f(); void x() { f(); }", unaryOperator()));
9004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Overloaded operators do not match at all.
9024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: We probably want to add that.
9034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
9044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct A { bool operator!() const { return false; } };"
9054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void x() { A a; !a; }", unaryOperator(hasOperatorName("!"))));
9064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9084967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ArraySubscriptMatchers, ArrayIndex) {
9094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
9104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int i[2]; void f() { i[1] = 1; }",
9114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    arraySubscriptExpr(hasIndex(integerLiteral(equals(1))))));
9124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
9134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int i[2]; void f() { 1[i] = 1; }",
9144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    arraySubscriptExpr(hasIndex(integerLiteral(equals(1))))));
9154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
9164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int i[2]; void f() { i[1] = 1; }",
9174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    arraySubscriptExpr(hasIndex(integerLiteral(equals(0))))));
9184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ArraySubscriptMatchers, MatchesArrayBase) {
9214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
9224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int i[2]; void f() { i[1] = 2; }",
9234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    arraySubscriptExpr(hasBase(implicitCastExpr(
9244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      hasSourceExpression(declRefExpr()))))));
9254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9274967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, OfClass) {
9284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher Constructor = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
9294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ofClass(hasName("X")))));
9304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
9324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X { public: X(); }; void x(int) { X x; }", Constructor));
9334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
9344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("class X { public: X(); }; void x(int) { X x = X(); }",
9354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            Constructor));
9364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
9374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("class Y { public: Y(); }; void x(int) { Y y; }",
9384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               Constructor));
9394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9414967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, VisitsTemplateInstantiations) {
9424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
9434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { public: void x(); };"
9444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "template <typename T> class B { public: void y() { T t; t.x(); } };"
9454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f() { B<A> b; b.y(); }",
9464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    callExpr(callee(cxxMethodDecl(hasName("x"))))));
9474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
9494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { public: void x(); };"
9504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class C {"
9514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      " public:"
9524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  template <typename T> class B { public: void y() { T t; t.x(); } };"
9534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};"
9544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f() {"
9554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  C::B<A> b; b.y();"
9564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}",
9574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"), hasDescendant(callExpr(
9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      callee(cxxMethodDecl(hasName("x"))))))));
9594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9614967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, HasCondition) {
9624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher IfStmt =
9634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ifStmt(hasCondition(cxxBoolLiteral(equals(true))));
9644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { if (true) {} }", IfStmt));
9654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { if (false) {} }", IfStmt));
9664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher ForStmt =
9684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    forStmt(hasCondition(cxxBoolLiteral(equals(true))));
9694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { for (;true;) {} }", ForStmt));
9704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { for (;false;) {} }", ForStmt));
9714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher WhileStmt =
9734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    whileStmt(hasCondition(cxxBoolLiteral(equals(true))));
9744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { while (true) {} }", WhileStmt));
9754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { while (false) {} }", WhileStmt));
9764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher SwitchStmt =
9784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    switchStmt(hasCondition(integerLiteral(equals(42))));
9794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { switch (42) {case 42:;} }", SwitchStmt));
9804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { switch (43) {case 43:;} }", SwitchStmt));
9814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9834967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(For, ForLoopInternals) {
9844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f(){ int i; for (; i < 3 ; ); }",
9854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      forStmt(hasCondition(anything()))));
9864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { for (int i = 0; ;); }",
9874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      forStmt(hasLoopInit(anything()))));
9884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9904967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(For, ForRangeLoopInternals) {
9914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f(){ int a[] {1, 2}; for (int i : a); }",
9924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxForRangeStmt(hasLoopVariable(anything()))));
9934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
9944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f(){ int a[] {1, 2}; for (int i : a); }",
9954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxForRangeStmt(hasRangeInit(declRefExpr(to(varDecl(hasName("a"))))))));
9964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
9974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(For, NegativeForLoopInternals) {
9994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f(){ for (int i = 0; ; ++i); }",
10004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         forStmt(hasCondition(expr()))));
10014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() {int i; for (; i < 4; ++i) {} }",
10024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         forStmt(hasLoopInit(anything()))));
10034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10054967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasBody, FindsBodyOfForWhileDoLoops) {
10064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { for(;;) {} }",
10074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      forStmt(hasBody(compoundStmt()))));
10084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() { for(;;); }",
10094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         forStmt(hasBody(compoundStmt()))));
10104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { while(true) {} }",
10114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      whileStmt(hasBody(compoundStmt()))));
10124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { do {} while(true); }",
10134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      doStmt(hasBody(compoundStmt()))));
10144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { int p[2]; for (auto x : p) {} }",
10154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxForRangeStmt(hasBody(compoundStmt()))));
10164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() {}", functionDecl(hasBody(compoundStmt()))));
10174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f();", functionDecl(hasBody(compoundStmt()))));
10184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f(); void f() {}",
10194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      functionDecl(hasBody(compoundStmt()))));
10204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10224967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnySubstatement, MatchesForTopLevelCompoundStatement) {
10234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // The simplest case: every compound statement is in a function
10244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // definition, and the function body itself must be a compound
10254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // statement.
10264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { for (;;); }",
10274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      compoundStmt(hasAnySubstatement(forStmt()))));
10284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10304967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnySubstatement, IsNotRecursive) {
10314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // It's really "has any immediate substatement".
10324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() { if (true) for (;;); }",
10334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         compoundStmt(hasAnySubstatement(forStmt()))));
10344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10364967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnySubstatement, MatchesInNestedCompoundStatements) {
10374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { if (true) { for (;;); } }",
10384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      compoundStmt(hasAnySubstatement(forStmt()))));
10394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10414967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAnySubstatement, FindsSubstatementBetweenOthers) {
10424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() { 1; 2; 3; for (;;); 4; 5; 6; }",
10434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      compoundStmt(hasAnySubstatement(forStmt()))));
10444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10464967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Member, MatchesMemberAllocationFunction) {
10474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Fails in C++11 mode
10484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchesConditionally(
10494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace std { typedef typeof(sizeof(int)) size_t; }"
10504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class X { void *operator new(std::size_t); };",
10514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxMethodDecl(ofClass(hasName("X"))), true, "-std=gnu++98"));
10524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class X { void operator delete(void*); };",
10544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxMethodDecl(ofClass(hasName("X")))));
10554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Fails in C++11 mode
10574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchesConditionally(
10584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace std { typedef typeof(sizeof(int)) size_t; }"
10594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class X { void operator delete[](void*, std::size_t); };",
10604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxMethodDecl(ofClass(hasName("X"))), true, "-std=gnu++98"));
10614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10634967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasDestinationType, MatchesSimpleCase) {
10644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("char* p = static_cast<char*>(0);",
10654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      cxxStaticCastExpr(hasDestinationType(
10664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        pointsTo(TypeMatcher(anything()))))));
10674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10694967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasImplicitDestinationType, MatchesSimpleCase) {
10704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implicit const cast.
10714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x; const int i = x;",
10724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      implicitCastExpr(
10734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasImplicitDestinationType(isInteger()))));
10744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implicit array-to-pointer cast.
10754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int arr[3]; int *p = arr;",
10764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      implicitCastExpr(hasImplicitDestinationType(
10774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        pointsTo(TypeMatcher(anything()))))));
10784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10804967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasImplicitDestinationType, DoesNotMatchIncorrectly) {
10814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implicit cast from int to char.
10824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("char c = 0;",
10834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         implicitCastExpr(hasImplicitDestinationType(
10844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything())))));
10854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implicit array-to-pointer cast.
10864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int arr[3]; int *p = arr;",
10874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         implicitCastExpr(hasImplicitDestinationType(
10884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything())))));
10894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10914967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringImplicit, MatchesImplicit) {
10924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class C {}; C a = C();",
10934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(has(ignoringImplicit(cxxConstructExpr())))));
10944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
10954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
10964967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringImplicit, DoesNotMatchIncorrectly) {
10974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
10984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      notMatches("class C {}; C a = C();", varDecl(has(cxxConstructExpr()))));
10994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11014967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringImpCasts, MatchesImpCasts) {
11024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test checks that ignoringImpCasts matches when implicit casts are
11034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // present and its inner matcher alone does not match.
11044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Note that this test creates an implicit const cast.
11054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = 0; const int y = x;",
11064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringImpCasts(
11074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        declRefExpr(to(varDecl(hasName("x")))))))));
11084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implict cast from int to char.
11094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("char x = 0;",
11104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringImpCasts(
11114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
11124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11144967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringImpCasts, DoesNotMatchIncorrectly) {
11154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // These tests verify that ignoringImpCasts does not match if the inner
11164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // matcher does not match.
11174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Note that the first test creates an implicit const cast.
11184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int x; const int y = x;",
11194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringImpCasts(
11204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything()))))));
11214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int x; int y = x;",
11224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringImpCasts(
11234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything()))))));
11244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // These tests verify that ignoringImplictCasts does not look through explicit
11264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // casts or parentheses.
11274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);",
11284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringImpCasts(
11294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           integerLiteral())))));
11304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int i = (0);",
11314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringImpCasts(
11324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           integerLiteral())))));
11334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("float i = (float)0;",
11344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringImpCasts(
11354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           integerLiteral())))));
11364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("float i = float(0);",
11374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringImpCasts(
11384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           integerLiteral())))));
11394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11414967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringImpCasts, MatchesWithoutImpCasts) {
11424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test verifies that expressions that do not have implicit casts
11434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // still match the inner matcher.
11444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = 0; int &y = x;",
11454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringImpCasts(
11464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        declRefExpr(to(varDecl(hasName("x")))))))));
11474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11494967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringParenCasts, MatchesParenCasts) {
11504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test checks that ignoringParenCasts matches when parentheses and/or
11514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // casts are present and its inner matcher alone does not match.
11524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = (0);",
11534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenCasts(
11544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
11554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = (((((0)))));",
11564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenCasts(
11574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
11584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implict cast from int to char in addition to the
11604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // parentheses.
11614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("char x = (0);",
11624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenCasts(
11634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
11644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("char x = (char)0;",
11664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenCasts(
11674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
11684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("char* p = static_cast<char*>(0);",
11694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenCasts(
11704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
11714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11734967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringParenCasts, MatchesWithoutParenCasts) {
11744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test verifies that expressions that do not have any casts still match.
11754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = 0;",
11764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenCasts(
11774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
11784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11804967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringParenCasts, DoesNotMatchIncorrectly) {
11814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // These tests verify that ignoringImpCasts does not match if the inner
11824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // matcher does not match.
11834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("int x = ((0));",
11844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringParenCasts(
11854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything()))))));
11864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implicit cast from int to char in addition to the
11884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // parentheses.
11894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("char x = ((0));",
11904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringParenCasts(
11914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything()))))));
11924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("char *x = static_cast<char *>((0));",
11944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringParenCasts(
11954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything()))))));
11964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
11984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringParenAndImpCasts, MatchesParenImpCasts) {
11994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test checks that ignoringParenAndImpCasts matches when
12004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // parentheses and/or implicit casts are present and its inner matcher alone
12014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // does not match.
12024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Note that this test creates an implicit const cast.
12034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = 0; const int y = x;",
12044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenImpCasts(
12054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        declRefExpr(to(varDecl(hasName("x")))))))));
12064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implicit cast from int to char.
12074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("const char x = (0);",
12084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenImpCasts(
12094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
12104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12124967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringParenAndImpCasts, MatchesWithoutParenImpCasts) {
12134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test verifies that expressions that do not have parentheses or
12144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // implicit casts still match.
12154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = 0; int &y = x;",
12164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenImpCasts(
12174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        declRefExpr(to(varDecl(hasName("x")))))))));
12184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int x = 0;",
12194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      varDecl(hasInitializer(ignoringParenImpCasts(
12204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        integerLiteral(equals(0)))))));
12214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12234967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(IgnoringParenAndImpCasts, DoesNotMatchIncorrectly) {
12244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // These tests verify that ignoringParenImpCasts does not match if
12254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // the inner matcher does not match.
12264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // This test creates an implicit cast.
12274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("char c = ((3));",
12284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringParenImpCasts(
12294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           unless(anything()))))));
12304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // These tests verify that ignoringParenAndImplictCasts does not look
12314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // through explicit casts.
12324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("float y = (float(0));",
12334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringParenImpCasts(
12344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           integerLiteral())))));
12354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("float y = (float)0;",
12364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringParenImpCasts(
12374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           integerLiteral())))));
12384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);",
12394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         varDecl(hasInitializer(ignoringParenImpCasts(
12404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           integerLiteral())))));
12414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12434967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasSourceExpression, MatchesImplicitCasts) {
12444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("class string {}; class URL { public: URL(string s); };"
12454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "void r() {string a_string; URL url = a_string; }",
12464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      implicitCastExpr(
12474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasSourceExpression(cxxConstructExpr()))));
12484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12504967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasSourceExpression, MatchesExplicitCasts) {
12514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("float x = static_cast<float>(42);",
12524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      explicitCastExpr(
12534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasSourceExpression(hasDescendant(
12544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          expr(integerLiteral()))))));
12554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12574967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(UsingDeclaration, MatchesSpecificTarget) {
12584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("namespace f { int a; void b(); } using f::b;",
12594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      usingDecl(hasAnyUsingShadowDecl(
12604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasTargetDecl(functionDecl())))));
12614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("namespace f { int a; void b(); } using f::a;",
12624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         usingDecl(hasAnyUsingShadowDecl(
12634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           hasTargetDecl(functionDecl())))));
12644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12664967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(UsingDeclaration, ThroughUsingDeclaration) {
12674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
12684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace a { void f(); } using a::f; void g() { f(); }",
12694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    declRefExpr(throughUsingDecl(anything()))));
12704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
12714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace a { void f(); } using a::f; void g() { a::f(); }",
12724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    declRefExpr(throughUsingDecl(anything()))));
12734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12754967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(SingleDecl, IsSingleDecl) {
12764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher SingleDeclStmt =
12774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    declStmt(hasSingleDecl(varDecl(hasInitializer(anything()))));
12784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() {int a = 4;}", SingleDeclStmt));
12794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() {int a;}", SingleDeclStmt));
12804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() {int a = 4, b = 3;}",
12814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         SingleDeclStmt));
12824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12844967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(DeclStmt, ContainsDeclaration) {
12854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher MatchesInit = varDecl(hasInitializer(anything()));
12864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() {int a = 4;}",
12884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      declStmt(containsDeclaration(0, MatchesInit))));
12894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() {int a = 4, b = 3;}",
12904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      declStmt(containsDeclaration(0, MatchesInit),
12914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               containsDeclaration(1, MatchesInit))));
12924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned WrongIndex = 42;
12934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void f() {int a = 4, b = 3;}",
12944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         declStmt(containsDeclaration(WrongIndex,
12954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                      MatchesInit))));
12964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
12974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(SwitchCase, MatchesEachCase) {
12994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { switch(42); }",
13004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         switchStmt(forEachSwitchCase(caseStmt()))));
13014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { switch(42) case 42:; }",
13024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      switchStmt(forEachSwitchCase(caseStmt()))));
13034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { switch(42) { case 42:; } }",
13044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      switchStmt(forEachSwitchCase(caseStmt()))));
13054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
13064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x() { if (1) switch(42) { case 42: switch (42) { default:; } } }",
13074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ifStmt(has(switchStmt(forEachSwitchCase(defaultStmt()))))));
13084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void x() { switch(42) { case 1+1: case 4:; } }",
13094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      switchStmt(forEachSwitchCase(
13104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        caseStmt(hasCaseConstant(integerLiteral()))))));
13114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { switch(42) { case 1+1: case 2+2:; } }",
13124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         switchStmt(forEachSwitchCase(
13134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           caseStmt(hasCaseConstant(integerLiteral()))))));
13144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches("void x() { switch(42) { case 1 ... 2:; } }",
13154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         switchStmt(forEachSwitchCase(
13164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           caseStmt(hasCaseConstant(integerLiteral()))))));
13174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
13184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x() { switch (42) { case 1: case 2: case 3: default:; } }",
13194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    switchStmt(forEachSwitchCase(caseStmt().bind("x"))),
13204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<CaseStmt>>("x", 3)));
13214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13234967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachConstructorInitializer, MatchesInitializers) {
13244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
13254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct X { X() : i(42), j(42) {} int i, j; };",
13264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxConstructorDecl(forEachConstructorInitializer(cxxCtorInitializer()))));
13274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13294967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasConditionVariableStatement, DoesNotMatchCondition) {
13304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
13314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x() { if(true) {} }",
13324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ifStmt(hasConditionVariableStatement(declStmt()))));
13334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
13344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x() { int x; if((x = 42)) {} }",
13354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ifStmt(hasConditionVariableStatement(declStmt()))));
13364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13384967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasConditionVariableStatement, MatchesConditionVariables) {
13394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
13404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x() { if(int* a = 0) {} }",
13414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ifStmt(hasConditionVariableStatement(declStmt()))));
13424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13444967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEach, BindsOneNode) {
13454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue("class C { int x; };",
13464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       recordDecl(hasName("C"), forEach(fieldDecl(hasName("x")).bind("x"))),
13474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("x", 1)));
13484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13504967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEach, BindsMultipleNodes) {
13514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue("class C { int x; int y; int z; };",
13524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       recordDecl(hasName("C"), forEach(fieldDecl().bind("f"))),
13534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 3)));
13544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13564967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEach, BindsRecursiveCombinations) {
13574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
13584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class C { class D { int x; int y; }; class E { int y; int z; }; };",
13594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"),
13604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               forEach(recordDecl(forEach(fieldDecl().bind("f"))))),
13614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 4)));
13624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13644967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachDescendant, BindsOneNode) {
13654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue("class C { class D { int x; }; };",
13664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       recordDecl(hasName("C"),
13674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                  forEachDescendant(fieldDecl(hasName("x")).bind("x"))),
13684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("x", 1)));
13694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13714967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachDescendant, NestedForEachDescendant) {
13724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  DeclarationMatcher m = recordDecl(
13734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    isDefinition(), decl().bind("x"), hasName("C"));
13744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
13754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { class B { class C {}; }; };",
13764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("A"), anyOf(m, forEachDescendant(m))),
13774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", "C")));
13784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Check that a partial match of 'm' that binds 'x' in the
13804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // first part of anyOf(m, anything()) will not overwrite the
13814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // binding created by the earlier binding in the hasDescendant.
13824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
13834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { class B { class C {}; }; };",
13844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("A"), allOf(hasDescendant(m), anyOf(m, anything()))),
13854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", "C")));
13864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13884967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachDescendant, BindsMultipleNodes) {
13894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
13904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class C { class D { int x; int y; }; "
13914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "          class E { class F { int y; int z; }; }; };",
13924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"), forEachDescendant(fieldDecl().bind("f"))),
13934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 4)));
13944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
13954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
13964967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachDescendant, BindsRecursiveCombinations) {
13974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
13984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class C { class D { "
13994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "          class E { class F { class G { int y; int z; }; }; }; }; };",
14004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"), forEachDescendant(recordDecl(
14014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      forEachDescendant(fieldDecl().bind("f"))))),
14024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("f", 8)));
14034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
14044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
14054967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachDescendant, BindsCombinations) {
14064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { if(true) {} if (true) {} while (true) {} if (true) {} while "
14084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "(true) {} }",
14094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    compoundStmt(forEachDescendant(ifStmt().bind("if")),
14104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 forEachDescendant(whileStmt().bind("while"))),
14114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<IfStmt>>("if", 6)));
14124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
14134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
14144967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Has, DoesNotDeleteBindings) {
14154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { int a; };", recordDecl(decl().bind("x"), has(fieldDecl())),
14174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
14194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
14204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(LoopingMatchers, DoNotOverwritePreviousMatchResultOnFailure) {
14214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Those matchers cover all the cases where an inner matcher is called
14224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // and there is not a 1:1 relationship between the match of the outer
14234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // matcher and the match of the inner matcher.
14244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // The pattern to look for is:
14254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //   ... return InnerMatcher.matches(...); ...
14264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // In which case no special handling is needed.
14274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //
14284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // On the other hand, if there are multiple alternative matches
14294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // (for example forEach*) or matches might be discarded (for example has*)
14304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // the implementation must make sure that the discarded matches do not
14314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // affect the bindings.
14324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // When new such matchers are added, add a test here that:
14334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // - matches a simple node, and binds it as the first thing in the matcher:
14344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //     recordDecl(decl().bind("x"), hasName("X")))
14354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // - uses the matcher under test afterwards in a way that not the first
14364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //   alternative is matched; for anyOf, that means the first branch
14374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //   would need to return false; for hasAncestor, it means that not
14384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //   the direct parent matches the inner matcher.
14394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
14404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { int y; };",
14424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(
14434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      recordDecl().bind("x"), hasName("::X"),
14444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      anyOf(forEachDescendant(recordDecl(hasName("Y"))), anything())),
14454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("x", 1)));
14464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X {};", recordDecl(recordDecl().bind("x"), hasName("::X"),
14484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              anyOf(unless(anything()), anything())),
14494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("x", 1)));
14504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template<typename T1, typename T2> class X {}; X<float, int> x;",
14524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    classTemplateSpecializationDecl(
14534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      decl().bind("x"),
14544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      hasAnyTemplateArgument(refersToType(asString("int")))),
14554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { void f(); void g(); };",
14584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxRecordDecl(decl().bind("x"), hasMethod(hasName("g"))),
14594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { X() : a(1), b(2) {} double a; int b; };",
14624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(decl().bind("x"),
14634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               has(cxxConstructorDecl(
14644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 hasAnyConstructorInitializer(forField(hasName("b")))))),
14654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x(int, int) { x(0, 42); }",
14684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    callExpr(expr().bind("x"), hasAnyArgument(integerLiteral(equals(42)))),
14694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Expr>>("x", 1)));
14704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x(int, int y) {}",
14724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    functionDecl(decl().bind("x"), hasAnyParameter(hasName("y"))),
14734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void x() { return; if (true) {} }",
14764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    functionDecl(decl().bind("x"),
14774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 has(compoundStmt(hasAnySubstatement(ifStmt())))),
14784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace X { void b(int); void b(); }"
14814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "using X::b;",
14824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    usingDecl(decl().bind("x"), hasAnyUsingShadowDecl(hasTargetDecl(
14834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      functionDecl(parameterCountIs(1))))),
14844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A{}; class B{}; class C : B, A {};",
14874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxRecordDecl(decl().bind("x"), isDerivedFrom("::A")),
14884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A{}; typedef A B; typedef A C; typedef A D;"
14914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class E : A {};",
14924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxRecordDecl(decl().bind("x"), isDerivedFrom("C")),
14934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { class B { void f() {} }; };",
14964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    functionDecl(decl().bind("x"), hasAncestor(recordDecl(hasName("::A")))),
14974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
14984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
14994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct A { struct B {"
15004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  void f() { if(true) {} }"
15014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}; };"
15024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void t() { A<int>::B b; b.f(); }",
15034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ifStmt(stmt().bind("x"), hasAncestor(recordDecl(hasName("::A")))),
15044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Stmt>>("x", 2)));
15054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A {};",
15074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("::A"), decl().bind("x"), unless(hasName("fooble"))),
15084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
15094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { A() : s(), i(42) {} const char *s; int i; };",
15114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxConstructorDecl(hasName("::A::A"), decl().bind("x"),
15124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       forEachConstructorInitializer(forField(hasName("i")))),
15134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("x", 1)));
15144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15164967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ForEachDescendant, BindsCorrectNodes) {
15174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class C { void f(); int i; };",
15194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"), forEachDescendant(decl().bind("decl"))),
15204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("decl", 1)));
15214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class C { void f() {} int i; };",
15234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"), forEachDescendant(decl().bind("decl"))),
15244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("decl", 1)));
15254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15274967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(FindAll, BindsNodeOnMatch) {
15284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A {};",
15304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("::A"), findAll(recordDecl(hasName("::A")).bind("v"))),
15314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("v", 1)));
15324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15344967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(FindAll, BindsDescendantNodeOnMatch) {
15354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { int a; int b; };",
15374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("::A"), findAll(fieldDecl().bind("v"))),
15384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<FieldDecl>>("v", 2)));
15394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15414967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(FindAll, BindsNodeAndDescendantNodesOnOneMatch) {
15424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { int a; int b; };",
15444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("::A"),
15454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               findAll(decl(anyOf(recordDecl(hasName("::A")).bind("v"),
15464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  fieldDecl().bind("v"))))),
15474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<Decl>>("v", 3)));
15484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { class B {}; class C {}; };",
15514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("v"))),
15524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("v", 3)));
15534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15554967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncenstor, MatchesDeclarationAncestors) {
15564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
15574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { class B { class C {}; }; };",
15584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"), hasAncestor(recordDecl(hasName("A"))))));
15594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15614967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncenstor, FailsIfNoAncestorMatches) {
15624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
15634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { class B { class C {}; }; };",
15644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    recordDecl(hasName("C"), hasAncestor(recordDecl(hasName("X"))))));
15654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15674967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, MatchesDeclarationsThatGetVisitedLater) {
15684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
15694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class A { class B { void f() { C c; } class C {}; }; };",
15704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    varDecl(hasName("c"), hasType(recordDecl(hasName("C"),
15714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                             hasAncestor(recordDecl(hasName("A"))))))));
15724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15744967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncenstor, MatchesStatementAncestors) {
15754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
15764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { if (true) { while (false) { 42; } } }",
15774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    integerLiteral(equals(42), hasAncestor(ifStmt()))));
15784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15804967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, DrillsThroughDifferentHierarchies) {
15814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
15824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { if (true) { int x = 42; } }",
15834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    integerLiteral(equals(42), hasAncestor(functionDecl(hasName("f"))))));
15844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15864967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, BindsRecursiveCombinations) {
15874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class C { class D { class E { class F { int y; }; }; }; };",
15894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    fieldDecl(hasAncestor(recordDecl(hasAncestor(recordDecl().bind("r"))))),
15904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("r", 1)));
15914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
15924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
15934967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, BindsCombinationsWithHasDescendant) {
15944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
15954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class C { class D { class E { class F { int y; }; }; }; };",
15964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    fieldDecl(hasAncestor(
15974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      decl(
15984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        hasDescendant(recordDecl(isDefinition(),
15994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 hasAncestor(recordDecl())))
16004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ).bind("d")
16014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    )),
16024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<CXXRecordDecl>>("d", "E")));
16034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16054967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, MatchesClosestAncestor) {
16064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
16074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct C {"
16084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  void f(int) {"
16094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    struct I { void g(T) { int x; } } i; i.g(42);"
16104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  }"
16114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};"
16124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "template struct C<int>;",
16134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    varDecl(hasName("x"),
16144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            hasAncestor(functionDecl(hasParameter(
16154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              0, varDecl(hasType(asString("int"))))).bind("f"))).bind("v"),
16164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<FunctionDecl>>("f", "g", 2)));
16174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16194967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, MatchesInTemplateInstantiations) {
16204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
16214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct A { struct B { struct C { T t; }; }; }; "
16224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "A<int>::B::C a;",
16234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    fieldDecl(hasType(asString("int")),
16244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              hasAncestor(recordDecl(hasName("A"))))));
16254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16274967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, MatchesInImplicitCode) {
16284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
16294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct X {}; struct A { A() {} X x; };",
16304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    cxxConstructorDecl(
16314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      hasAnyConstructorInitializer(withInitializer(expr(
16324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        hasAncestor(recordDecl(hasName("A")))))))));
16334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16354967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasParent, MatchesOnlyParent) {
16364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
16374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { if (true) { int x = 42; } }",
16384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    compoundStmt(hasParent(ifStmt()))));
16394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
16404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { for (;;) { int x = 42; } }",
16414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    compoundStmt(hasParent(ifStmt()))));
16424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
16434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { if (true) for (;;) { int x = 42; } }",
16444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    compoundStmt(hasParent(ifStmt()))));
16454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16474967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, MatchesAllAncestors) {
16484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
16494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct C { static void f() { 42; } };"
16504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void t() { C<int>::f(); }",
16514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    integerLiteral(
16524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      equals(42),
16534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      allOf(
16544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        hasAncestor(cxxRecordDecl(isTemplateInstantiation())),
16554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        hasAncestor(cxxRecordDecl(unless(isTemplateInstantiation())))))));
16564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16584967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, ImplicitArrayCopyCtorDeclRefExpr) {
16594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("struct MyClass {\n"
16604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  int c[1];\n"
16614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  static MyClass Create() { return MyClass(); }\n"
16624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "};",
16634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      declRefExpr(to(decl(hasAncestor(decl()))))));
16644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16664967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, AnonymousUnionMemberExpr) {
16674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int F() {\n"
16684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  union { int i; };\n"
16694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  return i;\n"
16704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "}\n",
16714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      memberExpr(member(hasAncestor(decl())))));
16724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() {\n"
16734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  struct {\n"
16744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "    struct { int a; int b; };\n"
16754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  } s;\n"
16764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  s.a = 4;\n"
16774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "}\n",
16784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      memberExpr(member(hasAncestor(decl())))));
16794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("void f() {\n"
16804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  struct {\n"
16814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "    struct { int a; int b; };\n"
16824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  } s;\n"
16834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  s.a = 4;\n"
16844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "}\n",
16854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      declRefExpr(to(decl(hasAncestor(decl()))))));
16864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16874967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, NonParmDependentTemplateParmVarDeclRefExpr) {
16884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("struct PartitionAllocator {\n"
16894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  template<typename T>\n"
16904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  static int quantizedSize(int count) {\n"
16914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "    return count;\n"
16924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  }\n"
16934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "  void f() { quantizedSize<int>(10); }\n"
16944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "};",
16954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      declRefExpr(to(decl(hasAncestor(decl()))))));
16964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
16974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
16984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasAncestor, AddressOfExplicitSpecializationFunction) {
16994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("template <class T> void f();\n"
17004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "template <> void f<int>();\n"
17014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        "void (*get_f())() { return f<int>; }\n",
17024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      declRefExpr(to(decl(hasAncestor(decl()))))));
17034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
17044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17054967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasParent, MatchesAllParents) {
17064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
17074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct C { static void f() { 42; } };"
17084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void t() { C<int>::f(); }",
17094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    integerLiteral(
17104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      equals(42),
17114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      hasParent(compoundStmt(hasParent(functionDecl(
17124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        hasParent(cxxRecordDecl(isTemplateInstantiation())))))))));
17134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
17144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches("template <typename T> struct C { static void f() { 42; } };"
17154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              "void t() { C<int>::f(); }",
17164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            integerLiteral(
17174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              equals(42),
17184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              hasParent(compoundStmt(hasParent(functionDecl(hasParent(
17194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                cxxRecordDecl(unless(isTemplateInstantiation()))))))))));
17204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
17214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> struct C { static void f() { 42; } };"
17224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void t() { C<int>::f(); }",
17234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    integerLiteral(equals(42),
17244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                   hasParent(compoundStmt(
17254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     allOf(hasParent(functionDecl(hasParent(
17264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                       cxxRecordDecl(isTemplateInstantiation())))),
17274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           hasParent(functionDecl(hasParent(cxxRecordDecl(
17284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             unless(isTemplateInstantiation())))))))))));
17294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
17304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches("template <typename T> struct C { static void f() {} };"
17314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 "void t() { C<int>::f(); }",
17324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               compoundStmt(hasParent(recordDecl()))));
17334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
17344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17354967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(HasParent, NoDuplicateParents) {
17364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class HasDuplicateParents : public BoundNodesCallback {
17374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
17384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool run(const BoundNodes *Nodes) override { return false; }
17394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool run(const BoundNodes *Nodes, ASTContext *Context) override {
17404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      const Stmt *Node = Nodes->getNodeAs<Stmt>("node");
17414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      std::set<const void *> Parents;
17424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      for (const auto &Parent : Context->getParents(*Node)) {
17434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (!Parents.insert(Parent.getMemoizationData()).second) {
17444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          return true;
17454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        }
17464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
17474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return false;
17484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
17494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
17504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_FALSE(matchAndVerifyResultTrue(
17514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "template <typename T> int Foo() { return 1 + 2; }\n"
17524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "int x = Foo<int>() + Foo<unsigned>();",
17534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    stmt().bind("node"), llvm::make_unique<HasDuplicateParents>()));
17544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
17554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17564967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(TypeMatching, PointeeTypes) {
17574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int b; int &a = b;",
17584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      referenceType(pointee(builtinType()))));
17594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int *a;", pointerType(pointee(builtinType()))));
17604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int *a;",
17624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      loc(pointerType(pointee(builtinType())))));
17634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
17654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int const *A;",
17664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    pointerType(pointee(isConstQualified(), builtinType()))));
17674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
17684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "int *A;",
17694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    pointerType(pointee(isConstQualified(), builtinType()))));
17704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
17714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17724967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ElaboratedTypeNarrowing, hasQualifier) {
17734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
17744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace N {"
17754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  namespace M {"
17764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    class D {};"
17774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  }"
17784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}"
17794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "N::M::D d;",
17804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))))));
17814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
17824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace M {"
17834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  class D {};"
17844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}"
17854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "M::D d;",
17864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))))));
17874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
17884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct D {"
17894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "} d;",
17904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    elaboratedType(hasQualifier(nestedNameSpecifier()))));
17914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
17924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
17934967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(ElaboratedTypeNarrowing, namesType) {
17944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
17954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace N {"
17964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  namespace M {"
17974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    class D {};"
17984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  }"
17994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}"
18004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "N::M::D d;",
18014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    elaboratedType(elaboratedType(namesType(recordType(
18024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      hasDeclaration(namedDecl(hasName("D")))))))));
18034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
18044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace M {"
18054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  class D {};"
18064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}"
18074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "M::D d;",
18084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    elaboratedType(elaboratedType(namesType(typedefType())))));
18094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18114967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(NNS, BindsNestedNameSpecifiers) {
18124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
18134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace ns { struct E { struct B {}; }; } ns::E::B b;",
18144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifier(specifiesType(asString("struct ns::E"))).bind("nns"),
18154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifier>>(
18164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "nns", "ns::struct E::")));
18174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18194967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(NNS, BindsNestedNameSpecifierLocs) {
18204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
18214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace ns { struct B {}; } ns::B b;",
18224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    loc(nestedNameSpecifier()).bind("loc"),
18234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifierLoc>>("loc", 1)));
18244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18264967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(NNS, DescendantsOfNestedNameSpecifiers) {
18274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Fragment =
18284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace a { struct A { struct B { struct C {}; }; }; };"
18294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f() { a::A::B::C c; }";
18304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
18314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifier(specifiesType(asString("struct a::A::B")),
18334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        hasDescendant(nestedNameSpecifier(
18344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          specifiesNamespace(hasName("a")))))));
18354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
18364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifier(specifiesType(asString("struct a::A::B")),
18384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        has(nestedNameSpecifier(
18394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          specifiesNamespace(hasName("a")))))));
18404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
18414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifier(specifiesType(asString("struct a::A")),
18434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        has(nestedNameSpecifier(
18444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          specifiesNamespace(hasName("a")))))));
18454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Not really useful because a NestedNameSpecifier can af at most one child,
18474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // but to complete the interface.
18484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
18494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifier(specifiesType(asString("struct a::A::B")),
18514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                        forEach(nestedNameSpecifier().bind("x"))),
18524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifier>>("x", 1)));
18534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18554967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(NNS, NestedNameSpecifiersAsDescendants) {
18564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Fragment =
18574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace a { struct A { struct B { struct C {}; }; }; };"
18584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f() { a::A::B::C c; }";
18594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
18604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    decl(hasDescendant(nestedNameSpecifier(specifiesType(
18624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      asString("struct a::A")))))));
18634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
18644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    functionDecl(hasName("f"),
18664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 forEachDescendant(nestedNameSpecifier().bind("x"))),
18674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Nested names: a, a::A and a::A::B.
18684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifier>>("x", 3)));
18694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18714967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(NNSLoc, DescendantsOfNestedNameSpecifierLocs) {
18724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Fragment =
18734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace a { struct A { struct B { struct C {}; }; }; };"
18744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f() { a::A::B::C c; }";
18754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
18764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A::B"))),
18784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           hasDescendant(loc(nestedNameSpecifier(
18794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             specifiesNamespace(hasName("a"))))))));
18804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(
18814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A::B"))),
18834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           has(loc(nestedNameSpecifier(
18844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             specifiesNamespace(hasName("a"))))))));
18854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
18864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A"))),
18884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           has(loc(nestedNameSpecifier(
18894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                             specifiesNamespace(hasName("a"))))))));
18904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
18924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
18934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nestedNameSpecifierLoc(loc(specifiesType(asString("struct a::A::B"))),
18944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           forEach(nestedNameSpecifierLoc().bind("x"))),
18954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifierLoc>>("x", 1)));
18964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
18974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
18984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(NNSLoc, NestedNameSpecifierLocsAsDescendants) {
18994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Fragment =
19004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "namespace a { struct A { struct B { struct C {}; }; }; };"
19014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "void f() { a::A::B::C c; }";
19024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(
19034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
19044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    decl(hasDescendant(loc(nestedNameSpecifier(specifiesType(
19054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      asString("struct a::A"))))))));
19064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
19074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Fragment,
19084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    functionDecl(hasName("f"),
19094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 forEachDescendant(nestedNameSpecifierLoc().bind("x"))),
19104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Nested names: a, a::A and a::A::B.
19114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyIdIsBoundTo<NestedNameSpecifierLoc>>("x", 3)));
19124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
19134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T> class VerifyMatchOnNode : public BoundNodesCallback {
19144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
19154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  VerifyMatchOnNode(StringRef Id, const internal::Matcher<T> &InnerMatcher,
19164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                    StringRef InnerId)
19174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : Id(Id), InnerMatcher(InnerMatcher), InnerId(InnerId) {
19184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
19194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
19204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool run(const BoundNodes *Nodes) override { return false; }
19214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
19224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool run(const BoundNodes *Nodes, ASTContext *Context) override {
19234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const T *Node = Nodes->getNodeAs<T>(Id);
19244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return selectFirst<T>(InnerId, match(InnerMatcher, *Node, *Context)) !=
19254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      nullptr;
19264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
19274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprivate:
19284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Id;
19294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  internal::Matcher<T> InnerMatcher;
19304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string InnerId;
19314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
19324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
19334967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchFinder, CanMatchDeclarationsRecursively) {
19344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
19354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
19364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyMatchOnNode<Decl>>(
19374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "X", decl(hasDescendant(recordDecl(hasName("X::Y")).bind("Y"))),
19384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "Y")));
19394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultFalse(
19404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
19414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyMatchOnNode<Decl>>(
19424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "X", decl(hasDescendant(recordDecl(hasName("X::Z")).bind("Z"))),
19434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "Z")));
19444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
19454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
19464967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchFinder, CanMatchStatementsRecursively) {
19474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
19484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { if (1) { for (;;) { } } }", ifStmt().bind("if"),
19494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyMatchOnNode<Stmt>>(
19504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "if", stmt(hasDescendant(forStmt().bind("for"))), "for")));
19514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultFalse(
19524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void f() { if (1) { for (;;) { } } }", ifStmt().bind("if"),
19534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyMatchOnNode<Stmt>>(
19544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "if", stmt(hasDescendant(declStmt().bind("decl"))), "decl")));
19554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
19564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
19574967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(MatchFinder, CanMatchSingleNodesRecursively) {
19584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
19594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
19604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyMatchOnNode<Decl>>(
19614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "X", recordDecl(has(recordDecl(hasName("X::Y")).bind("Y"))), "Y")));
19624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultFalse(
19634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "class X { class Y {}; };", recordDecl(hasName("::X")).bind("X"),
19644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    llvm::make_unique<VerifyMatchOnNode<Decl>>(
19654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "X", recordDecl(has(recordDecl(hasName("X::Z")).bind("Z"))), "Z")));
19664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
19674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
19684967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(StatementMatcher, HasReturnValue) {
19694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StatementMatcher RetVal = returnStmt(hasReturnValue(binaryOperator()));
19704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches("int F() { int a, b; return a + b; }", RetVal));
19714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_FALSE(matches("int F() { int a; return a; }", RetVal));
19724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_FALSE(matches("void F() { return; }", RetVal));
19734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
19744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
19754967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(StatementMatcher, ForFunction) {
19764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const auto CppString1 =
19774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "struct PosVec {"
19784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  PosVec& operator=(const PosVec&) {"
19794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    auto x = [] { return 1; };"
19804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    return *this;"
19814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  }"
19824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "};";
19834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const auto CppString2 =
19844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    "void F() {"
19854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  struct S {"
19864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    void F2() {"
19874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "       return;"
19884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "    }"
19894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "  };"
19904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "}";
19914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
19924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches(
19934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      CppString1,
19944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      returnStmt(forFunction(hasName("operator=")),
19954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 has(unaryOperator(hasOperatorName("*"))))));
19964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
19974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    notMatches(
19984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      CppString1,
19994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      returnStmt(forFunction(hasName("operator=")),
20004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 has(integerLiteral()))));
20014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(
20024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    matches(
20034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      CppString1,
20044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      returnStmt(forFunction(hasName("operator()")),
20054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                 has(integerLiteral()))));
20064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matches(CppString2, returnStmt(forFunction(hasName("F2")))));
20074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(CppString2, returnStmt(forFunction(hasName("F")))));
20084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
20094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20104967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST(Matcher, ForEachOverriden) {
20114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const auto ForEachOverriddenInClass = [](const char *ClassName) {
20124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return cxxMethodDecl(ofClass(hasName(ClassName)), isVirtual(),
20134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         forEachOverridden(cxxMethodDecl().bind("overridden")))
20144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        .bind("override");
20154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
20164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const char Code1[] = "class A { virtual void f(); };"
20174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              "class B : public A { void f(); };"
20184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              "class C : public B { void f(); };";
20194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // C::f overrides A::f.
20204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
20214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Code1, ForEachOverriddenInClass("C"),
20224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 1)));
20234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
20244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Code1, ForEachOverriddenInClass("C"),
20254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f",
20264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                          1)));
20274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // B::f overrides A::f.
20284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
20294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Code1, ForEachOverriddenInClass("B"),
20304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 1)));
20314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
20324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Code1, ForEachOverriddenInClass("B"),
20334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f",
20344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                          1)));
20354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // A::f overrides nothing.
20364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(Code1, ForEachOverriddenInClass("A")));
20374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const char Code2[] =
20394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class A1 { virtual void f(); };"
20404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class A2 { virtual void f(); };"
20414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class B : public A1, public A2 { void f(); };";
20424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // B::f overrides A1::f and A2::f. This produces two matches.
20434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
20444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Code2, ForEachOverriddenInClass("B"),
20454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 2)));
20464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(matchAndVerifyResultTrue(
20474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Code2, ForEachOverriddenInClass("B"),
20484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f",
20494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                                          2)));
20504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // A1::f overrides nothing.
20514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_TRUE(notMatches(Code2, ForEachOverriddenInClass("A1")));
20524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
20534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // namespace ast_matchers
20554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // namespace clang
2056