//== unittests/ASTMatchers/ASTMatchersNodeTest.cpp - AST matcher unit tests ==//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "ASTMatchersTest.h"
#include "clang/AST/PrettyPrinter.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Tooling/Tooling.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Support/Host.h"
#include "gtest/gtest.h"

namespace clang {
namespace ast_matchers {

TEST_P(ASTMatchersTest, Decl_CXX) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a test for `decl()` that does not depend on C++.
    return;
  }
  EXPECT_TRUE(notMatches("", decl(usingDecl())));
  EXPECT_TRUE(
      matches("namespace x { class X {}; } using x::X;", decl(usingDecl())));
}

TEST_P(ASTMatchersTest, NameableDeclaration_MatchesVariousDecls) {
  DeclarationMatcher NamedX = namedDecl(hasName("X"));
  EXPECT_TRUE(matches("typedef int X;", NamedX));
  EXPECT_TRUE(matches("int X;", NamedX));
  EXPECT_TRUE(matches("void foo() { int X; }", NamedX));
  EXPECT_TRUE(matches("enum X { A, B, C };", NamedX));

  EXPECT_TRUE(notMatches("#define X 1", NamedX));
}

TEST_P(ASTMatchersTest, NamedDecl_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  DeclarationMatcher NamedX = namedDecl(hasName("X"));
  EXPECT_TRUE(matches("class foo { virtual void X(); };", NamedX));
  EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", NamedX));
  EXPECT_TRUE(matches("namespace X { }", NamedX));
}

TEST_P(ASTMatchersTest, MatchesNameRE) {
  DeclarationMatcher NamedX = namedDecl(matchesName("::X"));
  EXPECT_TRUE(matches("typedef int Xa;", NamedX));
  EXPECT_TRUE(matches("int Xb;", NamedX));
  EXPECT_TRUE(matches("void foo() { int Xgh; }", NamedX));
  EXPECT_TRUE(matches("enum X { A, B, C };", NamedX));

  EXPECT_TRUE(notMatches("#define Xkl 1", NamedX));

  DeclarationMatcher StartsWithNo = namedDecl(matchesName("::no"));
  EXPECT_TRUE(matches("int no_foo;", StartsWithNo));

  DeclarationMatcher Abc = namedDecl(matchesName("a.*b.*c"));
  EXPECT_TRUE(matches("int abc;", Abc));
  EXPECT_TRUE(matches("int aFOObBARc;", Abc));
  EXPECT_TRUE(notMatches("int cab;", Abc));
  EXPECT_TRUE(matches("int cabc;", Abc));

  DeclarationMatcher StartsWithK = namedDecl(matchesName(":k[^:]*$"));
  EXPECT_TRUE(matches("int k;", StartsWithK));
  EXPECT_TRUE(matches("int kAbc;", StartsWithK));
}

TEST_P(ASTMatchersTest, MatchesNameRE_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  DeclarationMatcher NamedX = namedDecl(matchesName("::X"));
  EXPECT_TRUE(matches("class foo { virtual void Xc(); };", NamedX));
  EXPECT_TRUE(matches("void foo() try { } catch(int Xdef) { }", NamedX));
  EXPECT_TRUE(matches("namespace Xij { }", NamedX));

  DeclarationMatcher StartsWithNo = namedDecl(matchesName("::no"));
  EXPECT_TRUE(matches("class foo { virtual void nobody(); };", StartsWithNo));

  DeclarationMatcher StartsWithK = namedDecl(matchesName(":k[^:]*$"));
  EXPECT_TRUE(matches("namespace x { int kTest; }", StartsWithK));
  EXPECT_TRUE(matches("class C { int k; };", StartsWithK));
  EXPECT_TRUE(notMatches("class C { int ckc; };", StartsWithK));
  EXPECT_TRUE(notMatches("int K;", StartsWithK));

  DeclarationMatcher StartsWithKIgnoreCase =
      namedDecl(matchesName(":k[^:]*$", llvm::Regex::IgnoreCase));
  EXPECT_TRUE(matches("int k;", StartsWithKIgnoreCase));
  EXPECT_TRUE(matches("int K;", StartsWithKIgnoreCase));
}

TEST_P(ASTMatchersTest, DeclarationMatcher_MatchClass) {
  if (!GetParam().isCXX()) {
    return;
  }

  DeclarationMatcher ClassX = recordDecl(recordDecl(hasName("X")));
  EXPECT_TRUE(matches("class X;", ClassX));
  EXPECT_TRUE(matches("class X {};", ClassX));
  EXPECT_TRUE(matches("template<class T> class X {};", ClassX));
  EXPECT_TRUE(notMatches("", ClassX));
}

TEST_P(ASTMatchersTest, TranslationUnitDecl) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a test for `translationUnitDecl()` that does not depend on
    // C++.
    return;
  }
  StringRef Code = "int MyVar1;\n"
                   "namespace NameSpace {\n"
                   "int MyVar2;\n"
                   "}  // namespace NameSpace\n";
  EXPECT_TRUE(matches(
      Code, varDecl(hasName("MyVar1"), hasDeclContext(translationUnitDecl()))));
  EXPECT_FALSE(matches(
      Code, varDecl(hasName("MyVar2"), hasDeclContext(translationUnitDecl()))));
  EXPECT_TRUE(matches(
      Code,
      varDecl(hasName("MyVar2"),
              hasDeclContext(decl(hasDeclContext(translationUnitDecl()))))));
}

TEST_P(ASTMatchersTest, LinkageSpecDecl) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("extern \"C\" { void foo() {}; }", linkageSpecDecl()));
  EXPECT_TRUE(notMatches("void foo() {};", linkageSpecDecl()));
}

TEST_P(ASTMatchersTest, ClassTemplateDecl_DoesNotMatchClass) {
  if (!GetParam().isCXX()) {
    return;
  }
  DeclarationMatcher ClassX = classTemplateDecl(hasName("X"));
  EXPECT_TRUE(notMatches("class X;", ClassX));
  EXPECT_TRUE(notMatches("class X {};", ClassX));
}

TEST_P(ASTMatchersTest, ClassTemplateDecl_MatchesClassTemplate) {
  if (!GetParam().isCXX()) {
    return;
  }
  DeclarationMatcher ClassX = classTemplateDecl(hasName("X"));
  EXPECT_TRUE(matches("template<typename T> class X {};", ClassX));
  EXPECT_TRUE(matches("class Z { template<class T> class X {}; };", ClassX));
}

TEST_P(ASTMatchersTest,
       ClassTemplateDecl_DoesNotMatchClassTemplateExplicitSpecialization) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches(
      "template<typename T> class X { };"
      "template<> class X<int> { int a; };",
      classTemplateDecl(hasName("X"), hasDescendant(fieldDecl(hasName("a"))))));
}

TEST_P(ASTMatchersTest,
       ClassTemplateDecl_DoesNotMatchClassTemplatePartialSpecialization) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches(
      "template<typename T, typename U> class X { };"
      "template<typename T> class X<T, int> { int a; };",
      classTemplateDecl(hasName("X"), hasDescendant(fieldDecl(hasName("a"))))));
}

TEST(ASTMatchersTestCUDA, CUDAKernelCallExpr) {
  EXPECT_TRUE(matchesWithCuda("__global__ void f() { }"
                              "void g() { f<<<1, 2>>>(); }",
                              cudaKernelCallExpr()));
  EXPECT_TRUE(notMatchesWithCuda("void f() {}", cudaKernelCallExpr()));
}

TEST(ASTMatchersTestCUDA, HasAttrCUDA) {
  EXPECT_TRUE(matchesWithCuda("__attribute__((device)) void f() {}",
                              hasAttr(clang::attr::CUDADevice)));
  EXPECT_FALSE(notMatchesWithCuda("__attribute__((global)) void f() {}",
                                  hasAttr(clang::attr::CUDAGlobal)));
}

TEST_P(ASTMatchersTest, ValueDecl) {
  if (!GetParam().isCXX()) {
    // FIXME: Fix this test in non-C++ language modes.
    return;
  }
  EXPECT_TRUE(matches("enum EnumType { EnumValue };",
                      valueDecl(hasType(asString("enum EnumType")))));
  EXPECT_TRUE(matches("void FunctionDecl();",
                      valueDecl(hasType(asString("void (void)")))));
}

TEST_P(ASTMatchersTest, FriendDecl) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("class Y { friend class X; };",
                      friendDecl(hasType(asString("class X")))));
  EXPECT_TRUE(matches("class Y { friend class X; };",
                      friendDecl(hasType(recordDecl(hasName("X"))))));

  EXPECT_TRUE(matches("class Y { friend void f(); };",
                      functionDecl(hasName("f"), hasParent(friendDecl()))));
}

TEST_P(ASTMatchersTest, EnumDecl_DoesNotMatchClasses) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("class X {};", enumDecl(hasName("X"))));
}

TEST_P(ASTMatchersTest, EnumDecl_MatchesEnums) {
  if (!GetParam().isCXX()) {
    // FIXME: Fix this test in non-C++ language modes.
    return;
  }
  EXPECT_TRUE(matches("enum X {};", enumDecl(hasName("X"))));
}

TEST_P(ASTMatchersTest, EnumConstantDecl) {
  if (!GetParam().isCXX()) {
    // FIXME: Fix this test in non-C++ language modes.
    return;
  }
  DeclarationMatcher Matcher = enumConstantDecl(hasName("A"));
  EXPECT_TRUE(matches("enum X{ A };", Matcher));
  EXPECT_TRUE(notMatches("enum X{ B };", Matcher));
  EXPECT_TRUE(notMatches("enum X {};", Matcher));
}

TEST_P(ASTMatchersTest, TagDecl) {
  if (!GetParam().isCXX()) {
    // FIXME: Fix this test in non-C++ language modes.
    return;
  }
  EXPECT_TRUE(matches("struct X {};", tagDecl(hasName("X"))));
  EXPECT_TRUE(matches("union U {};", tagDecl(hasName("U"))));
  EXPECT_TRUE(matches("enum E {};", tagDecl(hasName("E"))));
}

TEST_P(ASTMatchersTest, TagDecl_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("class C {};", tagDecl(hasName("C"))));
}

TEST_P(ASTMatchersTest, UnresolvedLookupExpr) {
  if (!GetParam().isCXX() || GetParam().hasDelayedTemplateParsing()) {
    // FIXME: Fix this test to work with delayed template parsing.
    return;
  }

  EXPECT_TRUE(matches("template<typename T>"
                      "T foo() { T a; return a; }"
                      "template<typename T>"
                      "void bar() {"
                      "  foo<T>();"
                      "}",
                      unresolvedLookupExpr()));
}

TEST_P(ASTMatchersTest, UsesADL) {
  if (!GetParam().isCXX()) {
    return;
  }

  StatementMatcher ADLMatch = callExpr(usesADL());
  StatementMatcher ADLMatchOper = cxxOperatorCallExpr(usesADL());
  StringRef NS_Str = R"cpp(
  namespace NS {
    struct X {};
    void f(X);
    void operator+(X, X);
  }
  struct MyX {};
  void f(...);
  void operator+(MyX, MyX);
)cpp";

  auto MkStr = [&](StringRef Body) {
    return (NS_Str + "void test_fn() { " + Body + " }").str();
  };

  EXPECT_TRUE(matches(MkStr("NS::X x; f(x);"), ADLMatch));
  EXPECT_TRUE(notMatches(MkStr("NS::X x; NS::f(x);"), ADLMatch));
  EXPECT_TRUE(notMatches(MkStr("MyX x; f(x);"), ADLMatch));
  EXPECT_TRUE(notMatches(MkStr("NS::X x; using NS::f; f(x);"), ADLMatch));

  // Operator call expressions
  EXPECT_TRUE(matches(MkStr("NS::X x; x + x;"), ADLMatch));
  EXPECT_TRUE(matches(MkStr("NS::X x; x + x;"), ADLMatchOper));
  EXPECT_TRUE(notMatches(MkStr("MyX x; x + x;"), ADLMatch));
  EXPECT_TRUE(notMatches(MkStr("MyX x; x + x;"), ADLMatchOper));
  EXPECT_TRUE(matches(MkStr("NS::X x; operator+(x, x);"), ADLMatch));
  EXPECT_TRUE(notMatches(MkStr("NS::X x; NS::operator+(x, x);"), ADLMatch));
}

TEST_P(ASTMatchersTest, CallExpr_CXX) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a test for `callExpr()` that does not depend on C++.
    return;
  }
  // FIXME: Do we want to overload Call() to directly take
  // Matcher<Decl>, too?
  StatementMatcher MethodX =
      callExpr(hasDeclaration(cxxMethodDecl(hasName("x"))));

  EXPECT_TRUE(matches("class Y { void x() { x(); } };", MethodX));
  EXPECT_TRUE(notMatches("class Y { void x() {} };", MethodX));

  StatementMatcher MethodOnY =
      cxxMemberCallExpr(on(hasType(recordDecl(hasName("Y")))));

  EXPECT_TRUE(matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
                      MethodOnY));
  EXPECT_TRUE(matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
                      MethodOnY));
  EXPECT_TRUE(notMatches(
      "class Y { public: void x(); }; void z(Y *&y) { y->x(); }", MethodOnY));
  EXPECT_TRUE(notMatches(
      "class Y { public: void x(); }; void z(Y y[]) { y->x(); }", MethodOnY));
  EXPECT_TRUE(notMatches(
      "class Y { public: void x(); }; void z() { Y *y; y->x(); }", MethodOnY));

  StatementMatcher MethodOnYPointer =
      cxxMemberCallExpr(on(hasType(pointsTo(recordDecl(hasName("Y"))))));

  EXPECT_TRUE(
      matches("class Y { public: void x(); }; void z() { Y *y; y->x(); }",
              MethodOnYPointer));
  EXPECT_TRUE(
      matches("class Y { public: void x(); }; void z(Y *&y) { y->x(); }",
              MethodOnYPointer));
  EXPECT_TRUE(
      matches("class Y { public: void x(); }; void z(Y y[]) { y->x(); }",
              MethodOnYPointer));
  EXPECT_TRUE(
      notMatches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
                 MethodOnYPointer));
  EXPECT_TRUE(
      notMatches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
                 MethodOnYPointer));
}

TEST_P(ASTMatchersTest, LambdaExpr) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("auto f = [] (int i) { return i; };", lambdaExpr()));
}

TEST_P(ASTMatchersTest, CXXForRangeStmt) {
  EXPECT_TRUE(
      notMatches("void f() { for (int i; i<5; ++i); }", cxxForRangeStmt()));
}

TEST_P(ASTMatchersTest, CXXForRangeStmt_CXX11) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("int as[] = { 1, 2, 3 };"
                      "void f() { for (auto &a : as); }",
                      cxxForRangeStmt()));
}

TEST_P(ASTMatchersTest, SubstNonTypeTemplateParmExpr) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_FALSE(matches("template<int N>\n"
                       "struct A {  static const int n = 0; };\n"
                       "struct B : public A<42> {};",
                       traverse(TK_AsIs, substNonTypeTemplateParmExpr())));
  EXPECT_TRUE(matches("template<int N>\n"
                      "struct A {  static const int n = N; };\n"
                      "struct B : public A<42> {};",
                      traverse(TK_AsIs, substNonTypeTemplateParmExpr())));
}

TEST_P(ASTMatchersTest, NonTypeTemplateParmDecl) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("template <int N> void f();",
                      nonTypeTemplateParmDecl(hasName("N"))));
  EXPECT_TRUE(
      notMatches("template <typename T> void f();", nonTypeTemplateParmDecl()));
}

TEST_P(ASTMatchersTest, TemplateTypeParmDecl) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("template <typename T> void f();",
                      templateTypeParmDecl(hasName("T"))));
  EXPECT_TRUE(notMatches("template <int N> void f();", templateTypeParmDecl()));
}

TEST_P(ASTMatchersTest, TemplateTemplateParmDecl) {
  if (!GetParam().isCXX())
    return;
  EXPECT_TRUE(matches("template <template <typename> class Z> void f();",
                      templateTemplateParmDecl(hasName("Z"))));
  EXPECT_TRUE(notMatches("template <typename, int> void f();",
                         templateTemplateParmDecl()));
}

TEST_P(ASTMatchersTest, UserDefinedLiteral) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("constexpr char operator \"\" _inc (const char i) {"
                      "  return i + 1;"
                      "}"
                      "char c = 'a'_inc;",
                      userDefinedLiteral()));
}

TEST_P(ASTMatchersTest, FlowControl) {
  EXPECT_TRUE(matches("void f() { while(1) { break; } }", breakStmt()));
  EXPECT_TRUE(matches("void f() { while(1) { continue; } }", continueStmt()));
  EXPECT_TRUE(matches("void f() { goto FOO; FOO: ;}", gotoStmt()));
  EXPECT_TRUE(matches("void f() { goto FOO; FOO: ;}",
                      labelStmt(hasDeclaration(labelDecl(hasName("FOO"))))));
  EXPECT_TRUE(matches("void f() { FOO: ; void *ptr = &&FOO; goto *ptr; }",
                      addrLabelExpr()));
  EXPECT_TRUE(matches("void f() { return; }", returnStmt()));
}

TEST_P(ASTMatchersTest, CXXOperatorCallExpr) {
  if (!GetParam().isCXX()) {
    return;
  }

  StatementMatcher OpCall = cxxOperatorCallExpr();
  // Unary operator
  EXPECT_TRUE(matches("class Y { }; "
                      "bool operator!(Y x) { return false; }; "
                      "Y y; bool c = !y;",
                      OpCall));
  // No match -- special operators like "new", "delete"
  // FIXME: operator new takes size_t, for which we need stddef.h, for which
  // we need to figure out include paths in the test.
  // EXPECT_TRUE(NotMatches("#include <stddef.h>\n"
  //             "class Y { }; "
  //             "void *operator new(size_t size) { return 0; } "
  //             "Y *y = new Y;", OpCall));
  EXPECT_TRUE(notMatches("class Y { }; "
                         "void operator delete(void *p) { } "
                         "void a() {Y *y = new Y; delete y;}",
                         OpCall));
  // Binary operator
  EXPECT_TRUE(matches("class Y { }; "
                      "bool operator&&(Y x, Y y) { return true; }; "
                      "Y a; Y b; bool c = a && b;",
                      OpCall));
  // No match -- normal operator, not an overloaded one.
  EXPECT_TRUE(notMatches("bool x = true, y = true; bool t = x && y;", OpCall));
  EXPECT_TRUE(notMatches("int t = 5 << 2;", OpCall));
}

TEST_P(ASTMatchersTest, ThisPointerType) {
  if (!GetParam().isCXX()) {
    return;
  }

  StatementMatcher MethodOnY = traverse(
      TK_AsIs, cxxMemberCallExpr(thisPointerType(recordDecl(hasName("Y")))));

  EXPECT_TRUE(matches("class Y { public: void x(); }; void z() { Y y; y.x(); }",
                      MethodOnY));
  EXPECT_TRUE(matches("class Y { public: void x(); }; void z(Y &y) { y.x(); }",
                      MethodOnY));
  EXPECT_TRUE(matches(
      "class Y { public: void x(); }; void z(Y *&y) { y->x(); }", MethodOnY));
  EXPECT_TRUE(matches(
      "class Y { public: void x(); }; void z(Y y[]) { y->x(); }", MethodOnY));
  EXPECT_TRUE(matches(
      "class Y { public: void x(); }; void z() { Y *y; y->x(); }", MethodOnY));

  EXPECT_TRUE(matches("class Y {"
                      "  public: virtual void x();"
                      "};"
                      "class X : public Y {"
                      "  public: virtual void x();"
                      "};"
                      "void z() { X *x; x->Y::x(); }",
                      MethodOnY));
}

TEST_P(ASTMatchersTest, DeclRefExpr) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a test for `declRefExpr()` that does not depend on C++.
    return;
  }
  StatementMatcher Reference = declRefExpr(to(varDecl(hasInitializer(
      cxxMemberCallExpr(thisPointerType(recordDecl(hasName("Y"))))))));

  EXPECT_TRUE(matches("class Y {"
                      " public:"
                      "  bool x() const;"
                      "};"
                      "void z(const Y &y) {"
                      "  bool b = y.x();"
                      "  if (b) {}"
                      "}",
                      Reference));

  EXPECT_TRUE(notMatches("class Y {"
                         " public:"
                         "  bool x() const;"
                         "};"
                         "void z(const Y &y) {"
                         "  bool b = y.x();"
                         "}",
                         Reference));
}

TEST_P(ASTMatchersTest, CXXMemberCallExpr) {
  if (!GetParam().isCXX()) {
    return;
  }
  StatementMatcher CallOnVariableY =
      cxxMemberCallExpr(on(declRefExpr(to(varDecl(hasName("y"))))));

  EXPECT_TRUE(matches("class Y { public: void x() { Y y; y.x(); } };",
                      CallOnVariableY));
  EXPECT_TRUE(matches("class Y { public: void x() const { Y y; y.x(); } };",
                      CallOnVariableY));
  EXPECT_TRUE(matches("class Y { public: void x(); };"
                      "class X : public Y { void z() { X y; y.x(); } };",
                      CallOnVariableY));
  EXPECT_TRUE(matches("class Y { public: void x(); };"
                      "class X : public Y { void z() { X *y; y->x(); } };",
                      CallOnVariableY));
  EXPECT_TRUE(notMatches(
      "class Y { public: void x(); };"
      "class X : public Y { void z() { unsigned long y; ((X*)y)->x(); } };",
      CallOnVariableY));
}

TEST_P(ASTMatchersTest, UnaryExprOrTypeTraitExpr) {
  EXPECT_TRUE(
      matches("void x() { int a = sizeof(a); }", unaryExprOrTypeTraitExpr()));
}

TEST_P(ASTMatchersTest, AlignOfExpr) {
  EXPECT_TRUE(
      notMatches("void x() { int a = sizeof(a); }", alignOfExpr(anything())));
  // FIXME: Uncomment once alignof is enabled.
  // EXPECT_TRUE(matches("void x() { int a = alignof(a); }",
  //                     unaryExprOrTypeTraitExpr()));
  // EXPECT_TRUE(notMatches("void x() { int a = alignof(a); }",
  //                        sizeOfExpr()));
}

TEST_P(ASTMatchersTest, MemberExpr_DoesNotMatchClasses) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("class Y { void x() {} };", memberExpr()));
  EXPECT_TRUE(notMatches("class Y { void x() {} };", unresolvedMemberExpr()));
  EXPECT_TRUE(
      notMatches("class Y { void x() {} };", cxxDependentScopeMemberExpr()));
}

TEST_P(ASTMatchersTest, MemberExpr_MatchesMemberFunctionCall) {
  if (!GetParam().isCXX() || GetParam().hasDelayedTemplateParsing()) {
    // FIXME: Fix this test to work with delayed template parsing.
    return;
  }
  EXPECT_TRUE(matches("class Y { void x() { x(); } };", memberExpr()));
  EXPECT_TRUE(matches("class Y { template <class T> void x() { x<T>(); } };",
                      unresolvedMemberExpr()));
  EXPECT_TRUE(matches("template <class T> void x() { T t; t.f(); }",
                      cxxDependentScopeMemberExpr()));
}

TEST_P(ASTMatchersTest, MemberExpr_MatchesVariable) {
  if (!GetParam().isCXX() || GetParam().hasDelayedTemplateParsing()) {
    // FIXME: Fix this test to work with delayed template parsing.
    return;
  }
  EXPECT_TRUE(
      matches("class Y { void x() { this->y; } int y; };", memberExpr()));
  EXPECT_TRUE(matches("class Y { void x() { y; } int y; };", memberExpr()));
  EXPECT_TRUE(
      matches("class Y { void x() { Y y; y.y; } int y; };", memberExpr()));
  EXPECT_TRUE(matches("template <class T>"
                      "class X : T { void f() { this->T::v; } };",
                      cxxDependentScopeMemberExpr()));
  EXPECT_TRUE(matches("template <class T> class X : T { void f() { T::v; } };",
                      cxxDependentScopeMemberExpr()));
  EXPECT_TRUE(matches("template <class T> void x() { T t; t.v; }",
                      cxxDependentScopeMemberExpr()));
}

TEST_P(ASTMatchersTest, MemberExpr_MatchesStaticVariable) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("class Y { void x() { this->y; } static int y; };",
                      memberExpr()));
  EXPECT_TRUE(
      notMatches("class Y { void x() { y; } static int y; };", memberExpr()));
  EXPECT_TRUE(notMatches("class Y { void x() { Y::y; } static int y; };",
                         memberExpr()));
}

TEST_P(ASTMatchersTest, FunctionDecl) {
  StatementMatcher CallFunctionF = callExpr(callee(functionDecl(hasName("f"))));

  EXPECT_TRUE(matches("void f() { f(); }", CallFunctionF));
  EXPECT_TRUE(notMatches("void f() { }", CallFunctionF));

  EXPECT_TRUE(notMatches("void f(int);", functionDecl(isVariadic())));
  EXPECT_TRUE(notMatches("void f();", functionDecl(isVariadic())));
  EXPECT_TRUE(matches("void f(int, ...);", functionDecl(parameterCountIs(1))));
}

TEST_P(ASTMatchersTest, FunctionDecl_C) {
  if (!GetParam().isC()) {
    return;
  }
  EXPECT_TRUE(notMatches("void f();", functionDecl(isVariadic())));
  EXPECT_TRUE(matches("void f();", functionDecl(parameterCountIs(0))));
}

TEST_P(ASTMatchersTest, FunctionDecl_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }

  StatementMatcher CallFunctionF = callExpr(callee(functionDecl(hasName("f"))));

  if (!GetParam().hasDelayedTemplateParsing()) {
    // FIXME: Fix this test to work with delayed template parsing.
    // Dependent contexts, but a non-dependent call.
    EXPECT_TRUE(
        matches("void f(); template <int N> void g() { f(); }", CallFunctionF));
    EXPECT_TRUE(
        matches("void f(); template <int N> struct S { void g() { f(); } };",
                CallFunctionF));
  }

  // Depedent calls don't match.
  EXPECT_TRUE(
      notMatches("void f(int); template <typename T> void g(T t) { f(t); }",
                 CallFunctionF));
  EXPECT_TRUE(
      notMatches("void f(int);"
                 "template <typename T> struct S { void g(T t) { f(t); } };",
                 CallFunctionF));

  EXPECT_TRUE(matches("void f(...);", functionDecl(isVariadic())));
  EXPECT_TRUE(matches("void f(...);", functionDecl(parameterCountIs(0))));
}

TEST_P(ASTMatchersTest, FunctionDecl_CXX11) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }

  EXPECT_TRUE(notMatches("template <typename... Ts> void f(Ts...);",
                         functionDecl(isVariadic())));
}

TEST_P(ASTMatchersTest,
       FunctionTemplateDecl_MatchesFunctionTemplateDeclarations) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("template <typename T> void f(T t) {}",
                      functionTemplateDecl(hasName("f"))));
}

TEST_P(ASTMatchersTest, FunctionTemplate_DoesNotMatchFunctionDeclarations) {
  EXPECT_TRUE(
      notMatches("void f(double d);", functionTemplateDecl(hasName("f"))));
  EXPECT_TRUE(
      notMatches("void f(int t) {}", functionTemplateDecl(hasName("f"))));
}

TEST_P(ASTMatchersTest,
       FunctionTemplateDecl_DoesNotMatchFunctionTemplateSpecializations) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches(
      "void g(); template <typename T> void f(T t) {}"
      "template <> void f(int t) { g(); }",
      functionTemplateDecl(hasName("f"), hasDescendant(declRefExpr(to(
                                             functionDecl(hasName("g"))))))));
}

TEST_P(ASTMatchersTest, ClassTemplateSpecializationDecl) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("template<typename T> struct A {};"
                      "template<> struct A<int> {};",
                      classTemplateSpecializationDecl()));
  EXPECT_TRUE(matches("template<typename T> struct A {}; A<int> a;",
                      classTemplateSpecializationDecl()));
  EXPECT_TRUE(notMatches("template<typename T> struct A {};",
                         classTemplateSpecializationDecl()));
}

TEST_P(ASTMatchersTest, DeclaratorDecl) {
  EXPECT_TRUE(matches("int x;", declaratorDecl()));
  EXPECT_TRUE(notMatches("struct A {};", declaratorDecl()));
}

TEST_P(ASTMatchersTest, DeclaratorDecl_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("class A {};", declaratorDecl()));
}

TEST_P(ASTMatchersTest, ParmVarDecl) {
  EXPECT_TRUE(matches("void f(int x);", parmVarDecl()));
  EXPECT_TRUE(notMatches("void f();", parmVarDecl()));
}

TEST_P(ASTMatchersTest, StaticAssertDecl) {
  if (!GetParam().isCXX11OrLater())
    return;

  EXPECT_TRUE(matches("static_assert(true, \"\");", staticAssertDecl()));
  EXPECT_TRUE(
      notMatches("constexpr bool staticassert(bool B, const char *M) "
                 "{ return true; };\n void f() { staticassert(true, \"\"); }",
                 staticAssertDecl()));
}

TEST_P(ASTMatchersTest, Matcher_ConstructorCall) {
  if (!GetParam().isCXX()) {
    return;
  }

  StatementMatcher Constructor = traverse(TK_AsIs, cxxConstructExpr());

  EXPECT_TRUE(
      matches("class X { public: X(); }; void x() { X x; }", Constructor));
  EXPECT_TRUE(matches("class X { public: X(); }; void x() { X x = X(); }",
                      Constructor));
  EXPECT_TRUE(matches("class X { public: X(int); }; void x() { X x = 0; }",
                      Constructor));
  EXPECT_TRUE(matches("class X {}; void x(int) { X x; }", Constructor));
}

TEST_P(ASTMatchersTest, Match_ConstructorInitializers) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("class C { int i; public: C(int ii) : i(ii) {} };",
                      cxxCtorInitializer(forField(hasName("i")))));
}

TEST_P(ASTMatchersTest, Matcher_ThisExpr) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      matches("struct X { int a; int f () { return a; } };", cxxThisExpr()));
  EXPECT_TRUE(
      notMatches("struct X { int f () { int a; return a; } };", cxxThisExpr()));
}

TEST_P(ASTMatchersTest, Matcher_BindTemporaryExpression) {
  if (!GetParam().isCXX()) {
    return;
  }

  StatementMatcher TempExpression = traverse(TK_AsIs, cxxBindTemporaryExpr());

  StringRef ClassString = "class string { public: string(); ~string(); }; ";

  EXPECT_TRUE(matches(
      ClassString + "string GetStringByValue();"
                    "void FunctionTakesString(string s);"
                    "void run() { FunctionTakesString(GetStringByValue()); }",
      TempExpression));

  EXPECT_TRUE(notMatches(ClassString +
                             "string* GetStringPointer(); "
                             "void FunctionTakesStringPtr(string* s);"
                             "void run() {"
                             "  string* s = GetStringPointer();"
                             "  FunctionTakesStringPtr(GetStringPointer());"
                             "  FunctionTakesStringPtr(s);"
                             "}",
                         TempExpression));

  EXPECT_TRUE(notMatches("class no_dtor {};"
                         "no_dtor GetObjByValue();"
                         "void ConsumeObj(no_dtor param);"
                         "void run() { ConsumeObj(GetObjByValue()); }",
                         TempExpression));
}

TEST_P(ASTMatchersTest, MaterializeTemporaryExpr_MatchesTemporaryCXX11CXX14) {
  if (GetParam().Language != Lang_CXX11 && GetParam().Language != Lang_CXX14) {
    return;
  }

  StatementMatcher TempExpression =
      traverse(TK_AsIs, materializeTemporaryExpr());

  EXPECT_TRUE(matches("class string { public: string(); }; "
                      "string GetStringByValue();"
                      "void FunctionTakesString(string s);"
                      "void run() { FunctionTakesString(GetStringByValue()); }",
                      TempExpression));
}

TEST_P(ASTMatchersTest, MaterializeTemporaryExpr_MatchesTemporary) {
  if (!GetParam().isCXX()) {
    return;
  }

  StringRef ClassString = "class string { public: string(); int length(); }; ";
  StatementMatcher TempExpression =
      traverse(TK_AsIs, materializeTemporaryExpr());

  EXPECT_TRUE(notMatches(ClassString +
                             "string* GetStringPointer(); "
                             "void FunctionTakesStringPtr(string* s);"
                             "void run() {"
                             "  string* s = GetStringPointer();"
                             "  FunctionTakesStringPtr(GetStringPointer());"
                             "  FunctionTakesStringPtr(s);"
                             "}",
                         TempExpression));

  EXPECT_TRUE(matches(ClassString +
                          "string GetStringByValue();"
                          "void run() { int k = GetStringByValue().length(); }",
                      TempExpression));

  EXPECT_TRUE(notMatches(ClassString + "string GetStringByValue();"
                                       "void run() { GetStringByValue(); }",
                         TempExpression));
}

TEST_P(ASTMatchersTest, Matcher_NewExpression) {
  if (!GetParam().isCXX()) {
    return;
  }

  StatementMatcher New = cxxNewExpr();

  EXPECT_TRUE(matches("class X { public: X(); }; void x() { new X; }", New));
  EXPECT_TRUE(matches("class X { public: X(); }; void x() { new X(); }", New));
  EXPECT_TRUE(
      matches("class X { public: X(int); }; void x() { new X(0); }", New));
  EXPECT_TRUE(matches("class X {}; void x(int) { new X; }", New));
}

TEST_P(ASTMatchersTest, Matcher_DeleteExpression) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      matches("struct A {}; void f(A* a) { delete a; }", cxxDeleteExpr()));
}

TEST_P(ASTMatchersTest, Matcher_NoexceptExpression) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  StatementMatcher NoExcept = cxxNoexceptExpr();
  EXPECT_TRUE(matches("void foo(); bool bar = noexcept(foo());", NoExcept));
  EXPECT_TRUE(
      matches("void foo() noexcept; bool bar = noexcept(foo());", NoExcept));
  EXPECT_TRUE(notMatches("void foo() noexcept;", NoExcept));
  EXPECT_TRUE(notMatches("void foo() noexcept(0+1);", NoExcept));
  EXPECT_TRUE(matches("void foo() noexcept(noexcept(1+1));", NoExcept));
}

TEST_P(ASTMatchersTest, Matcher_DefaultArgument) {
  if (!GetParam().isCXX()) {
    return;
  }
  StatementMatcher Arg = cxxDefaultArgExpr();
  EXPECT_TRUE(matches("void x(int, int = 0) { int y; x(y); }", Arg));
  EXPECT_TRUE(
      matches("class X { void x(int, int = 0) { int y; x(y); } };", Arg));
  EXPECT_TRUE(notMatches("void x(int, int = 0) { int y; x(y, 0); }", Arg));
}

TEST_P(ASTMatchersTest, StringLiteral) {
  StatementMatcher Literal = stringLiteral();
  EXPECT_TRUE(matches("const char *s = \"string\";", Literal));
  // with escaped characters
  EXPECT_TRUE(matches("const char *s = \"\x05five\";", Literal));
  // no matching -- though the data type is the same, there is no string literal
  EXPECT_TRUE(notMatches("const char s[1] = {'a'};", Literal));
}

TEST_P(ASTMatchersTest, StringLiteral_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("const wchar_t *s = L\"string\";", stringLiteral()));
}

TEST_P(ASTMatchersTest, CharacterLiteral) {
  EXPECT_TRUE(matches("const char c = 'c';", characterLiteral()));
  EXPECT_TRUE(notMatches("const char c = 0x1;", characterLiteral()));
}

TEST_P(ASTMatchersTest, CharacterLiteral_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  // wide character
  EXPECT_TRUE(matches("const char c = L'c';", characterLiteral()));
  // wide character, Hex encoded, NOT MATCHED!
  EXPECT_TRUE(notMatches("const wchar_t c = 0x2126;", characterLiteral()));
}

TEST_P(ASTMatchersTest, IntegerLiteral) {
  StatementMatcher HasIntLiteral = integerLiteral();
  EXPECT_TRUE(matches("int i = 10;", HasIntLiteral));
  EXPECT_TRUE(matches("int i = 0x1AB;", HasIntLiteral));
  EXPECT_TRUE(matches("int i = 10L;", HasIntLiteral));
  EXPECT_TRUE(matches("int i = 10U;", HasIntLiteral));

  // Non-matching cases (character literals, float and double)
  EXPECT_TRUE(notMatches("int i = L'a';",
                         HasIntLiteral)); // this is actually a character
  // literal cast to int
  EXPECT_TRUE(notMatches("int i = 'a';", HasIntLiteral));
  EXPECT_TRUE(notMatches("int i = 1e10;", HasIntLiteral));
  EXPECT_TRUE(notMatches("int i = 10.0;", HasIntLiteral));

  // Negative integers.
  EXPECT_TRUE(
      matches("int i = -10;",
              unaryOperator(hasOperatorName("-"),
                            hasUnaryOperand(integerLiteral(equals(10))))));
}

TEST_P(ASTMatchersTest, FloatLiteral) {
  StatementMatcher HasFloatLiteral = floatLiteral();
  EXPECT_TRUE(matches("float i = 10.0;", HasFloatLiteral));
  EXPECT_TRUE(matches("float i = 10.0f;", HasFloatLiteral));
  EXPECT_TRUE(matches("double i = 10.0;", HasFloatLiteral));
  EXPECT_TRUE(matches("double i = 10.0L;", HasFloatLiteral));
  EXPECT_TRUE(matches("double i = 1e10;", HasFloatLiteral));
  EXPECT_TRUE(matches("double i = 5.0;", floatLiteral(equals(5.0))));
  EXPECT_TRUE(matches("double i = 5.0;", floatLiteral(equals(5.0f))));
  EXPECT_TRUE(
      matches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(5.0)))));

  EXPECT_TRUE(notMatches("float i = 10;", HasFloatLiteral));
  EXPECT_TRUE(notMatches("double i = 5.0;", floatLiteral(equals(6.0))));
  EXPECT_TRUE(notMatches("double i = 5.0;", floatLiteral(equals(6.0f))));
  EXPECT_TRUE(
      notMatches("double i = 5.0;", floatLiteral(equals(llvm::APFloat(6.0)))));
}

TEST_P(ASTMatchersTest, CXXNullPtrLiteralExpr) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("int* i = nullptr;", cxxNullPtrLiteralExpr()));
}

TEST_P(ASTMatchersTest, ChooseExpr) {
  EXPECT_TRUE(matches("void f() { (void)__builtin_choose_expr(1, 2, 3); }",
                      chooseExpr()));
}

TEST_P(ASTMatchersTest, GNUNullExpr) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("int* i = __null;", gnuNullExpr()));
}

TEST_P(ASTMatchersTest, GenericSelectionExpr) {
  EXPECT_TRUE(matches("void f() { (void)_Generic(1, int: 1, float: 2.0); }",
                      genericSelectionExpr()));
}

TEST_P(ASTMatchersTest, AtomicExpr) {
  EXPECT_TRUE(matches("void foo() { int *ptr; __atomic_load_n(ptr, 1); }",
                      atomicExpr()));
}

TEST_P(ASTMatchersTest, Initializers_C99) {
  if (!GetParam().isC99OrLater()) {
    return;
  }
  EXPECT_TRUE(matches(
      "void foo() { struct point { double x; double y; };"
      "  struct point ptarray[10] = "
      "      { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; }",
      initListExpr(hasSyntacticForm(initListExpr(
          has(designatedInitExpr(designatorCountIs(2),
                                 hasDescendant(floatLiteral(equals(1.0))),
                                 hasDescendant(integerLiteral(equals(2))))),
          has(designatedInitExpr(designatorCountIs(2),
                                 hasDescendant(floatLiteral(equals(2.0))),
                                 hasDescendant(integerLiteral(equals(2))))),
          has(designatedInitExpr(
              designatorCountIs(2), hasDescendant(floatLiteral(equals(1.0))),
              hasDescendant(integerLiteral(equals(0))))))))));
}

TEST_P(ASTMatchersTest, Initializers_CXX) {
  if (GetParam().Language != Lang_CXX03) {
    // FIXME: Make this test pass with other C++ standard versions.
    return;
  }
  EXPECT_TRUE(matches(
      "void foo() { struct point { double x; double y; };"
      "  struct point ptarray[10] = "
      "      { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 }; }",
      initListExpr(
          has(cxxConstructExpr(requiresZeroInitialization())),
          has(initListExpr(
              hasType(asString("struct point")), has(floatLiteral(equals(1.0))),
              has(implicitValueInitExpr(hasType(asString("double")))))),
          has(initListExpr(hasType(asString("struct point")),
                           has(floatLiteral(equals(2.0))),
                           has(floatLiteral(equals(1.0))))))));
}

TEST_P(ASTMatchersTest, ParenListExpr) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      matches("template<typename T> class foo { void bar() { foo X(*this); } };"
              "template class foo<int>;",
              varDecl(hasInitializer(parenListExpr(has(unaryOperator()))))));
}

TEST_P(ASTMatchersTest, StmtExpr) {
  EXPECT_TRUE(matches("void declToImport() { int C = ({int X=4; X;}); }",
                      varDecl(hasInitializer(stmtExpr()))));
}

TEST_P(ASTMatchersTest, PredefinedExpr) {
  // __func__ expands as StringLiteral("foo")
  EXPECT_TRUE(matches("void foo() { __func__; }",
                      predefinedExpr(hasType(asString("const char[4]")),
                                     has(stringLiteral()))));
}

TEST_P(ASTMatchersTest, AsmStatement) {
  EXPECT_TRUE(matches("void foo() { __asm(\"mov al, 2\"); }", asmStmt()));
}

TEST_P(ASTMatchersTest, HasCondition) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a test for `hasCondition()` that does not depend on C++.
    return;
  }

  StatementMatcher Condition =
      ifStmt(hasCondition(cxxBoolLiteral(equals(true))));

  EXPECT_TRUE(matches("void x() { if (true) {} }", Condition));
  EXPECT_TRUE(notMatches("void x() { if (false) {} }", Condition));
  EXPECT_TRUE(notMatches("void x() { bool a = true; if (a) {} }", Condition));
  EXPECT_TRUE(notMatches("void x() { if (true || false) {} }", Condition));
  EXPECT_TRUE(notMatches("void x() { if (1) {} }", Condition));
}

TEST_P(ASTMatchersTest, ConditionalOperator) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a test for `conditionalOperator()` that does not depend on
    // C++.
    return;
  }

  StatementMatcher Conditional =
      conditionalOperator(hasCondition(cxxBoolLiteral(equals(true))),
                          hasTrueExpression(cxxBoolLiteral(equals(false))));

  EXPECT_TRUE(matches("void x() { true ? false : true; }", Conditional));
  EXPECT_TRUE(notMatches("void x() { false ? false : true; }", Conditional));
  EXPECT_TRUE(notMatches("void x() { true ? true : false; }", Conditional));

  StatementMatcher ConditionalFalse =
      conditionalOperator(hasFalseExpression(cxxBoolLiteral(equals(false))));

  EXPECT_TRUE(matches("void x() { true ? true : false; }", ConditionalFalse));
  EXPECT_TRUE(
      notMatches("void x() { true ? false : true; }", ConditionalFalse));

  EXPECT_TRUE(matches("void x() { true ? true : false; }", ConditionalFalse));
  EXPECT_TRUE(
      notMatches("void x() { true ? false : true; }", ConditionalFalse));
}

TEST_P(ASTMatchersTest, BinaryConditionalOperator) {
  if (!GetParam().isCXX()) {
    // FIXME: This test should work in non-C++ language modes.
    return;
  }

  StatementMatcher AlwaysOne = traverse(
      TK_AsIs, binaryConditionalOperator(
                   hasCondition(implicitCastExpr(has(opaqueValueExpr(
                       hasSourceExpression((integerLiteral(equals(1)))))))),
                   hasFalseExpression(integerLiteral(equals(0)))));

  EXPECT_TRUE(matches("void x() { 1 ?: 0; }", AlwaysOne));

  StatementMatcher FourNotFive = binaryConditionalOperator(
      hasTrueExpression(
          opaqueValueExpr(hasSourceExpression((integerLiteral(equals(4)))))),
      hasFalseExpression(integerLiteral(equals(5))));

  EXPECT_TRUE(matches("void x() { 4 ?: 5; }", FourNotFive));
}

TEST_P(ASTMatchersTest, ArraySubscriptExpr) {
  EXPECT_TRUE(
      matches("int i[2]; void f() { i[1] = 1; }", arraySubscriptExpr()));
  EXPECT_TRUE(notMatches("int i; void f() { i = 1; }", arraySubscriptExpr()));
}

TEST_P(ASTMatchersTest, ForStmt) {
  EXPECT_TRUE(matches("void f() { for(;;); }", forStmt()));
  EXPECT_TRUE(matches("void f() { if(1) for(;;); }", forStmt()));
}

TEST_P(ASTMatchersTest, ForStmt_CXX11) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(notMatches("int as[] = { 1, 2, 3 };"
                         "void f() { for (auto &a : as); }",
                         forStmt()));
}

TEST_P(ASTMatchersTest, ForStmt_NoFalsePositives) {
  EXPECT_TRUE(notMatches("void f() { ; }", forStmt()));
  EXPECT_TRUE(notMatches("void f() { if(1); }", forStmt()));
}

TEST_P(ASTMatchersTest, CompoundStatement) {
  EXPECT_TRUE(notMatches("void f();", compoundStmt()));
  EXPECT_TRUE(matches("void f() {}", compoundStmt()));
  EXPECT_TRUE(matches("void f() {{}}", compoundStmt()));
}

TEST_P(ASTMatchersTest, CompoundStatement_DoesNotMatchEmptyStruct) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a similar test that does not depend on C++.
    return;
  }
  // It's not a compound statement just because there's "{}" in the source
  // text. This is an AST search, not grep.
  EXPECT_TRUE(notMatches("namespace n { struct S {}; }", compoundStmt()));
  EXPECT_TRUE(
      matches("namespace n { struct S { void f() {{}} }; }", compoundStmt()));
}

TEST_P(ASTMatchersTest, CastExpr_MatchesExplicitCasts) {
  EXPECT_TRUE(matches("void *p = (void *)(&p);", castExpr()));
}

TEST_P(ASTMatchersTest, CastExpr_MatchesExplicitCasts_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("char *p = reinterpret_cast<char *>(&p);", castExpr()));
  EXPECT_TRUE(matches("char q, *p = const_cast<char *>(&q);", castExpr()));
  EXPECT_TRUE(matches("char c = char(0);", castExpr()));
}

TEST_P(ASTMatchersTest, CastExpression_MatchesImplicitCasts) {
  // This test creates an implicit cast from int to char.
  EXPECT_TRUE(matches("char c = 0;", traverse(TK_AsIs, castExpr())));
  // This test creates an implicit cast from lvalue to rvalue.
  EXPECT_TRUE(matches("void f() { char c = 0, d = c; }",
                      traverse(TK_AsIs, castExpr())));
}

TEST_P(ASTMatchersTest, CastExpr_DoesNotMatchNonCasts) {
  if (GetParam().Language == Lang_C89 || GetParam().Language == Lang_C99) {
    // This does have a cast in C
    EXPECT_TRUE(matches("char c = '0';", implicitCastExpr()));
  } else {
    EXPECT_TRUE(notMatches("char c = '0';", castExpr()));
  }
  EXPECT_TRUE(notMatches("int i = (0);", castExpr()));
  EXPECT_TRUE(notMatches("int i = 0;", castExpr()));
}

TEST_P(ASTMatchersTest, CastExpr_DoesNotMatchNonCasts_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("char c, &q = c;", castExpr()));
}

TEST_P(ASTMatchersTest, CXXReinterpretCastExpr) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("char* p = reinterpret_cast<char*>(&p);",
                      cxxReinterpretCastExpr()));
}

TEST_P(ASTMatchersTest, CXXReinterpretCastExpr_DoesNotMatchOtherCasts) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("char* p = (char*)(&p);", cxxReinterpretCastExpr()));
  EXPECT_TRUE(notMatches("char q, *p = const_cast<char*>(&q);",
                         cxxReinterpretCastExpr()));
  EXPECT_TRUE(notMatches("void* p = static_cast<void*>(&p);",
                         cxxReinterpretCastExpr()));
  EXPECT_TRUE(notMatches("struct B { virtual ~B() {} }; struct D : B {};"
                         "B b;"
                         "D* p = dynamic_cast<D*>(&b);",
                         cxxReinterpretCastExpr()));
}

TEST_P(ASTMatchersTest, CXXFunctionalCastExpr_MatchesSimpleCase) {
  if (!GetParam().isCXX()) {
    return;
  }
  StringRef foo_class = "class Foo { public: Foo(const char*); };";
  EXPECT_TRUE(matches(foo_class + "void r() { Foo f = Foo(\"hello world\"); }",
                      cxxFunctionalCastExpr()));
}

TEST_P(ASTMatchersTest, CXXFunctionalCastExpr_DoesNotMatchOtherCasts) {
  if (!GetParam().isCXX()) {
    return;
  }
  StringRef FooClass = "class Foo { public: Foo(const char*); };";
  EXPECT_TRUE(
      notMatches(FooClass + "void r() { Foo f = (Foo) \"hello world\"; }",
                 cxxFunctionalCastExpr()));
  EXPECT_TRUE(notMatches(FooClass + "void r() { Foo f = \"hello world\"; }",
                         cxxFunctionalCastExpr()));
}

TEST_P(ASTMatchersTest, CXXDynamicCastExpr) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("struct B { virtual ~B() {} }; struct D : B {};"
                      "B b;"
                      "D* p = dynamic_cast<D*>(&b);",
                      cxxDynamicCastExpr()));
}

TEST_P(ASTMatchersTest, CXXStaticCastExpr_MatchesSimpleCase) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("void* p(static_cast<void*>(&p));", cxxStaticCastExpr()));
}

TEST_P(ASTMatchersTest, CXXStaticCastExpr_DoesNotMatchOtherCasts) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("char* p = (char*)(&p);", cxxStaticCastExpr()));
  EXPECT_TRUE(
      notMatches("char q, *p = const_cast<char*>(&q);", cxxStaticCastExpr()));
  EXPECT_TRUE(notMatches("void* p = reinterpret_cast<char*>(&p);",
                         cxxStaticCastExpr()));
  EXPECT_TRUE(notMatches("struct B { virtual ~B() {} }; struct D : B {};"
                         "B b;"
                         "D* p = dynamic_cast<D*>(&b);",
                         cxxStaticCastExpr()));
}

TEST_P(ASTMatchersTest, CStyleCastExpr_MatchesSimpleCase) {
  EXPECT_TRUE(matches("int i = (int) 2.2f;", cStyleCastExpr()));
}

TEST_P(ASTMatchersTest, CStyleCastExpr_DoesNotMatchOtherCasts) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("char* p = static_cast<char*>(0);"
                         "char q, *r = const_cast<char*>(&q);"
                         "void* s = reinterpret_cast<char*>(&s);"
                         "struct B { virtual ~B() {} }; struct D : B {};"
                         "B b;"
                         "D* t = dynamic_cast<D*>(&b);",
                         cStyleCastExpr()));
}

TEST_P(ASTMatchersTest, ImplicitCastExpr_MatchesSimpleCase) {
  // This test creates an implicit const cast.
  EXPECT_TRUE(
      matches("void f() { int x = 0; const int y = x; }",
              traverse(TK_AsIs, varDecl(hasInitializer(implicitCastExpr())))));
  // This test creates an implicit cast from int to char.
  EXPECT_TRUE(
      matches("char c = 0;",
              traverse(TK_AsIs, varDecl(hasInitializer(implicitCastExpr())))));
  // This test creates an implicit array-to-pointer cast.
  EXPECT_TRUE(
      matches("int arr[6]; int *p = arr;",
              traverse(TK_AsIs, varDecl(hasInitializer(implicitCastExpr())))));
}

TEST_P(ASTMatchersTest, ImplicitCastExpr_DoesNotMatchIncorrectly) {
  // This test verifies that implicitCastExpr() matches exactly when implicit
  // casts are present, and that it ignores explicit and paren casts.

  // These two test cases have no casts.
  EXPECT_TRUE(
      notMatches("int x = 0;", varDecl(hasInitializer(implicitCastExpr()))));
  EXPECT_TRUE(
      notMatches("int x = (0);", varDecl(hasInitializer(implicitCastExpr()))));
  EXPECT_TRUE(notMatches("void f() { int x = 0; double d = (double) x; }",
                         varDecl(hasInitializer(implicitCastExpr()))));
}

TEST_P(ASTMatchersTest, ImplicitCastExpr_DoesNotMatchIncorrectly_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches("int x = 0, &y = x;",
                         varDecl(hasInitializer(implicitCastExpr()))));
  EXPECT_TRUE(notMatches("const int *p; int *q = const_cast<int *>(p);",
                         varDecl(hasInitializer(implicitCastExpr()))));
}

TEST_P(ASTMatchersTest, Stmt_DoesNotMatchDeclarations) {
  EXPECT_TRUE(notMatches("struct X {};", stmt()));
}

TEST_P(ASTMatchersTest, Stmt_MatchesCompoundStatments) {
  EXPECT_TRUE(matches("void x() {}", stmt()));
}

TEST_P(ASTMatchersTest, DeclStmt_DoesNotMatchCompoundStatements) {
  EXPECT_TRUE(notMatches("void x() {}", declStmt()));
}

TEST_P(ASTMatchersTest, DeclStmt_MatchesVariableDeclarationStatements) {
  EXPECT_TRUE(matches("void x() { int a; }", declStmt()));
}

TEST_P(ASTMatchersTest, ExprWithCleanups_MatchesExprWithCleanups) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      matches("struct Foo { ~Foo(); };"
              "const Foo f = Foo();",
              traverse(TK_AsIs, varDecl(hasInitializer(exprWithCleanups())))));
  EXPECT_FALSE(
      matches("struct Foo { }; Foo a;"
              "const Foo f = a;",
              traverse(TK_AsIs, varDecl(hasInitializer(exprWithCleanups())))));
}

TEST_P(ASTMatchersTest, InitListExpr) {
  EXPECT_TRUE(matches("int a[] = { 1, 2 };",
                      initListExpr(hasType(asString("int[2]")))));
  EXPECT_TRUE(matches("struct B { int x, y; }; struct B b = { 5, 6 };",
                      initListExpr(hasType(recordDecl(hasName("B"))))));
  EXPECT_TRUE(
      matches("int i[1] = {42, [0] = 43};", integerLiteral(equals(42))));
}

TEST_P(ASTMatchersTest, InitListExpr_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("struct S { S(void (*a)()); };"
                      "void f();"
                      "S s[1] = { &f };",
                      declRefExpr(to(functionDecl(hasName("f"))))));
}

TEST_P(ASTMatchersTest,
       CXXStdInitializerListExpression_MatchesCXXStdInitializerListExpression) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  StringRef code = "namespace std {"
                   "template <typename> class initializer_list {"
                   "  public: initializer_list() noexcept {}"
                   "};"
                   "}"
                   "struct A {"
                   "  A(std::initializer_list<int>) {}"
                   "};";
  EXPECT_TRUE(matches(
      code + "A a{0};",
      traverse(TK_AsIs, cxxConstructExpr(has(cxxStdInitializerListExpr()),
                                         hasDeclaration(cxxConstructorDecl(
                                             ofClass(hasName("A"))))))));
  EXPECT_TRUE(matches(
      code + "A a = {0};",
      traverse(TK_AsIs, cxxConstructExpr(has(cxxStdInitializerListExpr()),
                                         hasDeclaration(cxxConstructorDecl(
                                             ofClass(hasName("A"))))))));

  EXPECT_TRUE(notMatches("int a[] = { 1, 2 };", cxxStdInitializerListExpr()));
  EXPECT_TRUE(notMatches("struct B { int x, y; }; B b = { 5, 6 };",
                         cxxStdInitializerListExpr()));
}

TEST_P(ASTMatchersTest, UsingDecl_MatchesUsingDeclarations) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("namespace X { int x; } using X::x;", usingDecl()));
}

TEST_P(ASTMatchersTest, UsingDecl_MatchesShadowUsingDelcarations) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("namespace f { int a; } using f::a;",
                      usingDecl(hasAnyUsingShadowDecl(hasName("a")))));
}

TEST_P(ASTMatchersTest, UsingEnumDecl_MatchesUsingEnumDeclarations) {
  if (!GetParam().isCXX20OrLater()) {
    return;
  }
  EXPECT_TRUE(
      matches("namespace X { enum x {}; } using enum X::x;", usingEnumDecl()));
}

TEST_P(ASTMatchersTest, UsingEnumDecl_MatchesShadowUsingDeclarations) {
  if (!GetParam().isCXX20OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("namespace f { enum a {b}; } using enum f::a;",
                      usingEnumDecl(hasAnyUsingShadowDecl(hasName("b")))));
}

TEST_P(ASTMatchersTest, UsingDirectiveDecl_MatchesUsingNamespace) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("namespace X { int x; } using namespace X;",
                      usingDirectiveDecl()));
  EXPECT_FALSE(
      matches("namespace X { int x; } using X::x;", usingDirectiveDecl()));
}

TEST_P(ASTMatchersTest, WhileStmt) {
  EXPECT_TRUE(notMatches("void x() {}", whileStmt()));
  EXPECT_TRUE(matches("void x() { while(1); }", whileStmt()));
  EXPECT_TRUE(notMatches("void x() { do {} while(1); }", whileStmt()));
}

TEST_P(ASTMatchersTest, DoStmt_MatchesDoLoops) {
  EXPECT_TRUE(matches("void x() { do {} while(1); }", doStmt()));
  EXPECT_TRUE(matches("void x() { do ; while(0); }", doStmt()));
}

TEST_P(ASTMatchersTest, DoStmt_DoesNotMatchWhileLoops) {
  EXPECT_TRUE(notMatches("void x() { while(1) {} }", doStmt()));
}

TEST_P(ASTMatchersTest, SwitchCase_MatchesCase) {
  EXPECT_TRUE(matches("void x() { switch(42) { case 42:; } }", switchCase()));
  EXPECT_TRUE(matches("void x() { switch(42) { default:; } }", switchCase()));
  EXPECT_TRUE(matches("void x() { switch(42) default:; }", switchCase()));
  EXPECT_TRUE(notMatches("void x() { switch(42) {} }", switchCase()));
}

TEST_P(ASTMatchersTest, SwitchCase_MatchesSwitch) {
  EXPECT_TRUE(matches("void x() { switch(42) { case 42:; } }", switchStmt()));
  EXPECT_TRUE(matches("void x() { switch(42) { default:; } }", switchStmt()));
  EXPECT_TRUE(matches("void x() { switch(42) default:; }", switchStmt()));
  EXPECT_TRUE(notMatches("void x() {}", switchStmt()));
}

TEST_P(ASTMatchersTest, CxxExceptionHandling_SimpleCases) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", cxxCatchStmt()));
  EXPECT_TRUE(matches("void foo() try { } catch(int X) { }", cxxTryStmt()));
  EXPECT_TRUE(
      notMatches("void foo() try { } catch(int X) { }", cxxThrowExpr()));
  EXPECT_TRUE(
      matches("void foo() try { throw; } catch(int X) { }", cxxThrowExpr()));
  EXPECT_TRUE(
      matches("void foo() try { throw 5;} catch(int X) { }", cxxThrowExpr()));
  EXPECT_TRUE(matches("void foo() try { throw; } catch(...) { }",
                      cxxCatchStmt(isCatchAll())));
  EXPECT_TRUE(notMatches("void foo() try { throw; } catch(int) { }",
                         cxxCatchStmt(isCatchAll())));
  EXPECT_TRUE(matches("void foo() try {} catch(int X) { }",
                      varDecl(isExceptionVariable())));
  EXPECT_TRUE(notMatches("void foo() try { int X; } catch (...) { }",
                         varDecl(isExceptionVariable())));
}

TEST_P(ASTMatchersTest, ParenExpr_SimpleCases) {
  EXPECT_TRUE(matches("int i = (3);", traverse(TK_AsIs, parenExpr())));
  EXPECT_TRUE(matches("int i = (3 + 7);", traverse(TK_AsIs, parenExpr())));
  EXPECT_TRUE(notMatches("int i = 3;", traverse(TK_AsIs, parenExpr())));
  EXPECT_TRUE(notMatches("int f() { return 1; }; void g() { int a = f(); }",
                         traverse(TK_AsIs, parenExpr())));
}

TEST_P(ASTMatchersTest, IgnoringParens) {
  EXPECT_FALSE(matches("const char* str = (\"my-string\");",
                       traverse(TK_AsIs, implicitCastExpr(hasSourceExpression(
                                             stringLiteral())))));
  EXPECT_TRUE(
      matches("const char* str = (\"my-string\");",
              traverse(TK_AsIs, implicitCastExpr(hasSourceExpression(
                                    ignoringParens(stringLiteral()))))));
}

TEST_P(ASTMatchersTest, QualType) {
  EXPECT_TRUE(matches("struct S {};", qualType().bind("loc")));
}

TEST_P(ASTMatchersTest, ConstantArrayType) {
  EXPECT_TRUE(matches("int a[2];", constantArrayType()));
  EXPECT_TRUE(notMatches("void f() { int a[] = { 2, 3 }; int b[a[0]]; }",
                         constantArrayType(hasElementType(builtinType()))));

  EXPECT_TRUE(matches("int a[42];", constantArrayType(hasSize(42))));
  EXPECT_TRUE(matches("int b[2*21];", constantArrayType(hasSize(42))));
  EXPECT_TRUE(notMatches("int c[41], d[43];", constantArrayType(hasSize(42))));
}

TEST_P(ASTMatchersTest, DependentSizedArrayType) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      matches("template <typename T, int Size> class array { T data[Size]; };",
              dependentSizedArrayType()));
  EXPECT_TRUE(
      notMatches("int a[42]; int b[] = { 2, 3 }; void f() { int c[b[0]]; }",
                 dependentSizedArrayType()));
}

TEST_P(ASTMatchersTest, IncompleteArrayType) {
  EXPECT_TRUE(matches("int a[] = { 2, 3 };", incompleteArrayType()));
  EXPECT_TRUE(matches("void f(int a[]) {}", incompleteArrayType()));

  EXPECT_TRUE(notMatches("int a[42]; void f() { int b[a[0]]; }",
                         incompleteArrayType()));
}

TEST_P(ASTMatchersTest, VariableArrayType) {
  EXPECT_TRUE(matches("void f(int b) { int a[b]; }", variableArrayType()));
  EXPECT_TRUE(notMatches("int a[] = {2, 3}; int b[42];", variableArrayType()));

  EXPECT_TRUE(matches("void f(int b) { int a[b]; }",
                      variableArrayType(hasSizeExpr(ignoringImpCasts(
                          declRefExpr(to(varDecl(hasName("b")))))))));
}

TEST_P(ASTMatchersTest, AtomicType) {
  if (llvm::Triple(llvm::sys::getDefaultTargetTriple()).getOS() !=
      llvm::Triple::Win32) {
    // FIXME: Make this work for MSVC.
    EXPECT_TRUE(matches("_Atomic(int) i;", atomicType()));

    EXPECT_TRUE(
        matches("_Atomic(int) i;", atomicType(hasValueType(isInteger()))));
    EXPECT_TRUE(
        notMatches("_Atomic(float) f;", atomicType(hasValueType(isInteger()))));
  }
}

TEST_P(ASTMatchersTest, AutoType) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("auto i = 2;", autoType()));
  EXPECT_TRUE(matches("int v[] = { 2, 3 }; void f() { for (int i : v) {} }",
                      autoType()));

  EXPECT_TRUE(matches("auto i = 2;", varDecl(hasType(isInteger()))));
  EXPECT_TRUE(matches("struct X{}; auto x = X{};",
                      varDecl(hasType(recordDecl(hasName("X"))))));

  // FIXME: Matching against the type-as-written can't work here, because the
  //        type as written was not deduced.
  // EXPECT_TRUE(matches("auto a = 1;",
  //                    autoType(hasDeducedType(isInteger()))));
  // EXPECT_TRUE(notMatches("auto b = 2.0;",
  //                       autoType(hasDeducedType(isInteger()))));
}

TEST_P(ASTMatchersTest, DecltypeType) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("decltype(1 + 1) sum = 1 + 1;", decltypeType()));
  EXPECT_TRUE(matches("decltype(1 + 1) sum = 1 + 1;",
                      decltypeType(hasUnderlyingType(isInteger()))));
}

TEST_P(ASTMatchersTest, FunctionType) {
  EXPECT_TRUE(matches("int (*f)(int);", functionType()));
  EXPECT_TRUE(matches("void f(int i) {}", functionType()));
}

TEST_P(ASTMatchersTest, IgnoringParens_Type) {
  EXPECT_TRUE(
      notMatches("void (*fp)(void);", pointerType(pointee(functionType()))));
  EXPECT_TRUE(matches("void (*fp)(void);",
                      pointerType(pointee(ignoringParens(functionType())))));
}

TEST_P(ASTMatchersTest, FunctionProtoType) {
  EXPECT_TRUE(matches("int (*f)(int);", functionProtoType()));
  EXPECT_TRUE(matches("void f(int i);", functionProtoType()));
  EXPECT_TRUE(matches("void f(void);", functionProtoType(parameterCountIs(0))));
}

TEST_P(ASTMatchersTest, FunctionProtoType_C) {
  if (!GetParam().isC()) {
    return;
  }
  EXPECT_TRUE(notMatches("void f();", functionProtoType()));
}

TEST_P(ASTMatchersTest, FunctionProtoType_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("void f();", functionProtoType(parameterCountIs(0))));
}

TEST_P(ASTMatchersTest, ParenType) {
  EXPECT_TRUE(
      matches("int (*array)[4];", varDecl(hasType(pointsTo(parenType())))));
  EXPECT_TRUE(notMatches("int *array[4];", varDecl(hasType(parenType()))));

  EXPECT_TRUE(matches(
      "int (*ptr_to_func)(int);",
      varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
  EXPECT_TRUE(notMatches(
      "int (*ptr_to_array)[4];",
      varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
}

TEST_P(ASTMatchersTest, PointerType) {
  // FIXME: Reactive when these tests can be more specific (not matching
  // implicit code on certain platforms), likely when we have hasDescendant for
  // Types/TypeLocs.
  // EXPECT_TRUE(matchAndVerifyResultTrue(
  //    "int* a;",
  //    pointerTypeLoc(pointeeLoc(typeLoc().bind("loc"))),
  //    std::make_unique<VerifyIdIsBoundTo<TypeLoc>>("loc", 1)));
  // EXPECT_TRUE(matchAndVerifyResultTrue(
  //    "int* a;",
  //    pointerTypeLoc().bind("loc"),
  //    std::make_unique<VerifyIdIsBoundTo<TypeLoc>>("loc", 1)));
  EXPECT_TRUE(matches("int** a;", loc(pointerType(pointee(qualType())))));
  EXPECT_TRUE(matches("int** a;", loc(pointerType(pointee(pointerType())))));
  EXPECT_TRUE(matches("int* b; int* * const a = &b;",
                      loc(qualType(isConstQualified(), pointerType()))));

  StringRef Fragment = "int *ptr;";
  EXPECT_TRUE(notMatches(Fragment,
                         varDecl(hasName("ptr"), hasType(blockPointerType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("ptr"), hasType(memberPointerType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("ptr"), hasType(pointerType()))));
  EXPECT_TRUE(
      notMatches(Fragment, varDecl(hasName("ptr"), hasType(referenceType()))));
}

TEST_P(ASTMatchersTest, PointerType_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  StringRef Fragment = "struct A { int i; }; int A::* ptr = &A::i;";
  EXPECT_TRUE(notMatches(Fragment,
                         varDecl(hasName("ptr"), hasType(blockPointerType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("ptr"), hasType(memberPointerType()))));
  EXPECT_TRUE(
      notMatches(Fragment, varDecl(hasName("ptr"), hasType(pointerType()))));
  EXPECT_TRUE(
      notMatches(Fragment, varDecl(hasName("ptr"), hasType(referenceType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("ptr"), hasType(lValueReferenceType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("ptr"), hasType(rValueReferenceType()))));

  Fragment = "int a; int &ref = a;";
  EXPECT_TRUE(notMatches(Fragment,
                         varDecl(hasName("ref"), hasType(blockPointerType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("ref"), hasType(memberPointerType()))));
  EXPECT_TRUE(
      notMatches(Fragment, varDecl(hasName("ref"), hasType(pointerType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("ref"), hasType(referenceType()))));
  EXPECT_TRUE(matches(Fragment,
                      varDecl(hasName("ref"), hasType(lValueReferenceType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("ref"), hasType(rValueReferenceType()))));
}

TEST_P(ASTMatchersTest, PointerType_CXX11) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  StringRef Fragment = "int &&ref = 2;";
  EXPECT_TRUE(notMatches(Fragment,
                         varDecl(hasName("ref"), hasType(blockPointerType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("ref"), hasType(memberPointerType()))));
  EXPECT_TRUE(
      notMatches(Fragment, varDecl(hasName("ref"), hasType(pointerType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("ref"), hasType(referenceType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("ref"), hasType(lValueReferenceType()))));
  EXPECT_TRUE(matches(Fragment,
                      varDecl(hasName("ref"), hasType(rValueReferenceType()))));
}

TEST_P(ASTMatchersTest, AutoRefTypes) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }

  StringRef Fragment = "auto a = 1;"
                       "auto b = a;"
                       "auto &c = a;"
                       "auto &&d = c;"
                       "auto &&e = 2;";
  EXPECT_TRUE(
      notMatches(Fragment, varDecl(hasName("a"), hasType(referenceType()))));
  EXPECT_TRUE(
      notMatches(Fragment, varDecl(hasName("b"), hasType(referenceType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("c"), hasType(referenceType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("c"), hasType(lValueReferenceType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("c"), hasType(rValueReferenceType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("d"), hasType(referenceType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("d"), hasType(lValueReferenceType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("d"), hasType(rValueReferenceType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("e"), hasType(referenceType()))));
  EXPECT_TRUE(notMatches(
      Fragment, varDecl(hasName("e"), hasType(lValueReferenceType()))));
  EXPECT_TRUE(
      matches(Fragment, varDecl(hasName("e"), hasType(rValueReferenceType()))));
}

TEST_P(ASTMatchersTest, EnumType) {
  EXPECT_TRUE(
      matches("enum Color { Green }; enum Color color;", loc(enumType())));
}

TEST_P(ASTMatchersTest, EnumType_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("enum Color { Green }; Color color;", loc(enumType())));
}

TEST_P(ASTMatchersTest, EnumType_CXX11) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(
      matches("enum class Color { Green }; Color color;", loc(enumType())));
}

TEST_P(ASTMatchersTest, PointerType_MatchesPointersToConstTypes) {
  EXPECT_TRUE(matches("int b; int * const a = &b;", loc(pointerType())));
  EXPECT_TRUE(matches("int b; int * const a = &b;", loc(pointerType())));
  EXPECT_TRUE(matches("int b; const int * a = &b;",
                      loc(pointerType(pointee(builtinType())))));
  EXPECT_TRUE(matches("int b; const int * a = &b;",
                      pointerType(pointee(builtinType()))));
}

TEST_P(ASTMatchersTest, TypedefType) {
  EXPECT_TRUE(matches("typedef int X; X a;",
                      varDecl(hasName("a"), hasType(typedefType()))));
}

TEST_P(ASTMatchersTest, TemplateSpecializationType) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("template <typename T> class A{}; A<int> a;",
                      templateSpecializationType()));
}

TEST_P(ASTMatchersTest, DeducedTemplateSpecializationType) {
  if (!GetParam().isCXX17OrLater()) {
    return;
  }
  EXPECT_TRUE(
      matches("template <typename T> class A{ public: A(T) {} }; A a(1);",
              deducedTemplateSpecializationType()));
}

TEST_P(ASTMatchersTest, RecordType) {
  EXPECT_TRUE(matches("struct S {}; struct S s;",
                      recordType(hasDeclaration(recordDecl(hasName("S"))))));
  EXPECT_TRUE(notMatches("int i;",
                         recordType(hasDeclaration(recordDecl(hasName("S"))))));
}

TEST_P(ASTMatchersTest, RecordType_CXX) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("class C {}; C c;", recordType()));
  EXPECT_TRUE(matches("struct S {}; S s;",
                      recordType(hasDeclaration(recordDecl(hasName("S"))))));
}

TEST_P(ASTMatchersTest, ElaboratedType) {
  if (!GetParam().isCXX()) {
    // FIXME: Add a test for `elaboratedType()` that does not depend on C++.
    return;
  }
  EXPECT_TRUE(matches("namespace N {"
                      "  namespace M {"
                      "    class D {};"
                      "  }"
                      "}"
                      "N::M::D d;",
                      elaboratedType()));
  EXPECT_TRUE(matches("class C {} c;", elaboratedType()));
  EXPECT_TRUE(notMatches("class C {}; C c;", elaboratedType()));
}

TEST_P(ASTMatchersTest, SubstTemplateTypeParmType) {
  if (!GetParam().isCXX()) {
    return;
  }
  StringRef code = "template <typename T>"
                   "int F() {"
                   "  return 1 + T();"
                   "}"
                   "int i = F<int>();";
  EXPECT_FALSE(matches(code, binaryOperator(hasLHS(
                                 expr(hasType(substTemplateTypeParmType()))))));
  EXPECT_TRUE(matches(code, binaryOperator(hasRHS(
                                expr(hasType(substTemplateTypeParmType()))))));
}

TEST_P(ASTMatchersTest, NestedNameSpecifier) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      matches("namespace ns { struct A {}; } ns::A a;", nestedNameSpecifier()));
  EXPECT_TRUE(matches("template <typename T> class A { typename T::B b; };",
                      nestedNameSpecifier()));
  EXPECT_TRUE(
      matches("struct A { void f(); }; void A::f() {}", nestedNameSpecifier()));
  EXPECT_TRUE(matches("namespace a { namespace b {} } namespace ab = a::b;",
                      nestedNameSpecifier()));

  EXPECT_TRUE(matches("struct A { static void f() {} }; void g() { A::f(); }",
                      nestedNameSpecifier()));
  EXPECT_TRUE(
      notMatches("struct A { static void f() {} }; void g(A* a) { a->f(); }",
                 nestedNameSpecifier()));
}

TEST_P(ASTMatchersTest, Attr) {
  // Windows adds some implicit attributes.
  bool AutomaticAttributes = StringRef(GetParam().Target).contains("win32");
  if (GetParam().isCXX11OrLater()) {
    EXPECT_TRUE(matches("struct [[clang::warn_unused_result]] F{};", attr()));

    // Unknown attributes are not parsed into an AST node.
    if (!AutomaticAttributes) {
      EXPECT_TRUE(notMatches("int x [[unknownattr]];", attr()));
    }
  }
  if (GetParam().isCXX17OrLater()) {
    EXPECT_TRUE(matches("struct [[nodiscard]] F{};", attr()));
  }
  EXPECT_TRUE(matches("int x(int * __attribute__((nonnull)) );", attr()));
  if (!AutomaticAttributes) {
    EXPECT_TRUE(notMatches("struct F{}; int x(int *);", attr()));
    // Some known attributes are not parsed into an AST node.
    EXPECT_TRUE(notMatches("typedef int x __attribute__((ext_vector_type(1)));",
                           attr()));
  }
}

TEST_P(ASTMatchersTest, NullStmt) {
  EXPECT_TRUE(matches("void f() {int i;;}", nullStmt()));
  EXPECT_TRUE(notMatches("void f() {int i;}", nullStmt()));
}

TEST_P(ASTMatchersTest, NamespaceAliasDecl) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("namespace test {} namespace alias = ::test;",
                      namespaceAliasDecl(hasName("alias"))));
}

TEST_P(ASTMatchersTest, NestedNameSpecifier_MatchesTypes) {
  if (!GetParam().isCXX()) {
    return;
  }
  NestedNameSpecifierMatcher Matcher = nestedNameSpecifier(
      specifiesType(hasDeclaration(recordDecl(hasName("A")))));
  EXPECT_TRUE(matches("struct A { struct B {}; }; A::B b;", Matcher));
  EXPECT_TRUE(
      matches("struct A { struct B { struct C {}; }; }; A::B::C c;", Matcher));
  EXPECT_TRUE(notMatches("namespace A { struct B {}; } A::B b;", Matcher));
}

TEST_P(ASTMatchersTest, NestedNameSpecifier_MatchesNamespaceDecls) {
  if (!GetParam().isCXX()) {
    return;
  }
  NestedNameSpecifierMatcher Matcher =
      nestedNameSpecifier(specifiesNamespace(hasName("ns")));
  EXPECT_TRUE(matches("namespace ns { struct A {}; } ns::A a;", Matcher));
  EXPECT_TRUE(notMatches("namespace xx { struct A {}; } xx::A a;", Matcher));
  EXPECT_TRUE(notMatches("struct ns { struct A {}; }; ns::A a;", Matcher));
}

TEST_P(ASTMatchersTest,
       NestedNameSpecifier_MatchesNestedNameSpecifierPrefixes) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches(
      "struct A { struct B { struct C {}; }; }; A::B::C c;",
      nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A"))))));
  EXPECT_TRUE(matches("struct A { struct B { struct C {}; }; }; A::B::C c;",
                      nestedNameSpecifierLoc(hasPrefix(specifiesTypeLoc(
                          loc(qualType(asString("struct A"))))))));
  EXPECT_TRUE(matches(
      "namespace N { struct A { struct B { struct C {}; }; }; } N::A::B::C c;",
      nestedNameSpecifierLoc(hasPrefix(
          specifiesTypeLoc(loc(qualType(asString("struct N::A"))))))));
}

template <typename T>
class VerifyAncestorHasChildIsEqual : public BoundNodesCallback {
public:
  bool run(const BoundNodes *Nodes) override { return false; }

  bool run(const BoundNodes *Nodes, ASTContext *Context) override {
    const T *Node = Nodes->getNodeAs<T>("");
    return verify(*Nodes, *Context, Node);
  }

  bool verify(const BoundNodes &Nodes, ASTContext &Context, const Stmt *Node) {
    // Use the original typed pointer to verify we can pass pointers to subtypes
    // to equalsNode.
    const T *TypedNode = cast<T>(Node);
    return selectFirst<T>(
               "", match(stmt(hasParent(
                             stmt(has(stmt(equalsNode(TypedNode)))).bind(""))),
                         *Node, Context)) != nullptr;
  }
  bool verify(const BoundNodes &Nodes, ASTContext &Context, const Decl *Node) {
    // Use the original typed pointer to verify we can pass pointers to subtypes
    // to equalsNode.
    const T *TypedNode = cast<T>(Node);
    return selectFirst<T>(
               "", match(decl(hasParent(
                             decl(has(decl(equalsNode(TypedNode)))).bind(""))),
                         *Node, Context)) != nullptr;
  }
  bool verify(const BoundNodes &Nodes, ASTContext &Context, const Type *Node) {
    // Use the original typed pointer to verify we can pass pointers to subtypes
    // to equalsNode.
    const T *TypedNode = cast<T>(Node);
    const auto *Dec = Nodes.getNodeAs<FieldDecl>("decl");
    return selectFirst<T>(
               "", match(fieldDecl(hasParent(decl(has(fieldDecl(
                             hasType(type(equalsNode(TypedNode)).bind(""))))))),
                         *Dec, Context)) != nullptr;
  }
};

TEST_P(ASTMatchersTest, IsEqualTo_MatchesNodesByIdentity) {
  EXPECT_TRUE(matchAndVerifyResultTrue(
      "void f() { if (1) if(1) {} }", ifStmt().bind(""),
      std::make_unique<VerifyAncestorHasChildIsEqual<IfStmt>>()));
}

TEST_P(ASTMatchersTest, IsEqualTo_MatchesNodesByIdentity_Cxx) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matchAndVerifyResultTrue(
      "class X { class Y {}; };", recordDecl(hasName("::X::Y")).bind(""),
      std::make_unique<VerifyAncestorHasChildIsEqual<CXXRecordDecl>>()));
  EXPECT_TRUE(matchAndVerifyResultTrue(
      "class X { class Y {} y; };",
      fieldDecl(hasName("y"), hasType(type().bind(""))).bind("decl"),
      std::make_unique<VerifyAncestorHasChildIsEqual<Type>>()));
}

TEST_P(ASTMatchersTest, TypedefDecl) {
  EXPECT_TRUE(matches("typedef int typedefDeclTest;",
                      typedefDecl(hasName("typedefDeclTest"))));
}

TEST_P(ASTMatchersTest, TypedefDecl_Cxx) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(notMatches("using typedefDeclTest = int;",
                         typedefDecl(hasName("typedefDeclTest"))));
}

TEST_P(ASTMatchersTest, TypeAliasDecl) {
  EXPECT_TRUE(notMatches("typedef int typeAliasTest;",
                         typeAliasDecl(hasName("typeAliasTest"))));
}

TEST_P(ASTMatchersTest, TypeAliasDecl_CXX) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("using typeAliasTest = int;",
                      typeAliasDecl(hasName("typeAliasTest"))));
}

TEST_P(ASTMatchersTest, TypedefNameDecl) {
  EXPECT_TRUE(matches("typedef int typedefNameDeclTest1;",
                      typedefNameDecl(hasName("typedefNameDeclTest1"))));
}

TEST_P(ASTMatchersTest, TypedefNameDecl_CXX) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("using typedefNameDeclTest = int;",
                      typedefNameDecl(hasName("typedefNameDeclTest"))));
}

TEST_P(ASTMatchersTest, TypeAliasTemplateDecl) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  StringRef Code = R"(
    template <typename T>
    class X { T t; };

    template <typename T>
    using typeAliasTemplateDecl = X<T>;

    using typeAliasDecl = X<int>;
  )";
  EXPECT_TRUE(
      matches(Code, typeAliasTemplateDecl(hasName("typeAliasTemplateDecl"))));
  EXPECT_TRUE(
      notMatches(Code, typeAliasTemplateDecl(hasName("typeAliasDecl"))));
}

TEST_P(ASTMatchersTest, QualifiedTypeLocTest_BindsToConstIntVarDecl) {
  EXPECT_TRUE(matches("const int x = 0;",
                      qualifiedTypeLoc(loc(asString("const int")))));
}

TEST_P(ASTMatchersTest, QualifiedTypeLocTest_BindsToConstIntFunctionDecl) {
  EXPECT_TRUE(matches("const int f() { return 5; }",
                      qualifiedTypeLoc(loc(asString("const int")))));
}

TEST_P(ASTMatchersTest, QualifiedTypeLocTest_DoesNotBindToUnqualifiedVarDecl) {
  EXPECT_TRUE(notMatches("int x = 0;", qualifiedTypeLoc(loc(asString("int")))));
}

TEST_P(ASTMatchersTest, QualifiedTypeLocTest_IntDoesNotBindToConstIntDecl) {
  EXPECT_TRUE(
      notMatches("const int x = 0;", qualifiedTypeLoc(loc(asString("int")))));
}

TEST_P(ASTMatchersTest, QualifiedTypeLocTest_IntDoesNotBindToConstFloatDecl) {
  EXPECT_TRUE(
      notMatches("const float x = 0;", qualifiedTypeLoc(loc(asString("int")))));
}

TEST_P(ASTMatchersTest, PointerTypeLocTest_BindsToAnyPointerTypeLoc) {
  auto matcher = varDecl(hasName("x"), hasTypeLoc(pointerTypeLoc()));
  EXPECT_TRUE(matches("int* x;", matcher));
  EXPECT_TRUE(matches("float* x;", matcher));
  EXPECT_TRUE(matches("char* x;", matcher));
  EXPECT_TRUE(matches("void* x;", matcher));
}

TEST_P(ASTMatchersTest, PointerTypeLocTest_DoesNotBindToNonPointerTypeLoc) {
  auto matcher = varDecl(hasName("x"), hasTypeLoc(pointerTypeLoc()));
  EXPECT_TRUE(notMatches("int x;", matcher));
  EXPECT_TRUE(notMatches("float x;", matcher));
  EXPECT_TRUE(notMatches("char x;", matcher));
}

TEST_P(ASTMatchersTest, ReferenceTypeLocTest_BindsToAnyReferenceTypeLoc) {
  if (!GetParam().isCXX()) {
    return;
  }
  auto matcher = varDecl(hasName("r"), hasTypeLoc(referenceTypeLoc()));
  EXPECT_TRUE(matches("int rr = 3; int& r = rr;", matcher));
  EXPECT_TRUE(matches("int rr = 3; auto& r = rr;", matcher));
  EXPECT_TRUE(matches("int rr = 3; const int& r = rr;", matcher));
  EXPECT_TRUE(matches("float rr = 3.0; float& r = rr;", matcher));
  EXPECT_TRUE(matches("char rr = 'a'; char& r = rr;", matcher));
}

TEST_P(ASTMatchersTest, ReferenceTypeLocTest_DoesNotBindToNonReferenceTypeLoc) {
  auto matcher = varDecl(hasName("r"), hasTypeLoc(referenceTypeLoc()));
  EXPECT_TRUE(notMatches("int r;", matcher));
  EXPECT_TRUE(notMatches("int r = 3;", matcher));
  EXPECT_TRUE(notMatches("const int r = 3;", matcher));
  EXPECT_TRUE(notMatches("int* r;", matcher));
  EXPECT_TRUE(notMatches("float r;", matcher));
  EXPECT_TRUE(notMatches("char r;", matcher));
}

TEST_P(ASTMatchersTest, ReferenceTypeLocTest_BindsToAnyRvalueReferenceTypeLoc) {
  if (!GetParam().isCXX()) {
    return;
  }
  auto matcher = varDecl(hasName("r"), hasTypeLoc(referenceTypeLoc()));
  EXPECT_TRUE(matches("int&& r = 3;", matcher));
  EXPECT_TRUE(matches("auto&& r = 3;", matcher));
  EXPECT_TRUE(matches("float&& r = 3.0;", matcher));
}

TEST_P(
    ASTMatchersTest,
    TemplateSpecializationTypeLocTest_BindsToTemplateSpecializationExplicitInstantiation) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      matches("template <typename T> class C {}; template class C<int>;",
              classTemplateSpecializationDecl(
                  hasName("C"), hasTypeLoc(templateSpecializationTypeLoc()))));
}

TEST_P(ASTMatchersTest,
       TemplateSpecializationTypeLocTest_BindsToVarDeclTemplateSpecialization) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches(
      "template <typename T> class C {}; C<char> var;",
      varDecl(hasName("var"), hasTypeLoc(templateSpecializationTypeLoc()))));
}

TEST_P(
    ASTMatchersTest,
    TemplateSpecializationTypeLocTest_DoesNotBindToNonTemplateSpecialization) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(notMatches(
      "class C {}; C var;",
      varDecl(hasName("var"), hasTypeLoc(templateSpecializationTypeLoc()))));
}

TEST_P(ASTMatchersTest,
       ElaboratedTypeLocTest_BindsToElaboratedObjectDeclaration) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("class C {}; class C c;",
                      varDecl(hasName("c"), hasTypeLoc(elaboratedTypeLoc()))));
}

TEST_P(ASTMatchersTest,
       ElaboratedTypeLocTest_BindsToNamespaceElaboratedObjectDeclaration) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(matches("namespace N { class D {}; } N::D d;",
                      varDecl(hasName("d"), hasTypeLoc(elaboratedTypeLoc()))));
}

TEST_P(ASTMatchersTest,
       ElaboratedTypeLocTest_BindsToElaboratedStructDeclaration) {
  EXPECT_TRUE(matches("struct s {}; struct s ss;",
                      varDecl(hasName("ss"), hasTypeLoc(elaboratedTypeLoc()))));
}

TEST_P(ASTMatchersTest,
       ElaboratedTypeLocTest_DoesNotBindToNonElaboratedObjectDeclaration) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      notMatches("class C {}; C c;",
                 varDecl(hasName("c"), hasTypeLoc(elaboratedTypeLoc()))));
}

TEST_P(
    ASTMatchersTest,
    ElaboratedTypeLocTest_DoesNotBindToNamespaceNonElaboratedObjectDeclaration) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      notMatches("namespace N { class D {}; } using N::D; D d;",
                 varDecl(hasName("d"), hasTypeLoc(elaboratedTypeLoc()))));
}

TEST_P(ASTMatchersTest,
       ElaboratedTypeLocTest_DoesNotBindToNonElaboratedStructDeclaration) {
  if (!GetParam().isCXX()) {
    return;
  }
  EXPECT_TRUE(
      notMatches("struct s {}; s ss;",
                 varDecl(hasName("ss"), hasTypeLoc(elaboratedTypeLoc()))));
}

TEST_P(ASTMatchersTest, LambdaCaptureTest) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  EXPECT_TRUE(matches("int main() { int cc; auto f = [cc](){ return cc; }; }",
                      lambdaExpr(hasAnyCapture(lambdaCapture()))));
}

TEST_P(ASTMatchersTest, LambdaCaptureTest_BindsToCaptureOfVarDecl) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  auto matcher = lambdaExpr(
      hasAnyCapture(lambdaCapture(capturesVar(varDecl(hasName("cc"))))));
  EXPECT_TRUE(matches("int main() { int cc; auto f = [cc](){ return cc; }; }",
                      matcher));
  EXPECT_TRUE(matches("int main() { int cc; auto f = [&cc](){ return cc; }; }",
                      matcher));
  EXPECT_TRUE(
      matches("int main() { int cc; auto f = [=](){ return cc; }; }", matcher));
  EXPECT_TRUE(
      matches("int main() { int cc; auto f = [&](){ return cc; }; }", matcher));
}

TEST_P(ASTMatchersTest, LambdaCaptureTest_BindsToCaptureWithInitializer) {
  if (!GetParam().isCXX14OrLater()) {
    return;
  }
  auto matcher = lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(
      varDecl(hasName("cc"), hasInitializer(integerLiteral(equals(1))))))));
  EXPECT_TRUE(
      matches("int main() { auto lambda = [cc = 1] {return cc;}; }", matcher));
  EXPECT_TRUE(
      matches("int main() { int cc = 2; auto lambda = [cc = 1] {return cc;}; }",
              matcher));
}

TEST_P(ASTMatchersTest, LambdaCaptureTest_DoesNotBindToCaptureOfVarDecl) {
  if (!GetParam().isCXX11OrLater()) {
    return;
  }
  auto matcher = lambdaExpr(
      hasAnyCapture(lambdaCapture(capturesVar(varDecl(hasName("cc"))))));
  EXPECT_FALSE(matches("int main() { auto f = [](){ return 5; }; }", matcher));
  EXPECT_FALSE(matches("int main() { int xx; auto f = [xx](){ return xx; }; }",
                       matcher));
}

TEST_P(ASTMatchersTest,
       LambdaCaptureTest_DoesNotBindToCaptureWithInitializerAndDifferentName) {
  if (!GetParam().isCXX14OrLater()) {
    return;
  }
  EXPECT_FALSE(matches(
      "int main() { auto lambda = [xx = 1] {return xx;}; }",
      lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(varDecl(
          hasName("cc"), hasInitializer(integerLiteral(equals(1))))))))));
}

TEST(ASTMatchersTestObjC, ObjCMessageCalees) {
  StatementMatcher MessagingFoo =
      objcMessageExpr(callee(objcMethodDecl(hasName("foo"))));

  EXPECT_TRUE(matchesObjC("@interface I"
                          "+ (void)foo;"
                          "@end\n"
                          "int main() {"
                          "  [I foo];"
                          "}",
                          MessagingFoo));
  EXPECT_TRUE(notMatchesObjC("@interface I"
                             "+ (void)foo;"
                             "+ (void)bar;"
                             "@end\n"
                             "int main() {"
                             "  [I bar];"
                             "}",
                             MessagingFoo));
  EXPECT_TRUE(matchesObjC("@interface I"
                          "- (void)foo;"
                          "- (void)bar;"
                          "@end\n"
                          "int main() {"
                          "  I *i;"
                          "  [i foo];"
                          "}",
                          MessagingFoo));
  EXPECT_TRUE(notMatchesObjC("@interface I"
                             "- (void)foo;"
                             "- (void)bar;"
                             "@end\n"
                             "int main() {"
                             "  I *i;"
                             "  [i bar];"
                             "}",
                             MessagingFoo));
}

TEST(ASTMatchersTestObjC, ObjCMessageExpr) {
  // Don't find ObjCMessageExpr where none are present.
  EXPECT_TRUE(notMatchesObjC("", objcMessageExpr(anything())));

  StringRef Objc1String = "@interface Str "
                          " - (Str *)uppercaseString;"
                          "@end "
                          "@interface foo "
                          "- (void)contents;"
                          "- (void)meth:(Str *)text;"
                          "@end "
                          " "
                          "@implementation foo "
                          "- (void) meth:(Str *)text { "
                          "  [self contents];"
                          "  Str *up = [text uppercaseString];"
                          "} "
                          "@end ";
  EXPECT_TRUE(matchesObjC(Objc1String, objcMessageExpr(anything())));
  EXPECT_TRUE(matchesObjC(Objc1String,
                          objcMessageExpr(hasAnySelector({"contents", "meth:"}))

                              ));
  EXPECT_TRUE(
      matchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"))));
  EXPECT_TRUE(matchesObjC(
      Objc1String, objcMessageExpr(hasAnySelector("contents", "contentsA"))));
  EXPECT_FALSE(matchesObjC(
      Objc1String, objcMessageExpr(hasAnySelector("contentsB", "contentsC"))));
  EXPECT_TRUE(
      matchesObjC(Objc1String, objcMessageExpr(matchesSelector("cont*"))));
  EXPECT_FALSE(
      matchesObjC(Objc1String, objcMessageExpr(matchesSelector("?cont*"))));
  EXPECT_TRUE(
      notMatchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"),
                                                  hasNullSelector())));
  EXPECT_TRUE(matchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"),
                                                       hasUnarySelector())));
  EXPECT_TRUE(matchesObjC(Objc1String, objcMessageExpr(hasSelector("contents"),
                                                       numSelectorArgs(0))));
  EXPECT_TRUE(
      matchesObjC(Objc1String, objcMessageExpr(matchesSelector("uppercase*"),
                                               argumentCountIs(0))));
}

TEST(ASTMatchersTestObjC, ObjCStringLiteral) {

  StringRef Objc1String = "@interface NSObject "
                          "@end "
                          "@interface NSString "
                          "@end "
                          "@interface Test : NSObject "
                          "+ (void)someFunction:(NSString *)Desc; "
                          "@end "
                          "@implementation Test "
                          "+ (void)someFunction:(NSString *)Desc { "
                          "    return; "
                          "} "
                          "- (void) foo { "
                          "    [Test someFunction:@\"Ola!\"]; "
                          "}\n"
                          "@end ";
    EXPECT_TRUE(matchesObjC(Objc1String, objcStringLiteral()));
}

TEST(ASTMatchersTestObjC, ObjCDecls) {
  StringRef ObjCString = "@protocol Proto "
                         "- (void)protoDidThing; "
                         "@end "
                         "@interface Thing "
                         "@property int enabled; "
                         "@end "
                         "@interface Thing (ABC) "
                         "- (void)abc_doThing; "
                         "@end "
                         "@implementation Thing "
                         "{ id _ivar; } "
                         "- (void)anything {} "
                         "@end "
                         "@implementation Thing (ABC) "
                         "- (void)abc_doThing {} "
                         "@end ";

  EXPECT_TRUE(matchesObjC(ObjCString, objcProtocolDecl(hasName("Proto"))));
  EXPECT_TRUE(
      matchesObjC(ObjCString, objcImplementationDecl(hasName("Thing"))));
  EXPECT_TRUE(matchesObjC(ObjCString, objcCategoryDecl(hasName("ABC"))));
  EXPECT_TRUE(matchesObjC(ObjCString, objcCategoryImplDecl(hasName("ABC"))));
  EXPECT_TRUE(
      matchesObjC(ObjCString, objcMethodDecl(hasName("protoDidThing"))));
  EXPECT_TRUE(matchesObjC(ObjCString, objcMethodDecl(hasName("abc_doThing"))));
  EXPECT_TRUE(matchesObjC(ObjCString, objcMethodDecl(hasName("anything"))));
  EXPECT_TRUE(matchesObjC(ObjCString, objcIvarDecl(hasName("_ivar"))));
  EXPECT_TRUE(matchesObjC(ObjCString, objcPropertyDecl(hasName("enabled"))));
}

TEST(ASTMatchersTestObjC, ObjCExceptionStmts) {
  StringRef ObjCString = "void f(id obj) {"
                         "  @try {"
                         "    @throw obj;"
                         "  } @catch (...) {"
                         "  } @finally {}"
                         "}";

  EXPECT_TRUE(matchesObjC(ObjCString, objcTryStmt()));
  EXPECT_TRUE(matchesObjC(ObjCString, objcThrowStmt()));
  EXPECT_TRUE(matchesObjC(ObjCString, objcCatchStmt()));
  EXPECT_TRUE(matchesObjC(ObjCString, objcFinallyStmt()));
}

TEST(ASTMatchersTest, DecompositionDecl) {
  StringRef Code = R"cpp(
void foo()
{
    int arr[3];
    auto &[f, s, t] = arr;

    f = 42;
}
  )cpp";
  EXPECT_TRUE(matchesConditionally(
      Code, decompositionDecl(hasBinding(0, bindingDecl(hasName("f")))), true,
      {"-std=c++17"}));
  EXPECT_FALSE(matchesConditionally(
      Code, decompositionDecl(hasBinding(42, bindingDecl(hasName("f")))), true,
      {"-std=c++17"}));
  EXPECT_FALSE(matchesConditionally(
      Code, decompositionDecl(hasBinding(0, bindingDecl(hasName("s")))), true,
      {"-std=c++17"}));
  EXPECT_TRUE(matchesConditionally(
      Code, decompositionDecl(hasBinding(1, bindingDecl(hasName("s")))), true,
      {"-std=c++17"}));

  EXPECT_TRUE(matchesConditionally(
      Code,
      bindingDecl(decl().bind("self"), hasName("f"),
                  forDecomposition(decompositionDecl(
                      hasAnyBinding(bindingDecl(equalsBoundNode("self")))))),
      true, {"-std=c++17"}));
}

TEST(ASTMatchersTestObjC, ObjCAutoreleasePoolStmt) {
  StringRef ObjCString = "void f() {"
                         "@autoreleasepool {"
                         "  int x = 1;"
                         "}"
                         "}";
  EXPECT_TRUE(matchesObjC(ObjCString, autoreleasePoolStmt()));
  StringRef ObjCStringNoPool = "void f() { int x = 1; }";
  EXPECT_FALSE(matchesObjC(ObjCStringNoPool, autoreleasePoolStmt()));
}

TEST(ASTMatchersTestOpenMP, OMPExecutableDirective) {
  auto Matcher = stmt(ompExecutableDirective());

  StringRef Source0 = R"(
void x() {
#pragma omp parallel
;
})";
  EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher));

  StringRef Source1 = R"(
void x() {
#pragma omp taskyield
;
})";
  EXPECT_TRUE(matchesWithOpenMP(Source1, Matcher));

  StringRef Source2 = R"(
void x() {
;
})";
  EXPECT_TRUE(notMatchesWithOpenMP(Source2, Matcher));
}

TEST(ASTMatchersTestOpenMP, OMPDefaultClause) {
  auto Matcher = ompExecutableDirective(hasAnyClause(ompDefaultClause()));

  StringRef Source0 = R"(
void x() {
;
})";
  EXPECT_TRUE(notMatchesWithOpenMP(Source0, Matcher));

  StringRef Source1 = R"(
void x() {
#pragma omp parallel
;
})";
  EXPECT_TRUE(notMatchesWithOpenMP(Source1, Matcher));

  StringRef Source2 = R"(
void x() {
#pragma omp parallel default(none)
;
})";
  EXPECT_TRUE(matchesWithOpenMP(Source2, Matcher));

  StringRef Source3 = R"(
void x() {
#pragma omp parallel default(shared)
;
})";
  EXPECT_TRUE(matchesWithOpenMP(Source3, Matcher));

  StringRef Source4 = R"(
void x() {
#pragma omp parallel default(firstprivate)
;
})";
  EXPECT_TRUE(matchesWithOpenMP51(Source4, Matcher));

  StringRef Source5 = R"(
void x(int x) {
#pragma omp parallel num_threads(x)
;
})";
  EXPECT_TRUE(notMatchesWithOpenMP(Source5, Matcher));
}

TEST(ASTMatchersTest, Finder_DynamicOnlyAcceptsSomeMatchers) {
  MatchFinder Finder;
  EXPECT_TRUE(Finder.addDynamicMatcher(decl(), nullptr));
  EXPECT_TRUE(Finder.addDynamicMatcher(callExpr(), nullptr));
  EXPECT_TRUE(
      Finder.addDynamicMatcher(constantArrayType(hasSize(42)), nullptr));

  // Do not accept non-toplevel matchers.
  EXPECT_FALSE(Finder.addDynamicMatcher(isMain(), nullptr));
  EXPECT_FALSE(Finder.addDynamicMatcher(hasName("x"), nullptr));
}

TEST(MatchFinderAPI, MatchesDynamic) {
  StringRef SourceCode = "struct A { void f() {} };";
  auto Matcher = functionDecl(isDefinition()).bind("method");

  auto astUnit = tooling::buildASTFromCode(SourceCode);

  auto GlobalBoundNodes = matchDynamic(Matcher, astUnit->getASTContext());

  EXPECT_EQ(GlobalBoundNodes.size(), 1u);
  EXPECT_EQ(GlobalBoundNodes[0].getMap().size(), 1u);

  auto GlobalMethodNode = GlobalBoundNodes[0].getNodeAs<FunctionDecl>("method");
  EXPECT_TRUE(GlobalMethodNode != nullptr);

  auto MethodBoundNodes =
      matchDynamic(Matcher, *GlobalMethodNode, astUnit->getASTContext());
  EXPECT_EQ(MethodBoundNodes.size(), 1u);
  EXPECT_EQ(MethodBoundNodes[0].getMap().size(), 1u);

  auto MethodNode = MethodBoundNodes[0].getNodeAs<FunctionDecl>("method");
  EXPECT_EQ(MethodNode, GlobalMethodNode);
}

static std::vector<TestClangConfig> allTestClangConfigs() {
  std::vector<TestClangConfig> all_configs;
  for (TestLanguage lang : {Lang_C89, Lang_C99, Lang_CXX03, Lang_CXX11,
                            Lang_CXX14, Lang_CXX17, Lang_CXX20}) {
    TestClangConfig config;
    config.Language = lang;

    // Use an unknown-unknown triple so we don't instantiate the full system
    // toolchain.  On Linux, instantiating the toolchain involves stat'ing
    // large portions of /usr/lib, and this slows down not only this test, but
    // all other tests, via contention in the kernel.
    //
    // FIXME: This is a hack to work around the fact that there's no way to do
    // the equivalent of runToolOnCodeWithArgs without instantiating a full
    // Driver.  We should consider having a function, at least for tests, that
    // invokes cc1.
    config.Target = "i386-unknown-unknown";
    all_configs.push_back(config);

    // Windows target is interesting to test because it enables
    // `-fdelayed-template-parsing`.
    config.Target = "x86_64-pc-win32-msvc";
    all_configs.push_back(config);
  }
  return all_configs;
}

INSTANTIATE_TEST_SUITE_P(ASTMatchersTests, ASTMatchersTest,
                         testing::ValuesIn(allTestClangConfigs()));

} // namespace ast_matchers
} // namespace clang
