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