diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index 99917ccff5260..c6307954d7f1b 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -586,36 +586,28 @@

Node Matchers

#pragma omp declare simd int min(); - -The matcher attr() -matches nodiscard, nonnull, noinline, and -declare simd. +attr() + matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line. Matcher<CXXBaseSpecifier>cxxBaseSpecifierMatcher<CXXBaseSpecifier>...
Matches class bases.
 
-Given
+Examples matches public virtual B.
   class B {};
   class C : public virtual B {};
-
-The matcher cxxRecordDecl(hasDirectBase(cxxBaseSpecifier()))
-matches C.
 
Matcher<CXXCtorInitializer>cxxCtorInitializerMatcher<CXXCtorInitializer>...
Matches constructor initializers.
 
-Given
+Examples matches i(42).
   class C {
     C() : i(42) {}
     int i;
   };
-
-The matcher cxxCtorInitializer()
-matches i(42).
 
@@ -627,22 +619,17 @@

Node Matchers

public: int a; }; - -The matcher accessSpecDecl() -matches public:. +accessSpecDecl() + matches 'public:' Matcher<Decl>bindingDeclMatcher<BindingDecl>...
Matches binding declarations
+Example matches foo and bar
+(matcher = bindingDecl()
 
-Given
-  struct pair { int x; int y; };
-  pair make(int, int);
-  auto [foo, bar] = make(42, 42);
-
-The matcher bindingDecl()
-matches foo and bar.
+  auto [foo, bar] = std::make_pair{42, 42};
 
@@ -655,18 +642,14 @@

Node Matchers

myFunc(^(int p) { printf("%d", p); }) - Matcher<Decl>classTemplateDeclMatcher<ClassTemplateDecl>...
Matches C++ class template declarations.
 
-Given
+Example matches Z
   template<class T> class Z {};
-
-The matcher classTemplateDecl()
-matches Z.
 
@@ -677,14 +660,13 @@

Node Matchers

template<class T1, class T2, int I> class A {}; - template<class T, int I> class A<T, T*, I> {}; + template<class T, int I> + class A<T, T*, I> {}; template<> class A<int, int, 1> {}; - -The matcher classTemplatePartialSpecializationDecl() -matches template<class T, int I> class A<T, T*, I> {}, -but does not match A<int, int, 1>. +classTemplatePartialSpecializationDecl() + matches the specialization A<T,T*,I> but not A<int,int,1> @@ -695,128 +677,87 @@

Node Matchers

template<typename T> class A {}; template<> class A<double> {}; A<int> a; - -The matcher classTemplateSpecializationDecl() -matches class A<int> -and class A<double>. +classTemplateSpecializationDecl() + matches the specializations A<int> and A<double> Matcher<Decl>conceptDeclMatcher<ConceptDecl>...
Matches concept declarations.
 
-Given
-  template<typename T> concept my_concept = true;
-
-
-The matcher conceptDecl()
-matches template<typename T>
-concept my_concept = true.
+Example matches integral
+  template<typename T>
+  concept integral = std::is_integral_v<T>;
 
Matcher<Decl>cxxConstructorDeclMatcher<CXXConstructorDecl>...
Matches C++ constructor declarations.
 
-Given
+Example matches Foo::Foo() and Foo::Foo(int)
   class Foo {
    public:
     Foo();
     Foo(int);
     int DoSomething();
   };
-
-  struct Bar {};
-
-
-The matcher cxxConstructorDecl()
-matches Foo() and Foo(int).
 
Matcher<Decl>cxxConversionDeclMatcher<CXXConversionDecl>...
Matches conversion operator declarations.
 
-Given
+Example matches the operator.
   class X { operator int() const; };
-
-
-The matcher cxxConversionDecl()
-matches operator int() const.
 
Matcher<Decl>cxxDeductionGuideDeclMatcher<CXXDeductionGuideDecl>...
Matches user-defined and implicitly generated deduction guide.
 
-Given
+Example matches the deduction guide.
   template<typename T>
-  class X { X(int); };
+  class X { X(int) };
   X(int) -> X<int>;
-
-
-The matcher cxxDeductionGuideDecl()
-matches the written deduction guide
-auto (int) -> X<int>,
-the implicit copy deduction guide auto (int) -> X<T>
-and the implicitly declared deduction guide
-auto (X<T>) -> X<T>.
 
Matcher<Decl>cxxDestructorDeclMatcher<CXXDestructorDecl>...
Matches explicit C++ destructor declarations.
 
-Given
+Example matches Foo::~Foo()
   class Foo {
    public:
     virtual ~Foo();
   };
-
-  struct Bar {};
-
-
-The matcher cxxDestructorDecl()
-matches virtual ~Foo().
 
Matcher<Decl>cxxMethodDeclMatcher<CXXMethodDecl>...
Matches method declarations.
 
-Given
+Example matches y
   class X { void y(); };
-
-
-The matcher cxxMethodDecl()
-matches void y().
 
Matcher<Decl>cxxRecordDeclMatcher<CXXRecordDecl>...
Matches C++ class declarations.
 
-Given
+Example matches X, Z
   class X;
   template<class T> class Z {};
-
-The matcher cxxRecordDecl()
-matches X and Z.
 
Matcher<Decl>declMatcher<Decl>...
Matches declarations.
 
-Given
+Examples matches X, C, and the friend declaration inside C;
   void X();
   class C {
-    friend void X();
+    friend X;
   };
-
-The matcher decl()
-matches void X(), C
-and friend void X().
 
@@ -826,49 +767,40 @@

Node Matchers

Given class X { int y; }; - -The matcher declaratorDecl() -matches int y. +declaratorDecl() + matches int y. Matcher<Decl>decompositionDeclMatcher<DecompositionDecl>...
Matches decomposition-declarations.
 
-Given
-  struct pair { int x; int y; };
-  pair make(int, int);
-  int number = 42;
-  auto [foo, bar] = make(42, 42);
+Examples matches the declaration node with foo and bar, but not
+number.
+(matcher = declStmt(has(decompositionDecl())))
 
-The matcher decompositionDecl()
-matches auto [foo, bar] = make(42, 42),
-but does not match number.
+  int number = 42;
+  auto [foo, bar] = std::make_pair{42, 42};
 
Matcher<Decl>enumConstantDeclMatcher<EnumConstantDecl>...
Matches enum constants.
 
-Given
+Example matches A, B, C
   enum X {
     A, B, C
   };
-The matcher enumConstantDecl()
-matches A, B and C.
 
Matcher<Decl>enumDeclMatcher<EnumDecl>...
Matches enum declarations.
 
-Given
+Example matches X
   enum X {
     A, B, C
   };
-
-The matcher enumDecl()
-matches the enum X.
 
@@ -876,14 +808,9 @@

Node Matchers

Matches field declarations.
 
 Given
-  int a;
-  struct Foo {
-    int x;
-  };
-  void bar(int val);
-
-The matcher fieldDecl()
-matches int x.
+  class X { int m; };
+fieldDecl()
+  matches 'm'.
 
@@ -892,20 +819,16 @@

Node Matchers

Given class X { friend void foo(); }; - -The matcher friendDecl() -matches friend void foo(). +friendDecl() + matches 'friend void foo()'. Matcher<Decl>functionDeclMatcher<FunctionDecl>...
Matches function declarations.
 
-Given
+Example matches f
   void f();
-
-The matcher functionDecl()
-matches void f().
 
@@ -914,10 +837,6 @@

Node Matchers

Example matches f template<class T> void f(T t) {} - - -The matcher functionTemplateDecl() -matches template<class T> void f(T t) {}. @@ -926,8 +845,8 @@

Node Matchers

Given struct X { struct { int a; }; }; -The matcher indirectFieldDecl() -matches a. +indirectFieldDecl() + matches 'a'. @@ -935,13 +854,10 @@

Node Matchers

Matches a declaration of label.
 
 Given
-  void bar();
-  void foo() {
-    goto FOO;
-    FOO: bar();
-  }
-The matcher labelDecl()
-matches FOO: bar().
+  goto FOO;
+  FOO: bar();
+labelDecl()
+  matches 'FOO:'
 
@@ -950,9 +866,8 @@

Node Matchers

Given extern "C" {} - -The matcher linkageSpecDecl() -matches extern "C" {}. +linkageSpecDecl() + matches "extern "C" {}" @@ -960,18 +875,12 @@

Node Matchers

Matches a declaration of anything that could have a name.
 
 Example matches X, S, the anonymous union type, i, and U;
-Given
   typedef int X;
   struct S {
     union {
       int i;
     } U;
   };
-The matcher namedDecl()
-matches typedef int X, S, int i
- and U,
-with S matching twice in C++.
-Once for the injected class name and once for the declaration itself.
 
@@ -981,10 +890,8 @@

Node Matchers

Given namespace test {} namespace alias = ::test; - -The matcher namespaceAliasDecl() -matches alias, -but does not match test. +namespaceAliasDecl() + matches "namespace alias" but not "namespace test" @@ -994,9 +901,8 @@

Node Matchers

Given namespace {} namespace test {} - -The matcher namespaceDecl() -matches namespace {} and namespace test {}. +namespaceDecl() + matches "namespace {}" and "namespace test {}" @@ -1005,10 +911,8 @@

Node Matchers

Given template <typename T, int N> struct C {}; - -The matcher nonTypeTemplateParmDecl() -matches int N, -but does not match typename T. +nonTypeTemplateParmDecl() + matches 'N', but not 'T'. @@ -1018,7 +922,6 @@

Node Matchers

Example matches Foo (Additions) @interface Foo (Additions) @end - @@ -1028,7 +931,6 @@

Node Matchers

Example matches Foo (Additions) @implementation Foo (Additions) @end - @@ -1038,7 +940,6 @@

Node Matchers

Example matches Foo @implementation Foo @end - @@ -1048,7 +949,6 @@

Node Matchers

Example matches Foo @interface Foo @end - @@ -1060,7 +960,6 @@

Node Matchers

BOOL _enabled; } @end - @@ -1075,7 +974,6 @@

Node Matchers

@implementation Foo - (void)method {} @end - @@ -1086,7 +984,6 @@

Node Matchers

@interface Foo @property BOOL enabled; @end - @@ -1096,7 +993,6 @@

Node Matchers

Example matches FooDelegate @protocol FooDelegate @end - @@ -1105,58 +1001,48 @@

Node Matchers

Given void f(int x); -The matcher parmVarDecl() -matches int x. +parmVarDecl() + matches int x. Matcher<Decl>recordDeclMatcher<RecordDecl>...
Matches class, struct, and union declarations.
 
-Given
+Example matches X, Z, U, and S
   class X;
   template<class T> class Z {};
   struct S {};
   union U {};
-
-The matcher recordDecl()
-matches X, Z,
-S and U.
 
Matcher<Decl>staticAssertDeclMatcher<StaticAssertDecl>...
Matches a C++ static_assert declaration.
 
-Given
+Example:
+  staticAssertDecl()
+matches
+  static_assert(sizeof(S) == sizeof(int))
+in
   struct S {
     int x;
   };
   static_assert(sizeof(S) == sizeof(int));
-
-
-The matcher staticAssertDecl()
-matches static_assert(sizeof(S) == sizeof(int)).
 
Matcher<Decl>tagDeclMatcher<TagDecl>...
Matches tag declarations.
 
-Given
+Example matches X, Z, U, S, E
   class X;
   template<class T> class Z {};
   struct S {};
   union U {};
-  enum E { A, B, C };
-
-
-The matcher tagDecl()
-matches class X, class Z {}, the injected class name
-class Z, struct S {},
-the injected class name struct S, union U {},
-the injected class name union U
-and enum E { A, B, C }.
+  enum E {
+    A, B, C
+  };
 
@@ -1165,10 +1051,8 @@

Node Matchers

Given template <template <typename> class Z, int N> struct C {}; - -The matcher templateTemplateParmDecl() -matches template <typename> class Z, -but does not match int N. +templateTypeParmDecl() + matches 'Z', but not 'N'. @@ -1177,10 +1061,8 @@

Node Matchers

Given template <typename T, int N> struct C {}; - -The matcher templateTypeParmDecl() -matches typename T, -but does not int N. +templateTypeParmDecl() + matches 'T', but not 'N'. @@ -1190,12 +1072,10 @@

Node Matchers

Given int X; namespace NS { - int Y; + int Y; } // namespace NS - -The matcher namedDecl(hasDeclContext(translationUnitDecl())) -matches X and NS, -but does not match Y. +decl(hasDeclContext(translationUnitDecl())) + matches "int X", but not "int Y". @@ -1205,22 +1085,17 @@

Node Matchers

Given typedef int X; using Y = int; - -The matcher typeAliasDecl() -matches using Y = int, -but does not match typedef int X. +typeAliasDecl() + matches "using Y = int", but not "typedef int X" Matcher<Decl>typeAliasTemplateDeclMatcher<TypeAliasTemplateDecl>...
Matches type alias template declarations.
 
-Given
-  template <typename T> struct X {};
-  template <typename T> using Y = X<T>;
-
-The matcher typeAliasTemplateDecl()
-matches template <typename T> using Y = X<T>.
+typeAliasTemplateDecl() matches
+  template <typename T>
+  using Y = X<T>;
 
@@ -1230,10 +1105,8 @@

Node Matchers

Given typedef int X; using Y = int; - -The matcher typedefDecl() -matches typedef int X, -but does not match using Y = int. +typedefDecl() + matches "typedef int X", but not "using Y = int" @@ -1243,9 +1116,8 @@

Node Matchers

Given typedef int X; using Y = int; - -The matcher typedefNameDecl() -matches typedef int X and using Y = int. +typedefNameDecl() + matches "typedef int X" and "using Y = int" @@ -1261,10 +1133,8 @@

Node Matchers

struct S : private Base<T> { using typename Base<T>::Foo; }; - -The matcher unresolvedUsingTypenameDecl() - matches using typename Base<T>::Foo - +unresolvedUsingTypenameDecl() + matches using Base<T>::Foo Matcher<Decl>unresolvedUsingValueDeclMatcher<UnresolvedUsingValueDecl>... @@ -1275,10 +1145,8 @@

Node Matchers

class C : private X { using X::x; }; - -The matcher unresolvedUsingValueDecl() - matches using X::x - +unresolvedUsingValueDecl() + matches using X::x Matcher<Decl>usingDeclMatcher<UsingDecl>... @@ -1287,10 +1155,8 @@

Node Matchers

Given namespace X { int x; } using X::x; - -The matcher usingDecl() - matches using X::x - +usingDecl() + matches using X::x Matcher<Decl>usingDirectiveDeclMatcher<UsingDirectiveDecl>... @@ -1299,34 +1165,26 @@

Node Matchers

Given namespace X { int x; } using namespace X; - -The matcher usingDirectiveDecl() - matches using namespace X - +usingDirectiveDecl() + matches using namespace X Matcher<Decl>usingEnumDeclMatcher<UsingEnumDecl>...
Matches using-enum declarations.
 
 Given
-  namespace X { enum x { val1, val2 }; }
+  namespace X { enum x {...}; }
   using enum X::x;
-
-The matcher usingEnumDecl()
-  matches using enum X::x
-
+usingEnumDecl() + matches using enum X::x Matcher<Decl>valueDeclMatcher<ValueDecl>...
Matches any value declaration.
 
-Given
+Example matches A, B, C and F
   enum X { A, B, C };
   void F();
-  int V = 0;
-The matcher valueDecl()
-matches A, B, C, void F()
-and int V = 0.
 
@@ -1338,13 +1196,6 @@

Node Matchers

Example matches a int a; - struct Foo { - int x; - }; - void bar(int val); - -The matcher varDecl() -matches int a and int val, but not int x. @@ -1357,29 +1208,13 @@

Node Matchers

auto f = [x](){}; auto g = [x = 1](){}; } - -The matcher -lambdaExpr(hasAnyCapture(lambdaCapture().bind("capture"))), -matches [x](){} and [x = 1](){}, -with lambdaCapture() matching -x and x = 1. +In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`, +`lambdaCapture()` matches `x` and `x=1`. Matcher<NestedNameSpecifierLoc>nestedNameSpecifierLocMatcher<NestedNameSpecifierLoc>...
Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
-
-Given
-  namespace ns {
-    struct A { static void f(); };
-    void A::f() {}
-    void g() { A::f(); }
-  }
-  ns::A a;
-
-
-The matcher nestedNameSpecifierLoc() matches
-A:: twice, and ns:: once.
 
@@ -1393,9 +1228,8 @@

Node Matchers

void g() { A::f(); } } ns::A a; - -The matcher nestedNameSpecifier() -matches ns and both A +nestedNameSpecifier() + matches "ns::" and both "A::" @@ -1403,38 +1237,20 @@

Node Matchers

Matches OpenMP ``default`` clause.
 
 Given
-  void foo() {
-    #pragma omp parallel default(none)
-      ;
-    #pragma omp parallel default(shared)
-      ;
-    #pragma omp parallel default(private)
-      ;
-    #pragma omp parallel default(firstprivate)
-      ;
-    #pragma omp parallel
-      ;
-  }
 
+  #pragma omp parallel default(none)
+  #pragma omp parallel default(shared)
+  #pragma omp parallel default(private)
+  #pragma omp parallel default(firstprivate)
+  #pragma omp parallel
 
-The matcher
-ompExecutableDirective(hasAnyClause(ompDefaultClause())) matches
-#pragma omp parallel default(none),
-#pragma omp parallel default(shared),
-#pragma omp parallel default(private) and
-#pragma omp parallel default(firstprivate).
+``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``,
+`` default(private)`` and ``default(firstprivate)``
 
Matcher<QualType>qualTypeMatcher<QualType>...
Matches QualTypes in the clang AST.
-
-Given
-  int a = 0;
-  const int b = 1;
-
-The matcher varDecl(hasType(qualType(isConstQualified())))
-matches const int b = 1, but not int a = 0.
 
@@ -1442,39 +1258,34 @@

Node Matchers

Matches address of label statements (GNU extension).
 
 Given
-void bar();
-void foo() {
   FOO: bar();
   void *ptr = &&FOO;
-  goto *ptr;
-}
-The matcher addrLabelExpr()
-matches &&FOO
+  goto *bar;
+addrLabelExpr()
+  matches '&&FOO'
 
Matcher<Stmt>arrayInitIndexExprMatcher<ArrayInitIndexExpr>...
The arrayInitIndexExpr consists of two subexpressions: a common expression
-(the source array) that is evaluated once up-front, and a per-element
-initializer that runs once for each array element. Within the per-element
-initializer, the current index may be obtained via an ArrayInitIndexExpr.
+(the source array) that is evaluated once up-front, and a per-element initializer
+that runs once for each array element. Within the per-element initializer,
+the current index may be obtained via an ArrayInitIndexExpr.
 
 Given
-  void testStructuredBinding() {
+  void testStructBinding() {
     int a[2] = {1, 2};
     auto [x, y] = a;
   }
-
-
-The matcher arrayInitIndexExpr() matches the array index
-that implicitly iterates over the array `a` to copy each element to the
-anonymous array that backs the structured binding.
+arrayInitIndexExpr() matches the array index that implicitly iterates
+over the array `a` to copy each element to the anonymous array
+that backs the structured binding `[x, y]` elements of which are
+referred to by their aliases `x` and `y`.
 
Matcher<Stmt>arrayInitLoopExprMatcher<ArrayInitLoopExpr>... -
Matches a loop initializing the elements of an array in a number of
-contexts:
+
Matches a loop initializing the elements of an array in a number of contexts:
  * in the implicit copy/move constructor for a class with an array member
  * when a lambda-expression captures an array by value
  * when a decomposition declaration decomposes an array
@@ -1482,12 +1293,13 @@ 

Node Matchers

Given void testLambdaCapture() { int a[10]; - [a]() {}; + auto Lam1 = [a]() { + return; + }; } - -The matcher arrayInitLoopExpr() matches the implicit loop that -initializes each element of the implicit array field inside the lambda -object, that represents the array a captured by value. +arrayInitLoopExpr() matches the implicit loop that initializes each element of +the implicit array field inside the lambda object, that represents the array `a` +captured by value.
@@ -1495,34 +1307,26 @@

Node Matchers

Matches array subscript expressions.
 
 Given
-  void foo() {
-    int a[2] = {0, 1};
-    int i = a[1];
-  }
-The matcher arraySubscriptExpr()
-matches a[1].
+  int i = a[1];
+arraySubscriptExpr()
+  matches "a[1]"
 
Matcher<Stmt>asmStmtMatcher<AsmStmt>...
Matches asm statements.
 
-void foo() {
  int i = 100;
-  __asm("mov %al, 2");
-}
-The matcher asmStmt()
-matches __asm("mov %al, 2")
+  __asm("mov al, 2");
+asmStmt()
+  matches '__asm("mov al, 2")'
 
Matcher<Stmt>atomicExprMatcher<AtomicExpr>...
Matches atomic builtins.
-
-Given
+Example matches __atomic_load_n(ptr, 1)
   void foo() { int *ptr; __atomic_load_n(ptr, 1); }
-
-The matcher atomicExpr() matches __atomic_load_n(ptr, 1).
 
@@ -1533,35 +1337,24 @@

Node Matchers

@autoreleasepool { int x = 0; } - -The matcher autoreleasePoolStmt(stmt()) matches the declaration of -int x = 0 inside the autorelease pool. +autoreleasePoolStmt(stmt()) matches the declaration of "x" +inside the autorelease pool.
Matcher<Stmt>binaryConditionalOperatorMatcher<BinaryConditionalOperator>...
Matches binary conditional operator expressions (GNU extension).
 
-Given
-  int f(int a, int b) {
-    return (a ?: b) + 42;
-  }
-
-The matcher binaryConditionalOperator() matches a ?: b.
+Example matches a ?: b
+  (a ?: b) + 42;
 
Matcher<Stmt>binaryOperatorMatcher<BinaryOperator>...
Matches binary operator expressions.
 
-Given
-  void foo(bool a, bool b) {
-    !(a || b);
-  }
-
-
-The matcher binaryOperator() matches a || b.
-
+Example matches a || b
+  !(a || b)
 See also the binaryOperation() matcher for more-general matching.
 
@@ -1569,11 +1362,8 @@

Node Matchers

Matcher<Stmt>blockExprMatcher<BlockExpr>...
Matches a reference to a block.
 
-Given
+Example: matches "^{}":
   void f() { ^{}(); }
-
-
-The matcher blockExpr() matches ^{}.
 
@@ -1581,23 +1371,17 @@

Node Matchers

Matches break statements.
 
 Given
-void foo() {
   while (true) { break; }
-}
-
-The matcher breakStmt()
-matches break
+breakStmt()
+  matches 'break'
 
Matcher<Stmt>cStyleCastExprMatcher<CStyleCastExpr>...
Matches a C-style cast expression.
 
-Given
+Example: Matches (int) 2.2f in
   int i = (int) 2.2f;
-
-The matcher cStyleCastExpr()
-matches (int) 2.2f.
 
@@ -1605,16 +1389,9 @@

Node Matchers

Matches call expressions.
 
 Example matches x.y() and y()
-  struct X { void foo(); };
-  void bar();
-  void foobar() {
-    X x;
-    x.foo();
-    bar();
-  }
-
-The matcher callExpr()
-matches x.foo() and bar();
+  X x;
+  x.y();
+  y();
 
@@ -1622,41 +1399,22 @@

Node Matchers

Matches case statements inside switch statements.
 
 Given
-void foo(int a) {
   switch(a) { case 42: break; default: break; }
-}
-The matcher caseStmt()
-matches case 42: break.
+caseStmt()
+  matches 'case 42:'.
 
Matcher<Stmt>castExprMatcher<CastExpr>...
Matches any cast nodes of Clang's AST.
 
-Given
-  struct S {};
-  const S* s;
-  S* s2 = const_cast<S*>(s);
-
-  const int val = 0;
-  char val0 = 1;
-  char val1 = (char)2;
-  char val2 = static_cast<char>(3);
-  int* val3 = reinterpret_cast<int*>(4);
-  char val4 = char(5);
-
-
-The matcher castExpr()
-matches
-const_cast<S*>(s) and the implicit l- to r-value cast for s,
-the implicit cast to char for the initializer 1,
-the c-style cast (char)2 and it's implicit cast to char
-(part of the c-style cast) 2,
-static_cast<char>(3) and it's implicit cast to char
-(part of the static_cast) 3,
-reinterpret_cast<int*>(4),
-char(5) and it's implicit cast to char
-(part of the functional cast) 5.
+Example: castExpr() matches each of the following:
+  (int) 3;
+  const_cast<Expr *>(SubExpr);
+  char c = 0;
+but does not match
+  int i = (0);
+  int k = 0;
 
@@ -1666,24 +1424,14 @@

Node Matchers

Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral), though. -Given +Example matches 'a', L'a' char ch = 'a'; wchar_t chw = L'a'; - - -The matcher characterLiteral() matches 'a' and -L'a'. Matcher<Stmt>chooseExprMatcher<ChooseExpr>...
Matches GNU __builtin_choose_expr.
-
-Given
-  void f() { (void)__builtin_choose_expr(1, 2, 3); }
-
-The matcher chooseExpr() matches
-__builtin_choose_expr(1, 2, 3).
 
@@ -1691,45 +1439,9 @@

Node Matchers

Matches co_await expressions.
 
 Given
-  namespace std {
-  template <typename T = void>
-  struct coroutine_handle {
-      static constexpr coroutine_handle from_address(void* addr) {
-        return {};
-      }
-  };
-
-  struct always_suspend {
-      bool await_ready() const noexcept;
-      bool await_resume() const noexcept;
-      template <typename T>
-      bool await_suspend(coroutine_handle<T>) const noexcept;
-  };
-
-  template <typename T>
-  struct coroutine_traits {
-      using promise_type = T::promise_type;
-  };
-  }  // namespace std
-
-  struct generator {
-      struct promise_type {
-          std::always_suspend yield_value(int&&);
-          std::always_suspend initial_suspend() const noexcept;
-          std::always_suspend final_suspend() const noexcept;
-          void return_void();
-          void unhandled_exception();
-          generator get_return_object();
-      };
-  };
-
-  std::always_suspend h();
-
-  generator g() { co_await h(); }
-
-The matcher
-coawaitExpr(has(callExpr(callee(functionDecl(hasName("h"))))))
-matches co_await h().
+  co_await 1;
+coawaitExpr()
+  matches 'co_await 1'
 
@@ -1737,48 +1449,35 @@

Node Matchers

Matches compound (i.e. non-scalar) literals
 
 Example match: {1}, (1, 2)
-  struct vector { int x; int y; };
-  struct vector myvec = (struct vector){ 1, 2 };
-
-The matcher compoundLiteralExpr()
-matches (struct vector){ 1, 2 }.
+  int array[4] = {1};
+  vector int myvec = (vector int)(1, 2);
 
Matcher<Stmt>compoundStmtMatcher<CompoundStmt>...
Matches compound statements.
 
-Given
-void foo() { for (;;) {{}} }
-
-The matcher compoundStmt() matches
-{ for (;;) {{}} }, {{}} and {}.
+Example matches '{}' and '{{}}' in 'for (;;) {{}}'
+  for (;;) {{}}
 
Matcher<Stmt>conditionalOperatorMatcher<ConditionalOperator>...
Matches conditional operator expressions.
 
-Given
-  int f(int a, int b, int c) {
-    return (a ? b : c) + 42;
-  }
-
-The matcher conditionalOperator() matches a ? b : c.
+Example matches a ? b : c
+  (a ? b : c) + 42
 
Matcher<Stmt>constantExprMatcher<ConstantExpr>...
Matches a constant expression wrapper.
 
-Given
-  void f(int a) {
-    switch (a) {
-      case 37: break;
-    }
+Example matches the constant in the case statement:
+    (matcher = constantExpr())
+  switch (a) {
+  case 37: break;
   }
-
-The matcher constantExpr() matches 37.
 
@@ -1786,26 +1485,14 @@

Node Matchers

Matches continue statements.
 
 Given
-void foo() {
   while (true) { continue; }
-}
-
-The matcher continueStmt()
-matches continue
+continueStmt()
+  matches 'continue'
 
Matcher<Stmt>convertVectorExprMatcher<ConvertVectorExpr>...
Matches builtin function __builtin_convertvector.
-
-Given
-  typedef double vector4double __attribute__((__vector_size__(32)));
-  typedef float  vector4float  __attribute__((__vector_size__(16)));
-  vector4float vf;
-  void f() { (void)__builtin_convertvector(vf, vector4double); }
-
-The matcher convertVectorExpr() matches
-__builtin_convertvector(vf, vector4double).
 
@@ -1813,85 +1500,19 @@

Node Matchers

Matches co_return statements.
 
 Given
-  namespace std {
-  template <typename T = void>
-  struct coroutine_handle {
-      static constexpr coroutine_handle from_address(void* addr) {
-        return {};
-      }
-  };
-
-  struct always_suspend {
-      bool await_ready() const noexcept;
-      bool await_resume() const noexcept;
-      template <typename T>
-      bool await_suspend(coroutine_handle<T>) const noexcept;
-  };
-
-  template <typename T>
-  struct coroutine_traits {
-      using promise_type = T::promise_type;
-  };
-  }  // namespace std
-
-  struct generator {
-      struct promise_type {
-          void return_value(int v);
-          std::always_suspend yield_value(int&&);
-          std::always_suspend initial_suspend() const noexcept;
-          std::always_suspend final_suspend() const noexcept;
-          void unhandled_exception();
-          generator get_return_object();
-      };
-  };
-
-  generator f() {
-      co_return 10;
-  }
-
-
-The matcher coreturnStmt(has(integerLiteral()))
-matches co_return 10
+  while (true) { co_return; }
+coreturnStmt()
+  matches 'co_return'
 
Matcher<Stmt>coroutineBodyStmtMatcher<CoroutineBodyStmt>...
Matches coroutine body statements.
 
-Given
-  namespace std {
-  template <typename T = void>
-  struct coroutine_handle {
-      static constexpr coroutine_handle from_address(void* addr) {
-        return {};
-      }
-  };
-
-  struct suspend_always {
-      bool await_ready() const noexcept;
-      bool await_resume() const noexcept;
-      template <typename T>
-      bool await_suspend(coroutine_handle<T>) const noexcept;
-  };
-
-  template <typename...>
-  struct coroutine_traits {
-      struct promise_type {
-          std::suspend_always initial_suspend() const noexcept;
-          std::suspend_always final_suspend() const noexcept;
-          void return_void();
-          void unhandled_exception();
-          coroutine_traits get_return_object();
-      };
-  };
-  }  // namespace std
-
-  void f() { while (true) { co_return; } }
-
-
-
-The matcher coroutineBodyStmt() matches
-{ while (true) { co_return; } }.
+coroutineBodyStmt() matches the coroutine below
+  generator<int> gen() {
+    co_return;
+  }
 
@@ -1899,77 +1520,27 @@

Node Matchers

Matches co_yield expressions.
 
 Given
-  namespace std {
-  template <typename T = void>
-  struct coroutine_handle {
-      static constexpr coroutine_handle from_address(void* addr) {
-        return {};
-      }
-  };
-
-  struct always_suspend {
-      bool await_ready() const noexcept;
-      bool await_resume() const noexcept;
-      template <typename T>
-      bool await_suspend(coroutine_handle<T>) const noexcept;
-  };
-
-  template <typename T>
-  struct coroutine_traits {
-      using promise_type = T::promise_type;
-  };
-  }  // namespace std
-
-  struct generator {
-      struct promise_type {
-          std::always_suspend yield_value(int&&);
-          std::always_suspend initial_suspend() const noexcept;
-          std::always_suspend final_suspend() const noexcept;
-          void return_void();
-          void unhandled_exception();
-          generator get_return_object();
-      };
-  };
-
-  generator f() {
-      while (true) {
-          co_yield 10;
-      }
-  }
-
-The matcher coyieldExpr()
-matches co_yield 10
+  co_yield 1;
+coyieldExpr()
+  matches 'co_yield 1'
 
Matcher<Stmt>cudaKernelCallExprMatcher<CUDAKernelCallExpr>...
Matches CUDA kernel call expression.
 
-Given
-  __global__ void kernel() {}
-  void f() {
-    kernel<<<32,32>>>();
-  }
-
-The matcher cudaKernelCallExpr()
-matches kernel<<<i, k>>>()
+Example matches,
+  kernel<<<i,j>>>();
 
Matcher<Stmt>cxxBindTemporaryExprMatcher<CXXBindTemporaryExpr>...
Matches nodes where temporaries are created.
 
-Given
-  struct S {
-    S() { }  // User defined constructor makes S non-POD.
-    ~S() { } // User defined destructor makes it non-trivial.
-  };
-  void test() {
-    const S &s_ref = S(); // Requires a CXXBindTemporaryExpr.
-  }
-
-The matcher cxxBindTemporaryExpr()
-matches the constructor call S().
+Example matches FunctionTakesString(GetStringByValue())
+    (matcher = cxxBindTemporaryExpr())
+  FunctionTakesString(GetStringByValue());
+  FunctionTakesStringByPointer(GetStringPointer());
 
@@ -1977,71 +1548,49 @@

Node Matchers

Matches bool literals.
 
 Example matches true
-  bool Flag = true;
-
-
-The matcher cxxBoolLiteral() matches true.
+  true
 
Matcher<Stmt>cxxCatchStmtMatcher<CXXCatchStmt>...
Matches catch statements.
 
-void foo() {
   try {} catch(int i) {}
-}
-
-The matcher cxxCatchStmt()
-matches catch(int i) {}
+cxxCatchStmt()
+  matches 'catch(int i)'
 
Matcher<Stmt>cxxConstCastExprMatcher<CXXConstCastExpr>...
Matches a const_cast expression.
 
-Given
+Example: Matches const_cast<int*>(&r) in
   int n = 42;
   const int &r(n);
   int* p = const_cast<int*>(&r);
-
-
-The matcher cxxConstCastExpr()
-matches const_cast<int*>(&r).
 
Matcher<Stmt>cxxConstructExprMatcher<CXXConstructExpr>...
Matches constructor call expressions (including implicit ones).
 
-Given
-  struct string {
-    string(const char*);
-    string(const char*s, int n);
-  };
+Example matches string(ptr, n) and ptr within arguments of f
+    (matcher = cxxConstructExpr())
   void f(const string &a, const string &b);
-  void foo(char *ptr, int n) {
-    f(string(ptr, n), ptr);
-  }
-
-
-The matcher cxxConstructExpr() matches string(ptr, n)
-and ptr within arguments of f .
+  char *ptr;
+  int n;
+  f(string(ptr, n), ptr);
 
Matcher<Stmt>cxxDefaultArgExprMatcher<CXXDefaultArgExpr>...
Matches the value of a default argument at the call site.
 
-Given
+Example matches the CXXDefaultArgExpr placeholder inserted for the
+    default value of the second parameter in the call expression f(42)
+    (matcher = cxxDefaultArgExpr())
   void f(int x, int y = 0);
-  void g() {
-    f(42);
-  }
-
-
-The matcher callExpr(has(cxxDefaultArgExpr()))
-matches the CXXDefaultArgExpr placeholder inserted for the default value
-of the second parameter in the call expression f(42).
+  f(42);
 
@@ -2049,17 +1598,9 @@

Node Matchers

Matches delete expressions.
 
 Given
-  void* operator new(decltype(sizeof(void*)));
-  void operator delete(void*);
-  struct X {};
-  void foo() {
-    auto* x = new X;
-    delete x;
-  }
-
-
-The matcher cxxDeleteExpr()
-matches delete x.
+  delete X;
+cxxDeleteExpr()
+  matches 'delete X'.
 
@@ -2069,8 +1610,7 @@

Node Matchers

Given template <class T> void f() { T t; t.g(); } - -The matcher cxxDependentScopeMemberExpr() +cxxDependentScopeMemberExpr() matches t.g @@ -2078,83 +1618,53 @@

Node Matchers

Matcher<Stmt>cxxDynamicCastExprMatcher<CXXDynamicCastExpr>...
Matches a dynamic_cast expression.
 
-Given
+Example:
+  cxxDynamicCastExpr()
+matches
+  dynamic_cast<D*>(&b);
+in
   struct B { virtual ~B() {} }; struct D : B {};
   B b;
   D* p = dynamic_cast<D*>(&b);
-
-
-The matcher cxxDynamicCastExpr()
-matches dynamic_cast<D*>(&b).
 
Matcher<Stmt>cxxFoldExprMatcher<CXXFoldExpr>...
Matches C++17 fold expressions.
 
-Given
+Example matches `(0 + ... + args)`:
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
   }
-
-
-The matcher cxxFoldExpr() matches (0 + ... + args).
 
Matcher<Stmt>cxxForRangeStmtMatcher<CXXForRangeStmt>...
Matches range-based for statements.
 
-Given
-  void foo() {
-    int i[] =  {1, 2, 3}; for (auto a : i);
-    for(int j = 0; j < 5; ++j);
-  }
-
-The matcher cxxForRangeStmt()
-matches for (auto a : i);
+cxxForRangeStmt() matches 'for (auto a : i)'
+  int i[] =  {1, 2, 3}; for (auto a : i);
+  for(int j = 0; j < 5; ++j);
 
Matcher<Stmt>cxxFunctionalCastExprMatcher<CXXFunctionalCastExpr>...
Matches functional cast expressions
 
-Given
-  struct Foo {
-    Foo(int x);
-  };
-
-  void foo(int bar) {
-    Foo f = bar;
-    Foo g = (Foo) bar;
-    Foo h = Foo(bar);
-  }
-
-
-The matcher cxxFunctionalCastExpr()
-matches Foo(bar).
+Example: Matches Foo(bar);
+  Foo f = bar;
+  Foo g = (Foo) bar;
+  Foo h = Foo(bar);
 
Matcher<Stmt>cxxMemberCallExprMatcher<CXXMemberCallExpr>...
Matches member call expressions.
 
-Given
-  struct X {
-    void y();
-    void m() { y(); }
-  };
-  void f();
-  void g() {
-    X x;
-    x.y();
-    f();
-  }
-
-
-The matcher cxxMemberCallExpr() matches x.y() and
-y(), but not f().
+Example matches x.y()
+  X x;
+  x.y();
 
@@ -2162,15 +1672,9 @@

Node Matchers

Matches new expressions.
 
 Given
-  void* operator new(decltype(sizeof(void*)));
-  struct X {};
-  void foo() {
-    auto* x = new X;
-  }
-
-
-The matcher cxxNewExpr()
-matches new X.
+  new X;
+cxxNewExpr()
+  matches 'new X'.
 
@@ -2183,24 +1687,14 @@

Node Matchers

bool c() noexcept(false); bool d() noexcept(noexcept(a())); bool e = noexcept(b()) || noexcept(c()); - -The matcher cxxNoexceptExpr() -matches noexcept(a()), noexcept(b()) and -noexcept(c()), but does not match the noexcept specifier in the -declarations a, b, c or d. +cxxNoexceptExpr() + matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`. + doesn't match the noexcept specifier in the declarations a, b, c or d. Matcher<Stmt>cxxNullPtrLiteralExprMatcher<CXXNullPtrLiteralExpr>...
Matches nullptr literal.
-
-Given
-  int a = 0;
-  int* b = 0;
-  int *c = nullptr;
-
-
-The matcher cxxNullPtrLiteralExpr() matches nullptr.
 
@@ -2212,16 +1706,11 @@

Node Matchers

Currently it does not match operators such as new delete. FIXME: figure out why these do not match? -Given - struct ostream; +Example matches both operator<<((o << b), c) and operator<<(o, b) + (matcher = cxxOperatorCallExpr()) ostream &operator<< (ostream &out, int i) { }; - void f(ostream& o, int b, int c) { - o << b << c; - } - - -The matcher cxxOperatorCallExpr() matches o << b << c -and o << b. + ostream &o; int b = 1, c = 1; + o << b << c; See also the binaryOperation() matcher for more-general matching of binary uses of this AST node. @@ -2236,10 +1725,6 @@

Node Matchers

Example matches reinterpret_cast<char*>(&p) in void* p = reinterpret_cast<char*>(&p); - - -The matcher cxxReinterpretCastExpr() -matches reinterpret_cast<char*>(&p). @@ -2247,20 +1732,16 @@

Node Matchers

Matches rewritten binary operators
 
 Example matches use of "<":
+  #include <compare>
   struct HasSpaceshipMem {
     int a;
-    constexpr bool operator==(const HasSpaceshipMem&) const = default;
+    constexpr auto operator<=>(const HasSpaceshipMem&) const = default;
   };
   void compare() {
     HasSpaceshipMem hs1, hs2;
-    if (hs1 != hs2)
+    if (hs1 < hs2)
         return;
   }
-
-
-The matcher cxxRewrittenBinaryOperator() matches
-hs1 != hs2.
-
 See also the binaryOperation() matcher for more-general matching
 of this AST node.
 
@@ -2272,12 +1753,12 @@

Node Matchers

See also: hasDestinationType See also: reinterpretCast -Given +Example: + cxxStaticCastExpr() +matches + static_cast<long>(8) +in long eight(static_cast<long>(8)); - - -The matcher cxxStaticCastExpr() -matches static_cast<long>(8). @@ -2285,110 +1766,69 @@

Node Matchers

Matches C++ initializer list expressions.
 
 Given
-  namespace std {
-    template <typename T>
-    class initializer_list {
-      const T* begin;
-      const T* end;
-    };
-  }
-  template <typename T> class vector {
-    public: vector(std::initializer_list<T>) {}
-  };
-
-  vector<int> a({ 1, 2, 3 });
-  vector<int> b = { 4, 5 };
+  std::vector<int> a({ 1, 2, 3 });
+  std::vector<int> b = { 4, 5 };
   int c[] = { 6, 7 };
-  struct pair { int x; int y; };
-  pair d = { 8, 9 };
-
-The matcher cxxStdInitializerListExpr()
-matches { 1, 2, 3 } and { 4, 5 }.
+  std::pair<int, int> d = { 8, 9 };
+cxxStdInitializerListExpr()
+  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
 
Matcher<Stmt>cxxTemporaryObjectExprMatcher<CXXTemporaryObjectExpr>...
Matches functional cast expressions having N != 1 arguments
 
-Given
-  struct Foo {
-    Foo(int x, int y);
-  };
-
-  void foo(int bar) {
-    Foo h = Foo(bar, bar);
-  }
-
-
-The matcher cxxTemporaryObjectExpr()
-matches Foo(bar, bar).
+Example: Matches Foo(bar, bar)
+  Foo h = Foo(bar, bar);
 
-Matcher<Stmt>cxxThisExprMatcher<CXXThisExpr>... -
Matches implicit and explicit this expressions.
-
-Given
-  struct foo {
-    int i;
-    int f() { return i; }
-    int g() { return this->i; }
-  };
-
+Matcher<Stmt>cxxThisExprMatcher<CXXThisExpr>...
+
Matches implicit and explicit this expressions.
 
-The matcher cxxThisExpr()
-matches this of this->i and the implicit this expression
-of i.
+Example matches the implicit this expression in "return i".
+    (matcher = cxxThisExpr())
+struct foo {
+  int i;
+  int f() { return i; }
+};
 
Matcher<Stmt>cxxThrowExprMatcher<CXXThrowExpr>...
Matches throw expressions.
 
-void foo() {
   try { throw 5; } catch(int i) {}
-}
-
-The matcher cxxThrowExpr()
-matches throw 5
+cxxThrowExpr()
+  matches 'throw 5'
 
Matcher<Stmt>cxxTryStmtMatcher<CXXTryStmt>...
Matches try statements.
 
-void foo() {
   try {} catch(int i) {}
-}
-
-The matcher cxxTryStmt()
-matches try {} catch(int i) {}
+cxxTryStmt()
+  matches 'try {}'
 
Matcher<Stmt>cxxUnresolvedConstructExprMatcher<CXXUnresolvedConstructExpr>...
Matches unresolved constructor call expressions.
 
-Given
+Example matches T(t) in return statement of f
+    (matcher = cxxUnresolvedConstructExpr())
   template <typename T>
   void f(const T& t) { return T(t); }
-
-
-The matcher cxxUnresolvedConstructExpr() matches
-T(t).
 
Matcher<Stmt>declRefExprMatcher<DeclRefExpr>...
Matches expressions that refer to declarations.
 
-Given
-  void f(bool x) {
-    if (x) {}
-  }
-
-
-The matcher declRefExpr() matches x.
+Example matches x in if (x)
+  bool x;
+  if (x) {}
 
@@ -2396,11 +1836,9 @@

Node Matchers

Matches declaration statements.
 
 Given
-  void foo() {
-    int a;
-  }
-The matcher declStmt()
-matches int a;.
+  int a;
+declStmt()
+  matches 'int a'.
 
@@ -2408,75 +1846,22 @@

Node Matchers

Matches default statements inside switch statements.
 
 Given
-void foo(int a) {
   switch(a) { case 42: break; default: break; }
-}
-The matcher defaultStmt()
-matches default: break.
+defaultStmt()
+  matches 'default:'.
 
Matcher<Stmt>dependentCoawaitExprMatcher<DependentCoawaitExpr>...
Matches co_await expressions where the type of the promise is dependent
-
-Given
-  namespace std {
-  template <typename T = void>
-  struct coroutine_handle {
-      static constexpr coroutine_handle from_address(void* addr) {
-        return {};
-      }
-  };
-
-  struct always_suspend {
-      bool await_ready() const noexcept;
-      bool await_resume() const noexcept;
-      template <typename T>
-      bool await_suspend(coroutine_handle<T>) const noexcept;
-  };
-
-  template <typename T>
-  struct coroutine_traits {
-      using promise_type = T::promise_type;
-  };
-  }  // namespace std
-
-  template <typename T>
-  struct generator {
-      struct promise_type {
-          std::always_suspend yield_value(int&&);
-          std::always_suspend initial_suspend() const noexcept;
-          std::always_suspend final_suspend() const noexcept;
-          void return_void();
-          void unhandled_exception();
-          generator get_return_object();
-      };
-  };
-
-  template <typename T>
-  std::always_suspend h();
-
-  template <>
-  std::always_suspend h<void>();
-
-  template<typename T>
-  generator<T> g() { co_await h<T>(); }
-
-The matcher dependentCoawaitExpr()
-matches co_await h<T>().
 
Matcher<Stmt>designatedInitExprMatcher<DesignatedInitExpr>...
Matches C99 designated initializer expressions [C99 6.7.8].
 
-Example: Given
-  struct point2 { double x; double y; };
-  struct point2 ptarray[10] = { [0].x = 1.0 };
-  struct point2 pt = { .x = 2.0 };
-
-The matcher designatedInitExpr()
-matches [0].x = 1.0 and .x = 2.0.
+Example: Matches { [2].y = 1.0, [0].x = 1.0 }
+  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
 
@@ -2484,12 +1869,9 @@

Node Matchers

Matches do statements.
 
 Given
-void foo() {
   do {} while (true);
-}
-
-The matcher doStmt()
-matches do {} while (true)
+doStmt()
+  matches 'do {} while(true)'
 
@@ -2507,36 +1889,18 @@

Node Matchers

See also: hasDestinationType. - struct S {}; - const S* s; - S* s2 = const_cast<S*>(s); - - const int val = 0; - char val0 = val; - char val1 = (char)val; - char val2 = static_cast<char>(val); - int* val3 = reinterpret_cast<int*>(val); - char val4 = char(val); - - -The matcher explicitCastExpr() -matches (char)val, static_cast<char>(val), -reinterpret_cast<int*>(val), const_cast<S*>(s) -and char(val), but not the initialization of val0 with -val. +Example: matches all five of the casts in + int((int)(reinterpret_cast<int>(static_cast<int>(const_cast<int>(42))))) +but does not match the implicit conversion in + long ell = 42;
Matcher<Stmt>exprMatcher<Expr>...
Matches expressions.
 
-Given
-  int f(int x, int y) { return x + y; }
-
-The matcher expr() matches x + y once,
-x twice and y twice, matching the
-DeclRefExpr , and the ImplicitCastExpr that does an l- to r-value
-cast.
+Example matches x()
+  void f() { x(); }
 
@@ -2545,33 +1909,12 @@

Node Matchers

of the sub-expression's evaluation. Example matches std::string() - struct A { ~A(); }; - void f(A); - void g(A&); - void h() { - A a = A{}; - f(A{}); - f(a); - g(a); - } - - -The matcher exprWithCleanups() matches A{}, -f(A{}) and f(a), -but does not match passing g(a). + const std::string str = std::string(); Matcher<Stmt>fixedPointLiteralMatcher<FixedPointLiteral>...
Matches fixed point literals
-
-Given
-  void f() {
-    0.0k;
-  }
-
-
-The matcher fixedPointLiteral() matches 0.0k.
 
@@ -2579,62 +1922,27 @@

Node Matchers

Matches float literals of all sizes / encodings, e.g.
 1.0, 1.0f, 1.0L and 1e10.
 
-Given
-  int a = 1.0;
-  int b = 1.0F;
-  int c = 1.0L;
-  int d = 1e10;
-  int e = 1;
-
-The matcher floatLiteral() matches
-1.0, 1.0F, 1.0L and 1e10, but does not match
-1.
+Does not match implicit conversions such as
+  float a = 10;
 
Matcher<Stmt>forStmtMatcher<ForStmt>...
Matches for statements.
 
-Given
-  void foo() {
-    for (;;) {}
-    int i[] =  {1, 2, 3}; for (auto a : i);
-  }
-
-
-The matcher forStmt() matches for (;;) {},
-but not for (auto a : i);.
+Example matches 'for (;;) {}'
+  for (;;) {}
+  int i[] =  {1, 2, 3}; for (auto a : i);
 
Matcher<Stmt>genericSelectionExprMatcher<GenericSelectionExpr>...
Matches C11 _Generic expression.
-
-Given
-  double fdouble(double);
-  float ffloat(float);
-  #define GENERIC_MACRO(X) _Generic((X), double: fdouble, float: ffloat)(X)
-
-  void f() {
-      GENERIC_MACRO(0.0);
-      GENERIC_MACRO(0.0F);
-  }
-
-
-The matcher genericSelectionExpr() matches
-the generic selection expression that is expanded in
-GENERIC_MACRO(0.0) and GENERIC_MACRO(0.0F).
 
Matcher<Stmt>gnuNullExprMatcher<GNUNullExpr>...
Matches GNU __null expression.
-
-Given
-  auto val = __null;
-
-
-The matcher gnuNullExpr() matches __null.
 
@@ -2642,39 +1950,24 @@

Node Matchers

Matches goto statements.
 
 Given
-void bar();
-void foo() {
   goto FOO;
   FOO: bar();
-}
-The matcher gotoStmt()
-matches goto FOO
+gotoStmt()
+  matches 'goto FOO'
 
Matcher<Stmt>ifStmtMatcher<IfStmt>...
Matches if statements.
 
-Given
-  void foo(int x) {
-    if (x) {}
-  }
-
-The matcher ifStmt() matches if (x) {}.
+Example matches 'if (x) {}'
+  if (x) {}
 
Matcher<Stmt>imaginaryLiteralMatcher<ImaginaryLiteral>...
Matches imaginary literals, which are based on integer and floating
 point literals e.g.: 1i, 1.0i
-
-Given
-  auto a = 1i;
-  auto b = 1.0i;
-
-
-The matcher imaginaryLiteral() matches 1i and
-1.0i.
 
@@ -2683,17 +1976,6 @@

Node Matchers

This matches many different places, including function call return value eliding, as well as any type conversions. - -void f(int); -void g(int val1, int val2) { - unsigned int a = val1; - f(val2); -} - -The matcher implicitCastExpr() -matches val1 for the implicit cast from an l- to an r-value -and for the cast to int}, f for the function pointer -decay, and val2 for the cast from an l- to an r-value. @@ -2701,11 +1983,9 @@

Node Matchers

Matches implicit initializers of init list expressions.
 
 Given
-  struct point { double x; double y; };
-  struct point pt = { .x = 42.0 };
-The matcher
-initListExpr(has(implicitValueInitExpr().bind("implicit")))
-matches { .x = 42.0 }.
+  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
+implicitValueInitExpr()
+  matches "[0].y" (implicitly)
 
@@ -2715,9 +1995,9 @@

Node Matchers

Given int a[] = { 1, 2 }; struct B { int x, y; }; - struct B b = { 5, 6 }; -The matcher initListExpr() -matches { 1, 2 } and { 5, 6 } + B b = { 5, 6 }; +initListExpr() + matches "{ 1, 2 }" and "{ 5, 6 }" @@ -2726,17 +2006,6 @@

Node Matchers

1, 1L, 0x1 and 1U. Does not match character-encoded integers such as L'a'. - -Given - int a = 1; - int b = 1L; - int c = 0x1; - int d = 1U; - int e = 1.0; - -The matcher integerLiteral() matches -1, 1L, 0x1 and 1U, but does not match -1.0. @@ -2744,26 +2013,18 @@

Node Matchers

Matches label statements.
 
 Given
-void bar();
-void foo() {
   goto FOO;
   FOO: bar();
-}
-The matcher labelStmt()
-matches FOO: bar()
+labelStmt()
+  matches 'FOO:'
 
Matcher<Stmt>lambdaExprMatcher<LambdaExpr>...
Matches lambda expressions.
 
-Given
-  void f() {
-    []() { return 5; };
-  }
-
-
-The matcher lambdaExpr() matches []() { return 5; }.
+Example matches [&](){return 5;}
+  [&](){return 5;}
 
@@ -2774,17 +2035,12 @@

Node Matchers

struct T {void func();}; T f(); void g(T); - void foo() { - T u(f()); - g(f()); - f().func(); - f(); // does not match - } - -The matcher materializeTemporaryExpr() matches -f() three times before C++17 and it -matches f() time with C++17 and later, but -it does not match the f() in the last line in any version. +materializeTemporaryExpr() matches 'f()' in these statements + T u(f()); + g(f()); + f().func(); +but does not match + f(); @@ -2796,20 +2052,17 @@

Node Matchers

void x() { this->x(); x(); Y y; y.x(); a; this->b; Y::b; } int a; static int b; }; - -The matcher memberExpr() -matches this->x, x, y.x, a, this->b. +memberExpr() + matches this->x, x, y.x, a, this->b Matcher<Stmt>nullStmtMatcher<NullStmt>...
Matches null statements.
 
-void foo() {
   foo();;
-}
-The matcher nullStmt()
-matches the second ;
+nullStmt()
+  matches the second ';'
 
@@ -2819,7 +2072,6 @@

Node Matchers

Example matches @catch @try {} @catch (...) {} - @@ -2829,23 +2081,19 @@

Node Matchers

Example matches @finally @try {} @finally {} - Matcher<Stmt>objcIvarRefExprMatcher<ObjCIvarRefExpr>...
Matches a reference to an ObjCIvar.
 
-Given
+Example: matches "a" in "init" method:
 @implementation A {
   NSString *a;
 }
 - (void) init {
   a = @"hello";
 }
-
-
-The matcher objcIvarRefExpr() matches a.
 
@@ -2857,10 +2105,6 @@

Node Matchers

"initWithString" instance method on the object returned from NSString's "alloc". This matcher should match both message sends. [[NSString alloc] initWithString:@"Hello"] - - -The matcher objcMessageExpr() matches -[[NSString alloc] initWithString:@"Hello"] @@ -2869,7 +2113,6 @@

Node Matchers

Example matches @"abcd" NSString *s = @"abcd"; - @@ -2877,7 +2120,6 @@

Node Matchers

Matches Objective-C statements.
 
 Example matches @throw obj;
-
 
@@ -2887,7 +2129,6 @@

Node Matchers

Example matches @try @try {} @catch (...) {} - @@ -2895,19 +2136,13 @@

Node Matchers

Matches any ``#pragma omp`` executable directive.
 
 Given
-  void foo() {
-    #pragma omp parallel
-      {}
-    #pragma omp parallel default(none)
-      {
-        #pragma omp taskyield
-      }
-  }
 
-The matcher ompExecutableDirective()
-matches #pragma omp parallel,
-#pragma omp parallel default(none)
-and #pragma omp taskyield.
+  #pragma omp parallel
+  #pragma omp parallel default(none)
+  #pragma omp taskyield
+
+``ompExecutableDirective()`` matches ``omp parallel``,
+``omp parallel default(none)`` and ``omp taskyield``.
 
@@ -2916,27 +2151,17 @@

Node Matchers

to reference another expressions and can be met in BinaryConditionalOperators, for example. -Given - int f(int a, int b) { - return (a ?: b) + 42; - } - - -The matcher opaqueValueExpr() matches a twice, -once for the check and once for the expression of the true path. +Example matches 'a' + (a ?: c) + 42; Matcher<Stmt>parenExprMatcher<ParenExpr>...
Matches parentheses used in expressions.
 
-Given
+Example matches (foo() + 1)
   int foo() { return 1; }
-  int bar() {
-    int a = (foo() + 1);
-  }
-
-The matcher parenExpr() matches (foo() + 1).
+  int a = (foo() + 1);
 
@@ -2952,12 +2177,8 @@

Node Matchers

int a = 0, b = 1; int i = (a, b); } }; - -The matcher parenListExpr() -matches (*this), -but does not match (a, b) -because (a, b) has a predefined type and is a ParenExpr, not a -ParenListExpr. +parenListExpr() matches "*this" but NOT matches (a, b) because (a, b) +has a predefined type and is a ParenExpr, not a ParenListExpr. @@ -2965,12 +2186,7 @@

Node Matchers

Matches predefined identifier expressions [C99 6.4.2.2].
 
 Example: Matches __func__
-  void f() {
-    const char* func_name = __func__;
-  }
-
-The matcher predefinedExpr()
-matches __func__.
+  printf("%s", __func__);
 
@@ -2978,11 +2194,9 @@

Node Matchers

Matches return statements.
 
 Given
-int foo() {
   return 1;
-}
-The matcher returnStmt()
-matches return 1
+returnStmt()
+  matches 'return 1'
 
@@ -2990,35 +2204,26 @@

Node Matchers

Matches statements.
 
 Given
-  void foo(int a) { { ++a; } }
-The matcher stmt()
-matches the function body itself { { ++a; } }, the compound
-statement { ++a; }, the expression ++a and a.
+  { ++a; }
+stmt()
+  matches both the compound statement '{ ++a; }' and '++a'.
 
Matcher<Stmt>stmtExprMatcher<StmtExpr>...
Matches statement expression (GNU extension).
 
-Given
-  void f() {
-    int C = ({ int X = 4; X; });
-  }
-
-The matcher stmtExpr() matches ({ int X = 4; X; }).
+Example match: ({ int X = 4; X; })
+  int C = ({ int X = 4; X; });
 
Matcher<Stmt>stringLiteralMatcher<StringLiteral>...
Matches string literals (also matches wide string literals).
 
-Given
+Example matches "abcd", L"abcd"
   char *s = "abcd";
   wchar_t *ws = L"abcd";
-
-
-The matcher stringLiteral() matches "abcd" and
-L"abcd".
 
@@ -3029,9 +2234,8 @@

Node Matchers

template <int N> struct A { static const int n = N; }; struct B : public A<42> {}; - -The matcher substNonTypeTemplateParmExpr() -matches N in the right-hand side of "static const int n = N;" +substNonTypeTemplateParmExpr() + matches "N" in the right-hand side of "static const int n = N;" @@ -3039,11 +2243,9 @@

Node Matchers

Matches case and default statements inside switch statements.
 
 Given
-void foo(int a) {
   switch(a) { case 42: break; default: break; }
-}
-The matcher switchCase()
-matches case 42: break and default: break
+switchCase()
+  matches 'case 42:' and 'default:'.
 
@@ -3051,11 +2253,9 @@

Node Matchers

Matches switch statements.
 
 Given
-void foo(int a) {
   switch(a) { case 42: break; default: break; }
-}
-The matcher switchStmt()
-matches switch(a) { case 42: break; default: break; }.
+switchStmt()
+  matches 'switch(a)'.
 
@@ -3063,11 +2263,10 @@

Node Matchers

Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
 
 Given
-  int x = 42;
+  Foo x = bar;
   int y = sizeof(x) + alignof(x);
-
-The matcher unaryExprOrTypeTraitExpr()
-matches sizeof(x) and alignof(x)
+unaryExprOrTypeTraitExpr()
+  matches sizeof(x) and alignof(x)
 
@@ -3075,12 +2274,7 @@

Node Matchers

Matches unary operator expressions.
 
 Example matches !a
-  void foo(bool a, bool b) {
-    !a || b;
-  }
-
-
-The matcher unaryOperator() matches !a.
+  !a || b
 
@@ -3095,10 +2289,8 @@

Node Matchers

void bar() { foo<T>(); } - -The matcher unresolvedLookupExpr() -matches foo<T>. - +unresolvedLookupExpr() + matches foo<T>() Matcher<Stmt>unresolvedMemberExprMatcher<UnresolvedMemberExpr>... @@ -3110,9 +2302,8 @@

Node Matchers

void g(); }; template <class T> void h() { X x; x.f<T>(); x.g(); } - -The matcher unresolvedMemberExpr() -matches x.f<T> +unresolvedMemberExpr() + matches x.f<T> @@ -3120,12 +2311,6 @@

Node Matchers

Matches user defined literal operator call.
 
 Example match: "foo"_suffix
-Given
-  float operator ""_foo(long double);
-  float a = 1234.5_foo;
-
-
-The matcher userDefinedLiteral() matches 1234.5_foo.
 
@@ -3133,12 +2318,9 @@

Node Matchers

Matches while statements.
 
 Given
-void foo() {
   while (true) {}
-}
-
-The matcher whileStmt()
-matches while (true) {}.
+whileStmt()
+  matches 'while (true) {}'.
 
@@ -3148,9 +2330,8 @@

Node Matchers

Given template <typename T> struct C {}; C<int> c; - -The matcher templateArgumentLoc() -matches int in C<int>. +templateArgumentLoc() + matches 'int' in C<int>. @@ -3160,10 +2341,8 @@

Node Matchers

Given template <typename T> struct C {}; C<int> c; - -The matcher -templateSpecializationType(hasAnyTemplateArgument(templateArgument())) -matches C<int>. +templateArgument() + matches 'int' in C<int>. @@ -3171,14 +2350,10 @@

Node Matchers

Matches template name.
 
 Given
-  template<template <typename> class S> class X {};
-  template<typename T> class Y {};
-  X<Y> xi;
-
-The matcher
-classTemplateSpecializationDecl(hasAnyTemplateArgument(
-              refersToTemplate(templateName())))
-matches the specialization class X<Y>
+  template <typename T> class X { };
+  X<int> xi;
+templateName()
+  matches 'X' in X<int>.
 
@@ -3188,8 +2363,8 @@

Node Matchers

Given struct s {}; struct s ss; -The matcher elaboratedTypeLoc() -matches the type struct s of ss. +elaboratedTypeLoc() + matches the `TypeLoc` of the variable declaration of `ss`. @@ -3198,8 +2373,8 @@

Node Matchers

Given int* x; -The matcher pointerTypeLoc() - matches int*. +pointerTypeLoc() + matches `int*`. @@ -3208,11 +2383,8 @@

Node Matchers

Given const int x = 0; - -The matcher qualifiedTypeLoc() -matches the type of the variable declaration x . However, the -current implementation of QualifiedTypeLoc does not store the source -locations for the qualifiers of the type int. +qualifiedTypeLoc() + matches `const int`. @@ -3223,10 +2395,8 @@

Node Matchers

int x = 3; int& l = x; int&& r = 3; - - -The matcher referenceTypeLoc() - matches int& and int&&. +referenceTypeLoc() + matches `int&` and `int&&`. @@ -3236,25 +2406,13 @@

Node Matchers

Given template <typename T> class C {}; C<char> var; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(typeLoc()))))) -matches C<char> var. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc()))) + matches `C<char> var`. Matcher<TypeLoc>typeLocMatcher<TypeLoc>...
Matches TypeLocs in the clang AST.
-
-That is, information about a type and where it was written.
-
-  void foo(int val);
-
-The matcher declaratorDecl(hasTypeLoc(typeLoc().bind("type")))
-matches void foo(int val) and int val, with
-typeLoc() matching void and
-int respectively.
 
@@ -3265,9 +2423,8 @@

Node Matchers

int a[] = { 2, 3 }; int b[4]; void f() { int c[a[0]]; } -The matcher arrayType() -int[4], int[a[0]] and -int[]; +arrayType() + matches "int a[]", "int b[4]" and "int c[a[0]]"; @@ -3276,25 +2433,20 @@

Node Matchers

Given _Atomic(int) i; -The matcher atomicType() -_Atomic(int) +atomicType() + matches "_Atomic(int) i" Matcher<Type>autoTypeMatcher<AutoType>...
Matches types nodes representing C++11 auto types.
 
-Given
-  void foo() {
-    auto n = 4;
-    int v[] = { 2, 3 };
-    for (auto i : v) { };
-  }
-
-The matcher autoType()
-matches the auto of n and i ,
-as well as the auto types for the implicitly generated code of the range-for
-loop (for the range, the begin iterator and the end iterator).
+Given:
+  auto n = 4;
+  int v[] = { 2, 3 }
+  for (auto i : v) { }
+autoType()
+  matches "auto n" and "auto i"
 
@@ -3310,12 +2462,13 @@

Node Matchers

Matches builtin Types.
 
 Given
-  enum E { Ok };
-  enum E e;
+  struct A {};
+  A a;
   int b;
   float c;
-The matcher varDecl(hasType(builtinType()))
-matches int b and float c.
+  bool d;
+builtinType()
+  matches "int b", "float c" and "bool d"
 
@@ -3324,8 +2477,8 @@

Node Matchers

Given _Complex float f; -The matcher complexType() -_Complex float +complexType() + matches "_Complex float f" @@ -3333,38 +2486,37 @@

Node Matchers

Matches C arrays with a specified constant size.
 
 Given
-  void foo() {
+  void() {
     int a[2];
     int b[] = { 2, 3 };
     int c[b[0]];
   }
-The matcher constantArrayType()
-int[2]
+constantArrayType()
+  matches "int a[2]"
 
Matcher<Type>decayedTypeMatcher<DecayedType>...
Matches decayed type
+Example matches i[] in declaration of f.
+    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
+Example matches i[1].
+    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
   void f(int i[]) {
     i[1] = 0;
   }
-The matcher
-valueDecl(hasType(decayedType(hasDecayedType(pointerType()))))
-matches int i[] in declaration of The matcher
-expr(hasType(decayedType(hasDecayedType(pointerType()))))
-matches i in 
+ Matcher<Type>decltypeTypeMatcher<DecltypeType>...
Matches types nodes representing C++11 decltype(<expr>) types.
 
-Given
+Given:
   short i = 1;
   int j = 42;
   decltype(i + j) result = i + j;
-
-The matcher decltypeType()
-decltype(i + j)
+decltypeType()
+  matches "decltype(i + j)"
 
@@ -3377,9 +2529,8 @@

Node Matchers

class C { public: C(T); }; C c(123); - -The matcher deducedTemplateSpecializationType() matches the type -C of the declaration of the variable c. +deducedTemplateSpecializationType() matches the type in the declaration +of the variable c. @@ -3391,9 +2542,8 @@

Node Matchers

class array { T data[Size]; }; - -The matcher dependentSizedArrayType() -T[Size] +dependentSizedArrayType() + matches "T data[Size]" @@ -3406,9 +2556,8 @@

Node Matchers

class vector { typedef T __attribute__((ext_vector_type(Size))) type; }; - -The matcher dependentSizedExtVectorType() -T __attribute__((ext_vector_type(Size))) +dependentSizedExtVectorType() + matches "T __attribute__((ext_vector_type(Size)))" @@ -3424,17 +2573,11 @@

Node Matchers

} class C {}; - C c; + class C c; N::M::D d; - -The matcher elaboratedType() matches the type -C three times. Once for the type of the -variable c, once for the type of the class definition and once for the -type in the injected class name. For D}, it matches -N::M::D of variable d and its class definition and -injected class name -D one time respectively. +elaboratedType() matches the type of the variable declarations of both +c and d. @@ -3448,10 +2591,8 @@

Node Matchers

C c; S s; - -The matcher enumType() matches the type -enum C of c , -and the type enum S of s . +enumType() matches the type of the variable declarations of both c and +s. @@ -3461,11 +2602,9 @@

Node Matchers

Given int (*f)(int); void g(); -The matcher functionProtoType() -matches the type int (int) of 'f' and the type -void (void) of 'g' in C++ mode. -In C, the type void () of 'g' is not -matched because it does not contain a prototype. +functionProtoType() + matches "int (*f)(int)" and the type of "g" in C++ mode. + In C mode, "g" is not matched because it does not contain a prototype. @@ -3475,12 +2614,8 @@

Node Matchers

Given int (*f)(int); void g(); -The matcher functionType() -int (int) and the type of -void (void) in C++ and in C23 and -later. Before C23, the function type for f will be matched the same way, -but the function type for g will match -void (). +functionType() + matches "int (*f)(int)" and the type of "g". @@ -3491,30 +2626,27 @@

Node Matchers

int a[] = { 2, 3 }; int b[42]; void f(int c[]) { int d[a[0]]; }; -The matcher incompleteArrayType() -int[] and int[] +incompleteArrayType() + matches "int a[]" and "int c[]" Matcher<Type>injectedClassNameTypeMatcher<InjectedClassNameType>...
Matches injected class name types.
 
-Given
+Example matches S s, but not S<T> s.
+    (matcher = parmVarDecl(hasType(injectedClassNameType())))
   template <typename T> struct S {
     void f(S s);
     void g(S<T> s);
   };
-
-The matcher
-parmVarDecl(hasType(elaboratedType(namesType(injectedClassNameType()))))
-matches S s, but not s}
 
Matcher<Type>lValueReferenceTypeMatcher<LValueReferenceType>...
Matches lvalue reference types.
 
-Given
+Given:
   int *a;
   int &b = *a;
   int &&c = 1;
@@ -3523,11 +2655,8 @@ 

Node Matchers

auto &&f = 2; int g = 5; - -The matcher lValueReferenceType() matches the type -int & of b and the type auto & -of d. -FIXME: figure out why auto changechange matches twice +lValueReferenceType() matches the types of b, d, and e. e is +matched since the type is deduced as int& by reference collapsing rules.
@@ -3538,23 +2667,18 @@

Node Matchers

#define CDECL __attribute__((cdecl)) typedef void (CDECL *X)(); typedef void (__attribute__((cdecl)) *Y)(); -The matcher macroQualifiedType() -matches the type CDECL void -(void) of the typedef declaration of X , unless when in C98-C17, there -CDECL void (), -but it does not match the type -__attribute((cdecl)) void () of Y . +macroQualifiedType() + matches the type of the typedef declaration of X but not Y. Matcher<Type>memberPointerTypeMatcher<MemberPointerType>...
Matches member pointer types.
 Given
-  struct A { int i; };
-  int A::* ptr = &A::i;
-
-The matcher memberPointerType()
-matches int struct A::*.
+  struct A { int i; }
+  A::* ptr = A::i;
+memberPointerType()
+  matches "A::* ptr"
 
@@ -3568,10 +2692,8 @@

Node Matchers

@interface Foo @end Foo *f; - -The matcher pointerType() -matches Foo *, but does not match -int *. +pointerType() + matches "Foo *f", but does not match "int *a". @@ -3582,9 +2704,8 @@

Node Matchers

int (*ptr_to_array)[4]; int *array_of_ptrs[4]; -The matcher varDecl(hasType(pointsTo(parenType()))) - matches ptr_to_array but not - array_of_ptrs. +varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not +array_of_ptrs. @@ -3593,28 +2714,22 @@

Node Matchers

types. Given - typedef int* int_ptr; - void foo(char *str, - int val, - int *val_ptr, - int_ptr not_a_ptr, - int_ptr *ptr); - -The matcher parmVarDecl(hasType(pointerType())) -matches char *str, int *val_ptr and -int_ptr *ptr. + int *a; + int &b = *a; + int c = 5; @interface Foo @end Foo *f; - +pointerType() + matches "int *a", but does not match "Foo *f". Matcher<Type>rValueReferenceTypeMatcher<RValueReferenceType>...
Matches rvalue reference types.
 
-Given
+Given:
   int *a;
   int &b = *a;
   int &&c = 1;
@@ -3623,10 +2738,8 @@ 

Node Matchers

auto &&f = 2; int g = 5; - -The matcher rValueReferenceType() matches the type -int && of c and the type -auto && of f. +rValueReferenceType() matches the types of c and f. e is not +matched as it is deduced to int& by reference collapsing rules.
@@ -3640,14 +2753,8 @@

Node Matchers

C c; S s; - -The matcher recordType() matches the type -class C of the variable declaration of c and -matches the type struct S of the variable -declaration of s. -Both of these types are matched three times, once for the type of the -variable, once for the definition of the class, and once for the type of the -injected class name. +recordType() matches the type of the variable declarations of both c +and s. @@ -3663,12 +2770,7 @@

Node Matchers

auto &&f = 2; int g = 5; - -The matcher referenceType() matches the type -int & of b , the type int && of -c, the type -auto & d, and the type -auto && of e and f. +referenceType() matches the types of b, c, d, e, and f. @@ -3679,17 +2781,10 @@

Node Matchers

Given template <typename T> void F(T t) { - T local; int i = 1 + t; } - void f() { - F(0); - } - -The matcher varDecl(hasType(substTemplateTypeParmType())) -matches T t and T local for the substituted template type -int in the instantiation of F . +substTemplateTypeParmType() matches the type of 't' but not '1' @@ -3697,18 +2792,14 @@

Node Matchers

Matches tag types (record and enum types).
 
 Given
-  enum E { Ok };
+  enum E {};
   class C {};
 
   E e;
   C c;
 
-
-The matcher tagType() matches the type
-enum E of variable e and the type
-class C three times, once for the type
-of the variable c , once for the type of the class definition and once of
-the type in the injected class name.
+tagType() matches the type of the variable declarations of both e
+and c.
 
@@ -3719,38 +2810,25 @@

Node Matchers

template <typename T> class C { }; - template class C<int>; - C<int> intvar; - C<char> charvar; + template class C<int>; // A + C<char> var; // B - -The matcher templateSpecializationType() matches the type -C<int> of the explicit instantiation in A and the -type C<char> of the variable declaration in -B. +templateSpecializationType() matches the type of the explicit +instantiation in A and the type of the variable declaration in B. Matcher<Type>templateTypeParmTypeMatcher<TemplateTypeParmType>...
Matches template type parameter types.
 
-Given
+Example matches T, but not int.
+    (matcher = templateTypeParmType())
   template <typename T> void f(int i);
-
-The matcher templateTypeParmType() matches T,
-but does not match int.
 
Matcher<Type>typeMatcher<Type>...
Matches Types in the clang AST.
-
-Given
-  const int b = 1;
-
-The matcher varDecl(hasType(type().bind("type")))
-matches const int b = 1, with type()
-matching int.
 
@@ -3759,22 +2837,18 @@

Node Matchers

Given typedef int X; - X x = 0; -The matcher typedefType() -matches X. +typedefType() + matches "typedef int X" Matcher<Type>unaryTransformTypeMatcher<UnaryTransformType>...
Matches types nodes representing unary type transformations.
 
-Given
-  template <typename T> struct A {
-    typedef __underlying_type(T) type;
-  };
-
-The matcher unaryTransformType()
-matches __underlying_type(T)
+Given:
+  typedef __underlying_type(T) type;
+unaryTransformType()
+  matches "__underlying_type(T)"
 
@@ -3786,9 +2860,7 @@

Node Matchers

using a::S; S s; - -The matcher usingType() matches the type a::S -of the variable declaration of s. +usingType() matches the type of the variable declaration of s. @@ -3798,12 +2870,12 @@

Node Matchers

Given void f() { - int a[] = { 2, 3 }; + int a[] = { 2, 3 } int b[42]; int c[a[0]]; } -The matcher variableArrayType() -int[a[0]] +variableArrayType() + matches "int c[a[0]]" @@ -3827,12 +2899,6 @@

Narrowing Matchers

Matches if all given matchers match.
 
 Usable as: Any Matcher
-
-  int v0 = 0;
-  int v1 = 1;
-
-The matcher varDecl(allOf(hasName("v0"), hasType(isInteger())))
-matches int v0 = 0.
 
@@ -3840,13 +2906,6 @@

Narrowing Matchers

Matches if any of the given matchers matches.
 
 Usable as: Any Matcher
-
-  char v0 = 'a';
-  int v1 = 1;
-  float v2 = 2.0;
-
-The matcher varDecl(anyOf(hasName("v0"), hasType(isInteger())))
-matches char v0 = 'a' and int v1 = 1.
 
@@ -3857,11 +2916,11 @@

Narrowing Matchers

additional constraint. This will often be used with an explicit conversion to an internal::Matcher<> type such as TypeMatcher. -Given +Example: DeclarationMatcher(anything()) matches all declarations, e.g., +"int* p" and "void f()" in int* p; void f(); -The matcher decl(anything()) -matches int* p and void f(). + Usable as: Any Matcher @@ -3870,25 +2929,21 @@

Narrowing Matchers

Matches any of the NodeMatchers with InnerMatchers nested within
 
 Given
-  void f() {
-    if (true);
-    for (; true; );
-  }
-
-
-The matcher stmt(mapAnyOf(ifStmt, forStmt).with(
-    hasCondition(cxxBoolLiteral(equals(true)))
-    )),
-which is equivalent to
-stmt(anyOf(
-    ifStmt(hasCondition(cxxBoolLiteral(equals(true)))).bind("trueCond"),
-    forStmt(hasCondition(cxxBoolLiteral(equals(true)))).bind("trueCond")
-    )),
-matches if (true); and for (; true; );.
+  if (true);
+  for (; true; );
+with the matcher
+  mapAnyOf(ifStmt, forStmt).with(
+    hasCondition(cxxBoolLiteralExpr(equals(true)))
+    ).bind("trueCond")
+matches the if and the for. It is equivalent to:
+  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
+  anyOf(
+    ifStmt(trueCond).bind("trueCond"),
+    forStmt(trueCond).bind("trueCond")
+    );
 
 The with() chain-call accepts zero or more matchers which are combined
 as-if with allOf() in each of the node matchers.
-
 Usable as: Any Matcher
 
@@ -3896,13 +2951,10 @@

Narrowing Matchers

Matcher<*>unlessMatcher<*>
Matches if the provided matcher does not match.
 
-Given
+Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
   class X {};
   class Y {};
 
-The matcher cxxRecordDecl(unless(hasName("X")))
-matches Y
-
 Usable as: Any Matcher
 
@@ -3910,20 +2962,6 @@

Narrowing Matchers

Matcher<Attr>isImplicit
Matches an entity that has been implicitly added by the compiler (e.g.
 implicit default/copy constructors).
-
-Given
-  struct S {};
-  void f(S obj) {
-    S copy = obj;
-    [&](){ return copy; };
-  }
-
-
-The matcher cxxConstructorDecl(isImplicit(), isCopyConstructor())
-matches the implicit copy constructor of S.
-The matcher lambdaExpr(forEachLambdaCapture(
-    lambdaCapture(isImplicit()))) matches [&](){ return copy; },
-because it implicitly captures copy .
 
@@ -3931,26 +2969,9 @@

Narrowing Matchers

Matches operator expressions (binary or unary) that have any of the
 specified names.
 
-It provides a compact way of writing if an operator has any of the specified
-names:
-The matcher
    hasAnyOperatorName("+", "-")
-Is equivalent to
-   hasOperatorName("-"))}
-
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-void bar(bool a, bool b) {
-  a && b;
- }
-
-The matcher binaryOperator(hasAnyOperatorName("||", "&&"))
-matches a || b and a && b.
-The matcher unaryOperator(hasAnyOperatorName("-", "!"))
-matches !(a || b).
+ Is equivalent to
+   anyOf(hasOperatorName("+"), hasOperatorName("-"))
 
@@ -3958,62 +2979,43 @@

Narrowing Matchers

Matches the operator Name of operator expressions and fold expressions
 (binary or unary).
 
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-The matcher binaryOperator(hasOperatorName("||"))
-matches a || b
+Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
+  !(a || b)
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(hasOperatorName("+")))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
   }
-
-The matcher cxxFoldExpr(hasOperatorName("+"))
- matches (0 + ... + args).
 
Matcher<BinaryOperator>isAssignmentOperator
Matches all kinds of assignment operators.
 
-Given
-void foo(int a, int b) {
+Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   if (a == b)
     a += b;
-}
-The matcher binaryOperator(isAssignmentOperator())
-matches a += b.
 
-Given
+Example 2: matches s1 = s2
+           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   struct S { S& operator=(const S&); };
   void x() { S s1, s2; s1 = s2; }
-
-The matcher cxxOperatorCallExpr(isAssignmentOperator())
-matches s1 = s2.
 
Matcher<BinaryOperator>isComparisonOperator
Matches comparison operators.
 
-Given
-void foo(int a, int b) {
+Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   if (a == b)
     a += b;
-}
-The matcher binaryOperator(isComparisonOperator())
-matches a == b
 
-Given
+Example 2: matches s1 < s2
+           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   struct S { bool operator<(const S& other); };
   void x(S s1, S s2) { bool b1 = s1 < s2; }
-
-The matcher cxxOperatorCallExpr(isComparisonOperator())
-matches s1 < s2
 
@@ -4021,25 +3023,16 @@

Narrowing Matchers

Matches private C++ declarations and C++ base specifers that specify private
 inheritance.
 
-Given
+Examples:
   class C {
   public:    int a;
   protected: int b;
-  private:   int c;
+  private:   int c; // fieldDecl(isPrivate()) matches 'c'
   };
 
-The matcher fieldDecl(isPrivate())
-matches c.
-
   struct Base {};
-  struct Derived1 : private Base {}; // Base
-  class Derived2 : Base {}; // Base
-
-The matcher
-cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(isPrivate()).bind("base")))
-matches Derived1 and Derived2, with
-cxxBaseSpecifier(isPrivate()) matching
-Base.
+  struct Derived1 : private Base {}; // matches 'Base'
+  class Derived2 : Base {}; // matches 'Base'
 
@@ -4047,24 +3040,15 @@

Narrowing Matchers

Matches protected C++ declarations and C++ base specifers that specify
 protected inheritance.
 
-Given
+Examples:
   class C {
   public:    int a;
-  protected: int b;
+  protected: int b; // fieldDecl(isProtected()) matches 'b'
   private:   int c;
   };
 
-The matcher fieldDecl(isProtected())
-matches b.
-
   class Base {};
-  class Derived : protected Base {};
-
-The matcher
-cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(isProtected()).bind("base")))
-matches Derived, with
-cxxBaseSpecifier(isProtected()) matching
-Base.
+  class Derived : protected Base {}; // matches 'Base'
 
@@ -4072,26 +3056,16 @@

Narrowing Matchers

Matches public C++ declarations and C++ base specifers that specify public
 inheritance.
 
-Given
+Examples:
   class C {
-  public:    int a;
+  public:    int a; // fieldDecl(isPublic()) matches 'a'
   protected: int b;
   private:   int c;
   };
 
-The matcher fieldDecl(isPublic())
-matches a.
-
-Given
   class Base {};
-  class Derived1 : public Base {};
-  struct Derived2 : Base {};
-
-The matcher
-cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(isPublic()).bind("base")))
-matches Derived1 and Derived2,
-with cxxBaseSpecifier(isPublic()) matching
-public Base and Base.
+  class Derived1 : public Base {}; // matches 'Base'
+  struct Derived2 : Base {}; // matches 'Base'
 
@@ -4099,23 +3073,16 @@

Narrowing Matchers

Matches declarations of virtual methods and C++ base specifers that specify
 virtual inheritance.
 
-Given
+Example:
   class A {
    public:
     virtual void x(); // matches x
   };
 
-The matcher cxxMethodDecl(isVirtual())
-matches x.
-
-Given
-  struct Base {};
-  struct DirectlyDerived : virtual Base {}; // matches Base
-  struct IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
-
-The matcher
-cxxRecordDecl(hasDirectBase(cxxBaseSpecifier(isVirtual())))
-matches DirectlyDerived.
+Example:
+  class Base {};
+  class DirectlyDerived : virtual Base {}; // matches Base
+  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
 
 Usable as: Matcher<CXXMethodDecl>, Matcher<CXXBaseSpecifier>
 
@@ -4129,27 +3096,22 @@

Narrowing Matchers

Matches literals that are equal to the given value of type ValueT.
 
 Given
-void f(char, bool, double, int);
-void foo() {
   f('false, 3.14, 42);
-}
-
-The matcher characterLiteral(equals(0U)) matches 'The matchers cxxBoolLiteral(equals(false)) and
-cxxBoolLiteral(equals(0)) match false.
-The matcher floatLiteral(equals(3.14)) matches 3.14.
-The matcher integerLiteral(equals(42)) matches 42.
+characterLiteral(equals(0))
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
+  match false
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
+  match 3.14
+integerLiteral(equals(42))
+  matches 42
 
 Note that you cannot directly match a negative numeric literal because the
 minus sign is not part of the literal: It is a unary operator whose operand
 is the positive numeric literal. Instead, you must use a unaryOperator()
 matcher to match the minus sign:
 
-Given
-  int val = -1;
-
-The matcher unaryOperator(hasOperatorName("-"),
-              hasUnaryOperand(integerLiteral(equals(1))))
-matches -1.
+unaryOperator(hasOperatorName("-"),
+              hasUnaryOperand(integerLiteral(equals(13))))
 
 Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>,
            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
@@ -4168,15 +3130,14 @@ 

Narrowing Matchers

Matches a C++ catch statement that has a catch-all handler.
 
 Given
-  void foo() {
-    try {}
-    catch (int) {}
-    catch (...) {}
+  try {
+    // ...
+  } catch (int) {
+    // ...
+  } catch (...) {
+    // ...
   }
-
-The matcher cxxCatchStmt(isCatchAll())
-matches catch (...) {}
-but does not match catch(int)
+cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
 
@@ -4184,15 +3145,12 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has at least
 the specified number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) and g(0, 0, 0)
+(matcher = callExpr(argumentCountAtLeast(2)))
   void f(int x, int y);
   void g(int x, int y, int z);
-  void foo() {
-    f(0, 0);
-    g(0, 0, 0);
-  }
-The matcher callExpr(argumentCountAtLeast(2))
-matches f(0, 0) and g(0, 0, 0)
+  f(0, 0);
+  g(0, 0, 0);
 
@@ -4200,39 +3158,14 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has
 a specific number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   void f(int x, int y);
-  void foo() {
-    f(0, 0);
-  }
-The matcher callExpr(argumentCountIs(2))
-matches f(0, 0)
+  f(0, 0);
 
Matcher<CXXConstructExpr>isListInitialization
Matches a constructor call expression which uses list initialization.
-
-Given
-  namespace std {
-    template <typename T>
-    class initializer_list {
-      const T* begin;
-      const T* end;
-    };
-  }
-  template <typename T> class vector {
-    public: vector(std::initializer_list<T>) {}
-  };
-
-  vector<int> a({ 1, 2, 3 });
-  vector<int> b = { 4, 5 };
-  int c[] = { 6, 7 };
-  struct pair { int x; int y; };
-  pair d = { 8, 9 };
-
-The matcher cxxConstructExpr(isListInitialization())
-matches { 4, 5 }.
 
@@ -4242,15 +3175,11 @@

Narrowing Matchers

Given void foo() { - struct Foo { - double x; - }; - auto Val = Foo(); + struct point { double x; double y; }; + point pt[2] = { { 1.0, 2.0 } }; } - -The matcher -cxxConstructExpr(requiresZeroInitialization()) -matches Foo() because the x member has to be zero initialized. +initListExpr(has(cxxConstructExpr(requiresZeroInitialization())) +will match the implicit array filler for pt[1].
@@ -4263,10 +3192,7 @@

Narrowing Matchers

S(const S &); // #2 S(S &&); // #3 }; - -The matcher cxxConstructorDecl(isCopyConstructor()) -matches S(const S &), -but does not match S() or S(S &&). +cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3. @@ -4279,10 +3205,7 @@

Narrowing Matchers

S(const S &); // #2 S(S &&); // #3 }; - -The matcher cxxConstructorDecl(isDefaultConstructor()) -matches S() -but does not match S(const S &); or S(S &&);. +cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3. @@ -4296,10 +3219,8 @@

Narrowing Matchers

S(S &&) : S() {} // #3 }; S::S() : S(0) {} // #4 - -The matcher cxxConstructorDecl(isDelegatingConstructor()) -matches S(S &&) : S() {} and S::S() : S(0) {}, -but does not match S() or S(int). +cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not +#1 or #2. @@ -4315,27 +3236,15 @@

Narrowing Matchers

explicit S(double); // #2 operator int(); // #3 explicit operator bool(); // #4 - explicit(false) S(bool); // # 7 - explicit(true) S(char); // # 8 - explicit(b) S(float); // # 9 + explicit(false) S(bool) // # 7 + explicit(true) S(char) // # 8 + explicit(b) S(S) // # 9 }; - S(int) -> S<true>; // #5 - explicit S(double) -> S<false>; // #6 - -The matcher cxxConstructorDecl(isExplicit()) -matches explicit S(double) -and explicit(true) S(char) -but does not match S(int);, explicit(false) S(bool); or -explicit(b) S(float) -The matcher cxxConversionDecl(isExplicit()) -matches explicit operator bool() -but does not match operator int(). -The matcher cxxDeductionGuideDecl(isExplicit()) -matches the deduction guide explicit S(double) -> S<false>, -the implicit copy deduction candiate -auto (double) -> S<b> and -the implicitly generated deduction guide for explicit(true) S(char), -but does not match S(int) -> S<true>. + S(int) -> S<true> // #5 + explicit S(double) -> S<false> // #6 +cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. +cxxConversionDecl(isExplicit()) will match #4, but not #3. +cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. @@ -4352,10 +3261,7 @@

Narrowing Matchers

S(const S &); // #2 S(S &&); // #3 }; - -The matcher cxxConstructorDecl(isMoveConstructor()) -matches S(S &&) -but does not match S(); or S(S &&); +cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2. @@ -4371,27 +3277,15 @@

Narrowing Matchers

explicit S(double); // #2 operator int(); // #3 explicit operator bool(); // #4 - explicit(false) S(bool); // # 7 - explicit(true) S(char); // # 8 - explicit(b) S(float); // # 9 + explicit(false) S(bool) // # 7 + explicit(true) S(char) // # 8 + explicit(b) S(S) // # 9 }; - S(int) -> S<true>; // #5 - explicit S(double) -> S<false>; // #6 - -The matcher cxxConstructorDecl(isExplicit()) -matches explicit S(double) -and explicit(true) S(char) -but does not match S(int);, explicit(false) S(bool); or -explicit(b) S(float) -The matcher cxxConversionDecl(isExplicit()) -matches explicit operator bool() -but does not match operator int(). -The matcher cxxDeductionGuideDecl(isExplicit()) -matches the deduction guide explicit S(double) -> S<false>, -the implicit copy deduction candiate -auto (double) -> S<b> and -the implicitly generated deduction guide for explicit(true) S(char), -but does not match S(int) -> S<true>. + S(int) -> S<true> // #5 + explicit S(double) -> S<false> // #6 +cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. +cxxConversionDecl(isExplicit()) will match #4, but not #3. +cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. @@ -4408,12 +3302,8 @@

Narrowing Matchers

struct E : B { E() : B() {} }; - -The matcher cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer())) -matches E() : B() {} and D(int i) : I(i) {}. -The constructor of D is matched, because it implicitly has a constructor -initializer for B . + will match E(), but not match D(int). @@ -4430,11 +3320,8 @@

Narrowing Matchers

struct E : B { E() : B() {} }; - -The matcher cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer())) - will match D(int i) : I(i) {}, but not match E() : B() - {}. + will match D(int), but not match E(). @@ -4443,16 +3330,13 @@

Narrowing Matchers

code (as opposed to implicitly added by the compiler). Given - struct Bar { explicit Bar(const char*); }; struct Foo { Foo() { } Foo(int) : foo_("A") { } - Bar foo_{""}; + string foo_; }; - -The matcher -cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) will -match Foo(int) : foo_("A") { }, but not Foo() { } +cxxConstructorDecl(hasAnyConstructorInitializer(isWritten())) + will match Foo(int), but not Foo() @@ -4468,27 +3352,15 @@

Narrowing Matchers

explicit S(double); // #2 operator int(); // #3 explicit operator bool(); // #4 - explicit(false) S(bool); // # 7 - explicit(true) S(char); // # 8 - explicit(b) S(float); // # 9 + explicit(false) S(bool) // # 7 + explicit(true) S(char) // # 8 + explicit(b) S(S) // # 9 }; - S(int) -> S<true>; // #5 - explicit S(double) -> S<false>; // #6 - -The matcher cxxConstructorDecl(isExplicit()) -matches explicit S(double) -and explicit(true) S(char) -but does not match S(int);, explicit(false) S(bool); or -explicit(b) S(float) -The matcher cxxConversionDecl(isExplicit()) -matches explicit operator bool() -but does not match operator int(). -The matcher cxxDeductionGuideDecl(isExplicit()) -matches the deduction guide explicit S(double) -> S<false>, -the implicit copy deduction candiate -auto (double) -> S<b> and -the implicitly generated deduction guide for explicit(true) S(char), -but does not match S(int) -> S<true>. + S(int) -> S<true> // #5 + explicit S(double) -> S<false> // #6 +cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9. +cxxConversionDecl(isExplicit()) will match #4, but not #3. +cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5. @@ -4510,9 +3382,7 @@

Narrowing Matchers

S<T> s; s.mem(); } - -The matcher cxxDependentScopeMemberExpr(hasMemberName("mem")) -matches s.mem. +cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()` @@ -4531,25 +3401,14 @@

Narrowing Matchers

}; template <class T> class Z { - void x() { - this->m; - this->t; - this->t->m; - } - int m; - T* t; + void x() { this->m; } }; - -The matcher memberExpr(isArrow()) -matches this->x, x, a, -this->b, this->m and two times this->t, -once for the standalone member expression, and once for the member -expression that later accesses m . -Additionally, it does not match this->t->t. -The matcher cxxDependentScopeMemberExpr(isArrow()) -matches this->t->m, but not this->m or this->t. -The matcher unresolvedMemberExpr(isArrow()) -matches this->f<T>, f<T> +memberExpr(isArrow()) + matches this->x, x, y.x, a, this->b +cxxDependentScopeMemberExpr(isArrow()) + matches this->m +unresolvedMemberExpr(isArrow()) + matches this->f<T>, f<T> @@ -4573,20 +3432,19 @@

Narrowing Matchers

S<T> s; s.mem(); } - -The matcher cxxDependentScopeMemberExpr( - hasObjectExpression(declRefExpr(hasType( - elaboratedType(namesType(templateSpecializationType( +The matcher +@code +cxxDependentScopeMemberExpr( + hasObjectExpression(declRefExpr(hasType(templateSpecializationType( hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has( cxxMethodDecl(hasName("mem")).bind("templMem") ))))) - ))) - ))), + )))), memberHasSameNameAsBoundNode("templMem") -) -matches s.mem, with the inner matcher -cxxMethodDecl(hasName("mem")) matching -void mem() of the S template. + ) +@endcode +first matches and binds the @c mem member of the @c S template, then +compares its name to the usage in @c s.mem() in the @c x function template @@ -4594,29 +3452,23 @@

Narrowing Matchers

Matches the operator Name of operator expressions and fold expressions
 (binary or unary).
 
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-The matcher binaryOperator(hasOperatorName("||"))
-matches a || b
+Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
+  !(a || b)
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(hasOperatorName("+")))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
   }
-
-The matcher cxxFoldExpr(hasOperatorName("+"))
- matches (0 + ... + args).
 
Matcher<CXXFoldExpr>isBinaryFold
Matches binary fold expressions, i.e. fold expressions with an initializer.
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(isBinaryFold()))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
@@ -4626,17 +3478,14 @@ 

Narrowing Matchers

auto multiply(Args... args) { return (args * ...); } - - -The matcher cxxFoldExpr(isBinaryFold()) -matches (0 + ... + args).
Matcher<CXXFoldExpr>isLeftFold
Matches left-folding fold expressions.
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(isLeftFold()))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
@@ -4646,17 +3495,14 @@ 

Narrowing Matchers

auto multiply(Args... args) { return (args * ... * 1); } - - -The matcher cxxFoldExpr(isLeftFold()) -matches (0 + ... + args).
Matcher<CXXFoldExpr>isRightFold
Matches right-folding fold expressions.
 
-Given
+Example matches `(args * ... * 1)`
+    (matcher = cxxFoldExpr(isRightFold()))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
@@ -4666,10 +3512,6 @@ 

Narrowing Matchers

auto multiply(Args... args) { return (args * ... * 1); } - - -The matcher cxxFoldExpr(isRightFold()) -matches (args * ... * 1).
@@ -4677,7 +3519,8 @@

Narrowing Matchers

Matches unary fold expressions, i.e. fold expressions without an
 initializer.
 
-Given
+Example matches `(args * ...)`
+    (matcher = cxxFoldExpr(isUnaryFold()))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
@@ -4687,10 +3530,6 @@ 

Narrowing Matchers

auto multiply(Args... args) { return (args * ...); } - - -The matcher cxxFoldExpr(isUnaryFold()) -matches (args * ...), but not (0 + ... + args).
@@ -4703,9 +3542,7 @@

Narrowing Matchers

void bar(); }; - -The matcher cxxMethodDecl(isConst()) -matches foo but not bar +cxxMethodDecl(isConst()) matches A::foo() but not A::bar() @@ -4719,10 +3556,8 @@

Narrowing Matchers

A &operator=(A &&); }; - -The matcher cxxMethodDecl(isCopyAssignmentOperator()) -matches A &operator=(const A &) -but does not match A &operator=(A &&) +cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not +the second one. @@ -4738,19 +3573,15 @@

Narrowing Matchers

int operator+(int); }; - -The matcher cxxMethodDecl(isExplicitObjectMemberFunction()) -matches int operator-(this A, int) and -void fun(this A &&self), -but not static int operator()(int) or -int operator+(int). +cxxMethodDecl(isExplicitObjectMemberFunction()) matches the first two +methods but not the last two. Matcher<CXXMethodDecl>isFinal
Matches if the given method or class declaration is final.
 
-Given
+Given:
   class A final {};
 
   struct B {
@@ -4760,13 +3591,7 @@ 

Narrowing Matchers

struct C : B { void f() final; }; - -The matcher cxxRecordDecl(isFinal()) -matches A, -but does not match B or C. -The matcher cxxMethodDecl(isFinal()) -matches void f() final in C , -but does not match virtual void f() in B . +matches A and C::f, but not B, C, or B::f
@@ -4780,10 +3605,8 @@

Narrowing Matchers

A &operator=(A &&); }; - -The matcher cxxMethodDecl(isMoveAssignmentOperator()) -matches A &operator=(A &&) -but does not match A &operator=(const A &) +cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not +the first one. @@ -4797,11 +3620,9 @@

Narrowing Matchers

}; class B : public A { public: - void x() override; + virtual void x(); }; - -The matcher cxxMethodDecl(isOverride()) - matches void x() override + matches B::x @@ -4813,9 +3634,7 @@

Narrowing Matchers

public: virtual void x() = 0; }; - -The matcher cxxMethodDecl(isPure()) -matches virtual void x() = 0 + matches A::x @@ -4828,10 +3647,7 @@

Narrowing Matchers

S(const S &) = default; // #2 S(S &&) = delete; // #3 }; - -The matcher cxxConstructorDecl(isUserProvided()) -will match S(), but not S &) = default} or -&&) = delete} +cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3. @@ -4839,23 +3655,16 @@

Narrowing Matchers

Matches declarations of virtual methods and C++ base specifers that specify
 virtual inheritance.
 
-Given
+Example:
   class A {
    public:
     virtual void x(); // matches x
   };
 
-The matcher cxxMethodDecl(isVirtual())
-matches x.
-
-Given
-  struct Base {};
-  struct DirectlyDerived : virtual Base {}; // matches Base
-  struct IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
-
-The matcher
-cxxRecordDecl(hasDirectBase(cxxBaseSpecifier(isVirtual())))
-matches DirectlyDerived.
+Example:
+  class Base {};
+  class DirectlyDerived : virtual Base {}; // matches Base
+  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
 
 Usable as: Matcher<CXXMethodDecl>, Matcher<CXXBaseSpecifier>
 
@@ -4873,22 +3682,17 @@

Narrowing Matchers

public: void x(); }; - -The matcher cxxMethodDecl(isVirtualAsWritten()) -matches virtual void x() of A, -but does not match x()} of B . + matches A::x but not B::x Matcher<CXXNewExpr>isArray
Matches array new expressions.
 
-Given
-  struct MyClass { int x; };
+Given:
   MyClass *p1 = new MyClass[10];
-
-The matcher cxxNewExpr(isArray())
-matches new MyClass[10].
+cxxNewExpr(isArray())
+  matches the expression 'new MyClass[10]'.
 
@@ -4896,26 +3700,9 @@

Narrowing Matchers

Matches operator expressions (binary or unary) that have any of the
 specified names.
 
-It provides a compact way of writing if an operator has any of the specified
-names:
-The matcher
    hasAnyOperatorName("+", "-")
-Is equivalent to
-   hasOperatorName("-"))}
-
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-void bar(bool a, bool b) {
-  a && b;
- }
-
-The matcher binaryOperator(hasAnyOperatorName("||", "&&"))
-matches a || b and a && b.
-The matcher unaryOperator(hasAnyOperatorName("-", "!"))
-matches !(a || b).
+ Is equivalent to
+   anyOf(hasOperatorName("+"), hasOperatorName("-"))
 
@@ -4926,30 +3713,6 @@

Narrowing Matchers

"operator" prefix: e.g. "<<". hasAnyOverloadedOperatorName("+", "-") - -Given - struct Point { double x; double y; }; - Point operator+(const Point&, const Point&); - Point operator-(const Point&, const Point&); - - Point sub(Point a, Point b) { - return b - a; - } - - -The matcher functionDecl(hasAnyOverloadedOperatorName("+", "-")), -which is equivalent to -functionDecl(anyOf(hasAnyOverloadedOperatorName("+"), -hasOverloadedOperatorName("-"))), -matches Point operator+(const Point&, const Point&) and -Point operator-(const Point&, const Point&). -The matcher -cxxOperatorCallExpr(hasAnyOverloadedOperatorName("+", "-")), -which is equivalent to -cxxOperatorCallExpr(anyOf(hasOverloadedOperatorName("+"), -hasOverloadedOperatorName("-"))), -matches b - a. - Is equivalent to anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-")) @@ -4959,22 +3722,15 @@

Narrowing Matchers

Matches the operator Name of operator expressions and fold expressions
 (binary or unary).
 
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-The matcher binaryOperator(hasOperatorName("||"))
-matches a || b
+Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
+  !(a || b)
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(hasOperatorName("+")))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
   }
-
-The matcher cxxFoldExpr(hasOperatorName("+"))
- matches (0 + ... + args).
 
@@ -4984,19 +3740,16 @@

Narrowing Matchers

Matches overloaded operator names specified in strings without the "operator" prefix: e.g. "<<". -Given - struct A { int operator*(); }; +Given: + class A { int operator*(); }; const A &operator<<(const A &a, const A &b); - void f(A a) { - a << a; // <-- This matches - } + A a; + a << a; // <-- This matches - -The matcher cxxOperatorCallExpr(hasOverloadedOperatorName("<<")) -matches a << a. -The matcher +cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the +specified line and cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) -matches struct A { int operator*(); }. +matches the declaration of A. Usable as: Matcher<CXXOperatorCallExpr>, Matcher<FunctionDecl> @@ -5005,104 +3758,47 @@

Narrowing Matchers

Matcher<CXXOperatorCallExpr>isAssignmentOperator
Matches all kinds of assignment operators.
 
-Given
-void foo(int a, int b) {
+Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   if (a == b)
     a += b;
-}
-The matcher binaryOperator(isAssignmentOperator())
-matches a += b.
 
-Given
+Example 2: matches s1 = s2
+           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   struct S { S& operator=(const S&); };
   void x() { S s1, s2; s1 = s2; }
-
-The matcher cxxOperatorCallExpr(isAssignmentOperator())
-matches s1 = s2.
 
Matcher<CXXOperatorCallExpr>isComparisonOperator
Matches comparison operators.
 
-Given
-void foo(int a, int b) {
+Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   if (a == b)
     a += b;
-}
-The matcher binaryOperator(isComparisonOperator())
-matches a == b
 
-Given
+Example 2: matches s1 < s2
+           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   struct S { bool operator<(const S& other); };
   void x(S s1, S s2) { bool b1 = s1 < s2; }
-
-The matcher cxxOperatorCallExpr(isComparisonOperator())
-matches s1 < s2
 
Matcher<CXXRecordDecl>hasDefinition
Matches a class declaration that is defined.
 
-Given
+Example matches x (matcher = cxxRecordDecl(hasDefinition()))
 class x {};
 class y;
-
-The matcher cxxRecordDecl(hasDefinition())
-matches class x {}
 
Matcher<CXXRecordDecl>isDerivedFromstd::string BaseName
Overloaded method as shortcut for isDerivedFrom(hasName(...)).
-
-Matches C++ classes that are directly or indirectly derived from a class
-matching Base, or Objective-C classes that directly or indirectly
-subclass a class matching Base.
-
-Note that a class is not considered to be derived from itself.
-
-Example matches Y, Z, C (Base == hasName("X"))
-  class X {};
-  class Y : public X {};  // directly derived
-  class Z : public Y {};  // indirectly derived
-  typedef X A;
-  typedef A B;
-  class C : public B {};  // derived from a typedef of X
-
-  class Foo {};
-  typedef Foo Alias;
-  class Bar : public Alias {};  // derived from Alias, which is a
-                                // typedef of Foo
-
-
-The matcher cxxRecordDecl(isDerivedFrom("X"))
-matches Y, Z and C.
-The matcher cxxRecordDecl(isDerivedFrom("Foo"))
-matches Bar.
-
-In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
-  @interface NSObject @end
-  @interface Bar : NSObject @end
-
-
-Usable as: Matcher<CXXRecordDecl>, Matcher<ObjCInterfaceDecl>
 
Matcher<CXXRecordDecl>isDirectlyDerivedFromstd::string BaseName
Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
-
-Given
-  struct Base {};
-  struct DirectlyDerived : public Base {};
-  struct IndirectlyDerived : public DirectlyDerived {};
-
-
-The matcher cxxRecordDecl(isDirectlyDerivedFrom("Base"))
-matches DirectlyDerived, but not
-IndirectlyDerived.
 
@@ -5113,9 +3809,8 @@

Narrowing Matchers

Given template<typename T> void A(T t) { } template<> void A(int N) { } - -The matcher functionDecl(isExplicitTemplateSpecialization()) - matches the specialization template<> void A(int N) { }. +functionDecl(isExplicitTemplateSpecialization()) + matches the specialization A<int>(). Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> @@ -5124,7 +3819,7 @@

Narrowing Matchers

Matcher<CXXRecordDecl>isFinal
Matches if the given method or class declaration is final.
 
-Given
+Given:
   class A final {};
 
   struct B {
@@ -5134,46 +3829,24 @@ 

Narrowing Matchers

struct C : B { void f() final; }; - -The matcher cxxRecordDecl(isFinal()) -matches A, -but does not match B or C. -The matcher cxxMethodDecl(isFinal()) -matches void f() final in C , -but does not match virtual void f() in B . +matches A and C::f, but not B, C, or B::f
Matcher<CXXRecordDecl>isLambda
Matches the generated class of lambda expressions.
 
-Given
+Given:
   auto x = []{};
 
-
-The matcher varDecl(hasType(cxxRecordDecl(isLambda())))
-matches auto x = []{}.
+cxxRecordDecl(isLambda()) matches the implicit class declaration of
+decltype(x)
 
Matcher<CXXRecordDecl>isSameOrDerivedFromstd::string BaseName -
Similar to isDerivedFrom(), but also matches classes that directly
-match Base.
-Overloaded method as shortcut for
+
Overloaded method as shortcut for
 isSameOrDerivedFrom(hasName(...)).
-
-Given
-  class X {};
-  class Y : public X {};  // directly derived
-  class Z : public Y {};  // indirectly derived
-  typedef X A;
-  typedef A B;
-  class C : public B {};  // derived from a typedef of X
-
-The matcher
-cxxRecordDecl(isSameOrDerivedFrom("X"), isDefinition())
-matches class X {}, class Y : public X {},
-class Z : public Y {} and class C : public B {}.
 
@@ -5182,36 +3855,18 @@

Narrowing Matchers

member variable template instantiations. Given - template <typename T> class X {}; - class A {}; - X<A> x; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches class X<class A>. - template <typename T> class X {}; - class A {}; - template class X<A>; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches template class X<A> - template <typename T> class X {}; - class A {}; - extern template class X<A>; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches extern template class X<A> + template <typename T> class X {}; class A {}; X<A> x; +or + template <typename T> class X {}; class A {}; template class X<A>; +or + template <typename T> class X {}; class A {}; extern template class X<A>; +cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) + matches the template instantiation of X<A>. But given - template <typename T> class X {}; - class A {}; - template <> class X<A> {}; - X<A> x; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) + template <typename T> class X {}; class A {}; + template <> class X<A> {}; X<A> x; +cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) does not match, as X<A> is an explicit template specialization. Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> @@ -5222,26 +3877,9 @@

Narrowing Matchers

Matches operator expressions (binary or unary) that have any of the
 specified names.
 
-It provides a compact way of writing if an operator has any of the specified
-names:
-The matcher
    hasAnyOperatorName("+", "-")
-Is equivalent to
-   hasOperatorName("-"))}
-
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-void bar(bool a, bool b) {
-  a && b;
- }
-
-The matcher binaryOperator(hasAnyOperatorName("||", "&&"))
-matches a || b and a && b.
-The matcher unaryOperator(hasAnyOperatorName("-", "!"))
-matches !(a || b).
+ Is equivalent to
+   anyOf(hasOperatorName("+"), hasOperatorName("-"))
 
@@ -5249,62 +3887,43 @@

Narrowing Matchers

Matches the operator Name of operator expressions and fold expressions
 (binary or unary).
 
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-The matcher binaryOperator(hasOperatorName("||"))
-matches a || b
+Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
+  !(a || b)
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(hasOperatorName("+")))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
   }
-
-The matcher cxxFoldExpr(hasOperatorName("+"))
- matches (0 + ... + args).
 
Matcher<CXXRewrittenBinaryOperator>isAssignmentOperator
Matches all kinds of assignment operators.
 
-Given
-void foo(int a, int b) {
+Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
   if (a == b)
     a += b;
-}
-The matcher binaryOperator(isAssignmentOperator())
-matches a += b.
 
-Given
+Example 2: matches s1 = s2
+           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
   struct S { S& operator=(const S&); };
   void x() { S s1, s2; s1 = s2; }
-
-The matcher cxxOperatorCallExpr(isAssignmentOperator())
-matches s1 = s2.
 
Matcher<CXXRewrittenBinaryOperator>isComparisonOperator
Matches comparison operators.
 
-Given
-void foo(int a, int b) {
+Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
   if (a == b)
     a += b;
-}
-The matcher binaryOperator(isComparisonOperator())
-matches a == b
 
-Given
+Example 2: matches s1 < s2
+           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
   struct S { bool operator<(const S& other); };
   void x(S s1, S s2) { bool b1 = s1 < s2; }
-
-The matcher cxxOperatorCallExpr(isComparisonOperator())
-matches s1 < s2
 
@@ -5312,15 +3931,12 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has at least
 the specified number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) and g(0, 0, 0)
+(matcher = callExpr(argumentCountAtLeast(2)))
   void f(int x, int y);
   void g(int x, int y, int z);
-  void foo() {
-    f(0, 0);
-    g(0, 0, 0);
-  }
-The matcher callExpr(argumentCountAtLeast(2))
-matches f(0, 0) and g(0, 0, 0)
+  f(0, 0);
+  g(0, 0, 0);
 
@@ -5328,13 +3944,9 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has
 a specific number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   void f(int x, int y);
-  void foo() {
-    f(0, 0);
-  }
-The matcher callExpr(argumentCountIs(2))
-matches f(0, 0)
+  f(0, 0);
 
@@ -5342,15 +3954,12 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has at least
 the specified number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) and g(0, 0, 0)
+(matcher = callExpr(argumentCountAtLeast(2)))
   void f(int x, int y);
   void g(int x, int y, int z);
-  void foo() {
-    f(0, 0);
-    g(0, 0, 0);
-  }
-The matcher callExpr(argumentCountAtLeast(2))
-matches f(0, 0) and g(0, 0, 0)
+  f(0, 0);
+  g(0, 0, 0);
 
@@ -5358,20 +3967,16 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has
 a specific number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   void f(int x, int y);
-  void foo() {
-    f(0, 0);
-  }
-The matcher callExpr(argumentCountIs(2))
-matches f(0, 0)
+  f(0, 0);
 
Matcher<CallExpr>usesADL
Matches call expressions which were resolved using ADL.
 
-Given
+Example matches y(x) but not y(42) or NS::y(x).
   namespace NS {
     struct X {};
     void y(X);
@@ -5387,20 +3992,15 @@ 

Narrowing Matchers

using NS::y; y(x); // Found by both unqualified lookup and ADL, doesn't match } - - -The matcher callExpr(usesADL()) -matches y(x), but not y(42) or NS::y(x).
Matcher<CastExpr>hasCastKindCastKind Kind
Matches casts that has a given cast kind.
 
-Given
+Example: matches the implicit cast around 0
+(matcher = castExpr(hasCastKind(CK_NullToPointer)))
   int *p = 0;
-The matcher castExpr(hasCastKind(CK_NullToPointer))
-matches the implicit cast around 0
 
 If the matcher is use from clang-query, CastKind parameter
 should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
@@ -5415,27 +4015,22 @@ 

Narrowing Matchers

Matches literals that are equal to the given value of type ValueT.
 
 Given
-void f(char, bool, double, int);
-void foo() {
   f('false, 3.14, 42);
-}
-
-The matcher characterLiteral(equals(0U)) matches 'The matchers cxxBoolLiteral(equals(false)) and
-cxxBoolLiteral(equals(0)) match false.
-The matcher floatLiteral(equals(3.14)) matches 3.14.
-The matcher integerLiteral(equals(42)) matches 42.
+characterLiteral(equals(0))
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
+  match false
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
+  match 3.14
+integerLiteral(equals(42))
+  matches 42
 
 Note that you cannot directly match a negative numeric literal because the
 minus sign is not part of the literal: It is a unary operator whose operand
 is the positive numeric literal. Instead, you must use a unaryOperator()
 matcher to match the minus sign:
 
-Given
-  int val = -1;
-
-The matcher unaryOperator(hasOperatorName("-"),
-              hasUnaryOperand(integerLiteral(equals(1))))
-matches -1.
+unaryOperator(hasOperatorName("-"),
+              hasUnaryOperand(integerLiteral(equals(13))))
 
 Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>,
            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
@@ -5456,10 +4051,8 @@ 

Narrowing Matchers

Given template<typename T> struct C {}; C<int> c; - -The matcher classTemplateSpecializationDecl(templateArgumentCountIs(1)) -matches struct C<int>. + matches C<int>.
@@ -5468,11 +4061,9 @@

Narrowing Matchers

child statements. Example: Given -void foo() { { for (;;) {} } -} -The matcher compoundStmt(statementCountIs(0)) -{} +compoundStmt(statementCountIs(0))) + matches '{}' but does not match the outer compound statement.
@@ -5487,11 +4078,10 @@

Narrowing Matchers

char *s = "abcd"; wchar_t *ws = L"abcd"; char *w = "a"; - -The matcher constantArrayType(hasSize(42)) -matches int[42] twice. -The matcher stringLiteral(hasSize(4)) -matches "abcd" and L"abcd". +constantArrayType(hasSize(42)) + matches "int a[42]" and "int b[2 * 21]" +stringLiteral(hasSize(4)) + matches "abcd", L"abcd"
@@ -5499,15 +4089,12 @@

Narrowing Matchers

Matches declaration statements that contain a specific number of
 declarations.
 
-Given
-  void foo() {
-    int a, b;
-    int c;
-    int d = 2, e;
-  }
-The matcher declStmt(declCountIs(2))
-matches int a, b; and int d = 2, e;,
-but does not match int c;
+Example: Given
+  int a, b;
+  int c;
+  int d = 2, e;
+declCountIs(2)
+  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
 
@@ -5518,11 +4105,10 @@

Narrowing Matchers

Given class X { int a; int b; }; - -The matcher cxxRecordDecl( +cxxRecordDecl( has(fieldDecl(hasName("a"), hasType(type().bind("t")))), has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) - matches X, as a and b have the same type. + matches the class X, as a and b have the same type. Note that when multiple matches are involved via forEach* matchers, equalsBoundNodes acts as a filter. @@ -5546,13 +4132,10 @@

Narrowing Matchers

Matches declaration that has a given attribute.
 
 Given
-  __attribute__((device)) void f() {}
-
-The matcher decl(hasAttr(clang::attr::CUDADevice))
-matches f.
-If the matcher is used from clang-query, attr::Kind
-parameter should be passed as a quoted string. e.g.,
-hasAttr("attr::CUDADevice").
+  __attribute__((device)) void f() { ... }
+decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
+f. If the matcher is used from clang-query, attr::Kind parameter should be
+passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
 
@@ -5561,15 +4144,6 @@

Narrowing Matchers

Does not match if only part of the statement is expanded from that macro or if different parts of the statement are expanded from different appearances of the macro. - -Given - #define A 0 - #define B A - int c = B; - -The matcher integerLiteral(isExpandedFromMacro("A")) -matches the literal expanded at the initializer B of the variable -c . @@ -5577,25 +4151,12 @@

Narrowing Matchers

Matches AST nodes that were expanded within files whose name is
 partially matching a given regex.
 
-Given the headers Y.h
-  #pragma once
-  typedef int my_y_int;
-and X.h
-  #pragma once
-  typedef int my_x_int;
-and the source code
-  #include "X.h"
-  #include "Y.h"
-  typedef int my_main_file_int;
-  my_main_file_int a = 0;
-  my_x_int b = 1;
-  my_y_int c = 2;
-
-The matcher
-typedefDecl(isExpansionInFileMatching("Y.h"))
-matches typedef int my_y_int,
-but does not match typedef int my_main_file_int or
-typedef int my_x_int.
+Example matches Y but not X
+    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
+  #include "ASTMatcher.h"
+  class X {};
+ASTMatcher.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -5608,18 +4169,12 @@ 

Narrowing Matchers

Matcher<Decl>isExpansionInMainFile
Matches AST nodes that were expanded within the main-file.
 
-Given the header Y.h
-  #pragma once
-  typedef int my_header_int;
-and the source file
-  #include "Y.h"
-  typedef int my_main_file_int;
-  my_main_file_int a = 0;
-  my_header_int b = 1;
-
-The matcher typedefDecl(isExpansionInMainFile())
-matches typedef int my_main_file_int,
-but does not match typedef int my_header_int.
+Example matches X but not Y
+  (matcher = cxxRecordDecl(isExpansionInMainFile())
+  #include <Y.h>
+  class X {};
+Y.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -5628,17 +4183,12 @@

Narrowing Matchers

Matcher<Decl>isExpansionInSystemHeader
Matches AST nodes that were expanded within system-header-files.
 
-Given the header SystemHeader.h
-  #pragma once
-  int header();
-and the source code
+Example matches Y but not X
+    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   #include <SystemHeader.h>
-  static int main_file();
-
-
-The matcher functionDecl(isExpansionInSystemHeader())
-matches int header(),
-but does not match static int main_file().
+  class X {};
+SystemHeader.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -5647,20 +4197,6 @@

Narrowing Matchers

Matcher<Decl>isImplicit
Matches an entity that has been implicitly added by the compiler (e.g.
 implicit default/copy constructors).
-
-Given
-  struct S {};
-  void f(S obj) {
-    S copy = obj;
-    [&](){ return copy; };
-  }
-
-
-The matcher cxxConstructorDecl(isImplicit(), isCopyConstructor())
-matches the implicit copy constructor of S.
-The matcher lambdaExpr(forEachLambdaCapture(
-    lambdaCapture(isImplicit()))) matches [&](){ return copy; },
-because it implicitly captures copy .
 
@@ -5678,14 +4214,11 @@

Narrowing Matchers

namespace { class vector {}; // #2 namespace foo { - class vector {}; // #3 + class vector{}; // #3 } } - -The matcher cxxRecordDecl(hasName("vector"), - isInAnonymousNamespace()) -matches vector, -twice per declaration at #1, #2 and #3. +cxxRecordDecl(hasName("vector"), isInAnonymousNamespace()) will match +#1, #2 and #3.
@@ -5708,9 +4241,7 @@

Narrowing Matchers

} } } - -The matcher cxxRecordDecl(hasName("vector"), isInStdNamespace()) -matches class vector {} inside of namespace std. +cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1. @@ -5720,14 +4251,10 @@

Narrowing Matchers

Given template<typename T> void A(T t) { T i; } - void foo() { - A(0); - A(0U); - } - -The matcher functionDecl(isInstantiated()) -matches the two instantiations of void A(T t) { T i; } that -are generated for int , and for int}. + A(0); + A(0U); +functionDecl(isInstantiated()) + matches 'A(int) {...};' and 'A(unsigned) {...}'. @@ -5735,25 +4262,16 @@

Narrowing Matchers

Matches private C++ declarations and C++ base specifers that specify private
 inheritance.
 
-Given
+Examples:
   class C {
   public:    int a;
   protected: int b;
-  private:   int c;
+  private:   int c; // fieldDecl(isPrivate()) matches 'c'
   };
 
-The matcher fieldDecl(isPrivate())
-matches c.
-
   struct Base {};
-  struct Derived1 : private Base {}; // Base
-  class Derived2 : Base {}; // Base
-
-The matcher
-cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(isPrivate()).bind("base")))
-matches Derived1 and Derived2, with
-cxxBaseSpecifier(isPrivate()) matching
-Base.
+  struct Derived1 : private Base {}; // matches 'Base'
+  class Derived2 : Base {}; // matches 'Base'
 
@@ -5761,24 +4279,15 @@

Narrowing Matchers

Matches protected C++ declarations and C++ base specifers that specify
 protected inheritance.
 
-Given
+Examples:
   class C {
   public:    int a;
-  protected: int b;
+  protected: int b; // fieldDecl(isProtected()) matches 'b'
   private:   int c;
   };
 
-The matcher fieldDecl(isProtected())
-matches b.
-
   class Base {};
-  class Derived : protected Base {};
-
-The matcher
-cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(isProtected()).bind("base")))
-matches Derived, with
-cxxBaseSpecifier(isProtected()) matching
-Base.
+  class Derived : protected Base {}; // matches 'Base'
 
@@ -5786,26 +4295,16 @@

Narrowing Matchers

Matches public C++ declarations and C++ base specifers that specify public
 inheritance.
 
-Given
+Examples:
   class C {
-  public:    int a;
+  public:    int a; // fieldDecl(isPublic()) matches 'a'
   protected: int b;
   private:   int c;
   };
 
-The matcher fieldDecl(isPublic())
-matches a.
-
-Given
   class Base {};
-  class Derived1 : public Base {};
-  struct Derived2 : Base {};
-
-The matcher
-cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(isPublic()).bind("base")))
-matches Derived1 and Derived2,
-with cxxBaseSpecifier(isPublic()) matching
-public Base and Base.
+  class Derived1 : public Base {}; // matches 'Base'
+  struct Derived2 : Base {}; // matches 'Base'
 
@@ -5814,24 +4313,20 @@

Narrowing Matchers

a specific number of designators. Example: Given - struct point2 { double x; double y; }; - struct point2 ptarray[10] = { [0].x = 1.0 }; - struct point2 pt = { .x = 2.0 }; - -The matcher designatedInitExpr(designatorCountIs(2)) -matches [0].x = 1.0, but not .x = 2.0. + point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 }; + point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }; +designatorCountIs(2) + matches '{ [2].y = 1.0, [0].x = 1.0 }', + but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'. Matcher<EnumDecl>isScoped
Matches C++11 scoped enum declaration.
 
-Given
+Example matches Y (matcher = enumDecl(isScoped()))
 enum X {};
 enum class Y {};
-
-The matcher enumDecl(isScoped())
-matches enum class Y {}
 
@@ -5845,12 +4340,8 @@

Narrowing Matchers

sizeof is known (std::size_t) and therefore the size of the outer sizeof is known. template<typename T> - void f(T x, T y) { sizeof(T() + T()); } - -The matcher expr(isInstantiationDependent()) -matches sizeof(T() + T()), -(T() + T()), -T() + T() and T(). + void f(T x, T y) { sizeof(sizeof(T() + T()); } +expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T()) @@ -5864,9 +4355,7 @@

Narrowing Matchers

void add(T x, int y) { x + y; } - -The matcher expr(isTypeDependent()) -matches x + y and x. +expr(isTypeDependent()) matches x + y @@ -5877,9 +4366,7 @@

Narrowing Matchers

For example, the array bound of "Chars" in the following example is value-dependent. template<int Size> int f() { return Size; } - -The matcher expr(isValueDependent()) -matches the return value Size. +expr(isValueDependent()) matches return Size @@ -5887,22 +4374,16 @@

Narrowing Matchers

Matches expressions that resolve to a null pointer constant, such as
 GNU's __null, C++11's nullptr, or C's NULL macro.
 
-Given
-  #define NULL 0
+Given:
   void *v1 = NULL;
   void *v2 = nullptr;
   void *v3 = __null; // GNU extension
   char *cp = (char *)0;
   int *ip = 0;
   int i = 0;
-
-The matcher expr(nullPointerConstant())
-matches the initializer NULL of v1,
-matches the initializer nullptr of v2,
-matches the initializer __null of v3,
-matches the initializer 0 of cp and
-matches the initializer 0 of ip,
-but does not match the initializer i of i.
+expr(nullPointerConstant())
+  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
+  initializer for i.
 
@@ -5916,10 +4397,8 @@

Narrowing Matchers

int b : 4; int c : 2; }; - -The matcher fieldDecl(hasBitWidth(2)) -matches a and c, -but not b. +fieldDecl(hasBitWidth(2)) + matches 'int a;' and 'int c;' but not 'int b;'. @@ -5931,10 +4410,8 @@

Narrowing Matchers

int a : 2; int b; }; - -The matcher fieldDecl(isBitField()) -matches a, -but does not match b. +fieldDecl(isBitField()) + matches 'int a;' but not 'int b;'. @@ -5942,27 +4419,22 @@

Narrowing Matchers

Matches literals that are equal to the given value of type ValueT.
 
 Given
-void f(char, bool, double, int);
-void foo() {
   f('false, 3.14, 42);
-}
-
-The matcher characterLiteral(equals(0U)) matches 'The matchers cxxBoolLiteral(equals(false)) and
-cxxBoolLiteral(equals(0)) match false.
-The matcher floatLiteral(equals(3.14)) matches 3.14.
-The matcher integerLiteral(equals(42)) matches 42.
+characterLiteral(equals(0))
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
+  match false
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
+  match 3.14
+integerLiteral(equals(42))
+  matches 42
 
 Note that you cannot directly match a negative numeric literal because the
 minus sign is not part of the literal: It is a unary operator whose operand
 is the positive numeric literal. Instead, you must use a unaryOperator()
 matcher to match the minus sign:
 
-Given
-  int val = -1;
-
-The matcher unaryOperator(hasOperatorName("-"),
-              hasUnaryOperand(integerLiteral(equals(1))))
-matches -1.
+unaryOperator(hasOperatorName("-"),
+              hasUnaryOperand(integerLiteral(equals(13))))
 
 Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>,
            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
@@ -5980,30 +4452,6 @@ 

Narrowing Matchers

"operator" prefix: e.g. "<<". hasAnyOverloadedOperatorName("+", "-") - -Given - struct Point { double x; double y; }; - Point operator+(const Point&, const Point&); - Point operator-(const Point&, const Point&); - - Point sub(Point a, Point b) { - return b - a; - } - - -The matcher functionDecl(hasAnyOverloadedOperatorName("+", "-")), -which is equivalent to -functionDecl(anyOf(hasAnyOverloadedOperatorName("+"), -hasOverloadedOperatorName("-"))), -matches Point operator+(const Point&, const Point&) and -Point operator-(const Point&, const Point&). -The matcher -cxxOperatorCallExpr(hasAnyOverloadedOperatorName("+", "-")), -which is equivalent to -cxxOperatorCallExpr(anyOf(hasOverloadedOperatorName("+"), -hasOverloadedOperatorName("-"))), -matches b - a. - Is equivalent to anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
@@ -6012,32 +4460,17 @@

Narrowing Matchers

Matcher<FunctionDecl>hasDynamicExceptionSpec
Matches functions that have a dynamic exception specification.
 
-Given
-  void f(int);
-  void g(int) noexcept;
-  void h(int) noexcept(true);
-  void i(int) noexcept(false);
-  void j(int) throw();
-  void k(int) throw(int);
-  void l(int) throw(...);
-
-The matcher functionDecl(hasDynamicExceptionSpec())
-matches the declarations void j(int) throw(),
-void k(int) throw(int)
-and void l(int) throw(...),
-but does not match void f(int), void g(int) noexcept,
-void h(int) noexcept(true)
-or void i(int) noexcept(true).
-The matcher
-functionProtoType(hasDynamicExceptionSpec()) matches
-the type void (int) throw() of j ,
-the type void (int) throw(int) of k and
-the type void (int) throw(...) of l .
-It does not match
-the type void (int) noexcept of f ,
-the type void (int) noexcept of g ,
-the type void (int) noexcept(int) of h or
-the type void (int) noexcept(...) of i .
+Given:
+  void f();
+  void g() noexcept;
+  void h() noexcept(true);
+  void i() noexcept(false);
+  void j() throw();
+  void k() throw(int);
+  void l() throw(...);
+functionDecl(hasDynamicExceptionSpec()) and
+  functionProtoType(hasDynamicExceptionSpec())
+  match the declarations of j, k, and l, but not f, g, h, or i.
 
@@ -6047,19 +4480,16 @@

Narrowing Matchers

Matches overloaded operator names specified in strings without the "operator" prefix: e.g. "<<". -Given - struct A { int operator*(); }; +Given: + class A { int operator*(); }; const A &operator<<(const A &a, const A &b); - void f(A a) { - a << a; // <-- This matches - } - + A a; + a << a; // <-- This matches -The matcher cxxOperatorCallExpr(hasOverloadedOperatorName("<<")) -matches a << a. -The matcher +cxxOperatorCallExpr(hasOverloadedOperatorName("<<"))) matches the +specified line and cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*"))) -matches struct A { int operator*(); }. +matches the declaration of A. Usable as: Matcher<CXXOperatorCallExpr>, Matcher<FunctionDecl> @@ -6068,12 +4498,9 @@

Narrowing Matchers

Matcher<FunctionDecl>hasTrailingReturn
Matches a function declared with a trailing return type.
 
-Given
+Example matches Y (matcher = functionDecl(hasTrailingReturn()))
 int X() {}
 auto Y() -> int {}
-
-The matcher functionDecl(hasTrailingReturn())
-matches auto Y() -> int {}.
 
@@ -6081,18 +4508,15 @@

Narrowing Matchers

Matches consteval function declarations and if consteval/if ! consteval
 statements.
 
-Given
+Given:
   consteval int a();
   void b() { if consteval {} }
   void c() { if ! consteval {} }
   void d() { if ! consteval {} else {} }
-
-The matcher functionDecl(isConsteval())
-matches a.
-The matcher ifStmt(isConsteval())
-matches the if statements
-if consteval {}, if ! consteval {} and
-if ! consteval {} else {}.
+functionDecl(isConsteval())
+  matches the declaration of "int a()".
+ifStmt(isConsteval())
+  matches the if statement in "void b()", "void c()", "void d()".
 
@@ -6100,30 +4524,27 @@

Narrowing Matchers

Matches constexpr variable and function declarations,
        and if constexpr.
 
-Given
+Given:
   constexpr int foo = 42;
   constexpr int bar();
   void baz() { if constexpr(1 > 0) {} }
-
-The matcher varDecl(isConstexpr())
-matches foo.
-The matcher functionDecl(isConstexpr())
-matches bar.
-The matcher ifStmt(isConstexpr())
-matches if constexpr(1 > 0) {}.
+varDecl(isConstexpr())
+  matches the declaration of foo.
+functionDecl(isConstexpr())
+  matches the declaration of bar.
+ifStmt(isConstexpr())
+  matches the if statement in baz.
 
Matcher<FunctionDecl>isDefaulted
Matches defaulted function declarations.
 
-Given
+Given:
   class A { ~A(); };
   class B { ~B() = default; };
-
-The matcher functionDecl(isDefaulted())
-  matches ~B() = default,
-but does not match ~A().
+functionDecl(isDefaulted())
+  matches the declaration of ~B, but not ~A.
 
@@ -6137,14 +4558,6 @@

Narrowing Matchers

extern int vb; // Doesn't match, as it doesn't define the variable. void fa() {} void fb(); // Doesn't match, as it has no body. - -The matcher tagDecl(isDefinition()) -matches A -The matcher varDecl(isDefinition()) -matches va -The matcher functionDecl(isDefinition()) -matches fa - @interface X - (void)ma; // Doesn't match, interface is declaration. @end @@ -6152,9 +4565,6 @@

Narrowing Matchers

- (void)ma {} @end -The matcher objcMethodDecl(isDefinition()) -matches - (void)ma {} - Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>, Matcher<ObjCMethodDecl> @@ -6163,13 +4573,11 @@

Narrowing Matchers

Matcher<FunctionDecl>isDeleted
Matches deleted function declarations.
 
-Given
+Given:
   void Func();
   void DeletedFunc() = delete;
-
-The matcher functionDecl(isDeleted())
-matches DeletedFunc,
-but does not match Func.
+functionDecl(isDeleted())
+  matches the declaration of DeletedFunc, but not Func.
 
@@ -6180,9 +4588,8 @@

Narrowing Matchers

Given template<typename T> void A(T t) { } template<> void A(int N) { } - -The matcher functionDecl(isExplicitTemplateSpecialization()) - matches the specialization template<> void A(int N) { }. +functionDecl(isExplicitTemplateSpecialization()) + matches the specialization A<int>(). Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> @@ -6191,21 +4598,17 @@

Narrowing Matchers

Matcher<FunctionDecl>isExternC
Matches extern "C" function or variable declarations.
 
-Given
+Given:
   extern "C" void f() {}
   extern "C" { void g() {} }
   void h() {}
   extern "C" int x = 1;
   extern "C" int y = 2;
   int z = 3;
-
-The matcher functionDecl(isExternC())
-matches f
-and g.
-The matcher varDecl(isExternC())
-matches x
-and y,
-but does not match z.
+functionDecl(isExternC())
+  matches the declaration of f and g, but not the declaration of h.
+varDecl(isExternC())
+  matches the declaration of x and y, but not the declaration of z.
 
@@ -6220,22 +4623,15 @@

Narrowing Matchers

inline namespace m {} } inline int Foo = 5; - -The matcher functionDecl(isInline()) matches f. -The matcher namespaceDecl(isInline()) matches m. -The matcher varDecl(isInline()) matches Foo +functionDecl(isInline()) will match ::f(). +namespaceDecl(isInline()) will match n::m. +varDecl(isInline()) will match Foo; Matcher<FunctionDecl>isMain
Determines whether the function is "main", which is the entry point
 into an executable program.
-
-Given
-  void f();
-  int main() {}
-
-The matcher functionDecl(isMain()) matches int main() {}.
 
@@ -6247,38 +4643,23 @@

Narrowing Matchers

[[noreturn]] void a(); __attribute__((noreturn)) void b(); struct c { [[noreturn]] c(); }; - -The matcher functionDecl(isNoReturn()) -match a, b -and c -but do not match nope +functionDecl(isNoReturn()) + matches all of those except + void nope(); Matcher<FunctionDecl>isNoThrow
Matches functions that have a non-throwing exception specification.
 
-Given
-  void f(int);
-  void g(int) noexcept;
-  void h(int) noexcept(false);
-  void i(int) throw();
-  void j(int) throw(int);
-
-The matcher functionDecl(isNoThrow())
-matches the declaration void g(int) noexcept
-and void i(int) throw(),
-but does not match void f(int),
-void h(int) noexcept(false)
-or void j(int) throw(int).
-The matcher
-functionProtoType(isNoThrow())
-matches the type void (int) throw() of i
-and the type void (int) noexcept of g,
-but does not match
-the type void (int) of f ,
-the type void (int) noexcept(false) of h or
-the type void (int) throw(int) of j .
+Given:
+  void f();
+  void g() noexcept;
+  void h() throw();
+  void i() throw(int);
+  void j() noexcept(false);
+functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
+  match the declarations of g, and h, but not f, i or j.
 
@@ -6286,15 +4667,15 @@

Narrowing Matchers

Matches variable/function declarations that have "static" storage
 class specifier ("static" keyword) written in the source.
 
-Given
+Given:
   static void f() {}
   static int i = 0;
   extern int j;
   int k;
-The matcher functionDecl(isStaticStorageClass())
-  matches f
-The matcher varDecl(isStaticStorageClass())
-  matches i
+functionDecl(isStaticStorageClass())
+  matches the function declaration f.
+varDecl(isStaticStorageClass())
+  matches the variable declaration i.
 
@@ -6303,36 +4684,18 @@

Narrowing Matchers

member variable template instantiations. Given - template <typename T> class X {}; - class A {}; - X<A> x; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches class X<class A>. - template <typename T> class X {}; - class A {}; - template class X<A>; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches template class X<A> - template <typename T> class X {}; - class A {}; - extern template class X<A>; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches extern template class X<A> + template <typename T> class X {}; class A {}; X<A> x; +or + template <typename T> class X {}; class A {}; template class X<A>; +or + template <typename T> class X {}; class A {}; extern template class X<A>; +cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) + matches the template instantiation of X<A>. But given - template <typename T> class X {}; - class A {}; - template <> class X<A> {}; - X<A> x; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) + template <typename T> class X {}; class A {}; + template <> class X<A> {}; X<A> x; +cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) does not match, as X<A> is an explicit template specialization. Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> @@ -6348,25 +4711,17 @@

Narrowing Matchers

void g(int); template <typename... Ts> void h(Ts...); void i(); - -The matcher functionDecl(isVariadic()) -matches void f(...), -but does not match void g(int), -template <typename... Ts> void h(Ts...), -or void i(). Matcher<FunctionDecl>isWeak
Matches weak function declarations.
 
-Given
-  static void f();
-  void g() __attribute__((weak));
-The matcher functionDecl(isWeak())
-  matches the weak declaration
-void g() __attribute__((weak)),
-but does not match static void foo_v1().
+Given:
+  void foo() __attribute__((__weakref__("__foo")));
+  void bar();
+functionDecl(isWeak())
+  matches the weak declaration "foo", but not "bar".
 
@@ -6380,71 +4735,43 @@

Narrowing Matchers

void h(int i, int j); void j(int i); void k(int x, int y, int z, ...); -The matcher functionDecl(parameterCountIs(2)) -matches g and h -The matcher functionProtoType(parameterCountIs(1)) -matches the type void (int) of f and j. -The matcher functionProtoType(parameterCountIs(3)) matches the -type void (int, int, int, ...) of k. +functionDecl(parameterCountIs(2)) + matches g and h +functionProtoType(parameterCountIs(2)) + matches g and h +functionProtoType(parameterCountIs(3)) + matches k Matcher<FunctionProtoType>hasDynamicExceptionSpec
Matches functions that have a dynamic exception specification.
 
-Given
-  void f(int);
-  void g(int) noexcept;
-  void h(int) noexcept(true);
-  void i(int) noexcept(false);
-  void j(int) throw();
-  void k(int) throw(int);
-  void l(int) throw(...);
-
-The matcher functionDecl(hasDynamicExceptionSpec())
-matches the declarations void j(int) throw(),
-void k(int) throw(int)
-and void l(int) throw(...),
-but does not match void f(int), void g(int) noexcept,
-void h(int) noexcept(true)
-or void i(int) noexcept(true).
-The matcher
-functionProtoType(hasDynamicExceptionSpec()) matches
-the type void (int) throw() of j ,
-the type void (int) throw(int) of k and
-the type void (int) throw(...) of l .
-It does not match
-the type void (int) noexcept of f ,
-the type void (int) noexcept of g ,
-the type void (int) noexcept(int) of h or
-the type void (int) noexcept(...) of i .
+Given:
+  void f();
+  void g() noexcept;
+  void h() noexcept(true);
+  void i() noexcept(false);
+  void j() throw();
+  void k() throw(int);
+  void l() throw(...);
+functionDecl(hasDynamicExceptionSpec()) and
+  functionProtoType(hasDynamicExceptionSpec())
+  match the declarations of j, k, and l, but not f, g, h, or i.
 
Matcher<FunctionProtoType>isNoThrow
Matches functions that have a non-throwing exception specification.
 
-Given
-  void f(int);
-  void g(int) noexcept;
-  void h(int) noexcept(false);
-  void i(int) throw();
-  void j(int) throw(int);
-
-The matcher functionDecl(isNoThrow())
-matches the declaration void g(int) noexcept
-and void i(int) throw(),
-but does not match void f(int),
-void h(int) noexcept(false)
-or void j(int) throw(int).
-The matcher
-functionProtoType(isNoThrow())
-matches the type void (int) throw() of i
-and the type void (int) noexcept of g,
-but does not match
-the type void (int) of f ,
-the type void (int) noexcept(false) of h or
-the type void (int) throw(int) of j .
+Given:
+  void f();
+  void g() noexcept;
+  void h() throw();
+  void i() throw(int);
+  void j() noexcept(false);
+functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
+  match the declarations of g, and h, but not f, i or j.
 
@@ -6458,12 +4785,12 @@

Narrowing Matchers

void h(int i, int j); void j(int i); void k(int x, int y, int z, ...); -The matcher functionDecl(parameterCountIs(2)) -matches g and h -The matcher functionProtoType(parameterCountIs(1)) -matches the type void (int) of f and j. -The matcher functionProtoType(parameterCountIs(3)) matches the -type void (int, int, int, ...) of k. +functionDecl(parameterCountIs(2)) + matches g and h +functionProtoType(parameterCountIs(2)) + matches g and h +functionProtoType(parameterCountIs(3)) + matches k @@ -6471,18 +4798,15 @@

Narrowing Matchers

Matches consteval function declarations and if consteval/if ! consteval
 statements.
 
-Given
+Given:
   consteval int a();
   void b() { if consteval {} }
   void c() { if ! consteval {} }
   void d() { if ! consteval {} else {} }
-
-The matcher functionDecl(isConsteval())
-matches a.
-The matcher ifStmt(isConsteval())
-matches the if statements
-if consteval {}, if ! consteval {} and
-if ! consteval {} else {}.
+functionDecl(isConsteval())
+  matches the declaration of "int a()".
+ifStmt(isConsteval())
+  matches the if statement in "void b()", "void c()", "void d()".
 
@@ -6490,17 +4814,16 @@

Narrowing Matchers

Matches constexpr variable and function declarations,
        and if constexpr.
 
-Given
+Given:
   constexpr int foo = 42;
   constexpr int bar();
   void baz() { if constexpr(1 > 0) {} }
-
-The matcher varDecl(isConstexpr())
-matches foo.
-The matcher functionDecl(isConstexpr())
-matches bar.
-The matcher ifStmt(isConstexpr())
-matches if constexpr(1 > 0) {}.
+varDecl(isConstexpr())
+  matches the declaration of foo.
+functionDecl(isConstexpr())
+  matches the declaration of bar.
+ifStmt(isConstexpr())
+  matches the if statement in baz.
 
@@ -6512,27 +4835,22 @@

Narrowing Matchers

Matches literals that are equal to the given value of type ValueT.
 
 Given
-void f(char, bool, double, int);
-void foo() {
   f('false, 3.14, 42);
-}
-
-The matcher characterLiteral(equals(0U)) matches 'The matchers cxxBoolLiteral(equals(false)) and
-cxxBoolLiteral(equals(0)) match false.
-The matcher floatLiteral(equals(3.14)) matches 3.14.
-The matcher integerLiteral(equals(42)) matches 42.
+characterLiteral(equals(0))
+  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
+  match false
+floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
+  match 3.14
+integerLiteral(equals(42))
+  matches 42
 
 Note that you cannot directly match a negative numeric literal because the
 minus sign is not part of the literal: It is a unary operator whose operand
 is the positive numeric literal. Instead, you must use a unaryOperator()
 matcher to match the minus sign:
 
-Given
-  int val = -1;
-
-The matcher unaryOperator(hasOperatorName("-"),
-              hasUnaryOperand(integerLiteral(equals(1))))
-matches -1.
+unaryOperator(hasOperatorName("-"),
+              hasUnaryOperand(integerLiteral(equals(13))))
 
 Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>,
            Matcher<FloatingLiteral>, Matcher<IntegerLiteral>
@@ -6558,30 +4876,14 @@ 

Narrowing Matchers

return l(); } }; - -The matcher lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis()))) -matches [this]() { return cc; }. + matches `[this]() { return cc; }`.
Matcher<LambdaCapture>isImplicit
Matches an entity that has been implicitly added by the compiler (e.g.
 implicit default/copy constructors).
-
-Given
-  struct S {};
-  void f(S obj) {
-    S copy = obj;
-    [&](){ return copy; };
-  }
-
-
-The matcher cxxConstructorDecl(isImplicit(), isCopyConstructor())
-matches the implicit copy constructor of S.
-The matcher lambdaExpr(forEachLambdaCapture(
-    lambdaCapture(isImplicit()))) matches [&](){ return copy; },
-because it implicitly captures copy .
 
@@ -6600,25 +4902,14 @@

Narrowing Matchers

}; template <class T> class Z { - void x() { - this->m; - this->t; - this->t->m; - } - int m; - T* t; + void x() { this->m; } }; - -The matcher memberExpr(isArrow()) -matches this->x, x, a, -this->b, this->m and two times this->t, -once for the standalone member expression, and once for the member -expression that later accesses m . -Additionally, it does not match this->t->t. -The matcher cxxDependentScopeMemberExpr(isArrow()) -matches this->t->m, but not this->m or this->t. -The matcher unresolvedMemberExpr(isArrow()) -matches this->f<T>, f<T> +memberExpr(isArrow()) + matches this->x, x, y.x, a, this->b +cxxDependentScopeMemberExpr(isArrow()) + matches this->m +unresolvedMemberExpr(isArrow()) + matches this->f<T>, f<T> @@ -6626,43 +4917,29 @@

Narrowing Matchers

Matches NamedDecl nodes that have any of the specified names.
 
 This matcher is only provided as a performance optimization of hasName.
-
-Given
-  void f(int a, int b);
-
-The matcher namedDecl(hasAnyName("a", "b")),
-which is equivalent to the matcher
-namedDecl(hasAnyName("a", "b")),
-matches int a and int b, but not
-void f(int a, int b).
+    hasAnyName(a, b, c)
+ is equivalent to, but faster than
+    anyOf(hasName(a), hasName(b), hasName(c))
 
Matcher<NamedDecl>hasExternalFormalLinkage
Matches a declaration that has external formal linkage.
 
-Given
+Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
 void f() {
-  int a;
-  static int b;
+  int x;
+  static int y;
 }
-int c;
-static int d;
-The matcher varDecl(hasExternalFormalLinkage())
-matches int c,
-but not int a, static int b or int d.
-
-Given
-  namespace {
-    void f() {}
-  }
-  void g() {}
-  static void h() {}
+int z;
 
+Example matches f() because it has external formal linkage despite being
+unique to the translation unit as though it has internal likage
+(matcher = functionDecl(hasExternalFormalLinkage()))
 
-The matcher functionDecl(hasExternalFormalLinkage())
-matches void g() {}, but not void f() {} or
-static void h() {}.
+namespace {
+void f() {}
+}
 
@@ -6673,22 +4950,11 @@

Narrowing Matchers

with '<enclosing>::'. Does not match typedefs of an underlying type with the given name. -Given +Example matches X (Name == "X") class X; - -The matcher namedDecl(hasName("X")) -matches class X. - -Given +Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X") namespace a { namespace b { class X; } } - - -The matchers namedDecl(hasName("::a::b::X")), -namedDecl(hasName("a::b::X")), -namedDecl(hasName("b::X")) and -namedDecl(hasName("X")) -match class X. @@ -6700,12 +4966,11 @@

Narrowing Matchers

prefixing the name with '<enclosing>::'. Does not match typedefs of an underlying type with the given name. -Given - namespace foo { namespace bar { class X; } } - +Example matches X (regexp == "::X") + class X; -The matcher namedDecl(matchesName("^::foo:.*X")) -matches class X. +Example matches X (regexp is one of "::X", "^foo::.*X", among others) + namespace foo { namespace bar { class X; } } If the matcher is used in clang-query, RegexFlags parameter should be passed as a quoted string. e.g: "NoFlags". @@ -6720,9 +4985,7 @@

Narrowing Matchers

namespace n { namespace {} // #1 } - -The matcher namespaceDecl(isAnonymous()) -matches namespace {}, but not namespace n. +namespaceDecl(isAnonymous()) will match #1 but not ::n. @@ -6737,10 +5000,9 @@

Narrowing Matchers

inline namespace m {} } inline int Foo = 5; - -The matcher functionDecl(isInline()) matches f. -The matcher namespaceDecl(isInline()) matches m. -The matcher varDecl(isInline()) matches Foo +functionDecl(isInline()) will match ::f(). +namespaceDecl(isInline()) will match n::m. +varDecl(isInline()) will match Foo; @@ -6749,23 +5011,15 @@

Narrowing Matchers

specified. Given - void foo() { - #pragma omp parallel - ; - #pragma omp parallel default(none) - ; - #pragma omp parallel default(shared) - ; - #pragma omp parallel default(private) - ; - #pragma omp parallel default(firstprivate) - ; - } + #pragma omp parallel + #pragma omp parallel default(none) + #pragma omp parallel default(shared) + #pragma omp parallel default(private) + #pragma omp parallel default(firstprivate) -The matcher -ompExecutableDirective(hasAnyClause(ompDefaultClause(isFirstPrivateKind()))) -matches #pragma omp parallel default(firstprivate). +``ompDefaultClause(isFirstPrivateKind())`` matches only +``default(firstprivate)``. @@ -6773,23 +5027,14 @@

Narrowing Matchers

Matches if the OpenMP ``default`` clause has ``none`` kind specified.
 
 Given
-  void foo() {
-    #pragma omp parallel
-      ;
-    #pragma omp parallel default(none)
-      ;
-    #pragma omp parallel default(shared)
-      ;
-    #pragma omp parallel default(private)
-      ;
-    #pragma omp parallel default(firstprivate)
-      ;
-  }
 
+  #pragma omp parallel
+  #pragma omp parallel default(none)
+  #pragma omp parallel default(shared)
+  #pragma omp parallel default(private)
+  #pragma omp parallel default(firstprivate)
 
-The matcher
-ompExecutableDirective(hasAnyClause(ompDefaultClause(isNoneKind())))
-matches only #pragma omp parallel default(none).
+``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
 
@@ -6798,23 +5043,15 @@

Narrowing Matchers

specified. Given - void foo() { - #pragma omp parallel - ; + + #pragma omp parallel #pragma omp parallel default(none) - ; #pragma omp parallel default(shared) - ; #pragma omp parallel default(private) - ; #pragma omp parallel default(firstprivate) - ; - } - -The matcher -ompExecutableDirective(hasAnyClause(ompDefaultClause(isPrivateKind()))) -matches #pragma omp parallel default(private). +``ompDefaultClause(isPrivateKind())`` matches only +``default(private)``. @@ -6822,23 +5059,14 @@

Narrowing Matchers

Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
 
 Given
-  void foo() {
-    #pragma omp parallel
-      ;
-    #pragma omp parallel default(none)
-      ;
+
+  #pragma omp parallel
+  #pragma omp parallel default(none)
   #pragma omp parallel default(shared)
-      ;
   #pragma omp parallel default(private)
-      ;
   #pragma omp parallel default(firstprivate)
-      ;
-  }
 
-
-The matcher
-ompExecutableDirective(hasAnyClause(ompDefaultClause(isSharedKind())))
-matches #pragma omp parallel default(shared).
+``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
 
@@ -6847,21 +5075,13 @@

Narrowing Matchers

clause kind. Given - void foo() { - #pragma omp parallel - ; - #pragma omp parallel for - for (int i = 0; i < 10; ++i) {} - #pragma omp for - for (int i = 0; i < 10; ++i) {} - } + #pragma omp parallel + #pragma omp parallel for + #pragma omp for -The matcher -ompExecutableDirective(isAllowedToContainClauseKind( -OpenMPClauseKind::OMPC_default)) -matches #pragma omp parallel -and #pragma omp parallel for. +`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches +``omp parallel`` and ``omp parallel for``. If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter should be passed as a quoted string. e.g., @@ -6874,89 +5094,29 @@

Narrowing Matchers

i.e., directives that can't have a structured block. Given - void foo() { - #pragma omp parallel - { - #pragma omp taskyield - } - } + #pragma omp parallel + {} + #pragma omp taskyield -The matcher ompExecutableDirective(isStandaloneDirective()) -matches #pragma omp taskyield. +``ompExecutableDirective(isStandaloneDirective()))`` matches +``omp taskyield``. Matcher<ObjCInterfaceDecl>isDerivedFromstd::string BaseName
Overloaded method as shortcut for isDerivedFrom(hasName(...)).
-
-Matches C++ classes that are directly or indirectly derived from a class
-matching Base, or Objective-C classes that directly or indirectly
-subclass a class matching Base.
-
-Note that a class is not considered to be derived from itself.
-
-Example matches Y, Z, C (Base == hasName("X"))
-  class X {};
-  class Y : public X {};  // directly derived
-  class Z : public Y {};  // indirectly derived
-  typedef X A;
-  typedef A B;
-  class C : public B {};  // derived from a typedef of X
-
-  class Foo {};
-  typedef Foo Alias;
-  class Bar : public Alias {};  // derived from Alias, which is a
-                                // typedef of Foo
-
-
-The matcher cxxRecordDecl(isDerivedFrom("X"))
-matches Y, Z and C.
-The matcher cxxRecordDecl(isDerivedFrom("Foo"))
-matches Bar.
-
-In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
-  @interface NSObject @end
-  @interface Bar : NSObject @end
-
-
-Usable as: Matcher<CXXRecordDecl>, Matcher<ObjCInterfaceDecl>
 
Matcher<ObjCInterfaceDecl>isDirectlyDerivedFromstd::string BaseName
Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
-
-Given
-  struct Base {};
-  struct DirectlyDerived : public Base {};
-  struct IndirectlyDerived : public DirectlyDerived {};
-
-
-The matcher cxxRecordDecl(isDirectlyDerivedFrom("Base"))
-matches DirectlyDerived, but not
-IndirectlyDerived.
 
Matcher<ObjCInterfaceDecl>isSameOrDerivedFromstd::string BaseName -
Similar to isDerivedFrom(), but also matches classes that directly
-match Base.
-Overloaded method as shortcut for
+
Overloaded method as shortcut for
 isSameOrDerivedFrom(hasName(...)).
-
-Given
-  class X {};
-  class Y : public X {};  // directly derived
-  class Z : public Y {};  // indirectly derived
-  typedef X A;
-  typedef A B;
-  class C : public B {};  // derived from a typedef of X
-
-The matcher
-cxxRecordDecl(isSameOrDerivedFrom("X"), isDefinition())
-matches class X {}, class Y : public X {},
-class Z : public Y {} and class C : public B {}.
 
@@ -6964,15 +5124,12 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has at least
 the specified number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) and g(0, 0, 0)
+(matcher = callExpr(argumentCountAtLeast(2)))
   void f(int x, int y);
   void g(int x, int y, int z);
-  void foo() {
-    f(0, 0);
-    g(0, 0, 0);
-  }
-The matcher callExpr(argumentCountAtLeast(2))
-matches f(0, 0) and g(0, 0, 0)
+  f(0, 0);
+  g(0, 0, 0);
 
@@ -6980,13 +5137,9 @@

Narrowing Matchers

Checks that a call expression or a constructor call expression has
 a specific number of arguments (including absent default arguments).
 
-Given
+Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
   void f(int x, int y);
-  void foo() {
-    f(0, 0);
-  }
-The matcher callExpr(argumentCountIs(2))
-matches f(0, 0)
+  f(0, 0);
 
@@ -6994,27 +5147,24 @@

Narrowing Matchers

Matches when at least one of the supplied string equals to the
 Selector.getAsString()
 
+ matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
+ matches both of the expressions below:
     [myObj methodA:argA];
     [myObj methodB:argB];
-
- The matcher objCMessageExpr(hasSelector("methodA:", "methodB:"));
- matches [myObj methodA:argA]; and [myObj methodB:argB];
 
Matcher<ObjCMessageExpr>hasKeywordSelector
Matches when the selector is a keyword selector
 
-Given
+objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
+message expression in
+
   UIWebView *webView = ...;
   CGRect bodyFrame = webView.frame;
   bodyFrame.size.height = self.bodyContentHeight;
   webView.frame = bodyFrame;
   //     ^---- matches here
-
-
-The matcher objCMessageExpr(hasKeywordSelector()) matches the
-generated setFrame message expression in
 
@@ -7029,68 +5179,56 @@

Narrowing Matchers

Matcher<ObjCMessageExpr>hasSelectorstd::string BaseName
Matches when BaseName == Selector.getAsString()
 
+ matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
+ matches the outer message expr in the code below, but NOT the message
+ invocation for self.bodyView.
     [self.bodyView loadHTMLString:html baseURL:NULL];
-
-The matcher
-objCMessageExpr(hasSelector("loadHTMLString:baseURL:")); matches
-the outer message expr in the code below, but NOT the message invocation
-for self.bodyView.
 
Matcher<ObjCMessageExpr>hasUnarySelector
Matches when the selector is a Unary Selector
 
-Given
-    [self.bodyView loadHTMLString:html baseURL:NULL];
-
-
- The matcher objCMessageExpr(matchesSelector(hasUnarySelector());
- matches self.bodyView, but does not match the outer message
+ matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
+ matches self.bodyView in the code below, but NOT the outer message
  invocation of "loadHTMLString:baseURL:".
+    [self.bodyView loadHTMLString:html baseURL:NULL];
 
Matcher<ObjCMessageExpr>isClassMessage
Returns true when the Objective-C message is sent to a class.
 
-Given
+Example
+matcher = objcMessageExpr(isClassMessage())
+matches
   [NSString stringWithFormat:@"format"];
+but not
   NSString *x = @"hello";
   [x containsString:@"h"];
-
-The matcher objcMessageExpr(isClassMessage())
-matches [NSString stringWithFormat:@"format"];
-but does not match [[x containsString:@"h"]
 
Matcher<ObjCMessageExpr>isInstanceMessage
Returns true when the Objective-C message is sent to an instance.
 
-Given
+Example
+matcher = objcMessageExpr(isInstanceMessage())
+matches
   NSString *x = @"hello";
   [x containsString:@"h"];
+but not
   [NSString stringWithFormat:@"format"];
-
-The matcher objcMessageExpr(isInstanceMessage())
-matches [x containsString:@"h"];
-but does not match [NSString stringWithFormat:@"format"];
 
Matcher<ObjCMessageExpr>matchesSelectorStringRef RegExp, Regex::RegexFlags Flags = NoFlags
Matches ObjC selectors whose name contains
 a substring matched by the given RegExp.
-
-Given
+ matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
+ invocation for self.bodyView.
     [self.bodyView loadHTMLString:html baseURL:NULL];
 
-
-The matcher
-objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
-invocation for self.bodyView.
-
 If the matcher is used in clang-query, RegexFlags parameter
 should be passed as a quoted string. e.g: "NoFlags".
 Flags can be combined with '|' example "IgnoreCase | BasicRegex"
@@ -7100,26 +5238,25 @@ 

Narrowing Matchers

Matcher<ObjCMessageExpr>numSelectorArgsunsigned N
Matches when the selector has the specified number of arguments
 
-    [self.bodyView loadHTMLString:html baseURL:NULL];
+ matcher = objCMessageExpr(numSelectorArgs(0));
+ matches self.bodyView in the code below
 
-The matcher objCMessageExpr(numSelectorArgs(0))
-matches self.bodyView.
-The matcher objCMessageExpr(numSelectorArgs(2))
-matches the invocation of loadHTMLString:baseURL:
-but does not match self.bodyView
+ matcher = objCMessageExpr(numSelectorArgs(2));
+ matches the invocation of "loadHTMLString:baseURL:" but not that
+ of self.bodyView
+    [self.bodyView loadHTMLString:html baseURL:NULL];
 
Matcher<ObjCMethodDecl>isClassMethod
Returns true when the Objective-C method declaration is a class method.
 
-Given
+Example
+matcher = objcMethodDecl(isClassMethod())
+matches
 @interface I + (void)foo; @end
+but not
 @interface I - (void)bar; @end
-
-The matcher objcMethodDecl(isClassMethod())
-matches @interface I + (void)foo; @end
-but does not match interface I + (void)foo; @end
 
@@ -7133,14 +5270,6 @@

Narrowing Matchers

extern int vb; // Doesn't match, as it doesn't define the variable. void fa() {} void fb(); // Doesn't match, as it has no body. - -The matcher tagDecl(isDefinition()) -matches A -The matcher varDecl(isDefinition()) -matches va -The matcher functionDecl(isDefinition()) -matches fa - @interface X - (void)ma; // Doesn't match, interface is declaration. @end @@ -7148,9 +5277,6 @@

Narrowing Matchers

- (void)ma {} @end -The matcher objcMethodDecl(isDefinition()) -matches - (void)ma {} - Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>, Matcher<ObjCMethodDecl>
@@ -7159,39 +5285,33 @@

Narrowing Matchers

Matcher<ObjCMethodDecl>isInstanceMethod
Returns true when the Objective-C method declaration is an instance method.
 
-Given
+Example
+matcher = objcMethodDecl(isInstanceMethod())
+matches
 @interface I - (void)bar; @end
+but not
 @interface I + (void)foo; @end
-
-The matcher objcMethodDecl(isInstanceMethod())
-matches @interface I - (void)bar; @end
-but does not match @interface I - (void)foo; @end
-
 
Matcher<ParmVarDecl>hasDefaultArgument
Matches a declaration that has default arguments.
 
-Given
-  void x(int val) {}
-  void y(int val = 0) {}
-
-
-The matcher parmVarDecl(hasDefaultArgument())
-matches int val = 0.
+Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
+void x(int val) {}
+void y(int val = 0) {}
 
 Deprecated. Use hasInitializer() instead to be able to
 match on the contents of the default argument.  For example:
 
-Given
-  void x(int val = 7) {}
-  void y(int val = 42) {}
-
+void x(int val = 7) {}
+void y(int val = 42) {}
+parmVarDecl(hasInitializer(integerLiteral(equals(42))))
+  matches the parameter of y
 
-The matcher
-parmVarDecl(hasInitializer(integerLiteral(equals(42)))),
-matches int val = 42.
+A matcher such as
+  parmVarDecl(hasInitializer(anything()))
+is equivalent to parmVarDecl(hasDefaultArgument()).
 
@@ -7206,9 +5326,9 @@

Narrowing Matchers

void f(int a, int b, int c) { } -The matcher parmVarDecl(isAtPosition(0)) matches -a. The matcher parmVarDecl(isAtPosition(1)) -matches b. +``parmVarDecl(isAtPosition(0))`` matches ``int a``. + +``parmVarDecl(isAtPosition(1))`` matches ``int b``.
@@ -7218,9 +5338,8 @@

Narrowing Matchers

Given class Y { public: void x(); }; void z() { Y* y; y->x(); } - -The matcher cxxMemberCallExpr(on(hasType(asString("Y *")))) -matches y->x() +cxxMemberCallExpr(on(hasType(asString("class Y *")))) + matches y->x() @@ -7231,11 +5350,10 @@

Narrowing Matchers

Given class X { int a; int b; }; - -The matcher cxxRecordDecl( +cxxRecordDecl( has(fieldDecl(hasName("a"), hasType(type().bind("t")))), has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) - matches X, as a and b have the same type. + matches the class X, as a and b have the same type. Note that when multiple matches are involved via forEach* matchers, equalsBoundNodes acts as a filter. @@ -7254,15 +5372,12 @@

Narrowing Matchers

Given typedef const int const_int; - const_int i = 0; - int *const j = nullptr; + const_int i; + int *const j; int *volatile k; int m; - - -The matcher varDecl(hasType(hasLocalQualifiers())) matches only -j and k. is -const-qualified but the qualifier is not local. +varDecl(hasType(hasLocalQualifiers())) matches only j and k. +i is const-qualified but the qualifier is not local. @@ -7273,11 +5388,9 @@

Narrowing Matchers

void a(char); void b(wchar_t); void c(double); - - -The matcher functionDecl(hasAnyParameter(hasType(isAnyCharacter()))) -a, b, but not +matches "a(char)", "b(wchar_t)", but not "c(double)". + Matcher<QualType>isAnyPointer @@ -7293,9 +5406,8 @@

Narrowing Matchers

Foo *f; int j; - -The matcher varDecl(hasType(isAnyPointer())) -int *i and Foo *f, but not int j. +varDecl(hasType(isAnyPointer())) + matches "int *i" and "Foo *f", but not "int j". @@ -7309,11 +5421,9 @@

Narrowing Matchers

void c(const int); void d(const int*); void e(int const) {}; -The matcher functionDecl(hasAnyParameter(hasType(isConstQualified()))) - matches b, c and - e. - It does not match as there + matches "void b(int const)", "void c(const int)" and + "void e(int const) {}". It does not match d as there is no top-level const on the parameter type "const int *". @@ -7325,8 +5435,8 @@

Narrowing Matchers

void a(int); void b(long); void c(double); -The matcher functionDecl(hasAnyParameter(hasType(isInteger()))) -a, b, but not c. +functionDecl(hasAnyParameter(hasType(isInteger()))) +matches "a(int)", "b(long)", but not "c(double)". @@ -7337,9 +5447,8 @@

Narrowing Matchers

void a(int); void b(unsigned long); void c(double); -The matcher -functionDecl(hasAnyParameter(hasType(isSignedInteger()))) matches -a, but not and not +functionDecl(hasAnyParameter(hasType(isSignedInteger()))) +matches "a(int)", but not "b(unsigned long)" and "c(double)". @@ -7350,10 +5459,8 @@

Narrowing Matchers

void a(int); void b(unsigned long); void c(double); -The matcher functionDecl(hasAnyParameter(hasType(isUnsignedInteger()))) -matches b, -but does not match a and c. +matches "b(unsigned long)", but not "a(int)" and "c(double)". @@ -7367,11 +5474,9 @@

Narrowing Matchers

void c(volatile int); void d(volatile int*); void e(int volatile) {}; -The matcher functionDecl(hasAnyParameter(hasType(isVolatileQualified()))) - matches b, c and - e. - It does not match as there + matches "void b(int volatile)", "void c(volatile int)" and + "void e(int volatile) {}". It does not match d as there is no top-level volatile on the parameter type "volatile int *". @@ -7383,11 +5488,10 @@

Narrowing Matchers

Given class X { int a; int b; }; - -The matcher cxxRecordDecl( +cxxRecordDecl( has(fieldDecl(hasName("a"), hasType(type().bind("t")))), has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) - matches X, as a and b have the same type. + matches the class X, as a and b have the same type. Note that when multiple matches are involved via forEach* matchers, equalsBoundNodes acts as a filter. @@ -7412,15 +5516,6 @@

Narrowing Matchers

Does not match if only part of the statement is expanded from that macro or if different parts of the statement are expanded from different appearances of the macro. - -Given - #define A 0 - #define B A - int c = B; - -The matcher integerLiteral(isExpandedFromMacro("A")) -matches the literal expanded at the initializer B of the variable -c . @@ -7428,25 +5523,12 @@

Narrowing Matchers

Matches AST nodes that were expanded within files whose name is
 partially matching a given regex.
 
-Given the headers Y.h
-  #pragma once
-  typedef int my_y_int;
-and X.h
-  #pragma once
-  typedef int my_x_int;
-and the source code
-  #include "X.h"
-  #include "Y.h"
-  typedef int my_main_file_int;
-  my_main_file_int a = 0;
-  my_x_int b = 1;
-  my_y_int c = 2;
-
-The matcher
-typedefDecl(isExpansionInFileMatching("Y.h"))
-matches typedef int my_y_int,
-but does not match typedef int my_main_file_int or
-typedef int my_x_int.
+Example matches Y but not X
+    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
+  #include "ASTMatcher.h"
+  class X {};
+ASTMatcher.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -7459,18 +5541,12 @@ 

Narrowing Matchers

Matcher<Stmt>isExpansionInMainFile
Matches AST nodes that were expanded within the main-file.
 
-Given the header Y.h
-  #pragma once
-  typedef int my_header_int;
-and the source file
-  #include "Y.h"
-  typedef int my_main_file_int;
-  my_main_file_int a = 0;
-  my_header_int b = 1;
-
-The matcher typedefDecl(isExpansionInMainFile())
-matches typedef int my_main_file_int,
-but does not match typedef int my_header_int.
+Example matches X but not Y
+  (matcher = cxxRecordDecl(isExpansionInMainFile())
+  #include <Y.h>
+  class X {};
+Y.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -7479,17 +5555,12 @@

Narrowing Matchers

Matcher<Stmt>isExpansionInSystemHeader
Matches AST nodes that were expanded within system-header-files.
 
-Given the header SystemHeader.h
-  #pragma once
-  int header();
-and the source code
+Example matches Y but not X
+    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   #include <SystemHeader.h>
-  static int main_file();
-
-
-The matcher functionDecl(isExpansionInSystemHeader())
-matches int header(),
-but does not match static int main_file().
+  class X {};
+SystemHeader.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -7500,18 +5571,14 @@

Narrowing Matchers

Given int j; - template<typename T> void A(T t) { T i; } - void foo() { - A(0); - A(0U); - } - -The matcher declStmt(isInTemplateInstantiation()) -matches T i; twice, once for int and once for -int}. -The matcher declStmt(unless(isInTemplateInstantiation())) will -match T i; once inside the template definition, but not for any of -the instantiated bodies. + template<typename T> void A(T t) { T i; j += 42;} + A(0); + A(0U); +declStmt(isInTemplateInstantiation()) + matches 'int i;' and 'unsigned i'. +unless(stmt(isInTemplateInstantiation())) + will NOT match j += 42; as it's shared between the template definition and + instantiation.
@@ -7525,28 +5592,21 @@

Narrowing Matchers

char *s = "abcd"; wchar_t *ws = L"abcd"; char *w = "a"; - -The matcher constantArrayType(hasSize(42)) -matches int[42] twice. -The matcher stringLiteral(hasSize(4)) -matches "abcd" and L"abcd". +constantArrayType(hasSize(42)) + matches "int a[42]" and "int b[2 * 21]" +stringLiteral(hasSize(4)) + matches "abcd", L"abcd" Matcher<TagDecl>isClass
Matches TagDecl object that are spelled with "class."
 
-Given
+Example matches C, but not S, U or E.
   struct S {};
   class C {};
   union U {};
-  enum E { Ok };
-
-The matcher tagDecl(isClass())
-matches class C,
-but does not match struct S,
-union U
-or enum E.
+  enum E {};
 
@@ -7560,14 +5620,6 @@

Narrowing Matchers

extern int vb; // Doesn't match, as it doesn't define the variable. void fa() {} void fb(); // Doesn't match, as it has no body. - -The matcher tagDecl(isDefinition()) -matches A -The matcher varDecl(isDefinition()) -matches va -The matcher functionDecl(isDefinition()) -matches fa - @interface X - (void)ma; // Doesn't match, interface is declaration. @end @@ -7575,9 +5627,6 @@

Narrowing Matchers

- (void)ma {} @end -The matcher objcMethodDecl(isDefinition()) -matches - (void)ma {} - Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>, Matcher<ObjCMethodDecl> @@ -7586,16 +5635,11 @@

Narrowing Matchers

Matcher<TagDecl>isEnum
Matches TagDecl object that are spelled with "enum."
 
-Given
+Example matches E, but not C, S or U.
   struct S {};
   class C {};
   union U {};
-  enum E { Ok };
-
-The matcher tagDecl(isEnum())
-matches enum E { Ok },
-but does not match struct S {},
-class C {} or union U {}.
+  enum E {};
 
@@ -7606,30 +5650,18 @@

Narrowing Matchers

struct S {}; class C {}; union U {}; - enum E { Ok }; - -The matcher tagDecl(isStruct()) -matches struct S, -but does not match class C, -union U -or enum E. + enum E {}; Matcher<TagDecl>isUnion
Matches TagDecl object that are spelled with "union."
 
-Given
+Example matches U, but not C, S or E.
   struct S {};
   class C {};
   union U {};
-  enum E { Ok };
-
-The matcher tagDecl(isUnion())
-matches union U,
-does not match struct S,
-class C
-or enum E.
+  enum E {};
 
@@ -7643,12 +5675,9 @@

Narrowing Matchers

Given template<int T> struct C {}; C<42> c; - -The matcher classTemplateSpecializationDecl( +classTemplateSpecializationDecl( hasAnyTemplateArgument(equalsIntegralValue("42"))) -matches the implicitly declared specialization -struct C<42> from the instantiation for the type of the -variable c . + matches the implicit instantiation of C in C<42>. @@ -7658,12 +5687,10 @@

Narrowing Matchers

Given template<int T> struct C {}; C<42> c; - -The matcher classTemplateSpecializationDecl( +classTemplateSpecializationDecl( hasAnyTemplateArgument(isIntegral())) -matches the implicitly declared specialization -struct C<42> from the instantiation for the type of the -variable c . + matches the implicit instantiation of C in C<42> + with isIntegral() matching 42. @@ -7673,10 +5700,8 @@

Narrowing Matchers

Given template<typename T> struct C {}; C<int> c; - -The matcher classTemplateSpecializationDecl(templateArgumentCountIs(1)) -matches struct C<int>. + matches C<int>. @@ -7685,15 +5710,6 @@

Narrowing Matchers

Does not match if only part of the statement is expanded from that macro or if different parts of the statement are expanded from different appearances of the macro. - -Given - #define A 0 - #define B A - int c = B; - -The matcher integerLiteral(isExpandedFromMacro("A")) -matches the literal expanded at the initializer B of the variable -c . @@ -7701,25 +5717,12 @@

Narrowing Matchers

Matches AST nodes that were expanded within files whose name is
 partially matching a given regex.
 
-Given the headers Y.h
-  #pragma once
-  typedef int my_y_int;
-and X.h
-  #pragma once
-  typedef int my_x_int;
-and the source code
-  #include "X.h"
-  #include "Y.h"
-  typedef int my_main_file_int;
-  my_main_file_int a = 0;
-  my_x_int b = 1;
-  my_y_int c = 2;
-
-The matcher
-typedefDecl(isExpansionInFileMatching("Y.h"))
-matches typedef int my_y_int,
-but does not match typedef int my_main_file_int or
-typedef int my_x_int.
+Example matches Y but not X
+    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
+  #include "ASTMatcher.h"
+  class X {};
+ASTMatcher.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -7732,18 +5735,12 @@ 

Narrowing Matchers

Matcher<TypeLoc>isExpansionInMainFile
Matches AST nodes that were expanded within the main-file.
 
-Given the header Y.h
-  #pragma once
-  typedef int my_header_int;
-and the source file
-  #include "Y.h"
-  typedef int my_main_file_int;
-  my_main_file_int a = 0;
-  my_header_int b = 1;
-
-The matcher typedefDecl(isExpansionInMainFile())
-matches typedef int my_main_file_int,
-but does not match typedef int my_header_int.
+Example matches X but not Y
+  (matcher = cxxRecordDecl(isExpansionInMainFile())
+  #include <Y.h>
+  class X {};
+Y.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -7752,17 +5749,12 @@

Narrowing Matchers

Matcher<TypeLoc>isExpansionInSystemHeader
Matches AST nodes that were expanded within system-header-files.
 
-Given the header SystemHeader.h
-  #pragma once
-  int header();
-and the source code
+Example matches Y but not X
+    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
   #include <SystemHeader.h>
-  static int main_file();
-
-
-The matcher functionDecl(isExpansionInSystemHeader())
-matches int header(),
-but does not match static int main_file().
+  class X {};
+SystemHeader.h:
+  class Y {};
 
 Usable as: Matcher<Decl>, Matcher<Stmt>, Matcher<TypeLoc>
 
@@ -7773,9 +5765,8 @@

Narrowing Matchers

Given struct S { bool func(); }; - -The matcher functionDecl(returns(booleanType())) -func +functionDecl(returns(booleanType())) + matches "bool func();"
@@ -7786,11 +5777,10 @@

Narrowing Matchers

Given class X { int a; int b; }; - -The matcher cxxRecordDecl( +cxxRecordDecl( has(fieldDecl(hasName("a"), hasType(type().bind("t")))), has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t")))))) - matches X, as a and b have the same type. + matches the class X, as a and b have the same type. Note that when multiple matches are involved via forEach* matchers, equalsBoundNodes acts as a filter. @@ -7816,9 +5806,8 @@

Narrowing Matchers

Given int i; float f; -The matcher type(realFloatingPointType()) -matches float -but does not match int. +realFloatingPointType() + matches "float f" but not "int i" @@ -7827,10 +5816,8 @@

Narrowing Matchers

Given struct S { void func(); }; - - -The matcher functionDecl(returns(voidType())) -func +functionDecl(returns(voidType())) + matches "void func();" @@ -7839,10 +5826,9 @@

Narrowing Matchers

Given int x; - int s = sizeof(x) + alignof(x); - -The matcher unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) -matches sizeof(x) + int s = sizeof(x) + alignof(x) +unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf)) + matches sizeof(x) If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter should be passed as a quoted string. e.g., ofKind("UETT_SizeOf"). @@ -7853,26 +5839,9 @@

Narrowing Matchers

Matches operator expressions (binary or unary) that have any of the
 specified names.
 
-It provides a compact way of writing if an operator has any of the specified
-names:
-The matcher
    hasAnyOperatorName("+", "-")
-Is equivalent to
-   hasOperatorName("-"))}
-
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-void bar(bool a, bool b) {
-  a && b;
- }
-
-The matcher binaryOperator(hasAnyOperatorName("||", "&&"))
-matches a || b and a && b.
-The matcher unaryOperator(hasAnyOperatorName("-", "!"))
-matches !(a || b).
+ Is equivalent to
+   anyOf(hasOperatorName("+"), hasOperatorName("-"))
 
@@ -7880,22 +5849,15 @@

Narrowing Matchers

Matches the operator Name of operator expressions and fold expressions
 (binary or unary).
 
-Given
-void foo(bool a, bool b) {
-  !(a || b);
- }
-
-The matcher binaryOperator(hasOperatorName("||"))
-matches a || b
+Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
+  !(a || b)
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(hasOperatorName("+")))
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
   }
-
-The matcher cxxFoldExpr(hasOperatorName("+"))
- matches (0 + ... + args).
 
@@ -7914,57 +5876,40 @@

Narrowing Matchers

}; template <class T> class Z { - void x() { - this->m; - this->t; - this->t->m; - } - int m; - T* t; + void x() { this->m; } }; - -The matcher memberExpr(isArrow()) -matches this->x, x, a, -this->b, this->m and two times this->t, -once for the standalone member expression, and once for the member -expression that later accesses m . -Additionally, it does not match this->t->t. -The matcher cxxDependentScopeMemberExpr(isArrow()) -matches this->t->m, but not this->m or this->t. -The matcher unresolvedMemberExpr(isArrow()) -matches this->f<T>, f<T> +memberExpr(isArrow()) + matches this->x, x, y.x, a, this->b +cxxDependentScopeMemberExpr(isArrow()) + matches this->m +unresolvedMemberExpr(isArrow()) + matches this->f<T>, f<T> Matcher<VarDecl>hasAutomaticStorageDuration
Matches a variable declaration that has automatic storage duration.
 
-Given
+Example matches x, but not y, z, or a.
+(matcher = varDecl(hasAutomaticStorageDuration())
 void f() {
   int x;
   static int y;
   thread_local int z;
 }
 int a;
-
-The matcher varDecl(hasAutomaticStorageDuration())
-matches x
-but does not match y, z or
-a
 
Matcher<VarDecl>hasGlobalStorage
Matches a variable declaration that does not have local storage.
 
-Given
+Example matches y and z (matcher = varDecl(hasGlobalStorage())
 void f() {
   int x;
   static int y;
 }
 int z;
-The matcher varDecl(hasGlobalStorage())
-matches y and z
 
@@ -7972,14 +5917,12 @@

Narrowing Matchers

Matches a variable declaration that has function scope and is a
 non-static local variable.
 
-Given
+Example matches x (matcher = varDecl(hasLocalStorage())
 void f() {
   int x;
   static int y;
 }
 int z;
-The matcher varDecl(hasLocalStorage())
-matches x
 
@@ -7996,28 +5939,22 @@

Narrowing Matchers

int a; static int b; extern int c; - -The matcher varDecl(hasStaticStorageDuration()) -matches y, a, b and -c +varDecl(hasStaticStorageDuration()) + matches the function declaration y, a, b and c. Matcher<VarDecl>hasThreadStorageDuration
Matches a variable declaration that has thread storage duration.
 
-Given
+Example matches z, but not x, z, or a.
+(matcher = varDecl(hasThreadStorageDuration())
 void f() {
   int x;
   static int y;
   thread_local int z;
 }
 int a;
-
-The matcher varDecl(hasThreadStorageDuration())
-matches z
-but does not match x, z or
-a
 
@@ -8025,34 +5962,29 @@

Narrowing Matchers

Matches constexpr variable and function declarations,
        and if constexpr.
 
-Given
+Given:
   constexpr int foo = 42;
   constexpr int bar();
   void baz() { if constexpr(1 > 0) {} }
-
-The matcher varDecl(isConstexpr())
-matches foo.
-The matcher functionDecl(isConstexpr())
-matches bar.
-The matcher ifStmt(isConstexpr())
-matches if constexpr(1 > 0) {}.
+varDecl(isConstexpr())
+  matches the declaration of foo.
+functionDecl(isConstexpr())
+  matches the declaration of bar.
+ifStmt(isConstexpr())
+  matches the if statement in baz.
 
Matcher<VarDecl>isConstinit
Matches constinit variable declarations.
 
-Given
+Given:
   constinit int foo = 42;
   constinit const char* bar = "bar";
   int baz = 42;
   [[clang::require_constant_initialization]] int xyz = 42;
-
-The matcher varDecl(isConstinit())
-matches the declaration of foo
-and bar,
-but does not match baz or
-xyz.
+varDecl(isConstinit())
+  matches the declaration of `foo` and `bar`, but not `baz` and `xyz`.
 
@@ -8066,14 +5998,6 @@

Narrowing Matchers

extern int vb; // Doesn't match, as it doesn't define the variable. void fa() {} void fb(); // Doesn't match, as it has no body. - -The matcher tagDecl(isDefinition()) -matches A -The matcher varDecl(isDefinition()) -matches va -The matcher functionDecl(isDefinition()) -matches fa - @interface X - (void)ma; // Doesn't match, interface is declaration. @end @@ -8081,9 +6005,6 @@

Narrowing Matchers

- (void)ma {} @end -The matcher objcMethodDecl(isDefinition()) -matches - (void)ma {} - Usable as: Matcher<TagDecl>, Matcher<VarDecl>, Matcher<FunctionDecl>, Matcher<ObjCMethodDecl> @@ -8093,15 +6014,12 @@

Narrowing Matchers

Matches a variable declaration that is an exception variable from
 a C++ catch block, or an Objective-C statement.
 
-Given
+Example matches x (matcher = varDecl(isExceptionVariable())
 void f(int y) {
   try {
   } catch (int x) {
   }
 }
-
-The matcher varDecl(isExceptionVariable())
-matches x
 
@@ -8112,9 +6030,8 @@

Narrowing Matchers

Given template<typename T> void A(T t) { } template<> void A(int N) { } - -The matcher functionDecl(isExplicitTemplateSpecialization()) - matches the specialization template<> void A(int N) { }. +functionDecl(isExplicitTemplateSpecialization()) + matches the specialization A<int>(). Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> @@ -8123,21 +6040,17 @@

Narrowing Matchers

Matcher<VarDecl>isExternC
Matches extern "C" function or variable declarations.
 
-Given
+Given:
   extern "C" void f() {}
   extern "C" { void g() {} }
   void h() {}
   extern "C" int x = 1;
   extern "C" int y = 2;
   int z = 3;
-
-The matcher functionDecl(isExternC())
-matches f
-and g.
-The matcher varDecl(isExternC())
-matches x
-and y,
-but does not match z.
+functionDecl(isExternC())
+  matches the declaration of f and g, but not the declaration of h.
+varDecl(isExternC())
+  matches the declaration of x and y, but not the declaration of z.
 
@@ -8145,11 +6058,8 @@

Narrowing Matchers

Matches a variable serving as the implicit variable for a lambda init-
 capture.
 
-Given
-auto f = [x = 3]() { return x; };
-
-The matcher varDecl(isInitCapture())
-matches x = 3.
+Example matches x (matcher = varDecl(isInitCapture()))
+auto f = [x=3]() { return x; };
 
@@ -8164,24 +6074,21 @@

Narrowing Matchers

inline namespace m {} } inline int Foo = 5; - -The matcher functionDecl(isInline()) matches f. -The matcher namespaceDecl(isInline()) matches m. -The matcher varDecl(isInline()) matches Foo +functionDecl(isInline()) will match ::f(). +namespaceDecl(isInline()) will match n::m. +varDecl(isInline()) will match Foo; Matcher<VarDecl>isStaticLocal
Matches a static variable with local scope.
 
-Given
+Example matches y (matcher = varDecl(isStaticLocal()))
 void f() {
   int x;
   static int y;
 }
 static int z;
-The matcher varDecl(isStaticLocal())
-matches y
 
@@ -8189,15 +6096,15 @@

Narrowing Matchers

Matches variable/function declarations that have "static" storage
 class specifier ("static" keyword) written in the source.
 
-Given
+Given:
   static void f() {}
   static int i = 0;
   extern int j;
   int k;
-The matcher functionDecl(isStaticStorageClass())
-  matches f
-The matcher varDecl(isStaticStorageClass())
-  matches i
+functionDecl(isStaticStorageClass())
+  matches the function declaration f.
+varDecl(isStaticStorageClass())
+  matches the variable declaration i.
 
@@ -8206,36 +6113,18 @@

Narrowing Matchers

member variable template instantiations. Given - template <typename T> class X {}; - class A {}; - X<A> x; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches class X<class A>. - template <typename T> class X {}; - class A {}; - template class X<A>; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches template class X<A> - template <typename T> class X {}; - class A {}; - extern template class X<A>; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) -matches extern template class X<A> + template <typename T> class X {}; class A {}; X<A> x; +or + template <typename T> class X {}; class A {}; template class X<A>; +or + template <typename T> class X {}; class A {}; extern template class X<A>; +cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) + matches the template instantiation of X<A>. But given - template <typename T> class X {}; - class A {}; - template <> class X<A> {}; - X<A> x; - -The matcher cxxRecordDecl(hasName("::X"), -isTemplateInstantiation()) + template <typename T> class X {}; class A {}; + template <> class X<A> {}; X<A> x; +cxxRecordDecl(hasName("::X"), isTemplateInstantiation()) does not match, as X<A> is an explicit template specialization. Usable as: Matcher<FunctionDecl>, Matcher<VarDecl>, Matcher<CXXRecordDecl> @@ -8262,9 +6151,10 @@

AST Traversal Matchers

Matcher<*>binaryOperationMatcher<*>...Matcher<*>
Matches nodes which can be used with binary operators.
 
-A comparison of two expressions might be represented in the clang AST as a
-binaryOperator, a cxxOperatorCallExpr or a
-cxxRewrittenBinaryOperator, depending on
+The code
+  var1 != var2;
+might be represented in the clang AST as a binaryOperator, a
+cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
 
 * whether the types of var1 and var2 are fundamental (binaryOperator) or at
   least one is a class type (cxxOperatorCallExpr)
@@ -8278,6 +6168,12 @@ 

AST Traversal Matchers

compatible. Given + binaryOperation( + hasOperatorName("!="), + hasLHS(expr().bind("lhs")), + hasRHS(expr().bind("rhs")) + ) +matches each use of "!=" in: struct S{ bool operator!=(const S&) const; }; @@ -8291,28 +6187,25 @@

AST Traversal Matchers

template<typename T> void templ() { - 3 != 4; + 1 != 2; T() != S(); } struct HasOpEq { - friend bool - operator==(const HasOpEq &, const HasOpEq&) noexcept = default; + bool operator==(const HasOpEq &) const; }; void inverse() { - HasOpEq e1; - HasOpEq e2; - if (e1 != e2) + HasOpEq s1; + HasOpEq s2; + if (s1 != s2) return; } struct HasSpaceship { - friend bool - operator<=>(const HasSpaceship &, - const HasSpaceship&) noexcept = default; + bool operator<=>(const HasOpEq &) const; }; void use_spaceship() @@ -8322,15 +6215,6 @@

AST Traversal Matchers

if (s1 != s2) return; } - - -The matcher binaryOperation( - hasOperatorName("!="), - hasLHS(expr().bind("lhs")), - hasRHS(expr().bind("rhs")) - ) -matches 1 != 2, S() != S(), 3 != 4, -T() != S(), e1 != e2 and s1 != s2.
@@ -8340,18 +6224,14 @@

AST Traversal Matchers

Unlike anyOf, eachOf will generate a match result for each matching submatcher. -Given - void f(int a, int b); - - -The matcher functionDecl(hasAnyParameter( -eachOf(parmVarDecl(hasName("a")).bind("v"), - parmVarDecl(hasName("b")).bind("v")))) -matches void f(int a, int b), -with parmVarDecl(hasName("a")) matching a -for one match, -and with parmVarDecl(hasName("b")) matching -b for the other match. +For example, in: + class A { int a; int b; }; +The matcher: + cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")), + has(fieldDecl(hasName("b")).bind("v")))) +will generate two results binding "v", the first of which binds +the field declaration of a, the second the field declaration of +b. Usable as: Any Matcher @@ -8364,14 +6244,10 @@

AST Traversal Matchers

For example, in: class A { class B {}; class C {}; }; - -The matcher -cxxRecordDecl(hasName("::A"), +The matcher: + cxxRecordDecl(hasName("::A"), findAll(cxxRecordDecl(isDefinition()).bind("m"))) -matches A three times, -with cxxRecordDecl(isDefinition()).bind("m") -matching A, -B and C. +will generate results for A, B and C. Usable as: Any Matcher @@ -8381,71 +6257,24 @@

AST Traversal Matchers

Matches AST nodes that have descendant AST nodes that match the
 provided matcher.
 
-Given
+Example matches X, A, A::X, B, B::C, B::C::X
+  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
   class X {};
   class A { class X {}; };  // Matches A, because A::X is a class of name
                             // X inside A.
   class B { class C { class X {}; }; };
 
-The matcher
-cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X"))))
-matches X, A,
-B, class B::C
-and class B::C::X
-
 DescendantT must be an AST base type.
 
 As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
 each result that matches instead of only on the first one.
 
 Note: Recursively combined ForEachDescendant can cause many matches:
-  struct A {
-    struct B {
-      struct C {};
-      struct D {};
-    };
-  };
-
-
-The matcher cxxRecordDecl(forEachDescendant(cxxRecordDecl(
-    forEachDescendant(cxxRecordDecl().bind("inner"))
-  ).bind("middle")))
-will match 9 times:
-It matches the definition of A with the definition of
-B in the middle and the injected class name of
-B as the innermost cxxRecordDecl.
-
-It matches the definition of A with the definition of
-C in the middle and the definition of
-B as the innermost cxxRecordDecl.
-
-It matches the definition of A with the definition of
-C in the middle and the injected class name of
-B as the innermost cxxRecordDecl.
-
-It matches the definition of A with the definition of
-B in the middle and the definition of
-D as the innermost cxxRecordDecl.
-
-It matches the definition of A with the definition of
-B in the middle and the injected class name of
-D as the innermost cxxRecordDecl.
-
-It matches the definition of A with the definition of
-C in the middle and the injected class name of
-C as the innermost cxxRecordDecl.
-
-It matches the definition of A with the definition of
-D in the middle and the injected class name of
-D as the innermost cxxRecordDecl.
-
-It matches the definition of B with the definition of
-C in the middle and the injected class name of
-C as the innermost cxxRecordDecl.
-
-It matches the definition of B with the definition of
-D in the middle and the injected class name of
-D as the innermost cxxRecordDecl.
+  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
+    forEachDescendant(cxxRecordDecl())
+  )))
+will match 10 times (plus injected class name matches) on:
+  class A { class B { class C { class D { class E {}; }; }; }; };
 
 Usable as: Any Matcher
 
@@ -8455,22 +6284,17 @@

AST Traversal Matchers

Matches AST nodes that have child AST nodes that match the
 provided matcher.
 
-Given
+Example matches X, Y, Y::X, Z::Y, Z::Y::X
+  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
   class X {};
   class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
                             // inside Y.
   class Z { class Y { class X {}; }; };  // Does not match Z.
 
-The matcher cxxRecordDecl(forEach(cxxRecordDecl(hasName("X"))))
-matches class X,
-class Y,
-class Y::X,
-class Z::Y::X and class Z::Y
-
 ChildT must be an AST base type.
 
 As opposed to 'has', 'forEach' will cause a match for each result that
-  matches instead of only on the first one.
+matches instead of only on the first one.
 
 Usable as: Any Matcher
 
@@ -8483,10 +6307,7 @@

AST Traversal Matchers

Given void f() { if (true) { int x = 42; } } void g() { for (;;) { int x = 43; } } - -The matcher expr(integerLiteral(hasAncestor(ifStmt()))) -matches 42 -but does not match 43 +expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43. Usable as: Any Matcher @@ -8496,16 +6317,12 @@

AST Traversal Matchers

Matches AST nodes that have descendant AST nodes that match the
 provided matcher.
 
-Given
+Example matches X, Y, Z
+    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
   class X {};  // Matches X, because X::X is a class of name X inside X.
   class Y { class X {}; };
   class Z { class Y { class X {}; }; };
 
-The matcher
-cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X"))))
-matches class X {}, class Y { class X {}; }
-and class Z { class Y { class X {}; }; }.
-
 DescendantT must be an AST base type.
 
 Usable as: Any Matcher
@@ -8516,29 +6333,19 @@ 

AST Traversal Matchers

Matches AST nodes that have child AST nodes that match the
 provided matcher.
 
-Given
+Example matches X, Y
+  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
   class X {};  // Matches X, because X::X is a class of name X inside X.
   class Y { class X {}; };
   class Z { class Y { class X {}; }; };  // Does not match Z.
 
-The matcher cxxRecordDecl(has(cxxRecordDecl(hasName("X"))))
-matches class X {} three times,
-and class Y { class X {}; } two times.
-
 ChildT must be an AST base type.
 
 Usable as: Any Matcher
 Note that has is direct matcher, so it also matches things like implicit
 casts and paren casts. If you are matching with expr then you should
-probably consider using ignoringParenImpCasts:
-
-Given
-  int x =0;
-  double y = static_cast<double>(x);
-
-The matcher
-cxxStaticCastExpr(has(ignoringParenImpCasts(declRefExpr()))).
-matches static_cast<double>(x)
+probably consider using ignoringParenImpCasts like:
+has(ignoringParenImpCasts(expr())).
 
@@ -8548,9 +6355,7 @@

AST Traversal Matchers

Given void f() { for (;;) { int x = 42; if (true) { int x = 43; } } } - -The matcher compoundStmt(hasParent(ifStmt())) -matches { int x = 43; } +compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }". Usable as: Any Matcher
@@ -8564,7 +6369,7 @@

AST Traversal Matchers

which should match both are typically duplicated. This matcher removes the need for duplication. -Given +Given code struct ConstructorTakesInt { ConstructorTakesInt(int i) {} @@ -8584,11 +6389,9 @@

AST Traversal Matchers

ConstructorTakesInt cti(42); } - The matcher -expr(invocation(hasArgument(0, integerLiteral(equals(42))))) -matches the expressions callTakesInt(42) -and cti(42). +invocation(hasArgument(0, integerLiteral(equals(42)))) +matches the expression in both doCall and doConstruct @@ -8599,12 +6402,18 @@

AST Traversal Matchers

Useful when additional information which may or may not present about a main matching node is desired. -Given - int a = 0; - int b; - -The matcher varDecl(optionally(hasInitializer(expr()))) -matches int a = 0 and int b. +For example, in: + class Foo { + int bar; + } +The matcher: + cxxRecordDecl( + optionally(has( + fieldDecl(hasName("bar")).bind("var") + ))).bind("record") +will produce a result binding for both "record" and "var". +The matcher will produce a "record" binding for even if there is no data +member named "bar" in that class. Usable as: Any Matcher @@ -8619,10 +6428,10 @@

AST Traversal Matchers

int i = 3.0; } The matcher -traverse(TK_IgnoreUnlessSpelledInSource, + traverse(TK_IgnoreUnlessSpelledInSource, varDecl(hasInitializer(floatLiteral().bind("init"))) ) - matches int i = 3.0 with "init" bound to 3.0. +matches the variable declaration with "init" bound to the "3.0". @@ -8630,13 +6439,8 @@

AST Traversal Matchers

Matches the condition expression of an if statement, for loop,
 switch statement or conditional operator.
 
-Given
-void foo() {
+Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   if (true) {}
-}
-
-The matcher ifStmt(hasCondition(cxxBoolLiteral(equals(true))))
-if (true) {}
 
@@ -8645,19 +6449,8 @@

AST Traversal Matchers

(binary or ternary). Example matches b - void foo(bool condition, int a, int b) { - condition ? a : b; - condition ?: b; - } - -The matcher -conditionalOperator(hasFalseExpression(expr().bind("false"))) -matches condition ? a : b, -with expr() matching b. -The matcher -binaryConditionalOperator(hasFalseExpression(expr().bind("false"))) -matches condition ?: b, -with expr() matching b. + condition ? a : b + condition ?: b @@ -8665,31 +6458,16 @@

AST Traversal Matchers

Matches the true branch expression of a conditional operator.
 
 Example 1 (conditional ternary operator): matches a
-Given
-  void foo(bool condition, int a, int b) {
-    condition ? a : b;
-  }
-
-The matcher
-conditionalOperator(hasTrueExpression(expr().bind("true")))
-matches condition ? a : b,
-with expr() matching a.
+  condition ? a : b
 
 Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
-Given
-  void foo(bool condition, int a, int b) {
-    condition ?: b;
-  }
-
-The matcher binaryConditionalOperator(hasTrueExpression(expr()))
-matches condition ?: b,
-with expr() matching conditoin.
+  condition ?: b
 
Matcher<AddrLabelExpr>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -8699,25 +6477,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -8735,7 +6505,7 @@

AST Traversal Matchers

Given int i[5]; void f() { i[1] = 42; } -The matcher arraySubscriptExpr(hasBase(implicitCastExpr( +arraySubscriptExpression(hasBase(implicitCastExpr( hasSourceExpression(declRefExpr())))) matches i[1] with the declRefExpr() matching i
@@ -8747,7 +6517,7 @@

AST Traversal Matchers

Given int i[5]; void f() { i[1] = 42; } -The matcher arraySubscriptExpr(hasIndex(integerLiteral())) +arraySubscriptExpression(hasIndex(integerLiteral())) matches i[1] with the integerLiteral() matching 1 @@ -8755,30 +6525,16 @@

AST Traversal Matchers

Matcher<ArraySubscriptExpr>hasLHSMatcher<Expr> InnerMatcher
Matches the left hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasLHS(expr().bind("lhs")))
-matches a || b,
-with expr()
-matching a.
+Example matches a (matcher = binaryOperator(hasLHS()))
+  a || b
 
Matcher<ArraySubscriptExpr>hasRHSMatcher<Expr> InnerMatcher
Matches the right hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasRHS(expr().bind("rhs")))
-matches a || b,
-with expr()
-matching b.
+Example matches b (matcher = binaryOperator(hasRHS()))
+  a || b
 
@@ -8790,10 +6546,8 @@

AST Traversal Matchers

struct A {}; A a[7]; int b[7]; - - -The matcher arrayType(hasElementType(builtinType())) -int[7] +arrayType(hasElementType(builtinType())) + matches "int b[7]" Usable as: Matcher<ArrayType>, Matcher<ComplexType> @@ -8805,8 +6559,8 @@

AST Traversal Matchers

Given _Atomic(int) i; _Atomic(float) f; -The matcher atomicType(hasValueType(isInteger())) -_Atomic(int). +atomicType(hasValueType(isInteger())) + matches "_Atomic(int) i" Usable as: Matcher<AtomicType> @@ -8821,10 +6575,8 @@

AST Traversal Matchers

Given auto a = 1; auto b = 2.0; - -The matcher -varDecl(hasType(autoType(hasDeducedType(isInteger())))) -matches auto a = 1, but does not match auto b = 2.0. +autoType(hasDeducedType(isInteger())) + matches "auto a" Usable as: Matcher<AutoType> @@ -8836,54 +6588,21 @@

AST Traversal Matchers

Given namespace X { void b(); } using X::b; - -The matcher usingDecl(hasAnyUsingShadowDecl(hasName("b"))) - matches using X::b - +usingDecl(hasAnyUsingShadowDecl(hasName("b")))) + matches using X::b Matcher<BinaryOperator>hasEitherOperandMatcher<Expr> InnerMatcher
Matches if either the left hand side or the right hand side of a
 binary operator or fold expression matches.
-
-Given
-  struct S {};
-  bool operator ==(const S&, const S&);
-
-  void f(int a, const S&lhs, const S&rhs) {
-      a + 0;
-      lhs == rhs;
-      lhs != rhs;
-  }
-
-  template <typename ...Ts>
-  auto sum(Ts... args) {
-    return (0 + ... + args);
-  }
-
-
-The matcher binaryOperator(hasEitherOperand(integerLiteral()))
-matches a + 0.
-The matcher cxxOperatorCallExpr(hasEitherOperand(declRefExpr(to(
-parmVarDecl(hasName("lhs")))))) matches lhs == rhs and
-lhs != rhs.
-The matcher cxxFoldExpr(hasEitherOperand(integerLiteral()))
-matches (0 + ... + args).
 
Matcher<BinaryOperator>hasLHSMatcher<Expr> InnerMatcher
Matches the left hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasLHS(expr().bind("lhs")))
-matches a || b,
-with expr()
-matching a.
+Example matches a (matcher = binaryOperator(hasLHS()))
+  a || b
 
@@ -8891,40 +6610,27 @@

AST Traversal Matchers

Matches if both matchers match with opposite sides of the binary operator
 or fold expression.
 
-Given
-void foo() {
-  1 + 2; // Match
-  2 + 1; // Match
-  1 + 1; // No match
-  2 + 2; // No match
-}
-The matcher binaryOperator(hasOperands(integerLiteral(equals(1)),
-                                            integerLiteral(equals(2))))
-matches 1 + 2 and 2 + 1,
-but does not match 1 + 1
-or 2 + 2.
+Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
+                                             integerLiteral(equals(2)))
+  1 + 2 // Match
+  2 + 1 // Match
+  1 + 1 // No match
+  2 + 2 // No match
 
-Matcher<BinaryOperator>hasRHSMatcher<Expr> InnerMatcher -
Matches the right hand side of binary operator expressions.
-
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
+Matcher<BinaryOperator>hasRHSMatcher<Expr> InnerMatcher
+
Matches the right hand side of binary operator expressions.
 
-The matcher binaryOperator(hasRHS(expr().bind("rhs")))
-matches a || b,
-with expr()
-matching b.
+Example matches b (matcher = binaryOperator(hasRHS()))
+  a || b
 
Matcher<BindingDecl>forDecompositionMatcher<ValueDecl> InnerMatcher
Matches the DecompositionDecl the binding belongs to.
 
-Given
+For example, in:
 void foo()
 {
     int arr[3];
@@ -8932,10 +6638,10 @@ 

AST Traversal Matchers

f = 42; } - -The matcher bindingDecl(hasName("f"), - forDecomposition(decompositionDecl())) -matches f in 'auto &[f, s, t]'. +The matcher: + bindingDecl(hasName("f"), + forDecomposition(decompositionDecl()) +matches 'f' in 'auto &[f, s, t]'.
@@ -8947,26 +6653,23 @@

AST Traversal Matchers

Given class X { void f(int x, int y, int z) {} }; - -The matcher cxxMethodDecl(hasAnyParameter(hasName("y"))) - matches f +cxxMethodDecl(hasAnyParameter(hasName("y"))) + matches f(int x, int y, int z) {} with hasAnyParameter(...) matching int y For ObjectiveC, given @interface I - (void) f:(int) y; @end - the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) - matches the declaration of method f with hasParameter +matches the declaration of method f with hasParameter matching y. For blocks, given b = ^(int y) { printf("%d", y) }; - the matcher blockDecl(hasAnyParameter(hasName("y"))) - matches the declaration of the block b with hasParameter +matches the declaration of the block b with hasParameter matching y.
@@ -8977,18 +6680,15 @@

AST Traversal Matchers

Given class X { void f(int x) {} }; - -The matcher -cxxMethodDecl(hasParameter(0, hasType(asString("int")))) -matches f +cxxMethodDecl(hasParameter(0, hasType(varDecl()))) + matches f(int x) {} with hasParameter(...) -matching int x. + matching int x For ObjectiveC, given @interface I - (void) f:(int) y; @end - -The matcher objcMethodDecl(hasParameter(0, hasName("y"))) +the matcher objcMethodDecl(hasParameter(0, hasName("y"))) matches the declaration of method f with hasParameter matching y. @@ -8997,26 +6697,19 @@

AST Traversal Matchers

Matcher<BlockDecl>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -9035,14 +6728,10 @@ 

AST Traversal Matchers

Given int *a; - const int *b; - int * const c = nullptr; - const float *f; - -The matcher pointerType(pointee(isConstQualified(), isInteger())) -matches const int *, -but does not match int * const -or const float *. + int const *b; + float const *f; +pointerType(pointee(isConstQualified(), isInteger())) + matches "int const *b" Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>, Matcher<PointerType>, Matcher<ReferenceType> @@ -9052,26 +6741,19 @@

AST Traversal Matchers

Matcher<CXXBaseSpecifier>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -9094,31 +6776,21 @@ 

AST Traversal Matchers

X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the declaration of x. +Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) + and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) + and friend class X (matcher = friendDecl(hasType("X")) + and public virtual X (matcher = cxxBaseSpecifier(hasType( + cxxRecordDecl(hasName("X")))) class X {}; void y(X &x) { x; X z; } class Y { friend class X; }; class Z : public virtual X {}; -The matcher expr(hasType(cxxRecordDecl(hasName("X")))) -matches x and z. -The matcher varDecl(hasType(cxxRecordDecl(hasName("X")))) -matches z. -The matcher friendDecl(hasType(asString("class X"))) -matches friend class X. -The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType( -asString("X"))).bind("b"))) matches -class Z : public virtual X {}, -with cxxBaseSpecifier(...) -matching public virtual X. - -Given +Example matches class Derived +(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) class Base {}; class Derived : Base {}; -The matcher -cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))) -matches class Derived : Base {}. - Usable as: Matcher<Expr>, Matcher<FriendDecl>, Matcher<ValueDecl>, Matcher<CXXBaseSpecifier>
@@ -9128,25 +6800,17 @@

AST Traversal Matchers

Matches if the expression's or declaration's type matches a type
 matcher.
 
-Exmaple
+Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
+            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
+            and U (matcher = typedefDecl(hasType(asString("int")))
+            and friend class X (matcher = friendDecl(hasType("X"))
+            and public virtual X (matcher = cxxBaseSpecifier(hasType(
+                                              asString("class X")))
  class X {};
  void y(X &x) { x; X z; }
  typedef int U;
  class Y { friend class X; };
  class Z : public virtual X {};
-
-The matcher expr(hasType(cxxRecordDecl(hasName("X"))))
-matches x and z.
-The matcher varDecl(hasType(cxxRecordDecl(hasName("X"))))
-matches z
-The matcher typedefDecl(hasType(asString("int")))
-matches typedef int U
-The matcher friendDecl(hasType(asString("class X")))
-matches friend class X
-The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType(
-asString("X"))).bind("b"))) matches class Z : public virtual X {},
-with cxxBaseSpecifier(...)
-matching public virtual X.
 
@@ -9156,10 +6820,8 @@

AST Traversal Matchers

Given void f(int i); int y; - void foo() { - f(y); - } -The matcher callExpr( + f(y); +callExpr( forEachArgumentWithParam( declRefExpr(to(varDecl(hasName("y")))), parmVarDecl(hasType(isInteger())) @@ -9182,15 +6844,14 @@

AST Traversal Matchers

Given void f(int i); - void foo(int y) { - f(y); - void (*f_ptr)(int) = f; - f_ptr(y); - } -The matcher callExpr( + int y; + f(y); + void (*f_ptr)(int) = f; + f_ptr(y); +callExpr( forEachArgumentWithParamType( declRefExpr(to(varDecl(hasName("y")))), - qualType(isInteger()).bind("type") + qualType(isInteger()).bind("type) )) matches f(y) and f_ptr(y) with declRefExpr(...) @@ -9205,19 +6866,17 @@

AST Traversal Matchers

expression, or an ObjC-message-send expression. Given - void x(int, int, int) { int y = 42; x(1, y, 42); } -The matcher -callExpr(hasAnyArgument(ignoringImplicit(declRefExpr()))) matches -x(1, y, 42) with hasAnyArgument(...) + void x(int, int, int) { int y; x(1, y, 42); } +callExpr(hasAnyArgument(declRefExpr())) + matches x(1, y, 42) +with hasAnyArgument(...) matching y For ObjectiveC, given @interface I - (void) f:(int) y; @end void foo(I *i) { [i f:12]; } - -The matcher objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) -matches [i f:12] + matches [i f:12]
@@ -9225,17 +6884,15 @@

AST Traversal Matchers

Matches the n'th argument of a call expression or a constructor
 call expression.
 
-Given
+Example matches y in x(y)
+    (matcher = callExpr(hasArgument(0, declRefExpr())))
   void x(int) { int y; x(y); }
-The matcher callExpr(hasArgument(0, declRefExpr().bind("arg")))
-matches x(y),
-with declRefExpr() matching y.
 
Matcher<CXXConstructExpr>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -9245,25 +6902,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -9280,12 +6929,10 @@

AST Traversal Matchers

Given class A { A() : i(42), j(42) {} int i; int j; }; - -The matcher cxxConstructorDecl(forEachConstructorInitializer( - forField(fieldDecl().bind("x")))) -matches the constructor of A twice, with -fieldDecl() matching i and -j respectively. +cxxConstructorDecl(forEachConstructorInitializer( + forField(decl().bind("x")) +)) + will trigger two matches, binding for 'i' and 'j' respectively.
@@ -9297,11 +6944,10 @@

AST Traversal Matchers

Foo() : foo_(1) { } int foo_; }; - -The matcher cxxRecordDecl(has(cxxConstructorDecl( +cxxRecordDecl(has(cxxConstructorDecl( hasAnyConstructorInitializer(anything()) ))) -matches Foo, hasAnyConstructorInitializer matches foo_(1) + record matches Foo, hasAnyConstructorInitializer matches foo_(1) @@ -9313,11 +6959,9 @@

AST Traversal Matchers

Foo() : foo_(1) { } int foo_; }; - -The matcher cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( forField(hasName("foo_")))))) -matches Foo + matches Foo with forField matching foo_ @@ -9325,26 +6969,19 @@

AST Traversal Matchers

Matcher<CXXCtorInitializer>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -9365,11 +7002,9 @@ 

AST Traversal Matchers

Foo() : foo_(1) { } int foo_; }; - -The matcher cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer( withInitializer(integerLiteral(equals(1))))))) -matches Foo + matches Foo with withInitializer matching (1)
@@ -9384,14 +7019,11 @@

AST Traversal Matchers

int m; int f(X x) { x.m; return m; } }; - - -The matcher memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) -matches x.m, but not m; however, -The matcher memberExpr(hasObjectExpression(hasType(pointsTo( -cxxRecordDecl(hasName("X")))))) -matches m (aka. this->m), but not x.m. + matches `x.m`, but not `m`; however, +memberExpr(hasObjectExpression(hasType(pointsTo( + cxxRecordDecl(hasName("X")))))) + matches `m` (aka. `this->m`), but not `x.m`. @@ -9401,20 +7033,12 @@

AST Traversal Matchers

Given class Y { void x() { this->x(); x(); Y y; y.x(); } }; void f() { f(); } - -The matcher callExpr(callee(expr().bind("callee"))) -matches this->x(), x(), y.x(), f() -with expr() inside of callee -matching this->x, x, -y.x, f respectively +callExpr(callee(expr())) + matches this->x(), x(), y.x(), f() +with callee(...) + matching this->x, x, y.x, f respectively Given - struct Dummy {}; - // makes sure there is a callee, otherwise there would be no callee, - // just a builtin operator - Dummy operator+(Dummy, Dummy); - // not defining a '*' operator - template <typename... Args> auto sum(Args... args) { return (0 + ... + args); @@ -9424,14 +7048,10 @@

AST Traversal Matchers

auto multiply(Args... args) { return (args * ... * 1); } - -The matcher cxxFoldExpr(callee(expr().bind("op"))) -matches (0 + ... + args) -with callee(...) matching *, -but does not match (args * ... * 1). -A CXXFoldExpr only has an UnresolvedLookupExpr as a callee. -When there are no define operators that could be used instead of builtin -ones, then there will be no callee . +cxxFoldExpr(callee(expr())) + matches (args * ... * 1) +with callee(...) + matching * Note: Callee cannot take the more general internal::Matcher<Expr> because this introduces ambiguous overloads with calls to Callee taking a @@ -9443,37 +7063,16 @@

AST Traversal Matchers

Matcher<CXXFoldExpr>hasEitherOperandMatcher<Expr> InnerMatcher
Matches if either the left hand side or the right hand side of a
 binary operator or fold expression matches.
-
-Given
-  struct S {};
-  bool operator ==(const S&, const S&);
-
-  void f(int a, const S&lhs, const S&rhs) {
-      a + 0;
-      lhs == rhs;
-      lhs != rhs;
-  }
-
-  template <typename ...Ts>
-  auto sum(Ts... args) {
-    return (0 + ... + args);
-  }
-
-
-The matcher binaryOperator(hasEitherOperand(integerLiteral()))
-matches a + 0.
-The matcher cxxOperatorCallExpr(hasEitherOperand(declRefExpr(to(
-parmVarDecl(hasName("lhs")))))) matches lhs == rhs and
-lhs != rhs.
-The matcher cxxFoldExpr(hasEitherOperand(integerLiteral()))
-matches (0 + ... + args).
 
Matcher<CXXFoldExpr>hasFoldInitMatcher<Expr> InnerMacher
Matches the operand that does not contain the parameter pack.
 
-Given
+Example matches `(0 + ... + args)` and `(args * ... * 1)`
+    (matcher = cxxFoldExpr(hasFoldInit(expr())))
+  with hasFoldInit(...)
+    matching `0` and `1` respectively
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
@@ -9483,27 +7082,14 @@ 

AST Traversal Matchers

auto multiply(Args... args) { return (args * ... * 1); } - - -The matcher cxxFoldExpr(hasFoldInit(expr().bind("init"))) -matches (0 + ... + args) and (args * ... * 1) -with hasFoldInit(expr().bind("init")) matching -0 and 1.
Matcher<CXXFoldExpr>hasLHSMatcher<Expr> InnerMatcher
Matches the left hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasLHS(expr().bind("lhs")))
-matches a || b,
-with expr()
-matching a.
+Example matches a (matcher = binaryOperator(hasLHS()))
+  a || b
 
@@ -9511,25 +7097,22 @@

AST Traversal Matchers

Matches if both matchers match with opposite sides of the binary operator
 or fold expression.
 
-Given
-void foo() {
-  1 + 2; // Match
-  2 + 1; // Match
-  1 + 1; // No match
-  2 + 2; // No match
-}
-The matcher binaryOperator(hasOperands(integerLiteral(equals(1)),
-                                            integerLiteral(equals(2))))
-matches 1 + 2 and 2 + 1,
-but does not match 1 + 1
-or 2 + 2.
+Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
+                                             integerLiteral(equals(2)))
+  1 + 2 // Match
+  2 + 1 // Match
+  1 + 1 // No match
+  2 + 2 // No match
 
Matcher<CXXFoldExpr>hasPatternMatcher<Expr> InnerMacher
Matches the operand that contains the parameter pack.
 
-Given
+Example matches `(0 + ... + args)`
+    (matcher = cxxFoldExpr(hasPattern(expr())))
+  with hasPattern(...)
+    matching `args`
   template <typename... Args>
   auto sum(Args... args) {
       return (0 + ... + args);
@@ -9539,27 +7122,14 @@ 

AST Traversal Matchers

auto multiply(Args... args) { return (args * ... * 1); } - - -The matcher cxxFoldExpr(hasPattern(expr().bind("pattern"))) -matches (0 + ... + args) and (args * ... * 1), -with hasPattern(expr().bind("pattern")) matching -args two times.
Matcher<CXXFoldExpr>hasRHSMatcher<Expr> InnerMatcher
Matches the right hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasRHS(expr().bind("rhs")))
-matches a || b,
-with expr()
-matching b.
+Example matches b (matcher = binaryOperator(hasRHS()))
+  a || b
 
@@ -9570,32 +7140,27 @@

AST Traversal Matchers

other declarations of the same function or coroutine. Given -void foo() { for (;;) {} -} -The matcher forStmt(hasBody(compoundStmt().bind("body"))) -matches for (;;) {} +forStmt(hasBody(compoundStmt())) + matches 'for (;;) {}' with compoundStmt() - matching {} + matching '{}' Given void f(); void f() {} -The matcher functionDecl(hasBody(compoundStmt().bind("compound"))) -f +functionDecl(hasBody(compoundStmt())) + matches 'void f() {}' with compoundStmt() -matching {} -but does not match void f(); + matching '{}' + but does not match 'void f();' Matcher<CXXForRangeStmt>hasInitStatementMatcher<Stmt> InnerMatcher
Matches selection statements with initializer.
 
-Given
- struct vec { int* begin(); int* end(); };
- int foobar();
- vec& get_range();
+Given:
  void foo() {
    if (int i = foobar(); i > 0) {}
    switch (int i = foobar(); i) {}
@@ -9606,71 +7171,51 @@ 

AST Traversal Matchers

switch (foobar()) {} for (auto& x : get_range()) {} } - -The matcher ifStmt(hasInitStatement(anything())) - matches the if statement if (int i = foobar(); i > 0) {} - in foo but not if (foobar() > 0) {} in bar. -The matcher switchStmt(hasInitStatement(anything())) - matches the switch statement switch (int i = foobar(); i) {} - in foo but not switch (foobar()) {} in bar. -The matcher cxxForRangeStmt(hasInitStatement(anything())) - matches the range for statement - for (auto& a = get_range(); auto& x : a) {} in foo - but not for (auto& x : get_range()) {} in bar. +ifStmt(hasInitStatement(anything())) + matches the if statement in foo but not in bar. +switchStmt(hasInitStatement(anything())) + matches the switch statement in foo but not in bar. +cxxForRangeStmt(hasInitStatement(anything())) + matches the range for statement in foo but not in bar.
Matcher<CXXForRangeStmt>hasLoopVariableMatcher<VarDecl> InnerMatcher
Matches the initialization statement of a for loop.
 
-Given
-  void foo() {
-    int a[42] = {};
+Example:
+    forStmt(hasLoopVariable(anything()))
+matches 'int x' in
     for (int x : a) { }
-  }
-
-The matcher cxxForRangeStmt(hasLoopVariable(anything()))
-matches for (int x : a) { }
 
Matcher<CXXForRangeStmt>hasRangeInitMatcher<Expr> InnerMatcher
Matches the range initialization statement of a for loop.
 
-Given
-  void foo() {
-    int a[42] = {};
+Example:
+    forStmt(hasRangeInit(anything()))
+matches 'a' in
     for (int x : a) { }
-  }
-
-The matcher cxxForRangeStmt(hasRangeInit(anything()))
-matches for (int x : a) { }
 
Matcher<CXXFunctionalCastExpr>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -9690,16 +7235,13 @@ 

AST Traversal Matchers

Given class Y { public: void m(); }; Y g(); - class X : public Y { public: void g(); }; + class X : public Y { void g(); }; void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); } - -The matcher cxxMemberCallExpr(onImplicitObjectArgument(hasType( +cxxMemberCallExpr(onImplicitObjectArgument(hasType( cxxRecordDecl(hasName("Y"))))) -matches y.m(), x.m() and (g()).m() -but does not match x.g(). -The matcher cxxMemberCallExpr(on(callExpr())) -only matches (g()).m(), because the parens are ignored. -FIXME: should they be ignored? (ignored bc of `on`) + matches `y.m()`, `x.m()` and (`g()).m()`, but not `x.g()`). +cxxMemberCallExpr(on(callExpr())) + only matches `(g()).m()` (the parens are ignored). FIXME: Overload to allow directly matching types?
@@ -9714,15 +7256,12 @@

AST Traversal Matchers

Y g(); class X : public Y {}; void z(Y y, X x) { y.m(); (g()).m(); x.m(); } - -The matcher cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))) - matches y.m() and (g()).m(). -The matcher + matches `y.m()` and `(g()).m()`. cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X"))))) - matches x.m(). -The matcher cxxMemberCallExpr(on(callExpr())) - matches (g()).m(). + matches `x.m()`. +cxxMemberCallExpr(on(callExpr())) + matches `(g()).m()`. FIXME: Overload to allow directly matching types? @@ -9730,35 +7269,24 @@

AST Traversal Matchers

Matcher<CXXMemberCallExpr>thisPointerTypeMatcher<Decl> InnerMatcher
Overloaded to match the type's declaration.
-
-Given
-  class Y { public: void m(); };
-  class X : public Y { public: void g(); };
-  void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); }
-
-The matcher cxxMemberCallExpr(thisPointerType(
-    cxxRecordDecl(hasName("Y"))))
-  matches y.m(), p->m() and x.m().
-The matcher cxxMemberCallExpr(thisPointerType(
-    cxxRecordDecl(hasName("X"))))
-  matches x.g().
 
Matcher<CXXMemberCallExpr>thisPointerTypeMatcher<QualType> InnerMatcher
Matches if the type of the expression's implicit object argument either
-  matches the InnerMatcher, or is a pointer to a type that matches the
+matches the InnerMatcher, or is a pointer to a type that matches the
 InnerMatcher.
 
 Given
-  class Y { public: void m() const; };
-  class X : public Y { public: void g(); };
-  void z() { const Y y; y.m(); const Y *p; p->m(); X x; x.m(); x.g(); }
-
-The matcher
-cxxMemberCallExpr(thisPointerType(isConstQualified()))
-matches y.m(), x.m() and p->m(),
-but not x.g().
+  class Y { public: void m(); };
+  class X : public Y { void g(); };
+  void z() { Y y; y.m(); Y *p; p->m(); X x; x.m(); x.g(); }
+cxxMemberCallExpr(thisPointerType(hasDeclaration(
+    cxxRecordDecl(hasName("Y")))))
+  matches `y.m()`, `p->m()` and `x.m()`.
+cxxMemberCallExpr(thisPointerType(hasDeclaration(
+    cxxRecordDecl(hasName("X")))))
+  matches `x.g()`.
 
@@ -9770,27 +7298,19 @@

AST Traversal Matchers

class A { virtual void f(); }; class B : public A { void f(); }; class C : public B { void f(); }; - -The matcher cxxMethodDecl(ofClass(hasName("C")), - forEachOverridden(cxxMethodDecl().bind("b"))) -matches void f() of C , -with cxxMethodDecl() matching -virtual void f() of A , -but the matcher does not match void f() of B because -it is not overridden by C::f. +cxxMethodDecl(ofClass(hasName("C")), + forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") + matches once, with "b" binding "A::f" and "d" binding "C::f" (Note + that B::f is not overridden by C::f). The check can produce multiple matches in case of multiple inheritance, e.g. class A1 { virtual void f(); }; class A2 { virtual void f(); }; class C : public A1, public A2 { void f(); }; - -The matcher cxxMethodDecl(ofClass(hasName("C")), - forEachOverridden(cxxMethodDecl().bind("b"))) -matches void f() of C with the inner -cxxMethodDecl() matching virtual void f() -inside of A1 , and void f() of C with the inner -cxxMethodDecl() matching virtual void f() -inside of A2. +cxxMethodDecl(ofClass(hasName("C")), + forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") + matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and + once with "b" binding "A2::f" and "d" binding "C::f". @@ -9802,52 +7322,40 @@

AST Traversal Matchers

FIXME: What other kind of declarations would we need to generalize this to? -Given +Example matches A() in the last line + (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl( + ofClass(hasName("A")))))) class A { public: A(); - void foo(); }; - -The matcher cxxMethodDecl(ofClass(hasName("A"))) -matches A() and void foo(). + A a = A(); Matcher<CXXNewExpr>hasAnyPlacementArgMatcher<Expr> InnerMatcher
Matches any placement new expression arguments.
 
-Given
-  void* operator new(decltype(sizeof(void*)), void*);
-  struct MyClass { int x; };
-  unsigned char Storage[sizeof(MyClass) * 10];
+Given:
   MyClass *p1 = new (Storage) MyClass();
-
-
-The matcher cxxNewExpr(hasAnyPlacementArg(anything()))
-matches new (Storage) MyClass().
+cxxNewExpr(hasAnyPlacementArg(anything()))
+  matches the expression 'new (Storage, 16) MyClass()'.
 
Matcher<CXXNewExpr>hasArraySizeMatcher<Expr> InnerMatcher
Matches array new expressions with a given array size.
 
-Given
-  void* operator new(decltype(sizeof(void*)));
-  struct MyClass { int x; };
+Given:
   MyClass *p1 = new MyClass[10];
-
-
-The matcher
-cxxNewExpr(hasArraySize(
-            ignoringImplicit(integerLiteral(equals(10)))))
-matches new MyClass[10].
+cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
+  matches the expression 'new MyClass[10]'.
 
Matcher<CXXNewExpr>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -9857,25 +7365,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -9890,42 +7390,29 @@

AST Traversal Matchers

Matcher<CXXNewExpr>hasPlacementArgunsigned Index, Matcher<Expr> InnerMatcher
Matches placement new expression arguments.
 
-Given
-  void *operator new(decltype(sizeof(void*)), int, void*);
-  struct MyClass { int x; };
-  unsigned char Storage[sizeof(MyClass) * 10];
-  MyClass *p1 = new (16, Storage) MyClass();
-
-
-The matcher cxxNewExpr(hasPlacementArg(0,
-                      integerLiteral(equals(16))))
-matches new (16, Storage) MyClass().
+Given:
+  MyClass *p1 = new (Storage, 16) MyClass();
+cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
+  matches the expression 'new (Storage, 16) MyClass()'.
 
Matcher<CXXNewExpr>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -9941,45 +7428,14 @@ 

AST Traversal Matchers

Matcher<CXXOperatorCallExpr>hasEitherOperandMatcher<Expr> InnerMatcher
Matches if either the left hand side or the right hand side of a
 binary operator or fold expression matches.
-
-Given
-  struct S {};
-  bool operator ==(const S&, const S&);
-
-  void f(int a, const S&lhs, const S&rhs) {
-      a + 0;
-      lhs == rhs;
-      lhs != rhs;
-  }
-
-  template <typename ...Ts>
-  auto sum(Ts... args) {
-    return (0 + ... + args);
-  }
-
-
-The matcher binaryOperator(hasEitherOperand(integerLiteral()))
-matches a + 0.
-The matcher cxxOperatorCallExpr(hasEitherOperand(declRefExpr(to(
-parmVarDecl(hasName("lhs")))))) matches lhs == rhs and
-lhs != rhs.
-The matcher cxxFoldExpr(hasEitherOperand(integerLiteral()))
-matches (0 + ... + args).
 
Matcher<CXXOperatorCallExpr>hasLHSMatcher<Expr> InnerMatcher
Matches the left hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasLHS(expr().bind("lhs")))
-matches a || b,
-with expr()
-matching a.
+Example matches a (matcher = binaryOperator(hasLHS()))
+  a || b
 
@@ -9987,64 +7443,44 @@

AST Traversal Matchers

Matches if both matchers match with opposite sides of the binary operator
 or fold expression.
 
-Given
-void foo() {
-  1 + 2; // Match
-  2 + 1; // Match
-  1 + 1; // No match
-  2 + 2; // No match
-}
-The matcher binaryOperator(hasOperands(integerLiteral(equals(1)),
-                                            integerLiteral(equals(2))))
-matches 1 + 2 and 2 + 1,
-but does not match 1 + 1
-or 2 + 2.
+Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
+                                             integerLiteral(equals(2)))
+  1 + 2 // Match
+  2 + 1 // Match
+  1 + 1 // No match
+  2 + 2 // No match
 
Matcher<CXXOperatorCallExpr>hasRHSMatcher<Expr> InnerMatcher
Matches the right hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasRHS(expr().bind("rhs")))
-matches a || b,
-with expr()
-matching b.
+Example matches b (matcher = binaryOperator(hasRHS()))
+  a || b
 
Matcher<CXXOperatorCallExpr>hasUnaryOperandMatcher<Expr> InnerMatcher
Matches if the operand of a unary operator matches.
 
-void foo() {
-  !true;
-}
-
-The matcher
-unaryOperator(hasUnaryOperand(cxxBoolLiteral(equals(true))))
-matches !true.
+Example matches true (matcher = hasUnaryOperand(
+                                  cxxBoolLiteral(equals(true))))
+  !true
 
Matcher<CXXRecordDecl>hasAnyBaseMatcher<CXXBaseSpecifier> BaseSpecMatcher
Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
 
-Given
-  class Foo {};
+Example:
+matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
+  class Foo;
   class Bar : Foo {};
   class Baz : Bar {};
-  class SpecialBase {};
+  class SpecialBase;
   class Proxy : SpecialBase {};  // matches Proxy
   class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
 
-
-The matcher
-cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))))
-matches Proxy and IndirectlyDerived
 FIXME: Refactor this and isDerivedFrom to reuse implementation.
 
@@ -10052,31 +7488,26 @@

AST Traversal Matchers

Matcher<CXXRecordDecl>hasDirectBaseMatcher<CXXBaseSpecifier> BaseSpecMatcher
Matches C++ classes that have a direct base matching BaseSpecMatcher.
 
-Given
-  class Foo {};
+Example:
+matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
+  class Foo;
   class Bar : Foo {};
   class Baz : Bar {};
-  class SpecialBase {};
+  class SpecialBase;
   class Proxy : SpecialBase {};  // matches Proxy
   class IndirectlyDerived : Proxy {};  // doesn't match
-
-The matcher
-cxxRecordDecl(hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase")))))
-matches Proxy
 
Matcher<CXXRecordDecl>hasMethodMatcher<CXXMethodDecl> InnerMatcher
Matches the first method of a class or struct that satisfies InnerMatcher.
 
-Given
+Given:
   class A { void func(); };
   class B { void member(); };
 
-
-The matcher cxxRecordDecl(hasMethod(hasName("func")))
-matches the declaration of class A { void func(); }
-but does not match class B { void member(); }
+cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
+A but not B.
 
@@ -10088,29 +7519,22 @@

AST Traversal Matchers

Note that a class is not considered to be derived from itself. Example matches Y, Z, C (Base == hasName("X")) - class X {}; + class X; class Y : public X {}; // directly derived class Z : public Y {}; // indirectly derived typedef X A; typedef A B; class C : public B {}; // derived from a typedef of X - class Foo {}; - typedef Foo Alias; - class Bar : public Alias {}; - // derived from a type that Alias is a typedef of Foo - - -The matcher cxxRecordDecl(isDerivedFrom(hasName("X"))) -matches Y, Z and C. -The matcher cxxRecordDecl(isDerivedFrom(hasName("Foo"))) -matches Bar. +In the following example, Bar matches isDerivedFrom(hasName("X")): + class Foo; + typedef Foo X; + class Bar : public Foo {}; // derived from a type that X is a typedef of In the following example, Bar matches isDerivedFrom(hasName("NSObject")) @interface NSObject @end @interface Bar : NSObject @end - Usable as: Matcher<CXXRecordDecl>, Matcher<ObjCInterfaceDecl>
@@ -10121,90 +7545,38 @@

AST Traversal Matchers

Note that a class is not considered to be derived from itself. -Given - class X {}; +Example matches Y, C (Base == hasName("X")) + class X; class Y : public X {}; // directly derived class Z : public Y {}; // indirectly derived typedef X A; typedef A B; class C : public B {}; // derived from a typedef of X -The matcher -cxxRecordDecl(isDirectlyDerivedFrom(namedDecl(hasName("X")))) -matches Y and C (Base == hasName("X") - In the following example, Bar matches isDerivedFrom(hasName("X")): - class Foo {}; + class Foo; typedef Foo X; class Bar : public Foo {}; // derived from a type that X is a typedef of - -The matcher cxxRecordDecl(isDerivedFrom(hasName("X"))) -matches Bar
Matcher<CXXRecordDecl>isSameOrDerivedFromMatcher<NamedDecl> Base
Similar to isDerivedFrom(), but also matches classes that directly
 match Base.
-
-Given
-  class X {};
-  class Y : public X {};  // directly derived
-  class Z : public Y {};  // indirectly derived
-  typedef X A;
-  typedef A B;
-  class C : public B {};  // derived from a typedef of X
-
-The matcher
-cxxRecordDecl(isSameOrDerivedFrom(cxxRecordDecl(hasName("X"))),
-isDefinition())
-matches class X {}, class Y : public X {},
-class Z : public Y {} and class C : public B {}.
 
Matcher<CXXRewrittenBinaryOperator>hasEitherOperandMatcher<Expr> InnerMatcher
Matches if either the left hand side or the right hand side of a
 binary operator or fold expression matches.
-
-Given
-  struct S {};
-  bool operator ==(const S&, const S&);
-
-  void f(int a, const S&lhs, const S&rhs) {
-      a + 0;
-      lhs == rhs;
-      lhs != rhs;
-  }
-
-  template <typename ...Ts>
-  auto sum(Ts... args) {
-    return (0 + ... + args);
-  }
-
-
-The matcher binaryOperator(hasEitherOperand(integerLiteral()))
-matches a + 0.
-The matcher cxxOperatorCallExpr(hasEitherOperand(declRefExpr(to(
-parmVarDecl(hasName("lhs")))))) matches lhs == rhs and
-lhs != rhs.
-The matcher cxxFoldExpr(hasEitherOperand(integerLiteral()))
-matches (0 + ... + args).
 
Matcher<CXXRewrittenBinaryOperator>hasLHSMatcher<Expr> InnerMatcher
Matches the left hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasLHS(expr().bind("lhs")))
-matches a || b,
-with expr()
-matching a.
+Example matches a (matcher = binaryOperator(hasLHS()))
+  a || b
 
@@ -10212,59 +7584,39 @@

AST Traversal Matchers

Matches if both matchers match with opposite sides of the binary operator
 or fold expression.
 
-Given
-void foo() {
-  1 + 2; // Match
-  2 + 1; // Match
-  1 + 1; // No match
-  2 + 2; // No match
-}
-The matcher binaryOperator(hasOperands(integerLiteral(equals(1)),
-                                            integerLiteral(equals(2))))
-matches 1 + 2 and 2 + 1,
-but does not match 1 + 1
-or 2 + 2.
+Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
+                                             integerLiteral(equals(2)))
+  1 + 2 // Match
+  2 + 1 // Match
+  1 + 1 // No match
+  2 + 2 // No match
 
Matcher<CXXRewrittenBinaryOperator>hasRHSMatcher<Expr> InnerMatcher
Matches the right hand side of binary operator expressions.
 
-Given
-void foo(bool a, bool b) {
-  a || b;
-}
-
-The matcher binaryOperator(hasRHS(expr().bind("rhs")))
-matches a || b,
-with expr()
-matching b.
+Example matches b (matcher = binaryOperator(hasRHS()))
+  a || b
 
Matcher<CXXTemporaryObjectExpr>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -10282,19 +7634,17 @@ 

AST Traversal Matchers

expression, or an ObjC-message-send expression. Given - void x(int, int, int) { int y = 42; x(1, y, 42); } -The matcher -callExpr(hasAnyArgument(ignoringImplicit(declRefExpr()))) matches -x(1, y, 42) with hasAnyArgument(...) + void x(int, int, int) { int y; x(1, y, 42); } +callExpr(hasAnyArgument(declRefExpr())) + matches x(1, y, 42) +with hasAnyArgument(...) matching y For ObjectiveC, given @interface I - (void) f:(int) y; @end void foo(I *i) { [i f:12]; } - -The matcher objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) -matches [i f:12] + matches [i f:12]
@@ -10302,37 +7652,28 @@

AST Traversal Matchers

Matches the n'th argument of a call expression or a constructor
 call expression.
 
-Given
+Example matches y in x(y)
+    (matcher = callExpr(hasArgument(0, declRefExpr())))
   void x(int) { int y; x(y); }
-The matcher callExpr(hasArgument(0, declRefExpr().bind("arg")))
-matches x(y),
-with declRefExpr() matching y.
 
Matcher<CXXUnresolvedConstructExpr>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -10350,23 +7691,19 @@ 

AST Traversal Matchers

given matcher; or 2) if the Obj-C message expression's callee's method declaration matches the given matcher. -Example 1 +Example matches y.x() (matcher = callExpr(callee( + cxxMethodDecl(hasName("x"))))) class Y { public: void x(); }; void z() { Y y; y.x(); } -The matcher callExpr(callee(cxxMethodDecl(hasName("x")))) -matches y.x() +Example 2. Matches [I foo] with +objcMessageExpr(callee(objcMethodDecl(hasName("foo")))) -Example 2 @interface I: NSObject +(void)foo; @end ... [I foo] - -The matcher -objcMessageExpr(callee(objcMethodDecl(hasName("foo")))) -matches [I foo]
@@ -10376,20 +7713,12 @@

AST Traversal Matchers

Given class Y { void x() { this->x(); x(); Y y; y.x(); } }; void f() { f(); } - -The matcher callExpr(callee(expr().bind("callee"))) -matches this->x(), x(), y.x(), f() -with expr() inside of callee -matching this->x, x, -y.x, f respectively +callExpr(callee(expr())) + matches this->x(), x(), y.x(), f() +with callee(...) + matching this->x, x, y.x, f respectively Given - struct Dummy {}; - // makes sure there is a callee, otherwise there would be no callee, - // just a builtin operator - Dummy operator+(Dummy, Dummy); - // not defining a '*' operator - template <typename... Args> auto sum(Args... args) { return (0 + ... + args); @@ -10399,14 +7728,10 @@

AST Traversal Matchers

auto multiply(Args... args) { return (args * ... * 1); } - -The matcher cxxFoldExpr(callee(expr().bind("op"))) -matches (0 + ... + args) -with callee(...) matching *, -but does not match (args * ... * 1). -A CXXFoldExpr only has an UnresolvedLookupExpr as a callee. -When there are no define operators that could be used instead of builtin -ones, then there will be no callee . +cxxFoldExpr(callee(expr())) + matches (args * ... * 1) +with callee(...) + matching * Note: Callee cannot take the more general internal::Matcher<Expr> because this introduces ambiguous overloads with calls to Callee taking a @@ -10421,10 +7746,8 @@

AST Traversal Matchers

Given void f(int i); int y; - void foo() { - f(y); - } -The matcher callExpr( + f(y); +callExpr( forEachArgumentWithParam( declRefExpr(to(varDecl(hasName("y")))), parmVarDecl(hasType(isInteger())) @@ -10447,15 +7770,14 @@

AST Traversal Matchers

Given void f(int i); - void foo(int y) { - f(y); - void (*f_ptr)(int) = f; - f_ptr(y); - } -The matcher callExpr( + int y; + f(y); + void (*f_ptr)(int) = f; + f_ptr(y); +callExpr( forEachArgumentWithParamType( declRefExpr(to(varDecl(hasName("y")))), - qualType(isInteger()).bind("type") + qualType(isInteger()).bind("type) )) matches f(y) and f_ptr(y) with declRefExpr(...) @@ -10470,19 +7792,17 @@

AST Traversal Matchers

expression, or an ObjC-message-send expression. Given - void x(int, int, int) { int y = 42; x(1, y, 42); } -The matcher -callExpr(hasAnyArgument(ignoringImplicit(declRefExpr()))) matches -x(1, y, 42) with hasAnyArgument(...) + void x(int, int, int) { int y; x(1, y, 42); } +callExpr(hasAnyArgument(declRefExpr())) + matches x(1, y, 42) +with hasAnyArgument(...) matching y For ObjectiveC, given @interface I - (void) f:(int) y; @end void foo(I *i) { [i f:12]; } - -The matcher objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) -matches [i f:12] + matches [i f:12] @@ -10490,17 +7810,15 @@

AST Traversal Matchers

Matches the n'th argument of a call expression or a constructor
 call expression.
 
-Given
+Example matches y in x(y)
+    (matcher = callExpr(hasArgument(0, declRefExpr())))
   void x(int) { int y; x(y); }
-The matcher callExpr(hasArgument(0, declRefExpr().bind("arg")))
-matches x(y),
-with declRefExpr() matching y.
 
Matcher<CallExpr>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -10510,25 +7828,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -10545,12 +7855,9 @@

AST Traversal Matchers

extension, matches the constant given in the statement. Given - void foo() { - switch (1) { case 1: break; case 1+1: break; case 3 ... 4: break; } - } -The matcher -caseStmt(hasCaseConstant(constantExpr(has(integerLiteral())))) -matches case 1: break. + switch (1) { case 1: case 1+1: case 3 ... 4: ; } +caseStmt(hasCaseConstant(integerLiteral())) + matches "case 1:"
@@ -10558,23 +7865,14 @@

AST Traversal Matchers

Matches if the cast's source expression
 or opaque value's source expression matches the given matcher.
 
-Given
- struct URL { URL(const char*); };
- URL url = "a string";
-
-The matcher castExpr(hasSourceExpression(cxxConstructExpr()))
-matches "a string".
-
-Given
-void foo(bool b) {
-  int a = b ?: 1;
-}
+Example 1: matches "a string"
+(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
+class URL { URL(string); };
+URL url = "a string";
 
-The matcher
-opaqueValueExpr(hasSourceExpression(
-              implicitCastExpr(has(
-                implicitCastExpr(has(declRefExpr()))))))
-matches b twice, for the conditiona and the true expression.
+Example 2: matches 'b' (matcher =
+opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
+int a = b ?: 1;
 
@@ -10594,22 +7892,13 @@

AST Traversal Matchers

template <typename T, typename U> void f(T&& t, U&& u) {} - void foo() { - bool B = false; - f(R, B); - } - -The matcher -templateSpecializationType(forEachTemplateArgument(isExpr(expr().bind("t_arg")))) -matches Matrix<int, R * 2, R * 4> twice, with -expr() matching R * 2 and -R * 4. -The matcher -functionDecl(forEachTemplateArgument(refersToType(qualType().bind("type")))) -matches the specialization of f twice, -with qualType() matching -unsigned and -bool. + bool B = false; + f(R, B); +templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) + matches twice, with expr() matching 'R * 2' and 'R * 4' +functionDecl(forEachTemplateArgument(refersToType(builtinType()))) + matches the specialization f<unsigned, bool> twice, for 'unsigned' + and 'bool' @@ -10622,11 +7911,9 @@

AST Traversal Matchers

Given template<typename T> class A {}; A<int> a; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( -hasTypeLoc(loc(asString("int"))))))))) matches A<int> a. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( + hasTypeLoc(loc(asString("int"))))))) + matches `A<int> a`. @@ -10640,19 +7927,15 @@

AST Traversal Matchers

template<> class A<double> {}; A<int> a; - template<typename T> void f() {}; + template<typename T> f() {}; void func() { f<int>(); }; +classTemplateSpecializationDecl(hasAnyTemplateArgument( + refersToType(asString("int")))) + matches the specialization A<int> -The matcher classTemplateSpecializationDecl( - hasAnyTemplateArgument( - refersToType(asString("int")))) -matches class A<int>. - -The matcher -functionDecl(hasAnyTemplateArgument( - refersToType(asString("int")))) -matches the instantiation of f. +functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) + matches the specialization f<int> @@ -10660,14 +7943,11 @@

AST Traversal Matchers

Matches the specialized template of a specialization declaration.
 
 Given
-  template<typename T> class A {}; // #1
-  template<> class A<int> {}; // #2
-
-The matcher
-classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl().bind("ctd")))
-matches template<> class A<int> {},
-with classTemplateDecl() matching the class template
-declaration template <typename T> class A {}.
+  template<typename T> class A {}; #1
+  template<> class A<int> {}; #2
+classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
+  matches '#2' with classTemplateDecl() matching the class template
+  declaration of 'A' at #1.
 
@@ -10680,12 +7960,9 @@

AST Traversal Matchers

template<typename T, typename U> class A {}; A<double, int> b; A<int, double> c; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, -hasTypeLoc(loc(asString("double"))))))))) -matches A<double, int> b, but not double> c}. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, + hasTypeLoc(loc(asString("double"))))))) + matches `A<double, int> b`, but not `A<int, double> c`. @@ -10696,20 +7973,17 @@

AST Traversal Matchers

Given template<typename T, typename U> class A {}; - A<double, int> b; - A<int, double> c; + A<bool, int> b; + A<int, bool> c; template<typename T> void f() {} void func() { f<int>(); }; - -The matcher classTemplateSpecializationDecl(hasTemplateArgument( 1, refersToType(asString("int")))) -matches the specialization class A<double, int>. + matches the specialization A<bool, int> -The matcher functionDecl(hasTemplateArgument(0, - refersToType(asString("int")))) -matches the specialization of f. +functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) + matches the specialization f<int> @@ -10721,10 +7995,8 @@

AST Traversal Matchers

struct A {}; A a[7]; int b[7]; - - -The matcher arrayType(hasElementType(builtinType())) -int[7] +arrayType(hasElementType(builtinType())) + matches "int b[7]" Usable as: Matcher<ArrayType>, Matcher<ComplexType> @@ -10733,26 +8005,19 @@

AST Traversal Matchers

Matcher<CompoundLiteralExpr>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -10770,12 +8035,11 @@ 

AST Traversal Matchers

a given matcher. Also matches StmtExprs that have CompoundStmt as children. Given -void foo() { { {}; 1+2; } } -The matcher -compoundStmt(hasAnySubstatement(compoundStmt().bind("compound"))) -{ {}; 1+2; } and { { {}; 1+2; } } + { {}; 1+2; } +hasAnySubstatement(compoundStmt()) + matches '{ {}; 1+2; }' with compoundStmt() -matching {} and { {}; 1+2; }. + matching '{}'
@@ -10786,35 +8050,25 @@

AST Traversal Matchers

other declarations of the same function or coroutine. Given -void foo() { for (;;) {} -} -The matcher forStmt(hasBody(compoundStmt().bind("body"))) -matches for (;;) {} +forStmt(hasBody(compoundStmt())) + matches 'for (;;) {}' with compoundStmt() - matching {} + matching '{}' Given void f(); void f() {} -The matcher functionDecl(hasBody(compoundStmt().bind("compound"))) -f +functionDecl(hasBody(compoundStmt())) + matches 'void f() {}' with compoundStmt() -matching {} -but does not match void f(); + matching '{}' + but does not match 'void f();' Matcher<DecayedType>hasDecayedTypeMatcher<QualType> InnerType
Matches the decayed type, whoes decayed type matches InnerMatcher
-
-Given
-  void f(int i[]) {
-    i[1] = 0;
-  }
-
-The matcher parmVarDecl(hasType(decayedType()))
-matches int i[].
 
@@ -10827,17 +8081,15 @@

AST Traversal Matchers

Given template<typename T> class A {}; A<int> a; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( -hasTypeLoc(loc(asString("int"))))))))) matches A<int> a. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( + hasTypeLoc(loc(asString("int"))))))) + matches `A<int> a`. Matcher<DeclRefExpr>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -10847,25 +8099,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -10886,12 +8130,9 @@

AST Traversal Matchers

template<typename T, typename U> class A {}; A<double, int> b; A<int, double> c; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, -hasTypeLoc(loc(asString("double"))))))))) -matches A<double, int> b, but not double> c}. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, + hasTypeLoc(loc(asString("double"))))))) + matches `A<double, int> b`, but not `A<int, double> c`.
@@ -10899,20 +8140,18 @@

AST Traversal Matchers

Matches if a node refers to a declaration through a specific
 using shadow declaration.
 
-Given
+Examples:
   namespace a { int f(); }
   using a::f;
   int x = f();
-
-The matcher declRefExpr(throughUsingDecl(anything()))
-matches f
+declRefExpr(throughUsingDecl(anything()))
+  matches f
 
   namespace a { class X{}; }
   using a::X;
   X x;
-
-The matcher typeLoc(loc(usingType(throughUsingDecl(anything()))))
-matches X
+typeLoc(loc(usingType(throughUsingDecl(anything()))))
+  matches X
 
 Usable as: Matcher<DeclRefExpr>, Matcher<UsingType>
 
@@ -10922,14 +8161,10 @@

AST Traversal Matchers

Matches a DeclRefExpr that refers to a declaration that matches the
 specified matcher.
 
-Given
-  void foo() {
-    bool x;
-    if (x) {}
-  }
-
-The matcher declRefExpr(to(varDecl(hasName("x"))))
-matches x inside the condition of the if-stmt.
+Example matches x in if(x)
+    (matcher = declRefExpr(to(varDecl(hasName("x")))))
+  bool x;
+  if (x) {}
 
@@ -10939,19 +8174,16 @@

AST Traversal Matchers

Note that this does not work for global declarations because the AST breaks up multiple-declaration DeclStmt's into multiple single-declaration DeclStmt's. - -Given non-global declarations - void foo() { - int a, b = 0; - int c; - int d = 2, e; - } -The matcher declStmt(containsDeclaration( +Example: Given non-global declarations + int a, b = 0; + int c; + int d = 2, e; +declStmt(containsDeclaration( 0, varDecl(hasInitializer(anything())))) -matches int d = 2, e;. -The matcher declStmt(containsDeclaration(1, varDecl())) -matches int a, b = 0; and int d = 2, e; -but does not match int c;. + matches only 'int d = 2, e;', and +declStmt(containsDeclaration(1, varDecl())) + matches 'int a, b = 0' as well as 'int d = 2, e;' + but 'int c;' is not matched. @@ -10959,39 +8191,29 @@

AST Traversal Matchers

Matches the Decl of a DeclStmt which has a single declaration.
 
 Given
-  void foo() {
-    int a, b;
-    int c;
-  }
-The matcher declStmt(hasSingleDecl(anything()))
-matches int c;
-but does not match int a, b;
+  int a, b;
+  int c;
+declStmt(hasSingleDecl(anything()))
+  matches 'int c;' but not 'int a, b;'.
 
Matcher<DeclaratorDecl>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -11015,9 +8237,8 @@ 

AST Traversal Matchers

} } - -The matcher cxxRecordDecl(hasDeclContext(namedDecl(hasName("M")))) - matches the declaration of D. +cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the +declaration of class D.
@@ -11027,11 +8248,8 @@

AST Traversal Matchers

Given decltype(1) a = 1; decltype(2.0) b = 2.0; - - -The matcher decltypeType(hasUnderlyingType(isInteger())) -matches the type decltype(1) of the variable -declaration of a . +decltypeType(hasUnderlyingType(isInteger())) + matches the type of "a" Usable as: Matcher<DecltypeType>, Matcher<UsingType> @@ -11048,17 +8266,16 @@

AST Traversal Matchers

f = 42; } - -The matcher - decompositionDecl(hasAnyBinding(bindingDecl(hasName("f")).bind("fBinding"))) -matches auto &[f, s, t] = arr with 'f' bound to "fBinding". +The matcher: + decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding")))) +matches the decomposition decl with 'f' bound to "fBinding". Matcher<DecompositionDecl>hasBindingunsigned N, Matcher<BindingDecl> InnerMatcher
Matches the Nth binding of a DecompositionDecl.
 
-Given
+For example, in:
 void foo()
 {
     int arr[3];
@@ -11066,10 +8283,10 @@ 

AST Traversal Matchers

f = 42; } - -The matcher decompositionDecl(hasBinding(0, - bindingDecl(hasName("f")).bind("fBinding"))) -matches auto &[f, s, t] = arr with 'f' bound to "fBinding". +The matcher: + decompositionDecl(hasBinding(0, + bindingDecl(hasName("f").bind("fBinding")))) +matches the decomposition decl with 'f' bound to "fBinding".
@@ -11080,22 +8297,20 @@

AST Traversal Matchers

other declarations of the same function or coroutine. Given -void foo() { for (;;) {} -} -The matcher forStmt(hasBody(compoundStmt().bind("body"))) -matches for (;;) {} +forStmt(hasBody(compoundStmt())) + matches 'for (;;) {}' with compoundStmt() - matching {} + matching '{}' Given void f(); void f() {} -The matcher functionDecl(hasBody(compoundStmt().bind("compound"))) -f +functionDecl(hasBody(compoundStmt())) + matches 'void f() {}' with compoundStmt() -matching {} -but does not match void f(); + matching '{}' + but does not match 'void f();' @@ -11103,13 +8318,8 @@

AST Traversal Matchers

Matches the condition expression of an if statement, for loop,
 switch statement or conditional operator.
 
-Given
-void foo() {
+Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   if (true) {}
-}
-
-The matcher ifStmt(hasCondition(cxxBoolLiteral(equals(true))))
-if (true) {}
 
@@ -11124,16 +8334,14 @@

AST Traversal Matchers

class D {}; class D d; - -The matcher -elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc())) - matches class C<int>, but not D} +elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc())); + matches the `TypeLoc` of the variable declaration of `c`, but not `d`. Matcher<ElaboratedType>hasQualifierMatcher<NestedNameSpecifier> InnerMatcher
Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
-  matches InnerMatcher if the qualifier exists.
+matches InnerMatcher if the qualifier exists.
 
 Given
   namespace N {
@@ -11143,11 +8351,8 @@ 

AST Traversal Matchers

} N::M::D d; - -The matcher -elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))) - matches the type N::M::D of the variable declaration - of d. +elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N")))) +matches the type of the variable declaration of d.
@@ -11157,20 +8362,20 @@

AST Traversal Matchers

Given namespace N { namespace M { - enum E { Ok }; + class D {}; } } - N::M::E e = N::M::Ok; - + N::M::D d; -The matcher elaboratedType(namesType(enumType())) -matches the type N::M::E of the declaration of e . +elaboratedType(namesType(recordType( +hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable +declaration of d. Matcher<EnumType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -11180,25 +8385,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -11215,37 +8412,25 @@

AST Traversal Matchers

(Note: Clang's AST refers to other conversions as "casts" too, and calls actual casts "explicit" casts.) - - unsigned int a = (unsigned int)0; - -The matcher explicitCastExpr(hasDestinationType( -qualType(isUnsignedInteger()))) matches (unsigned int)0.
Matcher<ExplicitCastExpr>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -11268,31 +8453,21 @@ 

AST Traversal Matchers

X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the declaration of x. +Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) + and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) + and friend class X (matcher = friendDecl(hasType("X")) + and public virtual X (matcher = cxxBaseSpecifier(hasType( + cxxRecordDecl(hasName("X")))) class X {}; void y(X &x) { x; X z; } class Y { friend class X; }; class Z : public virtual X {}; -The matcher expr(hasType(cxxRecordDecl(hasName("X")))) -matches x and z. -The matcher varDecl(hasType(cxxRecordDecl(hasName("X")))) -matches z. -The matcher friendDecl(hasType(asString("class X"))) -matches friend class X. -The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType( -asString("X"))).bind("b"))) matches -class Z : public virtual X {}, -with cxxBaseSpecifier(...) -matching public virtual X. - -Given +Example matches class Derived +(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) class Base {}; class Derived : Base {}; -The matcher -cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))) -matches class Derived : Base {}. - Usable as: Matcher<Expr>, Matcher<FriendDecl>, Matcher<ValueDecl>, Matcher<CXXBaseSpecifier>
@@ -11302,25 +8477,17 @@

AST Traversal Matchers

Matches if the expression's or declaration's type matches a type
 matcher.
 
-Exmaple
+Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
+            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
+            and U (matcher = typedefDecl(hasType(asString("int")))
+            and friend class X (matcher = friendDecl(hasType("X"))
+            and public virtual X (matcher = cxxBaseSpecifier(hasType(
+                                              asString("class X")))
  class X {};
  void y(X &x) { x; X z; }
  typedef int U;
  class Y { friend class X; };
  class Z : public virtual X {};
-
-The matcher expr(hasType(cxxRecordDecl(hasName("X"))))
-matches x and z.
-The matcher varDecl(hasType(cxxRecordDecl(hasName("X"))))
-matches z
-The matcher typedefDecl(hasType(asString("int")))
-matches typedef int U
-The matcher friendDecl(hasType(asString("class X")))
-matches friend class X
-The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType(
-asString("X"))).bind("b"))) matches class Z : public virtual X {},
-with cxxBaseSpecifier(...)
-matching public virtual X.
 
@@ -11337,16 +8504,15 @@

AST Traversal Matchers

appear in the C++17 AST. Given + struct H {}; H G(); void f() { H D = G(); } - -The matcher -varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr()))) -matches H D = G(). +``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))`` +matches ``H D = G()`` in C++11 through C++17 (and beyond). @@ -11357,25 +8523,19 @@

AST Traversal Matchers

Parentheses and explicit casts are not discarded. Given int arr[5]; - const int a = 0; + int a = 0; char b = 0; const int c = a; int *d = arr; long e = (long) 0l; -The matcher -varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) -matches a and b, -but does not match e. -The matcher -varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) -matches c and d. - -The matcher -varDecl(hasInitializer(integerLiteral())) -matches a, -but does not match b or e. -The matcher varDecl(hasInitializer(declRefExpr())) -does not match c or d. +The matchers + varDecl(hasInitializer(ignoringImpCasts(integerLiteral()))) + varDecl(hasInitializer(ignoringImpCasts(declRefExpr()))) +would match the declarations for a, b, c, and d, but not e. +While + varDecl(hasInitializer(integerLiteral())) + varDecl(hasInitializer(declRefExpr())) +only match the declarations for a. @@ -11384,34 +8544,17 @@

AST Traversal Matchers

nodes are stripped off. Parentheses and explicit casts are not discarded. - Given - void f(int param) { - int a = 0; - int b = param; - const int c = 0; - const int d = param; - int e = (0U); - int f = (int)0.0; - const int g = ((int)(((0)))); - } - -The matcher -varDecl(hasInitializer(ignoringImplicit(integerLiteral()))) -matches int a = 0 and const int c = 0, -but not int e = (0U) and ((int)(((0))). -The matcher -varDecl(hasInitializer(integerLiteral())) -matches int a = 0 and const int c = 0, -but not int e = (0U) and ((int)(((0))). - -The matcher -varDecl(hasInitializer(ignoringImplicit(declRefExpr()))) -matches int b = param and const int d = param. -The matcher -varDecl(hasInitializer(declRefExpr())) -matches neither int b = param nor const int d = param, -because an l-to-r-value cast happens. + class C {}; + C a = C(); + C b; + C c = b; +The matchers + varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr()))) +would match the declarations for a, b, and c. +While + varDecl(hasInitializer(cxxConstructExpr())) +only match the declarations for b and c. @@ -11425,14 +8568,12 @@

AST Traversal Matchers

char b = (0); void* c = reinterpret_cast<char*>(0); char d = char(0); - The matcher -varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) -matches a, b, c -and d. -The matcher -varDecl(hasInitializer(integerLiteral())) -matches a. + varDecl(hasInitializer(ignoringParenCasts(integerLiteral()))) +would match the declarations for a, b, c, and d. +while + varDecl(hasInitializer(integerLiteral())) +only match the declaration for a. @@ -11448,21 +8589,14 @@

AST Traversal Matchers

const int c = a; int *d = (arr); long e = ((long) 0l); - -The matcher -varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) -matches a and b, -but does not match e. -The matcher -varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) -matches c and d. - -The matcher -varDecl(hasInitializer(integerLiteral())) -matches a, -but does not match b or e. -The matcher varDecl(hasInitializer(declRefExpr())) -does not match c, or d. +The matchers + varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral()))) + varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr()))) +would match the declarations for a, b, c, and d, but not e. +while + varDecl(hasInitializer(integerLiteral())) + varDecl(hasInitializer(declRefExpr())) +would only match the declaration for a. @@ -11472,9 +8606,8 @@

AST Traversal Matchers

Given const char* str = ("my-string"); The matcher -implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) -would match the implicit cast resulting from the assignment -("my-string"). + implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral()))) +would match the implicit cast resulting from the assignment. @@ -11487,14 +8620,10 @@

AST Traversal Matchers

int b = 3; int c; }; - -The matcher fieldDecl(hasInClassInitializer(integerLiteral(equals(2)))) -matches a, -but does not match b. -The matcher fieldDecl(hasInClassInitializer(anything())) -matches a and b, -but does not match c. + matches 'int a;' but not 'int b;'. +fieldDecl(hasInClassInitializer(anything())) + matches 'int a;' and 'int b;' but not 'int c;'. @@ -11505,22 +8634,20 @@

AST Traversal Matchers

other declarations of the same function or coroutine. Given -void foo() { for (;;) {} -} -The matcher forStmt(hasBody(compoundStmt().bind("body"))) -matches for (;;) {} +forStmt(hasBody(compoundStmt())) + matches 'for (;;) {}' with compoundStmt() - matching {} + matching '{}' Given void f(); void f() {} -The matcher functionDecl(hasBody(compoundStmt().bind("compound"))) -f +functionDecl(hasBody(compoundStmt())) + matches 'void f() {}' with compoundStmt() -matching {} -but does not match void f(); + matching '{}' + but does not match 'void f();' @@ -11528,38 +8655,28 @@

AST Traversal Matchers

Matches the condition expression of an if statement, for loop,
 switch statement or conditional operator.
 
-Given
-void foo() {
+Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   if (true) {}
-}
-
-The matcher ifStmt(hasCondition(cxxBoolLiteral(equals(true))))
-if (true) {}
 
Matcher<ForStmt>hasIncrementMatcher<Stmt> InnerMatcher
Matches the increment statement of a for loop.
 
-Given
-void foo(int N) {
-    for (int x = 0; x < N; ++x) { }
-}
-The matcher
-forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
-matches for (int x = 0; x < N; ++x) { }
+Example:
+    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
+matches '++x' in
+    for (x; x < N; ++x) { }
 
Matcher<ForStmt>hasLoopInitMatcher<Stmt> InnerMatcher
Matches the initialization statement of a for loop.
 
-Given
-void foo(int N) {
+Example:
+    forStmt(hasLoopInit(declStmt()))
+matches 'int x = 0' in
     for (int x = 0; x < N; ++x) { }
-}
-The matcher forStmt(hasLoopInit(declStmt()))
-matches for (int x = 0; x < N; ++x) { }
 
@@ -11573,31 +8690,21 @@

AST Traversal Matchers

X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the declaration of x. +Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) + and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) + and friend class X (matcher = friendDecl(hasType("X")) + and public virtual X (matcher = cxxBaseSpecifier(hasType( + cxxRecordDecl(hasName("X")))) class X {}; void y(X &x) { x; X z; } class Y { friend class X; }; class Z : public virtual X {}; -The matcher expr(hasType(cxxRecordDecl(hasName("X")))) -matches x and z. -The matcher varDecl(hasType(cxxRecordDecl(hasName("X")))) -matches z. -The matcher friendDecl(hasType(asString("class X"))) -matches friend class X. -The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType( -asString("X"))).bind("b"))) matches -class Z : public virtual X {}, -with cxxBaseSpecifier(...) -matching public virtual X. - -Given +Example matches class Derived +(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) class Base {}; class Derived : Base {}; -The matcher -cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))) -matches class Derived : Base {}. - Usable as: Matcher<Expr>, Matcher<FriendDecl>, Matcher<ValueDecl>, Matcher<CXXBaseSpecifier> @@ -11607,25 +8714,17 @@

AST Traversal Matchers

Matches if the expression's or declaration's type matches a type
 matcher.
 
-Exmaple
+Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
+            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
+            and U (matcher = typedefDecl(hasType(asString("int")))
+            and friend class X (matcher = friendDecl(hasType("X"))
+            and public virtual X (matcher = cxxBaseSpecifier(hasType(
+                                              asString("class X")))
  class X {};
  void y(X &x) { x; X z; }
  typedef int U;
  class Y { friend class X; };
  class Z : public virtual X {};
-
-The matcher expr(hasType(cxxRecordDecl(hasName("X"))))
-matches x and z.
-The matcher varDecl(hasType(cxxRecordDecl(hasName("X"))))
-matches z
-The matcher typedefDecl(hasType(asString("int")))
-matches typedef int U
-The matcher friendDecl(hasType(asString("class X")))
-matches friend class X
-The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType(
-asString("X"))).bind("b"))) matches class Z : public virtual X {},
-with cxxBaseSpecifier(...)
-matching public virtual X.
 
@@ -11645,22 +8744,13 @@

AST Traversal Matchers

template <typename T, typename U> void f(T&& t, U&& u) {} - void foo() { - bool B = false; - f(R, B); - } - -The matcher -templateSpecializationType(forEachTemplateArgument(isExpr(expr().bind("t_arg")))) -matches Matrix<int, R * 2, R * 4> twice, with -expr() matching R * 2 and -R * 4. -The matcher -functionDecl(forEachTemplateArgument(refersToType(qualType().bind("type")))) -matches the specialization of f twice, -with qualType() matching -unsigned and -bool. + bool B = false; + f(R, B); +templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) + matches twice, with expr() matching 'R * 2' and 'R * 4' +functionDecl(forEachTemplateArgument(refersToType(builtinType()))) + matches the specialization f<unsigned, bool> twice, for 'unsigned' + and 'bool' @@ -11673,12 +8763,12 @@

AST Traversal Matchers

void f(); void f() {} void g(); -The matcher functionDecl(hasAnyBody(compoundStmt())) - matches f - and f +functionDecl(hasAnyBody(compoundStmt())) + matches both 'void f();' + and 'void f() {}' with compoundStmt() - matching {} - but does not match void g(); + matching '{}' + but does not match 'void g();' @@ -11690,26 +8780,23 @@

AST Traversal Matchers

Given class X { void f(int x, int y, int z) {} }; - -The matcher cxxMethodDecl(hasAnyParameter(hasName("y"))) - matches f +cxxMethodDecl(hasAnyParameter(hasName("y"))) + matches f(int x, int y, int z) {} with hasAnyParameter(...) matching int y For ObjectiveC, given @interface I - (void) f:(int) y; @end - the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) - matches the declaration of method f with hasParameter +matches the declaration of method f with hasParameter matching y. For blocks, given b = ^(int y) { printf("%d", y) }; - the matcher blockDecl(hasAnyParameter(hasName("y"))) - matches the declaration of the block b with hasParameter +matches the declaration of the block b with hasParameter matching y. @@ -11723,11 +8810,9 @@

AST Traversal Matchers

Given template<typename T> class A {}; A<int> a; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( -hasTypeLoc(loc(asString("int"))))))))) matches A<int> a. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( + hasTypeLoc(loc(asString("int"))))))) + matches `A<int> a`. @@ -11741,19 +8826,15 @@

AST Traversal Matchers

template<> class A<double> {}; A<int> a; - template<typename T> void f() {}; + template<typename T> f() {}; void func() { f<int>(); }; +classTemplateSpecializationDecl(hasAnyTemplateArgument( + refersToType(asString("int")))) + matches the specialization A<int> -The matcher classTemplateSpecializationDecl( - hasAnyTemplateArgument( - refersToType(asString("int")))) -matches class A<int>. - -The matcher -functionDecl(hasAnyTemplateArgument( - refersToType(asString("int")))) -matches the instantiation of f. +functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) + matches the specialization f<int> @@ -11764,22 +8845,20 @@

AST Traversal Matchers

other declarations of the same function or coroutine. Given -void foo() { for (;;) {} -} -The matcher forStmt(hasBody(compoundStmt().bind("body"))) -matches for (;;) {} +forStmt(hasBody(compoundStmt())) + matches 'for (;;) {}' with compoundStmt() - matching {} + matching '{}' Given void f(); void f() {} -The matcher functionDecl(hasBody(compoundStmt().bind("compound"))) -f +functionDecl(hasBody(compoundStmt())) + matches 'void f() {}' with compoundStmt() -matching {} -but does not match void f(); + matching '{}' + but does not match 'void f();' @@ -11794,27 +8873,15 @@

AST Traversal Matchers

explicit S(double); // #2 operator int(); // #3 explicit operator bool(); // #4 - explicit(false) S(bool); // # 7 - explicit(true) S(char); // # 8 - explicit(b) S(float); // # 9 + explicit(false) S(bool) // # 7 + explicit(true) S(char) // # 8 + explicit(b) S(S) // # 9 }; - S(int) -> S<true>; // #5 - explicit S(double) -> S<false>; // #6 - -The matcher -cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) matches -explicit(false) S(bool) and explicit(true) S(char), -but does not match explicit(b) S(float), S(int) or -explicit S(double). -The matcher -cxxConversionDecl(hasExplicitSpecifier(constantExpr())) does not -match operator int() or explicit operator bool(). -Matcher -The matcher -cxxDeductionGuideDecl(hasExplicitSpecifier(declRefExpr())) -matches the implicitly generated deduction guide -auto (float) -> S<b> of the constructor -S(float)}. + S(int) -> S<true> // #5 + explicit S(double) -> S<false> // #6 +cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2. +cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4. +cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6. @@ -11824,18 +8891,15 @@

AST Traversal Matchers

Given class X { void f(int x) {} }; - -The matcher -cxxMethodDecl(hasParameter(0, hasType(asString("int")))) -matches f +cxxMethodDecl(hasParameter(0, hasType(varDecl()))) + matches f(int x) {} with hasParameter(...) -matching int x. + matching int x For ObjectiveC, given @interface I - (void) f:(int) y; @end - -The matcher objcMethodDecl(hasParameter(0, hasName("y"))) +the matcher objcMethodDecl(hasParameter(0, hasName("y"))) matches the declaration of method f with hasParameter matching y. @@ -11847,9 +8911,9 @@

AST Traversal Matchers

Given int f() { return 5; } void g() {} -The matcher functionDecl(hasReturnTypeLoc(loc(asString("int")))) - matches the declaration of f, but not - +functionDecl(hasReturnTypeLoc(loc(asString("int")))) + matches the declaration of `f`, but not `g`. + Matcher<FunctionDecl>hasTemplateArgumentLocunsigned Index, Matcher<TemplateArgumentLoc> InnerMatcher @@ -11861,12 +8925,9 @@

AST Traversal Matchers

template<typename T, typename U> class A {}; A<double, int> b; A<int, double> c; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, -hasTypeLoc(loc(asString("double"))))))))) -matches A<double, int> b, but not double> c}. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, + hasTypeLoc(loc(asString("double"))))))) + matches `A<double, int> b`, but not `A<int, double> c`. @@ -11877,31 +8938,27 @@

AST Traversal Matchers

Given template<typename T, typename U> class A {}; - A<double, int> b; - A<int, double> c; + A<bool, int> b; + A<int, bool> c; template<typename T> void f() {} void func() { f<int>(); }; - -The matcher classTemplateSpecializationDecl(hasTemplateArgument( 1, refersToType(asString("int")))) -matches the specialization class A<double, int>. + matches the specialization A<bool, int> -The matcher functionDecl(hasTemplateArgument(0, - refersToType(asString("int")))) -matches the specialization of f. +functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) + matches the specialization f<int> Matcher<FunctionDecl>returnsMatcher<QualType> InnerMatcher
Matches the return type of a function declaration.
 
-Given
+Given:
   class X { int f() { return 1; } };
-
-The matcher cxxMethodDecl(returns(asString("int")))
-  matches f
+cxxMethodDecl(returns(asString("int")))
+  matches int f() { return 1; }
 
@@ -11909,13 +8966,8 @@

AST Traversal Matchers

Matches the condition expression of an if statement, for loop,
 switch statement or conditional operator.
 
-Given
-void foo() {
+Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   if (true) {}
-}
-
-The matcher ifStmt(hasCondition(cxxBoolLiteral(equals(true))))
-if (true) {}
 
@@ -11923,37 +8975,25 @@

AST Traversal Matchers

Matches the condition variable statement in an if statement.
 
 Given
-struct A {};
-A* GetAPointer();
-void foo() {
   if (A* a = GetAPointer()) {}
-}
-
-The matcher ifStmt(hasConditionVariableStatement(declStmt()))
-if (A* a = GetAPointer()) {}
+hasConditionVariableStatement(...)
+  matches 'A* a = GetAPointer()'.
 
Matcher<IfStmt>hasElseMatcher<Stmt> InnerMatcher
Matches the else-statement of an if statement.
 
-Given
-void foo() {
+Examples matches the if statement
+  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
   if (false) false; else true;
-}
-
-The matcher ifStmt(hasElse(cxxBoolLiteral(equals(true))))
-if (false) false; else true
 
Matcher<IfStmt>hasInitStatementMatcher<Stmt> InnerMatcher
Matches selection statements with initializer.
 
-Given
- struct vec { int* begin(); int* end(); };
- int foobar();
- vec& get_range();
+Given:
  void foo() {
    if (int i = foobar(); i > 0) {}
    switch (int i = foobar(); i) {}
@@ -11964,77 +9004,48 @@ 

AST Traversal Matchers

switch (foobar()) {} for (auto& x : get_range()) {} } - -The matcher ifStmt(hasInitStatement(anything())) - matches the if statement if (int i = foobar(); i > 0) {} - in foo but not if (foobar() > 0) {} in bar. -The matcher switchStmt(hasInitStatement(anything())) - matches the switch statement switch (int i = foobar(); i) {} - in foo but not switch (foobar()) {} in bar. -The matcher cxxForRangeStmt(hasInitStatement(anything())) - matches the range for statement - for (auto& a = get_range(); auto& x : a) {} in foo - but not for (auto& x : get_range()) {} in bar. +ifStmt(hasInitStatement(anything())) + matches the if statement in foo but not in bar. +switchStmt(hasInitStatement(anything())) + matches the switch statement in foo but not in bar. +cxxForRangeStmt(hasInitStatement(anything())) + matches the range for statement in foo but not in bar.
Matcher<IfStmt>hasThenMatcher<Stmt> InnerMatcher
Matches the then-statement of an if statement.
 
-Given
-void foo() {
+Examples matches the if statement
+  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
   if (false) true; else false;
-}
-
-The matcher ifStmt(hasThen(cxxBoolLiteral(equals(true))))
-if (false) true; else false
 
Matcher<ImplicitCastExpr>hasImplicitDestinationTypeMatcher<QualType> InnerMatcher
Matches implicit casts whose destination type matches a given
 matcher.
-
-Given
-  unsigned int a = 0;
-
-The matcher
-implicitCastExpr(hasImplicitDestinationType(
-qualType(isUnsignedInteger()))) matches 0.
 
Matcher<InitListExpr>hasInitunsigned N, Matcher<Expr> InnerMatcher
Matches the n'th item of an initializer list expression.
 
-Given
-  int y = 42;
-  int x{y};
-
-The matcher initListExpr(hasInit(0, expr()))
-matches {y}.
+Example matches y.
+    (matcher = initListExpr(hasInit(0, expr())))
+  int x{y}.
 
Matcher<InitListExpr>hasSyntacticFormMatcher<Expr> InnerMatcher
Matches the syntactic form of init list expressions
 (if expression have it).
-
-Given
-  int a[] = { 1, 2 };
-  struct B { int x, y; };
-  struct B b = { 5, 6 };
-
-
-The matcher
-initListExpr(hasSyntacticForm(expr().bind("syntactic")))
-matches { 1, 2 } and { 5, 6 }.
 
Matcher<InjectedClassNameType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -12044,25 +9055,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -12076,7 +9079,7 @@

AST Traversal Matchers

Matcher<LabelStmt>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -12086,25 +9089,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -12127,13 +9122,9 @@

AST Traversal Matchers

auto f = [x](){}; auto g = [x = 1](){}; } - -The matcher -lambdaExpr(hasAnyCapture( - lambdaCapture(capturesVar(hasName("x"))).bind("capture"))) -matches [x](){} and [x = 1](){}, with -lambdaCapture(capturesVar(hasName("x"))).bind("capture") -matching x and x = 1. +In the matcher +lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))), +capturesVar(hasName("x")) matches `x` and `x = 1`.
@@ -12142,18 +9133,13 @@

AST Traversal Matchers

Given int main() { - int x; - int y; + int x, y; float z; auto f = [=]() { return x + y + z; }; } - -The matcher lambdaExpr(forEachLambdaCapture( - lambdaCapture(capturesVar( - varDecl(hasType(isInteger())).bind("captured"))))) -matches [=]() { return x + y + z; } two times, -with varDecl(hasType(isInteger())) matching -int x and int y. +lambdaExpr(forEachLambdaCapture( + lambdaCapture(capturesVar(varDecl(hasType(isInteger())))))) +will trigger two matches, binding for 'x' and 'y' respectively.
@@ -12165,16 +9151,15 @@

AST Traversal Matchers

int t = 5; auto f = [=](){ return t; }; } - -The matcher lambdaExpr(hasAnyCapture(lambdaCapture())) and -lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("t"))))) - both match [=](){ return t; }. +lambdaExpr(hasAnyCapture(lambdaCapture())) and +lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t"))))) + both match `[=](){ return t; }`. Matcher<MemberExpr>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -12184,25 +9169,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -12224,14 +9201,11 @@

AST Traversal Matchers

int m; int f(X x) { x.m; return m; } }; - - -The matcher memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) -matches x.m, but not m; however, -The matcher memberExpr(hasObjectExpression(hasType(pointsTo( -cxxRecordDecl(hasName("X")))))) -matches m (aka. this->m), but not x.m. + matches `x.m`, but not `m`; however, +memberExpr(hasObjectExpression(hasType(pointsTo( + cxxRecordDecl(hasName("X")))))) + matches `m` (aka. `this->m`), but not `x.m`.
@@ -12240,14 +9214,13 @@

AST Traversal Matchers

given matcher. Given - struct { int first = 0, second = 1; } first, second; - int i = second.first; - int j = first.second; - - -The matcher memberExpr(member(hasName("first"))) -matches second.first -but not + struct { int first, second; } first, second; + int i(second.first); + int j(first.second); +memberExpr(member(hasName("first"))) + matches second.first + but not first.second (because the member name there is "second"). + Matcher<MemberPointerType>pointeeMatcher<Type> @@ -12256,14 +9229,10 @@

AST Traversal Matchers

Given int *a; - const int *b; - int * const c = nullptr; - const float *f; - -The matcher pointerType(pointee(isConstQualified(), isInteger())) -matches const int *, -but does not match int * const -or const float *. + int const *b; + float const *f; +pointerType(pointee(isConstQualified(), isInteger())) + matches "int const *b" Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>, Matcher<PointerType>, Matcher<ReferenceType> @@ -12277,10 +9246,9 @@

AST Traversal Matchers

Given namespace N { template<class T> void f(T t); } template <class T> void g() { using N::f; f(T()); } - -The matcher unresolvedLookupExpr(hasAnyDeclaration( +unresolvedLookupExpr(hasAnyDeclaration( namedDecl(hasUnderlyingDecl(hasName("::N::f"))))) - matches f in g(). + matches the use of f in g() . @@ -12290,29 +9258,14 @@

AST Traversal Matchers

Given struct A { struct B { struct C {}; }; }; A::B::C c; - -The matcher -nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString( -"struct A"))))) matches A::B::. +nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A"))))) + matches "A::" -Matcher<NestedNameSpecifierLoc>locMatcher<NestedNameSpecifier> InnerMatcher -
Matches NestedNameSpecifierLocs for which the given inner
-NestedNameSpecifier-matcher matches.
-
-Given
-  namespace ns {
-    struct A { static void f(); };
-    void A::f() {}
-    void g() { A::f(); }
-  }
-  ns::A a;
-
-
-The matcher nestedNameSpecifierLoc(loc(specifiesType(
-hasDeclaration(namedDecl(hasName("A")))))) matches A::
-twice.
+Matcher<NestedNameSpecifierLoc>locMatcher<NestedNameSpecifier> InnerMatcher
+
Matches NestedNameSpecifierLocs for which the given inner
+NestedNameSpecifier-matcher matches.
 
@@ -12323,10 +9276,9 @@

AST Traversal Matchers

Given struct A { struct B { struct C {}; }; }; A::B::C c; - -The matcher nestedNameSpecifierLoc(specifiesTypeLoc(loc(qualType( +nestedNameSpecifierLoc(specifiesTypeLoc(loc(type( hasDeclaration(cxxRecordDecl(hasName("A"))))))) -matches A:: + matches "A::"
@@ -12336,10 +9288,8 @@

AST Traversal Matchers

Given struct A { struct B { struct C {}; }; }; A::B::C c; - -The matcher -nestedNameSpecifier(hasPrefix(specifiesType(asString( -"struct A")))) matches struct A::B +nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and + matches "A::" @@ -12350,10 +9300,8 @@

AST Traversal Matchers

Given namespace ns { struct A {}; } ns::A a; - -The matcher -nestedNameSpecifier(specifiesNamespace(hasName("ns"))) matches -ns. +nestedNameSpecifier(specifiesNamespace(hasName("ns"))) + matches "ns::" @@ -12364,11 +9312,10 @@

AST Traversal Matchers

Given struct A { struct B { struct C {}; }; }; A::B::C c; - -The matcher nestedNameSpecifier(specifiesType( +nestedNameSpecifier(specifiesType( hasDeclaration(cxxRecordDecl(hasName("A"))) )) -matches A. + matches "A::" @@ -12376,16 +9323,12 @@

AST Traversal Matchers

Matches any clause in an OpenMP directive.
 
 Given
-  void foo() {
+
   #pragma omp parallel
-    ;
   #pragma omp parallel default(none)
-    ;
-  }
 
-
-The matcher ompExecutableDirective(hasAnyClause(anything()))
-matches #pragma omp parallel default(none).
+``ompExecutableDirective(hasAnyClause(anything()))`` matches
+``omp parallel default(none)``.
 
@@ -12396,18 +9339,13 @@

AST Traversal Matchers

If it is, it will never match. Given - void foo() { - #pragma omp parallel - ; - #pragma omp parallel - {} - } + #pragma omp parallel + ; + #pragma omp parallel + {} -The matcher -ompExecutableDirective(hasStructuredBlock(nullStmt().bind("stmt"))) -matches #pragma omp parallel, -with stmtt() matching {}. +``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;`` @@ -12419,29 +9357,22 @@

AST Traversal Matchers

Note that a class is not considered to be derived from itself. Example matches Y, Z, C (Base == hasName("X")) - class X {}; + class X; class Y : public X {}; // directly derived class Z : public Y {}; // indirectly derived typedef X A; typedef A B; class C : public B {}; // derived from a typedef of X - class Foo {}; - typedef Foo Alias; - class Bar : public Alias {}; - // derived from a type that Alias is a typedef of Foo - - -The matcher cxxRecordDecl(isDerivedFrom(hasName("X"))) -matches Y, Z and C. -The matcher cxxRecordDecl(isDerivedFrom(hasName("Foo"))) -matches Bar. +In the following example, Bar matches isDerivedFrom(hasName("X")): + class Foo; + typedef Foo X; + class Bar : public Foo {}; // derived from a type that X is a typedef of In the following example, Bar matches isDerivedFrom(hasName("NSObject")) @interface NSObject @end @interface Bar : NSObject @end - Usable as: Matcher<CXXRecordDecl>, Matcher<ObjCInterfaceDecl> @@ -12452,45 +9383,24 @@

AST Traversal Matchers

Note that a class is not considered to be derived from itself. -Given - class X {}; +Example matches Y, C (Base == hasName("X")) + class X; class Y : public X {}; // directly derived class Z : public Y {}; // indirectly derived typedef X A; typedef A B; class C : public B {}; // derived from a typedef of X -The matcher -cxxRecordDecl(isDirectlyDerivedFrom(namedDecl(hasName("X")))) -matches Y and C (Base == hasName("X") - In the following example, Bar matches isDerivedFrom(hasName("X")): - class Foo {}; + class Foo; typedef Foo X; class Bar : public Foo {}; // derived from a type that X is a typedef of - -The matcher cxxRecordDecl(isDerivedFrom(hasName("X"))) -matches Bar Matcher<ObjCInterfaceDecl>isSameOrDerivedFromMatcher<NamedDecl> Base
Similar to isDerivedFrom(), but also matches classes that directly
 match Base.
-
-Given
-  class X {};
-  class Y : public X {};  // directly derived
-  class Z : public Y {};  // indirectly derived
-  typedef X A;
-  typedef A B;
-  class C : public B {};  // derived from a typedef of X
-
-The matcher
-cxxRecordDecl(isSameOrDerivedFrom(cxxRecordDecl(hasName("X"))),
-isDefinition())
-matches class X {}, class Y : public X {},
-class Z : public Y {} and class C : public B {}.
 
@@ -12499,23 +9409,19 @@

AST Traversal Matchers

given matcher; or 2) if the Obj-C message expression's callee's method declaration matches the given matcher. -Example 1 +Example matches y.x() (matcher = callExpr(callee( + cxxMethodDecl(hasName("x"))))) class Y { public: void x(); }; void z() { Y y; y.x(); } -The matcher callExpr(callee(cxxMethodDecl(hasName("x")))) -matches y.x() +Example 2. Matches [I foo] with +objcMessageExpr(callee(objcMethodDecl(hasName("foo")))) -Example 2 @interface I: NSObject +(void)foo; @end ... [I foo] - -The matcher -objcMessageExpr(callee(objcMethodDecl(hasName("foo")))) -matches [I foo] @@ -12524,19 +9430,17 @@

AST Traversal Matchers

expression, or an ObjC-message-send expression. Given - void x(int, int, int) { int y = 42; x(1, y, 42); } -The matcher -callExpr(hasAnyArgument(ignoringImplicit(declRefExpr()))) matches -x(1, y, 42) with hasAnyArgument(...) + void x(int, int, int) { int y; x(1, y, 42); } +callExpr(hasAnyArgument(declRefExpr())) + matches x(1, y, 42) +with hasAnyArgument(...) matching y For ObjectiveC, given @interface I - (void) f:(int) y; @end void foo(I *i) { [i f:12]; } - -The matcher objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) -matches [i f:12] + matches [i f:12] @@ -12544,11 +9448,9 @@

AST Traversal Matchers

Matches the n'th argument of a call expression or a constructor
 call expression.
 
-Given
+Example matches y in x(y)
+    (matcher = callExpr(hasArgument(0, declRefExpr())))
   void x(int) { int y; x(y); }
-The matcher callExpr(hasArgument(0, declRefExpr().bind("arg")))
-matches x(y),
-with declRefExpr() matching y.
 
@@ -12556,26 +9458,23 @@

AST Traversal Matchers

Matches if the Objective-C message is sent to an instance,
 and the inner matcher matches on that instance.
 
-Given
+For example the method call in
   NSString *x = @"hello";
   [x containsString:@"h"];
-
-The matcher
+is matched by
 objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
-matches [x containsString:@"h"];
 
Matcher<ObjCMessageExpr>hasReceiverTypeMatcher<QualType> InnerMatcher
Matches on the receiver of an ObjectiveC Message expression.
 
+Example
+matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
+matches the [webView ...] message invocation.
   NSString *webViewJavaScript = ...
   UIWebView *webView = ...
   [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
-
-The matcher objCMessageExpr(hasReceiverType(asString("UIWebView
-*"))) matches
-[webViewstringByEvaluatingJavaScriptFromString:webViewJavascript];
 
@@ -12587,26 +9486,23 @@

AST Traversal Matchers

Given class X { void f(int x, int y, int z) {} }; - -The matcher cxxMethodDecl(hasAnyParameter(hasName("y"))) - matches f +cxxMethodDecl(hasAnyParameter(hasName("y"))) + matches f(int x, int y, int z) {} with hasAnyParameter(...) matching int y For ObjectiveC, given @interface I - (void) f:(int) y; @end - the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) - matches the declaration of method f with hasParameter +matches the declaration of method f with hasParameter matching y. For blocks, given b = ^(int y) { printf("%d", y) }; - the matcher blockDecl(hasAnyParameter(hasName("y"))) - matches the declaration of the block b with hasParameter +matches the declaration of the block b with hasParameter matching y. @@ -12617,18 +9513,15 @@

AST Traversal Matchers

Given class X { void f(int x) {} }; - -The matcher -cxxMethodDecl(hasParameter(0, hasType(asString("int")))) -matches f +cxxMethodDecl(hasParameter(0, hasType(varDecl()))) + matches f(int x) {} with hasParameter(...) -matching int x. + matching int x For ObjectiveC, given @interface I - (void) f:(int) y; @end - -The matcher objcMethodDecl(hasParameter(0, hasName("y"))) +the matcher objcMethodDecl(hasParameter(0, hasName("y"))) matches the declaration of method f with hasParameter matching y. @@ -12637,26 +9530,19 @@

AST Traversal Matchers

Matcher<ObjCPropertyDecl>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -12673,23 +9559,14 @@ 

AST Traversal Matchers

Matches if the cast's source expression
 or opaque value's source expression matches the given matcher.
 
-Given
- struct URL { URL(const char*); };
- URL url = "a string";
-
-The matcher castExpr(hasSourceExpression(cxxConstructExpr()))
-matches "a string".
+Example 1: matches "a string"
+(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
+class URL { URL(string); };
+URL url = "a string";
 
-Given
-void foo(bool b) {
-  int a = b ?: 1;
-}
-
-The matcher
-opaqueValueExpr(hasSourceExpression(
-              implicitCastExpr(has(
-                implicitCastExpr(has(declRefExpr()))))))
-matches b twice, for the conditiona and the true expression.
+Example 2: matches 'b' (matcher =
+opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
+int a = b ?: 1;
 
@@ -12704,11 +9581,9 @@

AST Traversal Matchers

foo(t); bar(t); } - -The matcher unresolvedLookupExpr(hasAnyDeclaration( +unresolvedLookupExpr(hasAnyDeclaration( functionTemplateDecl(hasName("foo")))) -matches foo in foo(t); -but does not match bar in bar(t); + matches foo in foo(t); but not bar in bar(t);
@@ -12719,10 +9594,8 @@

AST Traversal Matchers

int (*ptr_to_array)[4]; int (*ptr_to_func)(int); -The matcher -varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) - matches ptr_to_func but not - ptr_to_array. +varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches +ptr_to_func but not ptr_to_array. Usable as: Matcher<ParenType> @@ -12734,8 +9607,8 @@

AST Traversal Matchers

Given int* x; -The matcher pointerTypeLoc(hasPointeeLoc(loc(asString("int")))) - matches int*. +pointerTypeLoc(hasPointeeLoc(loc(asString("int")))) + matches `int*`. @@ -12745,14 +9618,10 @@

AST Traversal Matchers

Given int *a; - const int *b; - int * const c = nullptr; - const float *f; - -The matcher pointerType(pointee(isConstQualified(), isInteger())) -matches const int *, -but does not match int * const -or const float *. + int const *b; + float const *f; +pointerType(pointee(isConstQualified(), isInteger())) + matches "int const *b" Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>, Matcher<PointerType>, Matcher<ReferenceType> @@ -12762,22 +9631,19 @@

AST Traversal Matchers

Matcher<QualType>hasCanonicalTypeMatcher<QualType> InnerMatcher
Matches QualTypes whose canonical type matches InnerMatcher.
 
-Given
+Given:
   typedef int &int_ref;
   int a;
   int_ref b = a;
 
-The matcher varDecl(hasType(qualType(referenceType())))
-does not match int_ref b = a,
-but the matcher
-varDecl(hasType(qualType(hasCanonicalType(referenceType()))))
-does match int_ref b = a.
+varDecl(hasType(qualType(referenceType()))))) will not match the
+declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
 
Matcher<QualType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -12787,25 +9653,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -12823,56 +9681,30 @@

AST Traversal Matchers

Given void (*fp)(void); The matcher -varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) -matches fp. + varDecl(hasType(pointerType(pointee(ignoringParens(functionType()))))) +would match the declaration for fp.
Matcher<QualType>pointsToMatcher<Decl> InnerMatcher -
Matches if the matched type is a pointer type and the pointee type
-  matches the specified matcher.
-Overloaded to match the pointee type's declaration.
-
-Given
-  class Y { public: void x(); };
-  void z() { Y *y; y->x(); }
-
-The matcher cxxMemberCallExpr(on(hasType(pointsTo(
-     cxxRecordDecl(hasName("Y"))))))
-matches y->x()
+
Overloaded to match the pointee type's declaration.
 
Matcher<QualType>pointsToMatcher<QualType> InnerMatcher
Matches if the matched type is a pointer type and the pointee type
-  matches the specified matcher.
+matches the specified matcher.
 
-Given
+Example matches y->x()
+  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
+     cxxRecordDecl(hasName("Y")))))))
   class Y { public: void x(); };
   void z() { Y *y; y->x(); }
-
-The matcher cxxMemberCallExpr(on(hasType(pointsTo(
-     qualType()))))
-matches y->x()
 
Matcher<QualType>referencesMatcher<Decl> InnerMatcher -
Matches if the matched type is a reference type and the referenced
-type matches the specified matcher.
-Overloaded to match the referenced type's declaration.
-
-Given
-  class X {
-    void a(X b) {
-      X &x = b;
-      const X &y = b;
-    }
-  };
-
-The matcher
-varDecl(hasType(references(cxxRecordDecl(hasName("X"))))) matches
-X &x = b and const X &y = b.
+
Overloaded to match the referenced type's declaration.
 
@@ -12880,17 +9712,14 @@

AST Traversal Matchers

Matches if the matched type is a reference type and the referenced
 type matches the specified matcher.
 
-Given
+Example matches X &x and const X &y
+    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
   class X {
     void a(X b) {
       X &x = b;
       const X &y = b;
     }
   };
-
-The matcher
-varDecl(hasType(references(qualType()))) matches
-X &x = b and const X &y = b.
 
@@ -12899,18 +9728,16 @@

AST Traversal Matchers

`InnerMatcher`. Given - int* const x = nullptr; - const int y = 0; - - -The matcher qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc())) -matches the type int* of the variable declaration but -not
+ int* const x; + const int y; +qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc())) + matches the `TypeLoc` of the variable declaration of `x`, but not `y`. +
Matcher<RecordType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -12920,25 +9747,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -12957,10 +9776,8 @@

AST Traversal Matchers

Given int x = 3; int& xx = x; - - -The matcher referenceTypeLoc(hasReferentLoc(loc(asString("int")))) - matches int&. +referenceTypeLoc(hasReferentLoc(loc(asString("int")))) + matches `int&`.
@@ -12970,14 +9787,10 @@

AST Traversal Matchers

Given int *a; - const int *b; - int * const c = nullptr; - const float *f; - -The matcher pointerType(pointee(isConstQualified(), isInteger())) -matches const int *, -but does not match int * const -or const float *. + int const *b; + float const *f; +pointerType(pointee(isConstQualified(), isInteger())) + matches "int const *b" Usable as: Matcher<BlockPointerType>, Matcher<MemberPointerType>, Matcher<PointerType>, Matcher<ReferenceType> @@ -12988,13 +9801,11 @@

AST Traversal Matchers

Matches the return value expression of a return statement
 
 Given
-  int foo(int a, int b) {
-    return a + b;
-  }
-The matcher
-returnStmt(hasReturnValue(binaryOperator().bind("op"))) matches
-return a + b, with binaryOperator() matching
-a + b.
+  return a + b;
+hasReturnValue(binaryOperator())
+  matches 'return a + b'
+with binaryOperator()
+  matching 'a + b'
 
@@ -13003,25 +9814,17 @@

AST Traversal Matchers

a given matcher. Also matches StmtExprs that have CompoundStmt as children. Given -void foo() { { {}; 1+2; } } -The matcher -compoundStmt(hasAnySubstatement(compoundStmt().bind("compound"))) -{ {}; 1+2; } and { { {}; 1+2; } } + { {}; 1+2; } +hasAnySubstatement(compoundStmt()) + matches '{ {}; 1+2; }' with compoundStmt() -matching {} and { {}; 1+2; }. + matching '{}' Matcher<Stmt>alignOfExprMatcher<UnaryExprOrTypeTraitExpr> InnerMatcher
Same as unaryExprOrTypeTraitExpr, but only matching
 alignof.
-
-Given
-  int align = alignof(int);
-
-
-The matcher alignOfExpr(expr())
-matches alignof(int).
 
@@ -13029,30 +9832,26 @@

AST Traversal Matchers

Matches declaration of the function, method, or block the statement
 belongs to.
 
-Given
-struct F {
-  F& operator=(const F& other) {
-    []() { return 42 == 42; };
-    return *this;
-  }
-};
-
-The matcher returnStmt(forFunction(hasName("operator=")))
-matches return *this
-but does not match return 42 == 42.
+Given:
+F& operator=(const F& o) {
+  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; });
+  return *this;
+}
+returnStmt(forCallable(functionDecl(hasName("operator="))))
+  matches 'return *this'
+  but does not match 'return v > 0'
 
-Given
-void foo {
+Given:
+-(void) foo {
   int x = 1;
   dispatch_sync(queue, ^{ int y = 2; });
 }
-
-The matcher declStmt(forCallable(objcMethodDecl()))
-matches int x = 1
-but does not match int y = 2.
-The matcher declStmt(forCallable(blockDecl()))
-matches int y = 2
-but does not match int x = 1.
+declStmt(forCallable(objcMethodDecl()))
+  matches 'int x = 1'
+  but does not match 'int y = 2'.
+whereas declStmt(forCallable(blockDecl()))
+  matches 'int y = 2'
+  but does not match 'int x = 1'.
 
@@ -13061,34 +9860,23 @@

AST Traversal Matchers

Deprecated. Use forCallable() to correctly handle the situation when the declaration is not a function (but a block or an Objective-C method). -The matcher forFunction() not only fails to take non-functions -into account but also may match the wrong declaration in their presence. - -Given - struct F { - F& operator=(const F& other) { - []() { return 42 == 42; }; - return *this; - } - }; - +forFunction() not only fails to take non-functions into account but also +may match the wrong declaration in their presence. -The matcher returnStmt(forFunction(hasName("operator="))) -matches return *this -but does not match return 42 == 42. +Given: +F& operator=(const F& o) { + std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v > 0; }); + return *this; +} +returnStmt(forFunction(hasName("operator="))) + matches 'return *this' + but does not match 'return v > 0' Matcher<Stmt>sizeOfExprMatcher<UnaryExprOrTypeTraitExpr> InnerMatcher
Same as unaryExprOrTypeTraitExpr, but only matching
 sizeof.
-
-Given
-  struct S { double x; double y; };
-  int size = sizeof(struct S);
-
-The matcher sizeOfExpr(expr())
-matches sizeof(struct S).
 
@@ -13102,9 +9890,7 @@

AST Traversal Matchers

int i; double j = F(i); - -The matcher substTemplateTypeParmType(hasReplacementType(type())) -matches int. +substTemplateTypeParmType(hasReplacementType(type())) matches int @@ -13113,18 +9899,11 @@

AST Traversal Matchers

statement. This matcher may produce multiple matches. Given - void foo() { - switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } - } -The matcher -switchStmt(forEachSwitchCase(caseStmt().bind("c"))) -matches four times, matching -switch (1) { case 1: case 2: default: switch (2) { case 3: -case 4: ; } } and -switch (2) { case 3: case 4: ; }, with -caseStmt() matching each of case 1:, -case 2:, case 3: -and case 4:. + switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } } +switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s") + matches four times, with "c" binding each of "case 1:", "case 2:", +"case 3:" and "case 4:", and "s" respectively binding "switch (1)", +"switch (1)", "switch (2)" and "switch (2)". @@ -13132,23 +9911,15 @@

AST Traversal Matchers

Matches the condition expression of an if statement, for loop,
 switch statement or conditional operator.
 
-Given
-void foo() {
+Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   if (true) {}
-}
-
-The matcher ifStmt(hasCondition(cxxBoolLiteral(equals(true))))
-if (true) {}
 
Matcher<SwitchStmt>hasInitStatementMatcher<Stmt> InnerMatcher
Matches selection statements with initializer.
 
-Given
- struct vec { int* begin(); int* end(); };
- int foobar();
- vec& get_range();
+Given:
  void foo() {
    if (int i = foobar(); i > 0) {}
    switch (int i = foobar(); i) {}
@@ -13159,23 +9930,18 @@ 

AST Traversal Matchers

switch (foobar()) {} for (auto& x : get_range()) {} } - -The matcher ifStmt(hasInitStatement(anything())) - matches the if statement if (int i = foobar(); i > 0) {} - in foo but not if (foobar() > 0) {} in bar. -The matcher switchStmt(hasInitStatement(anything())) - matches the switch statement switch (int i = foobar(); i) {} - in foo but not switch (foobar()) {} in bar. -The matcher cxxForRangeStmt(hasInitStatement(anything())) - matches the range for statement - for (auto& a = get_range(); auto& x : a) {} in foo - but not for (auto& x : get_range()) {} in bar. +ifStmt(hasInitStatement(anything())) + matches the if statement in foo but not in bar. +switchStmt(hasInitStatement(anything())) + matches the switch statement in foo but not in bar. +cxxForRangeStmt(hasInitStatement(anything())) + matches the range for statement in foo but not in bar.
Matcher<TagType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -13185,25 +9951,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -13218,26 +9976,19 @@

AST Traversal Matchers

Matcher<TemplateArgumentLoc>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -13257,13 +10008,10 @@ 

AST Traversal Matchers

struct B { int next; }; template<int(B::*next_ptr)> struct A {}; A<&B::next> a; - -The matcher templateSpecializationType(hasAnyTemplateArgument( - isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")).bind("next"))))))) -matches the specialization A<&struct B::next> -with fieldDecl(hasName("next")) matching -B::next. + isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next")))))))) + matches the specialization A<&B::next> with fieldDecl(...) matching + B::next
@@ -13275,13 +10023,10 @@

AST Traversal Matchers

struct B { int next; }; template<int(B::*next_ptr)> struct A {}; A<&B::next> a; - -The matcher classTemplateSpecializationDecl(hasAnyTemplateArgument( - refersToDeclaration(fieldDecl(hasName("next")).bind("next")))) -matches the specialization struct A<&B::next> -with fieldDecl(hasName("next")) matching -B::next. + refersToDeclaration(fieldDecl(hasName("next"))))) + matches the specialization A<&B::next> with fieldDecl(...) matching + B::next
@@ -13291,12 +10036,9 @@

AST Traversal Matchers

Given template<int T> struct C {}; C<42> c; - -The matcher classTemplateSpecializationDecl( +classTemplateSpecializationDecl( hasAnyTemplateArgument(refersToIntegralType(asString("int")))) -matches the implicitly declared specialization -struct C<42> from the instantiation for the type of the -variable c . + matches the implicit instantiation of C in C<42>. @@ -13307,11 +10049,9 @@

AST Traversal Matchers

template<template <typename> class S> class X {}; template<typename T> class Y {}; X<Y> xi; - -The matcher classTemplateSpecializationDecl(hasAnyTemplateArgument( - refersToTemplate(templateName()))) -matches the specialization class X<Y> + refersToTemplate(templateName()))) + matches the specialization X<Y> @@ -13322,11 +10062,9 @@

AST Traversal Matchers

struct X {}; template<typename T> struct A {}; A<X> a; - -The matcher classTemplateSpecializationDecl(hasAnyTemplateArgument(refersToType( - recordType(hasDeclaration(recordDecl(hasName("X"))))))) -matches the specialization struct A<struct X>. + recordType(hasDeclaration(recordDecl(hasName("X"))))))) +matches the specialization of struct A generated by A<X>. @@ -13339,11 +10077,9 @@

AST Traversal Matchers

Given template<typename T> class A {}; A<int> a; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( -hasTypeLoc(loc(asString("int"))))))))) matches A<int> a. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( + hasTypeLoc(loc(asString("int"))))))) + matches `A<int> a`. @@ -13356,12 +10092,9 @@

AST Traversal Matchers

template<typename T, typename U> class A {}; A<double, int> b; A<int, double> c; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, -hasTypeLoc(loc(asString("double"))))))))) -matches A<double, int> b, but not double> c}. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, + hasTypeLoc(loc(asString("double"))))))) + matches `A<double, int> b`, but not `A<int, double> c`. @@ -13381,22 +10114,13 @@

AST Traversal Matchers

template <typename T, typename U> void f(T&& t, U&& u) {} - void foo() { - bool B = false; - f(R, B); - } - -The matcher -templateSpecializationType(forEachTemplateArgument(isExpr(expr().bind("t_arg")))) -matches Matrix<int, R * 2, R * 4> twice, with -expr() matching R * 2 and -R * 4. -The matcher -functionDecl(forEachTemplateArgument(refersToType(qualType().bind("type")))) -matches the specialization of f twice, -with qualType() matching -unsigned and -bool. + bool B = false; + f(R, B); +templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) + matches twice, with expr() matching 'R * 2' and 'R * 4' +functionDecl(forEachTemplateArgument(refersToType(builtinType()))) + matches the specialization f<unsigned, bool> twice, for 'unsigned' + and 'bool' @@ -13410,25 +10134,21 @@

AST Traversal Matchers

template<> class A<double> {}; A<int> a; - template<typename T> void f() {}; + template<typename T> f() {}; void func() { f<int>(); }; +classTemplateSpecializationDecl(hasAnyTemplateArgument( + refersToType(asString("int")))) + matches the specialization A<int> -The matcher classTemplateSpecializationDecl( - hasAnyTemplateArgument( - refersToType(asString("int")))) -matches class A<int>. - -The matcher -functionDecl(hasAnyTemplateArgument( - refersToType(asString("int")))) -matches the instantiation of f. +functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) + matches the specialization f<int> Matcher<TemplateSpecializationType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -13438,25 +10158,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -13475,26 +10187,23 @@

AST Traversal Matchers

Given template<typename T, typename U> class A {}; - A<double, int> b; - A<int, double> c; + A<bool, int> b; + A<int, bool> c; template<typename T> void f() {} void func() { f<int>(); }; - -The matcher classTemplateSpecializationDecl(hasTemplateArgument( 1, refersToType(asString("int")))) -matches the specialization class A<double, int>. + matches the specialization A<bool, int> -The matcher functionDecl(hasTemplateArgument(0, - refersToType(asString("int")))) -matches the specialization of f. +functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) + matches the specialization f<int>
Matcher<TemplateTypeParmType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -13504,25 +10213,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -13537,37 +10238,25 @@

AST Traversal Matchers

Matcher<TypeLoc>locMatcher<QualType> InnerMatcher
Matches TypeLocs for which the given inner
 QualType-matcher matches.
-
-  int a = 10;
-
-The matcher typeLoc(loc(qualType(isInteger())))
-matches the int of a .
 
Matcher<TypedefNameDecl>hasTypeLocMatcher<TypeLoc> Inner
Matches if the type location of a node matches the inner matcher.
 
-Given
+Examples:
   int x;
-The matcher declaratorDecl(hasTypeLoc(loc(asString("int"))))
-matches int x.
-
-Given
-struct point { point(double, double); };
-point p = point(1.0, -1.0);
+declaratorDecl(hasTypeLoc(loc(asString("int"))))
+  matches int x
 
-The matcher
-cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("point"))))
-matches point(1.0, -1.0).
+auto x = int(3);
+cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
+  matches int(3)
 
-Given
 struct Foo { Foo(int, int); };
-Foo x = Foo(1, 2);
-
-The matcher cxxTemporaryObjectExpr(hasTypeLoc(
-                          loc(asString("Foo"))))
-matches Foo(1, 2).
+auto x = Foo(1, 2);
+cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
+  matches Foo(1, 2)
 
 Usable as: Matcher<BlockDecl>, Matcher<CXXBaseSpecifier>,
   Matcher<CXXCtorInitializer>, Matcher<CXXFunctionalCastExpr>,
@@ -13584,31 +10273,23 @@ 

AST Traversal Matchers

Matches if the expression's or declaration's type matches a type
 matcher.
 
-Exmaple
+Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
+            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
+            and U (matcher = typedefDecl(hasType(asString("int")))
+            and friend class X (matcher = friendDecl(hasType("X"))
+            and public virtual X (matcher = cxxBaseSpecifier(hasType(
+                                              asString("class X")))
  class X {};
  void y(X &x) { x; X z; }
  typedef int U;
  class Y { friend class X; };
  class Z : public virtual X {};
-
-The matcher expr(hasType(cxxRecordDecl(hasName("X"))))
-matches x and z.
-The matcher varDecl(hasType(cxxRecordDecl(hasName("X"))))
-matches z
-The matcher typedefDecl(hasType(asString("int")))
-matches typedef int U
-The matcher friendDecl(hasType(asString("class X")))
-matches friend class X
-The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType(
-asString("X"))).bind("b"))) matches class Z : public virtual X {},
-with cxxBaseSpecifier(...)
-matching public virtual X.
 
Matcher<TypedefType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -13618,25 +10299,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -13655,11 +10328,8 @@

AST Traversal Matchers

For example, in: class A {}; using B = A; - B b; - -The matcher -varDecl(hasType(hasUnqualifiedDesugaredType(recordType()))) -matches B b. +The matcher type(hasUnqualifiedDesugaredType(recordType())) matches +both B and A.
@@ -13668,23 +10338,17 @@

AST Traversal Matchers

Given int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c); - -The matcher -unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))) -matches sizeof(a) and alignof(c) +unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int")) + matches sizeof(a) and alignof(c)
Matcher<UnaryOperator>hasUnaryOperandMatcher<Expr> InnerMatcher
Matches if the operand of a unary operator matches.
 
-void foo() {
-  !true;
-}
-
-The matcher
-unaryOperator(hasUnaryOperand(cxxBoolLiteral(equals(true))))
-matches !true.
+Example matches true (matcher = hasUnaryOperand(
+                                  cxxBoolLiteral(equals(true))))
+  !true
 
@@ -13698,20 +10362,17 @@

AST Traversal Matchers

int m; int f(X x) { x.m; return m; } }; - - -The matcher memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X"))))) -matches x.m, but not m; however, -The matcher memberExpr(hasObjectExpression(hasType(pointsTo( -cxxRecordDecl(hasName("X")))))) -matches m (aka. this->m), but not x.m. + matches `x.m`, but not `m`; however, +memberExpr(hasObjectExpression(hasType(pointsTo( + cxxRecordDecl(hasName("X")))))) + matches `m` (aka. `this->m`), but not `x.m`.
Matcher<UnresolvedUsingType>hasDeclarationMatcher<Decl> InnerMatcher
Matches a node if the declaration associated with that node
-  matches the given matcher.
+matches the given matcher.
 
 The associated declaration is:
 - for type nodes, the declaration of the underlying type
@@ -13721,25 +10382,17 @@ 

AST Traversal Matchers

- for CXXNewExpr, the declaration of the operator new - for ObjCIvarExpr, the declaration of the ivar -Given +For type nodes, hasDeclaration will generally match the declaration of the +sugared type. Given class X {}; typedef X Y; Y y; - -For type nodes, hasDeclaration will generally match the declaration of the -sugared type, i.e., the matcher -varDecl(hasType(qualType(hasDeclaration(decl().bind("d"))))), -matches Y y, with -the matcher decl() matching -typedef X Y;. -A common use case is to match the underlying, desugared type. +in varDecl(hasType(hasDeclaration(decl()))) the decl will match the +typedefDecl. A common use case is to match the underlying, desugared type. This can be achieved by using the hasUnqualifiedDesugaredType matcher: -varDecl(hasType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(decl().bind("d")))))) -matches Y y. -In this matcher, the matcher decl() will match the -CXXRecordDecl -class X {};. + varDecl(hasType(hasUnqualifiedDesugaredType( + recordType(hasDeclaration(decl()))))) +In this matcher, the decl will match the CXXRecordDecl of class X. Usable as: Matcher<AddrLabelExpr>, Matcher<CallExpr>, Matcher<CXXConstructExpr>, Matcher<CXXNewExpr>, Matcher<DeclRefExpr>, @@ -13759,12 +10412,8 @@

AST Traversal Matchers

namespace X { int a; void b(); } using X::a; using X::b; - -The matcher usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl()))) - matches using X::b - but not X::a} -
+ matches using X::b but not using X::a Matcher<UsingType>hasUnderlyingTypeMatcher<Type> @@ -13773,11 +10422,8 @@

AST Traversal Matchers

Given decltype(1) a = 1; decltype(2.0) b = 2.0; - - -The matcher decltypeType(hasUnderlyingType(isInteger())) -matches the type decltype(1) of the variable -declaration of a . +decltypeType(hasUnderlyingType(isInteger())) + matches the type of "a" Usable as: Matcher<DecltypeType>, Matcher<UsingType> @@ -13787,20 +10433,18 @@

AST Traversal Matchers

Matches if a node refers to a declaration through a specific
 using shadow declaration.
 
-Given
+Examples:
   namespace a { int f(); }
   using a::f;
   int x = f();
-
-The matcher declRefExpr(throughUsingDecl(anything()))
-matches f
+declRefExpr(throughUsingDecl(anything()))
+  matches f
 
   namespace a { class X{}; }
   using a::X;
   X x;
-
-The matcher typeLoc(loc(usingType(throughUsingDecl(anything()))))
-matches X
+typeLoc(loc(usingType(throughUsingDecl(anything()))))
+  matches X
 
 Usable as: Matcher<DeclRefExpr>, Matcher<UsingType>
 
@@ -13816,31 +10460,21 @@

AST Traversal Matchers

X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the declaration of x. +Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X"))))) + and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X"))))) + and friend class X (matcher = friendDecl(hasType("X")) + and public virtual X (matcher = cxxBaseSpecifier(hasType( + cxxRecordDecl(hasName("X")))) class X {}; void y(X &x) { x; X z; } class Y { friend class X; }; class Z : public virtual X {}; -The matcher expr(hasType(cxxRecordDecl(hasName("X")))) -matches x and z. -The matcher varDecl(hasType(cxxRecordDecl(hasName("X")))) -matches z. -The matcher friendDecl(hasType(asString("class X"))) -matches friend class X. -The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType( -asString("X"))).bind("b"))) matches -class Z : public virtual X {}, -with cxxBaseSpecifier(...) -matching public virtual X. - -Given +Example matches class Derived +(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base")))))) class Base {}; class Derived : Base {}; -The matcher -cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))) -matches class Derived : Base {}. - Usable as: Matcher<Expr>, Matcher<FriendDecl>, Matcher<ValueDecl>, Matcher<CXXBaseSpecifier> @@ -13850,25 +10484,17 @@

AST Traversal Matchers

Matches if the expression's or declaration's type matches a type
 matcher.
 
-Exmaple
+Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
+            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
+            and U (matcher = typedefDecl(hasType(asString("int")))
+            and friend class X (matcher = friendDecl(hasType("X"))
+            and public virtual X (matcher = cxxBaseSpecifier(hasType(
+                                              asString("class X")))
  class X {};
  void y(X &x) { x; X z; }
  typedef int U;
  class Y { friend class X; };
  class Z : public virtual X {};
-
-The matcher expr(hasType(cxxRecordDecl(hasName("X"))))
-matches x and z.
-The matcher varDecl(hasType(cxxRecordDecl(hasName("X"))))
-matches z
-The matcher typedefDecl(hasType(asString("int")))
-matches typedef int U
-The matcher friendDecl(hasType(asString("class X")))
-matches friend class X
-The matcher cxxRecordDecl(hasAnyBase(cxxBaseSpecifier(hasType(
-asString("X"))).bind("b"))) matches class Z : public virtual X {},
-with cxxBaseSpecifier(...)
-matching public virtual X.
 
@@ -13876,13 +10502,9 @@

AST Traversal Matchers

Matches a variable declaration that has an initializer expression
 that matches the given matcher.
 
-Given
-  int y() { return 0; }
-  void foo() {
-    int x = y();
-  }
-The matcher varDecl(hasInitializer(callExpr()))
-matches x
+Example matches x (matcher = varDecl(hasInitializer(callExpr())))
+  bool y() { return true; }
+  bool x = y();
 
@@ -13902,22 +10524,13 @@

AST Traversal Matchers

template <typename T, typename U> void f(T&& t, U&& u) {} - void foo() { - bool B = false; - f(R, B); - } - -The matcher -templateSpecializationType(forEachTemplateArgument(isExpr(expr().bind("t_arg")))) -matches Matrix<int, R * 2, R * 4> twice, with -expr() matching R * 2 and -R * 4. -The matcher -functionDecl(forEachTemplateArgument(refersToType(qualType().bind("type")))) -matches the specialization of f twice, -with qualType() matching -unsigned and -bool. + bool B = false; + f(R, B); +templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) + matches twice, with expr() matching 'R * 2' and 'R * 4' +functionDecl(forEachTemplateArgument(refersToType(builtinType()))) + matches the specialization f<unsigned, bool> twice, for 'unsigned' + and 'bool' @@ -13930,11 +10543,9 @@

AST Traversal Matchers

Given template<typename T> class A {}; A<int> a; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( -hasTypeLoc(loc(asString("int"))))))))) matches A<int> a. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc( + hasTypeLoc(loc(asString("int"))))))) + matches `A<int> a`. @@ -13948,19 +10559,15 @@

AST Traversal Matchers

template<> class A<double> {}; A<int> a; - template<typename T> void f() {}; + template<typename T> f() {}; void func() { f<int>(); }; +classTemplateSpecializationDecl(hasAnyTemplateArgument( + refersToType(asString("int")))) + matches the specialization A<int> -The matcher classTemplateSpecializationDecl( - hasAnyTemplateArgument( - refersToType(asString("int")))) -matches class A<int>. - -The matcher -functionDecl(hasAnyTemplateArgument( - refersToType(asString("int")))) -matches the instantiation of f. +functionDecl(hasAnyTemplateArgument(refersToType(asString("int")))) + matches the specialization f<int> @@ -13973,12 +10580,9 @@

AST Traversal Matchers

template<typename T, typename U> class A {}; A<double, int> b; A<int, double> c; - -The matcher -varDecl(hasTypeLoc(elaboratedTypeLoc(hasNamedTypeLoc( -templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, -hasTypeLoc(loc(asString("double"))))))))) -matches A<double, int> b, but not double> c}. +varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0, + hasTypeLoc(loc(asString("double"))))))) + matches `A<double, int> b`, but not `A<int, double> c`. @@ -13989,20 +10593,17 @@

AST Traversal Matchers

Given template<typename T, typename U> class A {}; - A<double, int> b; - A<int, double> c; + A<bool, int> b; + A<int, bool> c; template<typename T> void f() {} void func() { f<int>(); }; - -The matcher classTemplateSpecializationDecl(hasTemplateArgument( 1, refersToType(asString("int")))) -matches the specialization class A<double, int>. + matches the specialization A<bool, int> -The matcher functionDecl(hasTemplateArgument(0, - refersToType(asString("int")))) -matches the specialization of f. +functionDecl(hasTemplateArgument(0, refersToType(asString("int")))) + matches the specialization f<int> @@ -14014,10 +10615,9 @@

AST Traversal Matchers

void f(int b) { int a[b]; } -The matcher variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to( varDecl(hasName("b"))))))) -matches int[b] + matches "int a[b]" @@ -14028,22 +10628,20 @@

AST Traversal Matchers

other declarations of the same function or coroutine. Given -void foo() { for (;;) {} -} -The matcher forStmt(hasBody(compoundStmt().bind("body"))) -matches for (;;) {} +forStmt(hasBody(compoundStmt())) + matches 'for (;;) {}' with compoundStmt() - matching {} + matching '{}' Given void f(); void f() {} -The matcher functionDecl(hasBody(compoundStmt().bind("compound"))) -f +functionDecl(hasBody(compoundStmt())) + matches 'void f() {}' with compoundStmt() -matching {} -but does not match void f(); + matching '{}' + but does not match 'void f();' @@ -14051,13 +10649,8 @@

AST Traversal Matchers

Matches the condition expression of an if statement, for loop,
 switch statement or conditional operator.
 
-Given
-void foo() {
+Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
   if (true) {}
-}
-
-The matcher ifStmt(hasCondition(cxxBoolLiteral(equals(true))))
-if (true) {}
 
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index f9ab34a3f3cf3..a8830a5658c7d 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -858,9 +858,6 @@ AST Matchers - Ensure ``hasName`` matches template specializations across inline namespaces, making `matchesNodeFullSlow` and `matchesNodeFullFast` consistent. -- The examples in the AST matcher reference are now tested and additional - examples and descriptions were added. - clang-format ------------ diff --git a/clang/docs/doxygen.cfg.in b/clang/docs/doxygen.cfg.in index 1d1deb0fcfb07..251afb179b205 100644 --- a/clang/docs/doxygen.cfg.in +++ b/clang/docs/doxygen.cfg.in @@ -220,14 +220,7 @@ TAB_SIZE = 2 # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. -ALIASES += compile_args{1}="Compiled with \1.\n" -ALIASES += matcher{1}="\1" -ALIASES += matcher{2$}="\2" -ALIASES += match{1}="\1" -ALIASES += match{2$}="\2" -ALIASES += nomatch{1}="\1" -ALIASES += header{1}="\code" -ALIASES += endheader="\endcode" +ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" diff --git a/clang/docs/tools/dump_ast_matchers.py b/clang/docs/tools/dump_ast_matchers.py index a3feac8728c65..705ff0d4d4098 100755 --- a/clang/docs/tools/dump_ast_matchers.py +++ b/clang/docs/tools/dump_ast_matchers.py @@ -100,72 +100,15 @@ def extract_result_types(comment): comment = m.group(1) -def find_next_closing_rbrace( - data: str, start_pos: int, braces_to_be_matched: int -) -> int: - """Finds the location of the closing rbrace '}' inside of data.""" - """'start_pos' should be one past the opening lbrace and braces_to_be_matched is initialized with 0""" - next_lbrace = data.find("{", start_pos) - next_rbrace = data.find("}", start_pos) - if next_lbrace != -1: - if next_lbrace < next_rbrace: - return find_next_closing_rbrace( - data, next_lbrace + 1, braces_to_be_matched + 1 - ) - if braces_to_be_matched == 0: - return next_rbrace - return find_next_closing_rbrace(data, next_rbrace + 1, braces_to_be_matched - 1) - - if braces_to_be_matched > 0: - return find_next_closing_rbrace(data, next_rbrace + 1, braces_to_be_matched - 1) - - return next_rbrace - - def strip_doxygen(comment): """Returns the given comment without \-escaped words.""" + # If there is only a doxygen keyword in the line, delete the whole line. + comment = re.sub(r"^\\[^\s]+\n", r"", comment, flags=re.M) + # If there is a doxygen \see command, change the \see prefix into "See also:". # FIXME: it would be better to turn this into a link to the target instead. comment = re.sub(r"\\see", r"See also:", comment) - commands: list[str] = [ - "\\compile_args{", - "\\matcher{", - "\\match{", - "\\nomatch{", - ] - - for command in commands: - delete_command = command == "\\compile_args{" - command_begin_loc = comment.find(command) - while command_begin_loc != -1: - command_end_loc = command_begin_loc + len(command) - end_brace_loc = find_next_closing_rbrace(comment, command_end_loc + 1, 0) - if end_brace_loc == -1: - print("found unmatched {") - command_begin_loc = comment.find(command, command_end_loc) - continue - - if delete_command: - comment = comment[0:command_begin_loc] + comment[end_brace_loc + 1 :] - command_begin_loc = comment.find(command, command_begin_loc) - continue - - tag_seperator_loc = comment.find("$", command_end_loc) - if tag_seperator_loc != -1 and tag_seperator_loc < end_brace_loc: - command_end_loc = tag_seperator_loc + 1 - - comment = ( - comment[0:command_begin_loc] - + comment[command_end_loc:end_brace_loc] - + comment[end_brace_loc + 1 :] - ) - - command_begin_loc = comment.find(command, command_begin_loc) - - # If there is only a doxygen keyword in the line, delete the whole line. - comment = re.sub(r"^\\[^\s]+\n", r"", comment, flags=re.M) - # Delete the doxygen command and the following whitespace. comment = re.sub(r"\\[^\s]+\s+", r"", comment) return comment @@ -248,9 +191,8 @@ def act_on_decl(declaration, comment, allowed_types): definition. """ if declaration.strip(): - if re.match( - r"^\s?(#|namespace|using|template using|})", declaration - ): + + if re.match(r"^\s?(#|namespace|using|template using|})", declaration): return # Node matchers are defined by writing: diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 1898d53a50328..4bcaa953a61af 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -39,158 +39,6 @@ // See ASTMatchFinder.h for how to use the generated matchers to run over // an AST. // -// The doxygen comments on matchers are used to: -// - create the doxygen documentation -// - get information in the editor via signature help and goto definition -// - generate the AST matcher reference html file -// - test the documentation using a special syntax -// -// Test Annotations: -// -// The automatic testing uses doxygen commands (aliases) to extract the -// relevant information about an example of using a matcher from the -// documentation. -// -// \header{a.h} -// \endheader <- zero or more header -// -// \code -// int a = 42; -// \endcode -// \compile_args{-std=c++,c23-or-later} <- optional, the std flag supports -// std ranges and -// whole languages -// -// \matcher{expr()} <- one or more matchers in succession -// \matcher{integerLiteral()} <- one or more matchers in succession -// both matcher will have to match the -// following matches -// \match{42} <- one or more matches in succession -// -// \matcher{varDecl()} <- new matcher resets the context, the above -// \match will not count for this new -// matcher(-group) -// \match{int a = 42} <- only applies to the previous matcher (not to the -// previous case) -// -// -// The above block can be repeated inside a doxygen command for multiple code -// examples for a single matcher. The test generation script will only look for -// these annotations and ignore anything else like `\c` or the sentences where -// these annotations are embedded into: `The matcher \matcher{expr()} matches -// the number \match{42}.`. -// -// Language Grammar: -// -// [] denotes an optional, and <> denotes user-input -// -// compile_args j:= \compile_args{[;]} -// matcher_tag_key ::= type -// match_tag_key ::= type || std || count || sub -// matcher_tags ::= [matcher_tag_key=;]matcher_tag_key= -// match_tags ::= [match_tag_key=;]match_tag_key= -// matcher ::= \matcher{[matcher_tags$]} -// matchers ::= [matcher] matcher -// match ::= \match{[match_tags$]} -// matches ::= [match] match -// case ::= matchers matches -// cases ::= [case] case -// header-block ::= \header{} \endheader -// code-block ::= \code \endcode -// testcase ::= code-block [compile_args] cases -// -// Language Standard Versions: -// -// The 'std' tag and '\compile_args' support specifying a specific language -// version, a whole language and all of its versions, and thresholds (implies -// ranges). Multiple arguments are passed with a ',' separator. For a language -// and version to execute a tested matcher, it has to match the specified -// '\compile_args' for the code, and the 'std' tag for the matcher. Predicates -// for the 'std' compiler flag are used with disjunction between languages -// (e.g. 'c || c++') and conjunction for all predicates specific to each -// language (e.g. 'c++11-or-later && c++23-or-earlier'). -// -// Examples: -// - `c` all available versions of C -// - `c++11` only C++11 -// - `c++11-or-later` C++11 or later -// - `c++11-or-earlier` C++11 or earlier -// - `c++11-or-later,c++23-or-earlier,c` all of C and C++ between 11 and -// 23 (inclusive) -// - `c++11-23,c` same as above -// -// Tags -// -// `type`: -// **Match types** are used to select where the string that is used to check if -// a node matches comes from. Available: `code`, `name`, `typestr`, -// `typeofstr`. The default is `code`. -// -// - `code`: Forwards to `tooling::fixit::getText(...)` and should be the -// preferred way to show what matches. -// - `name`: Casts the match to a `NamedDecl` and returns the result of -// `getNameAsString`. Useful when the matched AST node is not easy to spell -// out (`code` type), e.g., namespaces or classes with many members. -// - `typestr`: Returns the result of `QualType::getAsString` for the type -// derived from `Type` (otherwise, if it is derived from `Decl`, recurses with -// `Node->getTypeForDecl()`) -// -// **Matcher types** are used to mark matchers as sub-matcher with 'sub' or as -// deactivated using 'none'. Testing sub-matcher is not implemented. -// -// `count`: -// Specifying a 'count=n' on a match will result in a test that requires that -// the specified match will be matched n times. Default is 1. -// -// `std`: -// A match allows specifying if it matches only in specific language versions. -// This may be needed when the AST differs between language versions. -// -// `sub`: -// The `sub` tag on a `\match` will indicate that the match is for a node of a -// bound sub-matcher. E.g., `\matcher{expr(expr().bind("inner"))}` has a -// sub-matcher that binds to `inner`, which is the value for the `sub` tag of -// the expected match for the sub-matcher `\match{sub=inner$...}`. Currently, -// sub-matchers are not tested in any way. -// -// -// What if ...? -// -// ... I want to add a matcher? -// -// Add a doxygen comment to the matcher with a code example, corresponding -// matchers and matches, that shows what the matcher is supposed to do. Specify -// the compile arguments/supported languages if required, and run `ninja -// check-clang-unit` to test the documentation. -// -// ... the example I wrote is wrong? -// -// The test-failure output of the generated test file will provide information -// about -// - where the generated test file is located -// - which line in `ASTMatcher.h` the example is from -// - which matches were: found, not-(yet)-found, expected -// - in case of an unexpected match: what the node looks like using the -// different `type`s -// - the language version and if the test ran with a windows `-target` flag -// (also in failure summary) -// -// ... I don't adhere to the required order of the syntax? -// -// The script will diagnose any found issues, such as `matcher is missing an -// example` with a `file:line:` prefix, which should provide enough information -// about the issue. -// -// ... the script diagnoses a false-positive issue with a doxygen comment? -// -// It hopefully shouldn't, but if you, e.g., added some non-matcher code and -// documented it with doxygen, then the script will consider that as a matcher -// documentation. As a result, the script will print that it detected a -// mismatch between the actual and the expected number of failures. If the -// diagnostic truly is a false-positive, change the -// `expected_failure_statistics` at the top of the -// `generate_ast_matcher_doc_tests.py` file. -// //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_ASTMATCHERS_ASTMATCHERS_H @@ -312,13 +160,13 @@ using AttrMatcher = internal::Matcher; /// additional constraint. This will often be used with an explicit conversion /// to an \c internal::Matcher<> type such as \c TypeMatcher. /// -/// Given +/// Example: \c DeclarationMatcher(anything()) matches all declarations, e.g., /// \code +/// "int* p" and "void f()" in /// int* p; /// void f(); /// \endcode -/// The matcher \matcher{decl(anything())} -/// matches \match{int* p} and \match{void f()}. +/// /// Usable as: Any Matcher inline internal::TrueMatcher anything() { return internal::TrueMatcher(); } @@ -327,13 +175,12 @@ inline internal::TrueMatcher anything() { return internal::TrueMatcher(); } /// Given /// \code /// int X; -/// namespace NS { int Y; } +/// namespace NS { +/// int Y; +/// } // namespace NS /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{namedDecl(hasDeclContext(translationUnitDecl()))} -/// matches \match{int X} and \match{namespace NS { int Y; }}, -/// but does not match \nomatch{int Y} because its decl-context is the -/// namespace \c NS . +/// decl(hasDeclContext(translationUnitDecl())) +/// matches "int X", but not "int Y". extern const internal::VariadicDynCastAllOfMatcher translationUnitDecl; @@ -344,10 +191,8 @@ extern const internal::VariadicDynCastAllOfMatcher /// typedef int X; /// using Y = int; /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{typedefDecl()} -/// matches \match{typedef int X}, -/// but does not match \nomatch{using Y = int}. +/// typedefDecl() +/// matches "typedef int X", but not "using Y = int" extern const internal::VariadicDynCastAllOfMatcher typedefDecl; @@ -358,9 +203,8 @@ extern const internal::VariadicDynCastAllOfMatcher /// typedef int X; /// using Y = int; /// \endcode -/// \compile_args{-std=c++11-or-later} -/// The matcher \matcher{typedefNameDecl()} -/// matches \match{typedef int X} and \match{using Y = int}. +/// typedefNameDecl() +/// matches "typedef int X" and "using Y = int" extern const internal::VariadicDynCastAllOfMatcher typedefNameDecl; @@ -371,44 +215,33 @@ extern const internal::VariadicDynCastAllOfMatcher /// typedef int X; /// using Y = int; /// \endcode -/// \compile_args{-std=c++11-or-later} -/// The matcher \matcher{typeAliasDecl()} -/// matches \match{using Y = int}, -/// but does not match \nomatch{typedef int X}. +/// typeAliasDecl() +/// matches "using Y = int", but not "typedef int X" extern const internal::VariadicDynCastAllOfMatcher typeAliasDecl; /// Matches type alias template declarations. /// -/// Given +/// typeAliasTemplateDecl() matches /// \code -/// template struct X {}; -/// template using Y = X; +/// template +/// using Y = X; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher \matcher{typeAliasTemplateDecl()} -/// matches \match{template using Y = X}. extern const internal::VariadicDynCastAllOfMatcher typeAliasTemplateDecl; /// Matches AST nodes that were expanded within the main-file. /// -/// Given the header \c Y.h -/// \header{Y.h} -/// #pragma once -/// typedef int my_header_int; -/// \endheader -/// and the source file +/// Example matches X but not Y +/// (matcher = cxxRecordDecl(isExpansionInMainFile()) /// \code -/// #include "Y.h" -/// typedef int my_main_file_int; -/// my_main_file_int a = 0; -/// my_header_int b = 1; +/// #include +/// class X {}; +/// \endcode +/// Y.h: +/// \code +/// class Y {}; /// \endcode -/// -/// The matcher \matcher{typedefDecl(isExpansionInMainFile())} -/// matches \match{typedef int my_main_file_int}, -/// but does not match \nomatch{typedef int my_header_int}. /// /// Usable as: Matcher, Matcher, Matcher AST_POLYMORPHIC_MATCHER(isExpansionInMainFile, @@ -420,21 +253,16 @@ AST_POLYMORPHIC_MATCHER(isExpansionInMainFile, /// Matches AST nodes that were expanded within system-header-files. /// -/// Given the header \c SystemHeader.h -/// \header{system_include/SystemHeader.h} -/// #pragma once -/// int header(); -/// \endheader -/// and the source code +/// Example matches Y but not X +/// (matcher = cxxRecordDecl(isExpansionInSystemHeader()) /// \code /// #include -/// static int main_file(); +/// class X {}; +/// \endcode +/// SystemHeader.h: +/// \code +/// class Y {}; /// \endcode -/// \compile_args{-isystemsystem_include/} -/// -/// The matcher \matcher{type=none$functionDecl(isExpansionInSystemHeader())} -/// matches \match{int header()}, -/// but does not match \nomatch{static int main_file()}. /// /// Usable as: Matcher, Matcher, Matcher AST_POLYMORPHIC_MATCHER(isExpansionInSystemHeader, @@ -450,31 +278,16 @@ AST_POLYMORPHIC_MATCHER(isExpansionInSystemHeader, /// Matches AST nodes that were expanded within files whose name is /// partially matching a given regex. /// -/// Given the headers \c Y.h -/// \header{Y.h} -/// #pragma once -/// typedef int my_y_int; -/// \endheader -/// and \c X.h -/// \header{X.h} -/// #pragma once -/// typedef int my_x_int; -/// \endheader -/// and the source code -/// \code -/// #include "X.h" -/// #include "Y.h" -/// typedef int my_main_file_int; -/// my_main_file_int a = 0; -/// my_x_int b = 1; -/// my_y_int c = 2; +/// Example matches Y but not X +/// (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*")) +/// \code +/// #include "ASTMatcher.h" +/// class X {}; +/// \endcode +/// ASTMatcher.h: +/// \code +/// class Y {}; /// \endcode -/// -/// The matcher -/// \matcher{type=none$typedefDecl(isExpansionInFileMatching("Y.h"))} -/// matches \match{typedef int my_y_int}, -/// but does not match \nomatch{typedef int my_main_file_int} or -/// \nomatch{typedef int my_x_int}. /// /// Usable as: Matcher, Matcher, Matcher AST_POLYMORPHIC_MATCHER_REGEX(isExpansionInFileMatching, @@ -500,17 +313,6 @@ AST_POLYMORPHIC_MATCHER_REGEX(isExpansionInFileMatching, /// Does not match if only part of the statement is expanded from that macro or /// if different parts of the statement are expanded from different /// appearances of the macro. -/// -/// Given -/// \code -/// #define A 0 -/// #define B A -/// int c = B; -/// \endcode -/// -/// The matcher \matcher{integerLiteral(isExpandedFromMacro("A"))} -/// matches the literal expanded at the initializer \match{B} of the variable -/// \c c . AST_POLYMORPHIC_MATCHER_P(isExpandedFromMacro, AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, Stmt, TypeLoc), std::string, MacroName) { @@ -528,50 +330,35 @@ AST_POLYMORPHIC_MATCHER_P(isExpandedFromMacro, /// Matches declarations. /// -/// Given +/// Examples matches \c X, \c C, and the friend declaration inside \c C; /// \code /// void X(); /// class C { -/// friend void X(); +/// friend X; /// }; /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{decl()} -/// matches \match{void X()} once, \match{type=name;count=2$C} -/// twice, once for the definition and once for the implicit class declaration, -/// and \match{count=2$friend void X()} twice, once for the declaration of the -/// friend, and once for the redeclaration of the function itself. extern const internal::VariadicAllOfMatcher decl; /// Matches decomposition-declarations. /// -/// Given +/// Examples matches the declaration node with \c foo and \c bar, but not +/// \c number. +/// (matcher = declStmt(has(decompositionDecl()))) +/// /// \code -/// struct pair { int x; int y; }; -/// pair make(int, int); /// int number = 42; -/// auto [foo, bar] = make(42, 42); +/// auto [foo, bar] = std::make_pair{42, 42}; /// \endcode -/// \compile_args{-std=c++17-or-later} -/// The matcher \matcher{decompositionDecl()} -/// matches \match{auto [foo, bar] = make(42, 42)}, -/// but does not match \nomatch{type=name$number}. extern const internal::VariadicDynCastAllOfMatcher decompositionDecl; /// Matches binding declarations +/// Example matches \c foo and \c bar +/// (matcher = bindingDecl() /// -/// Given /// \code -/// struct pair { int x; int y; }; -/// pair make(int, int); -/// void f() { -/// auto [foo, bar] = make(42, 42); -/// } +/// auto [foo, bar] = std::make_pair{42, 42}; /// \endcode -/// \compile_args{-std=c++17-or-later} -/// The matcher \matcher{bindingDecl()} -/// matches \match{type=name$foo} and \match{type=name$bar}. extern const internal::VariadicDynCastAllOfMatcher bindingDecl; @@ -581,41 +368,33 @@ extern const internal::VariadicDynCastAllOfMatcher /// \code /// extern "C" {} /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{linkageSpecDecl()} -/// matches \match{extern "C" {}}. +/// linkageSpecDecl() +/// matches "extern "C" {}" extern const internal::VariadicDynCastAllOfMatcher linkageSpecDecl; /// Matches a declaration of anything that could have a name. /// /// Example matches \c X, \c S, the anonymous union type, \c i, and \c U; -/// Given /// \code /// typedef int X; -/// struct S { union { int i; } U; }; -/// \endcode -/// The matcher \matcher{namedDecl()} -/// matches \match{typedef int X}, -/// \match{std=c$struct S { union { int i; } U; }}, \match{int i}, -/// the unnamed union\match{type=name$} and the variable -/// \match{union { int i; } U}, -/// with \match{type=name;count=2;std=c++$S} matching twice in C++. -/// Once for the implicit class declaration and once for the declaration itself. +/// struct S { +/// union { +/// int i; +/// } U; +/// }; +/// \endcode extern const internal::VariadicDynCastAllOfMatcher namedDecl; /// Matches a declaration of label. /// /// Given /// \code -/// void bar(); -/// void foo() { -/// goto FOO; -/// FOO: bar(); -/// } +/// goto FOO; +/// FOO: bar(); /// \endcode -/// The matcher \matcher{type=none$labelDecl()} -/// matches \match{FOO: bar()}. +/// labelDecl() +/// matches 'FOO:' extern const internal::VariadicDynCastAllOfMatcher labelDecl; /// Matches a declaration of a namespace. @@ -625,9 +404,8 @@ extern const internal::VariadicDynCastAllOfMatcher labelDecl; /// namespace {} /// namespace test {} /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{namespaceDecl()} -/// matches \match{namespace {}} and \match{namespace test {}}. +/// namespaceDecl() +/// matches "namespace {}" and "namespace test {}" extern const internal::VariadicDynCastAllOfMatcher namespaceDecl; @@ -638,53 +416,38 @@ extern const internal::VariadicDynCastAllOfMatcher /// namespace test {} /// namespace alias = ::test; /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{namespaceAliasDecl()} -/// matches \match{namespace alias = ::test}, -/// but does not match \nomatch{namespace test {}}. +/// namespaceAliasDecl() +/// matches "namespace alias" but not "namespace test" extern const internal::VariadicDynCastAllOfMatcher namespaceAliasDecl; /// Matches class, struct, and union declarations. /// -/// Given +/// Example matches \c X, \c Z, \c U, and \c S /// \code /// class X; /// template class Z {}; /// struct S {}; /// union U {}; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher \matcher{recordDecl()} -/// matches \match{class X} once, and the rest of the declared records twice, -/// once for their written definition and once for their implicit declaration: -/// \match{type=name;count=2$Z}, \match{type=name;count=2$S} and -/// \match{type=name;count=2$U}. extern const internal::VariadicDynCastAllOfMatcher recordDecl; /// Matches C++ class declarations. /// -/// Given +/// Example matches \c X, \c Z /// \code /// class X; /// template class Z {}; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher \matcher{cxxRecordDecl()} -/// matches \match{class X} once, and \match{type=name;count=2$Z} twice, -/// once for the written definition and once for the implicit declaration. extern const internal::VariadicDynCastAllOfMatcher cxxRecordDecl; /// Matches C++ class template declarations. /// -/// Given +/// Example matches \c Z /// \code /// template class Z {}; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher \matcher{classTemplateDecl()} -/// matches \match{template class Z {}}. extern const internal::VariadicDynCastAllOfMatcher classTemplateDecl; @@ -696,10 +459,8 @@ extern const internal::VariadicDynCastAllOfMatcher /// template<> class A {}; /// A a; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher \matcher{classTemplateSpecializationDecl()} -/// matches \match{type=typestr$class A} -/// and \match{type=typestr$class A}. +/// classTemplateSpecializationDecl() +/// matches the specializations \c A and \c A extern const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplateSpecializationDecl> classTemplateSpecializationDecl; @@ -711,15 +472,14 @@ extern const internal::VariadicDynCastAllOfMatcher< /// template /// class A {}; /// -/// template class A {}; +/// template +/// class A {}; /// /// template<> /// class A {}; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher \matcher{classTemplatePartialSpecializationDecl()} -/// matches \match{template class A {}}, -/// but does not match \nomatch{A}. +/// classTemplatePartialSpecializationDecl() +/// matches the specialization \c A but not \c A extern const internal::VariadicDynCastAllOfMatcher< Decl, ClassTemplatePartialSpecializationDecl> classTemplatePartialSpecializationDecl; @@ -731,9 +491,8 @@ extern const internal::VariadicDynCastAllOfMatcher< /// \code /// class X { int y; }; /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{declaratorDecl()} -/// matches \match{int y}. +/// declaratorDecl() +/// matches \c int y. extern const internal::VariadicDynCastAllOfMatcher declaratorDecl; @@ -743,8 +502,8 @@ extern const internal::VariadicDynCastAllOfMatcher /// \code /// void f(int x); /// \endcode -/// The matcher \matcher{parmVarDecl()} -/// matches \match{int x}. +/// parmVarDecl() +/// matches \c int x. extern const internal::VariadicDynCastAllOfMatcher parmVarDecl; @@ -757,36 +516,29 @@ extern const internal::VariadicDynCastAllOfMatcher /// int a; /// }; /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{accessSpecDecl()} -/// matches \match{public:}. +/// accessSpecDecl() +/// matches 'public:' extern const internal::VariadicDynCastAllOfMatcher accessSpecDecl; /// Matches class bases. /// -/// Given +/// Examples matches \c public virtual B. /// \code /// class B {}; -/// class C : public B {}; +/// class C : public virtual B {}; /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{cxxRecordDecl(hasDirectBase(cxxBaseSpecifier()))} -/// matches \match{class C : public B {}}. extern const internal::VariadicAllOfMatcher cxxBaseSpecifier; /// Matches constructor initializers. /// -/// Given +/// Examples matches \c i(42). /// \code /// class C { /// C() : i(42) {} /// int i; /// }; /// \endcode -/// \compile_args{-std=c++} -/// The matcher \matcher{cxxCtorInitializer()} -/// matches \match{i(42)}. extern const internal::VariadicAllOfMatcher cxxCtorInitializer; @@ -797,10 +549,8 @@ extern const internal::VariadicAllOfMatcher /// template struct C {}; /// C c; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher -/// \matcher{templateSpecializationType(hasAnyTemplateArgument(templateArgument()))} -/// matches \match{type=typestr$C}. +/// templateArgument() +/// matches 'int' in C. extern const internal::VariadicAllOfMatcher templateArgument; /// Matches template arguments (with location info). @@ -810,9 +560,8 @@ extern const internal::VariadicAllOfMatcher templateArgument; /// template struct C {}; /// C c; /// \endcode -/// \compile_args{-fno-delayed-template-parsing;-std=c++} -/// The matcher \matcher{templateArgumentLoc()} -/// matches \match{int} in C. +/// templateArgumentLoc() +/// matches 'int' in C. extern const internal::VariadicAllOfMatcher templateArgumentLoc; @@ -820,15 +569,11 @@ extern const internal::VariadicAllOfMatcher /// /// Given /// \code -/// template