xref: /openbsd-src/gnu/llvm/clang/docs/LibASTMatchersReference.html (revision 5a38ef86d0b61900239c7913d24a05e7b88a58f0)
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20span.mono { font-family: monospace; }
21
22.traverse_compare, .traverse_compare td, .traverse_compare th {
23  border: 1px solid black;
24  border-collapse: collapse;
25}
26</style>
27<script type="text/javascript">
28function toggle(id) {
29  if (!id) return;
30  row = document.getElementById(id);
31  if (row.style.display != 'table-cell')
32    row.style.display = 'table-cell';
33  else
34    row.style.display = 'none';
35}
36</script>
37</head>
38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39
40<!--#include virtual="../menu.html.incl"-->
41
42<div id="content">
43
44<h1>AST Matcher Reference</h1>
45
46<p>This document shows all currently implemented matchers. The matchers are grouped
47by category and node type they match. You can click on matcher names to show the
48matcher's source documentation.</p>
49
50<p>There are three different basic categories of matchers:
51<ul>
52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55</ul>
56</p>
57
58<p>Within each category the matchers are ordered by node type they match on.
59Note that if a matcher can match multiple node types, it will appear
60multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
61find all matchers that can be used to match on Stmt nodes.</p>
62
63<p>The exception to that rule are matchers that can match on any node. Those
64are marked with a * and are listed in the beginning of each category.</p>
65
66<p>Note that the categorization of matchers is a great help when you combine
67them into matcher expressions. You will usually want to form matcher expressions
68that read like english sentences by alternating between node matchers and
69narrowing or traversal matchers, like this:
70<pre>
71recordDecl(hasDescendant(
72    ifStmt(hasTrueExpression(
73        expr(hasDescendant(
74            ifStmt()))))))
75</pre>
76</p>
77
78<!-- ======================================================================= -->
79<h2 id="traverse-mode">Traverse Mode</h2>
80<!-- ======================================================================= -->
81
82<p>The default mode of operation of AST Matchers visits all nodes in the AST,
83even if they are not spelled in the source. This is
84<span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
85that explicitly traverse or ignore implicit nodes, such as parentheses
86surrounding an expression or expressions with cleanups.  These implicit
87nodes are not always obvious from the syntax of the source code, and so this
88mode requires careful consideration and testing to get the desired behavior
89from an AST matcher.
90</p>
91
92<p>In addition, because template instantiations are matched in the default mode,
93transformations can be accidentally made to template declarations. Finally,
94because implicit nodes are matched by default, transformations can be made on
95entirely incorrect places in the code.</p>
96
97<p>For these reasons, it is possible to ignore AST nodes which are not spelled
98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99mode. This is likely to be far less error-prone for users who are not already
100very familiar with where implicit nodes appear in the AST. It is also likely
101to be less error-prone for experienced AST users, as difficult cases do not
102need to be encountered and matcher expressions adjusted for these cases.</p>
103
104<p>In clang-query, the mode can be changed with
105<pre>
106set traversal IgnoreUnlessSpelledInSource
107</pre>
108</p>
109This affects both matchers and AST dump output in results.
110
111<p>When using the C++ API such as in clang-tidy checks, the
112<span class="mono">traverse()</span> matcher is used to set the mode:
113<pre>
114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115  returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116  ), this);
117</pre>
118</p>
119<p>The following table compares the <span class="mono">AsIs</span> mode with
120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121
122<table class="traverse_compare">
123<tr>
124<th></th>
125<th><span class="mono">AsIs</span></th>
126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127</tr>
128<tr>
129  <td>AST dump of <span class="mono">func1</span>:
130<pre>
131struct B {
132  B(int);
133};
134
135B func1() { return 42; }
136</pre>
137
138  </td>
139  <td>
140C++98 dialect:
141<pre>
142FunctionDecl
143`-CompoundStmt
144  `-ReturnStmt
145    `-ExprWithCleanups
146      `-CXXConstructExpr
147        `-MaterializeTemporaryExpr
148          `-ImplicitCastExpr
149            `-ImplicitCastExpr
150              `-CXXConstructExpr
151                `-IntegerLiteral 'int' 42
152</pre>
153C++11, C++14 dialect:
154<pre>
155FunctionDecl
156`-CompoundStmt
157  `-ReturnStmt
158    `-ExprWithCleanups
159      `-CXXConstructExpr
160        `-MaterializeTemporaryExpr
161          `-ImplicitCastExpr
162            `-CXXConstructExpr
163              `-IntegerLiteral 'int' 42
164</pre>
165C++17, C++20 dialect:
166<pre>
167FunctionDecl
168`-CompoundStmt
169  `-ReturnStmt
170    `-ImplicitCastExpr
171      `-CXXConstructExpr
172        `-IntegerLiteral 'int' 42
173</pre>
174</td>
175  <td>
176All dialects:
177    <pre>
178FunctionDecl
179`-CompoundStmt
180  `-ReturnStmt
181    `-IntegerLiteral 'int' 42
182</pre></td>
183</tr>
184
185<tr>
186<td>Matcher for returned <span class="mono">42</span>:
187<pre>
188struct B {
189  B(int);
190};
191
192B func1() { return 42; }
193</pre>
194
195  </td>
196  <td>
197All dialects:
198<pre>
199returnStmt(hasReturnValue(
200    ignoringImplicit(
201        ignoringElidableConstructorCall(
202            ignoringImplicit(
203                cxxConstructExpr(hasArgument(0,
204                    ignoringImplicit(
205                        integerLiteral().bind("returnVal")
206                        )
207                    ))
208                )
209            )
210        )
211    ))
212</pre></td>
213  <td>
214All dialects:
215<pre>
216returnStmt(hasReturnValue(
217    integerLiteral().bind("returnVal")
218))
219</pre></td>
220</tr>
221<tr>
222<td>Match result for
223<pre>implicitCastExpr()</pre>
224given:
225<pre>
226struct B {
227  B(int);
228};
229
230B func1() { return 42; }
231</pre>
232
233</td>
234<td>
235Match found.</td>
236  <td>
237No match.</td>
238</tr>
239<tr>
240  <td>Match result for:
241<pre>
242cxxConstructorDecl(
243  isCopyConstructor()
244  ).bind("prepend_explicit")
245</pre>
246given:
247<pre>
248struct Other {};
249struct Copyable {
250  Other m_o;
251  Copyable();
252};
253</pre>
254</td>
255<td>
256Match found. Insertion produces incorrect output:
257<pre>
258struct Other {};
259struct explicit Copyable {
260  Other m_o;
261  Copyable();
262};
263</pre>
264</td>
265<td>
266No match found. Incorrect replacement not possible.
267</td>
268</tr>
269<tr>
270  <td>Replacement of <span class="mono">begin()</span>
271    with <span class="mono">cbegin()</span>:
272<pre>
273cxxMemberCallExpr(
274  on(ConstContainerExpr),
275  callee(cxxMethodDecl(hasName("begin")))
276  ).bind("replace_with_cbegin")
277</pre>
278given:
279<pre>
280void foo() {
281  const Container c;
282  c.begin();
283
284  for (auto i : c) {
285  }
286}
287</pre>
288</td>
289<td>
2902 matches found. Replacement produces incorrect output:
291<pre>
292void foo() {
293  const Container c;
294  c.cbegin();
295
296  for (auto i :.cbegin() c) {
297  }
298}
299</pre>
300</td>
301<td>
3021 match found. Replacement produces correct output:
303<pre>
304void foo() {
305  const Container c;
306  c.cbegin();
307
308  for (auto i : c) {
309  }
310}
311</pre>
312</td>
313</tr>
314<tr>
315  <td>Replacement of <span class="mono">int</span> member
316    with <span class="mono">safe_int</span>:
317<pre>
318fieldDecl(
319  hasType(asString("int"))
320  ).bind("use_safe_int")
321</pre>
322given:
323<pre>
324struct S {
325  int m_i;
326};
327
328template &lt;typename T&gt; struct TemplStruct {
329  TemplStruct() {}
330  ~TemplStruct() {}
331
332private:
333  T m_t;
334};
335
336void instantiate() { TemplStruct&lt;int&gt; ti; }
337</pre>
338</td>
339<td>
3402 matches found. Replacement produces incorrect output:
341<pre>
342struct S {
343  safe_int m_i;
344};
345
346template &lt;typename T&gt; struct TemplStruct {
347  TemplStruct() {}
348  ~TemplStruct() {}
349
350private:
351  safe_int m_t;
352};
353
354void instantiate() { TemplStruct&lt;int&gt; ti; }
355</pre>
356</td>
357<td>
3581 match found. Replacement produces correct output:
359<pre>
360struct S {
361  safe_int m_i;
362};
363
364template &lt;typename T&gt; struct TemplStruct {
365  TemplStruct() {}
366  ~TemplStruct() {}
367
368private:
369  T m_t;
370};
371
372void instantiate() { TemplStruct&lt;int&gt; ti; }
373</pre>
374</td>
375</tr>
376<tr>
377  <td>Add prefix to member initializer
378<pre>
379cxxCtorInitializer(
380  forField(fieldDecl())
381  ).bind("add_prefix")
382</pre>
383given:
384<pre>
385struct Simple {};
386
387struct Record {
388  Record() : i(42) {}
389private:
390  int i;
391  Simple s;
392};
393</pre>
394</td>
395<td>
3962 matches found. Replacement produces incorrect output:
397<pre>
398struct Simple {};
399
400struct Record {
401  m_Record() : m_i(42) {}
402private:
403  int i;
404  Simple s;
405};
406</pre>
407</td>
408<td>
4091 match found. Replacement produces correct output:
410<pre>
411struct Simple {};
412
413struct Record {
414  Record() : m_i(42) {}
415private:
416  int i;
417  Simple s;
418};
419</pre>
420</td>
421</tr>
422<tr>
423  <td>Ignored default arguments
424<pre>
425callExpr(
426  callee(functionDecl(
427    hasName("hasDefaultArg")
428    )),
429  argumentCountIs(1)
430  ).bind("add_prefix")
431</pre>
432given:
433<pre>
434void hasDefaultArg(int i, int j = 0) {}
435void callDefaultArg() { hasDefaultArg(42); }
436</pre>
437</td>
438<td>
439No match.
440</td>
441<td>
4421 match found.
443</td>
444</tr>
445<tr>
446  <td>Lambda fields
447<pre>
448fieldDecl(
449  hasType(asString("int"))
450  ).bind("make_safe")
451</pre>
452given:
453<pre>
454struct S {
455  int m_i;
456};
457
458void func() {
459  int a = 0;
460  int c = 0;
461
462  auto l = [a, b = c](int d) { int e = d; };
463  l(43);
464}
465</pre>
466</td>
467<td>
4682 matches found. Replacement produces incorrect output:
469<pre>
470struct S {
471  safe_int m_i;
472};
473
474void func() {
475  int a = 0;
476  int c = 0;
477
478  auto l = [safe_a, safe_b = c](int d) { int e = d; };
479  l(43);
480}
481</pre>
482</td>
483<td>
4841 match found. Replacement produces correct output:
485<pre>
486struct S {
487  safe_int m_i;
488};
489
490void func() {
491  int a = 0;
492  int c = 0;
493
494  auto l = [a, b = c](int d) { int e = d; };
495  l(43);
496}
497</pre>
498</td>
499
500</tr>
501
502
503
504
505
506<tr>
507  <td>Rewritten binary operators
508<pre>
509binaryOperator(
510  hasOperatorName("&lt;"),
511  hasRHS(hasDescendant(integerLiteral(equals(0))))
512  )
513</pre>
514given:
515<pre>
516#include &lt;compare&gt;
517
518class HasSpaceship {
519public:
520   int x;
521   bool operator==(const HasSpaceship&) const = default;
522   std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523};
524
525bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526   return a < b;
527}
528</pre>
529</td>
530<td>
5311 match found.
532
533<pre>
534   return a < b;
535          ^~~~~
536</pre>
537
538</td>
539<td>
540No match found.
541</td>
542</tr>
543</table>
544
545<!-- ======================================================================= -->
546<h2 id="decl-matchers">Node Matchers</h2>
547<!-- ======================================================================= -->
548
549<p>Node matchers are at the core of matcher expressions - they specify the type
550of node that is expected. Every match expression starts with a node matcher,
551which can then be further refined with a narrowing or traversal matcher. All
552traversal matchers take node matchers as their arguments.</p>
553
554<p>For convenience, all node matchers take an arbitrary number of arguments
555and implicitly act as allOf matchers.</p>
556
557<p>Node matchers are the only matchers that support the bind("id") call to
558bind the matched node to the given string, to be later retrieved from the
559match callback.</p>
560
561<p>It is important to remember that the arguments to node matchers are
562predicates on the same node, just with additional information about the type.
563This is often useful to make matcher expression more readable by inlining bind
564calls into redundant node matchers inside another node matcher:
565<pre>
566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567// the same node.
568recordDecl(decl().bind("id"), hasName("::MyClass"))
569</pre>
570</p>
571
572<table>
573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574<!-- START_DECL_MATCHERS -->
575
576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;...</td></tr>
577<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
578
579Examples matches public virtual B.
580  class B {};
581  class C : public virtual B {};
582</pre></td></tr>
583
584
585<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
586<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
587
588Examples matches i(42).
589  class C {
590    C() : i(42) {}
591    int i;
592  };
593</pre></td></tr>
594
595
596<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
597<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
598
599Given
600  class C {
601  public:
602    int a;
603  };
604accessSpecDecl()
605  matches 'public:'
606</pre></td></tr>
607
608
609<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;...</td></tr>
610<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
611Example matches foo and bar
612(matcher = bindingDecl()
613
614  auto [foo, bar] = std::make_pair{42, 42};
615</pre></td></tr>
616
617
618<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
619<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
620
621Example matches the declaration of the nameless block printing an input
622integer.
623
624  myFunc(^(int p) {
625    printf("%d", p);
626  })
627</pre></td></tr>
628
629
630<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
631<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
632
633Example matches Z
634  template&lt;class T&gt; class Z {};
635</pre></td></tr>
636
637
638<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
639<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
640
641Given
642  template&lt;class T1, class T2, int I&gt;
643  class A {};
644
645  template&lt;class T, int I&gt;
646  class A&lt;T, T*, I&gt; {};
647
648  template&lt;&gt;
649  class A&lt;int, int, 1&gt; {};
650classTemplatePartialSpecializationDecl()
651  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
652</pre></td></tr>
653
654
655<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
656<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
657
658Given
659  template&lt;typename T&gt; class A {};
660  template&lt;&gt; class A&lt;double&gt; {};
661  A&lt;int&gt; a;
662classTemplateSpecializationDecl()
663  matches the specializations A&lt;int&gt; and A&lt;double&gt;
664</pre></td></tr>
665
666
667<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
668<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
669
670Example matches Foo::Foo() and Foo::Foo(int)
671  class Foo {
672   public:
673    Foo();
674    Foo(int);
675    int DoSomething();
676  };
677</pre></td></tr>
678
679
680<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
681<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
682
683Example matches the operator.
684  class X { operator int() const; };
685</pre></td></tr>
686
687
688<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
689<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
690
691Example matches the deduction guide.
692  template&lt;typename T&gt;
693  class X { X(int) };
694  X(int) -&gt; X&lt;int&gt;;
695</pre></td></tr>
696
697
698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
699<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
700
701Example matches Foo::~Foo()
702  class Foo {
703   public:
704    virtual ~Foo();
705  };
706</pre></td></tr>
707
708
709<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
710<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
711
712Example matches y
713  class X { void y(); };
714</pre></td></tr>
715
716
717<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
718<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
719
720Example matches X, Z
721  class X;
722  template&lt;class T&gt; class Z {};
723</pre></td></tr>
724
725
726<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
727<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
728
729Examples matches X, C, and the friend declaration inside C;
730  void X();
731  class C {
732    friend X;
733  };
734</pre></td></tr>
735
736
737<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
738<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
739and non-type template parameter declarations).
740
741Given
742  class X { int y; };
743declaratorDecl()
744  matches int y.
745</pre></td></tr>
746
747
748<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
749<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
750
751Examples matches the declaration node with foo and bar, but not
752number.
753(matcher = declStmt(has(decompositionDecl())))
754
755  int number = 42;
756  auto [foo, bar] = std::make_pair{42, 42};
757</pre></td></tr>
758
759
760<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
761<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
762
763Example matches A, B, C
764  enum X {
765    A, B, C
766  };
767</pre></td></tr>
768
769
770<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
771<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
772
773Example matches X
774  enum X {
775    A, B, C
776  };
777</pre></td></tr>
778
779
780<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
781<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
782
783Given
784  class X { int m; };
785fieldDecl()
786  matches 'm'.
787</pre></td></tr>
788
789
790<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
791<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
792
793Given
794  class X { friend void foo(); };
795friendDecl()
796  matches 'friend void foo()'.
797</pre></td></tr>
798
799
800<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
801<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
802
803Example matches f
804  void f();
805</pre></td></tr>
806
807
808<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
809<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
810
811Example matches f
812  template&lt;class T&gt; void f(T t) {}
813</pre></td></tr>
814
815
816<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
817<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
818
819Given
820  struct X { struct { int a; }; };
821indirectFieldDecl()
822  matches 'a'.
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
827<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
828
829Given
830  goto FOO;
831  FOO: bar();
832labelDecl()
833  matches 'FOO:'
834</pre></td></tr>
835
836
837<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
838<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
839
840Given
841  extern "C" {}
842linkageSpecDecl()
843  matches "extern "C" {}"
844</pre></td></tr>
845
846
847<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
848<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
849
850Example matches X, S, the anonymous union type, i, and U;
851  typedef int X;
852  struct S {
853    union {
854      int i;
855    } U;
856  };
857</pre></td></tr>
858
859
860<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
861<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
862
863Given
864  namespace test {}
865  namespace alias = ::test;
866namespaceAliasDecl()
867  matches "namespace alias" but not "namespace test"
868</pre></td></tr>
869
870
871<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
872<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
873
874Given
875  namespace {}
876  namespace test {}
877namespaceDecl()
878  matches "namespace {}" and "namespace test {}"
879</pre></td></tr>
880
881
882<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
883<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
884
885Given
886  template &lt;typename T, int N&gt; struct C {};
887nonTypeTemplateParmDecl()
888  matches 'N', but not 'T'.
889</pre></td></tr>
890
891
892<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
893<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
894
895Example matches Foo (Additions)
896  @interface Foo (Additions)
897  @end
898</pre></td></tr>
899
900
901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
902<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
903
904Example matches Foo (Additions)
905  @implementation Foo (Additions)
906  @end
907</pre></td></tr>
908
909
910<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
911<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
912
913Example matches Foo
914  @implementation Foo
915  @end
916</pre></td></tr>
917
918
919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
920<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
921
922Example matches Foo
923  @interface Foo
924  @end
925</pre></td></tr>
926
927
928<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
929<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
930
931Example matches _enabled
932  @implementation Foo {
933    BOOL _enabled;
934  }
935  @end
936</pre></td></tr>
937
938
939<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
940<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
941
942Example matches both declaration and definition of -[Foo method]
943  @interface Foo
944  - (void)method;
945  @end
946
947  @implementation Foo
948  - (void)method {}
949  @end
950</pre></td></tr>
951
952
953<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
954<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
955
956Example matches enabled
957  @interface Foo
958  @property BOOL enabled;
959  @end
960</pre></td></tr>
961
962
963<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
964<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
965
966Example matches FooDelegate
967  @protocol FooDelegate
968  @end
969</pre></td></tr>
970
971
972<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
973<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
974
975Given
976  void f(int x);
977parmVarDecl()
978  matches int x.
979</pre></td></tr>
980
981
982<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
983<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
984
985Example matches X, Z, U, and S
986  class X;
987  template&lt;class T&gt; class Z {};
988  struct S {};
989  union U {};
990</pre></td></tr>
991
992
993<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
994<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
995
996Example:
997  staticAssertExpr()
998matches
999  static_assert(sizeof(S) == sizeof(int))
1000in
1001  struct S {
1002    int x;
1003  };
1004  static_assert(sizeof(S) == sizeof(int));
1005</pre></td></tr>
1006
1007
1008<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
1009<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1010
1011Example matches X, Z, U, S, E
1012  class X;
1013  template&lt;class T&gt; class Z {};
1014  struct S {};
1015  union U {};
1016  enum E {
1017    A, B, C
1018  };
1019</pre></td></tr>
1020
1021
1022<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
1023<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1024
1025Given
1026  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
1027templateTypeParmDecl()
1028  matches 'Z', but not 'N'.
1029</pre></td></tr>
1030
1031
1032<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
1033<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1034
1035Given
1036  template &lt;typename T, int N&gt; struct C {};
1037templateTypeParmDecl()
1038  matches 'T', but not 'N'.
1039</pre></td></tr>
1040
1041
1042<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
1043<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1044
1045Given
1046  int X;
1047  namespace NS {
1048  int Y;
1049  }  // namespace NS
1050decl(hasDeclContext(translationUnitDecl()))
1051  matches "int X", but not "int Y".
1052</pre></td></tr>
1053
1054
1055<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
1056<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1057
1058Given
1059  typedef int X;
1060  using Y = int;
1061typeAliasDecl()
1062  matches "using Y = int", but not "typedef int X"
1063</pre></td></tr>
1064
1065
1066<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
1067<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1068
1069typeAliasTemplateDecl() matches
1070  template &lt;typename T&gt;
1071  using Y = X&lt;T&gt;;
1072</pre></td></tr>
1073
1074
1075<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
1076<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1077
1078Given
1079  typedef int X;
1080  using Y = int;
1081typedefDecl()
1082  matches "typedef int X", but not "using Y = int"
1083</pre></td></tr>
1084
1085
1086<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
1087<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1088
1089Given
1090  typedef int X;
1091  using Y = int;
1092typedefNameDecl()
1093  matches "typedef int X" and "using Y = int"
1094</pre></td></tr>
1095
1096
1097<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
1098<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1099typename.
1100
1101Given
1102  template &lt;typename T&gt;
1103  struct Base { typedef T Foo; };
1104
1105  template&lt;typename T&gt;
1106  struct S : private Base&lt;T&gt; {
1107    using typename Base&lt;T&gt;::Foo;
1108  };
1109unresolvedUsingTypenameDecl()
1110  matches using Base&lt;T&gt;::Foo </pre></td></tr>
1111
1112
1113<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
1114<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1115
1116Given
1117  template&lt;typename X&gt;
1118  class C : private X {
1119    using X::x;
1120  };
1121unresolvedUsingValueDecl()
1122  matches using X::x </pre></td></tr>
1123
1124
1125<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
1126<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1127
1128Given
1129  namespace X { int x; }
1130  using X::x;
1131usingDecl()
1132  matches using X::x </pre></td></tr>
1133
1134
1135<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
1136<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1137
1138Given
1139  namespace X { int x; }
1140  using namespace X;
1141usingDirectiveDecl()
1142  matches using namespace X </pre></td></tr>
1143
1144
1145<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
1146<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1147
1148Example matches A, B, C and F
1149  enum X { A, B, C };
1150  void F();
1151</pre></td></tr>
1152
1153
1154<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
1155<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1156
1157Note: this does not match declarations of member variables, which are
1158"field" declarations in Clang parlance.
1159
1160Example matches a
1161  int a;
1162</pre></td></tr>
1163
1164
1165<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
1166<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1167</pre></td></tr>
1168
1169
1170<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
1171<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1172
1173Given
1174  namespace ns {
1175    struct A { static void f(); };
1176    void A::f() {}
1177    void g() { A::f(); }
1178  }
1179  ns::A a;
1180nestedNameSpecifier()
1181  matches "ns::" and both "A::"
1182</pre></td></tr>
1183
1184
1185<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
1186<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1187
1188Given
1189
1190  #pragma omp parallel default(none)
1191  #pragma omp parallel default(shared)
1192  #pragma omp parallel default(firstprivate)
1193  #pragma omp parallel
1194
1195``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1196``default(firstprivate)``
1197</pre></td></tr>
1198
1199
1200<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
1201<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1202</pre></td></tr>
1203
1204
1205<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
1206<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1207
1208Given
1209  FOO: bar();
1210  void *ptr = &amp;&amp;FOO;
1211  goto *bar;
1212addrLabelExpr()
1213  matches '&amp;&amp;FOO'
1214</pre></td></tr>
1215
1216
1217<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
1218<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1219
1220Given
1221  int i = a[1];
1222arraySubscriptExpr()
1223  matches "a[1]"
1224</pre></td></tr>
1225
1226
1227<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
1228<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1229
1230 int i = 100;
1231  __asm("mov al, 2");
1232asmStmt()
1233  matches '__asm("mov al, 2")'
1234</pre></td></tr>
1235
1236
1237<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
1238<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1239Example matches __atomic_load_n(ptr, 1)
1240  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1241</pre></td></tr>
1242
1243
1244<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
1245<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1246
1247Given
1248  @autoreleasepool {
1249    int x = 0;
1250  }
1251autoreleasePoolStmt(stmt()) matches the declaration of "x"
1252inside the autorelease pool.
1253</pre></td></tr>
1254
1255
1256<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
1257<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1258
1259Example matches a ?: b
1260  (a ?: b) + 42;
1261</pre></td></tr>
1262
1263
1264<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
1265<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1266
1267Example matches a || b
1268  !(a || b)
1269See also the binaryOperation() matcher for more-general matching.
1270</pre></td></tr>
1271
1272
1273<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
1274<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1275
1276Example: matches "^{}":
1277  void f() { ^{}(); }
1278</pre></td></tr>
1279
1280
1281<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
1282<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1283
1284Given
1285  while (true) { break; }
1286breakStmt()
1287  matches 'break'
1288</pre></td></tr>
1289
1290
1291<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
1292<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1293
1294Example: Matches (int) 2.2f in
1295  int i = (int) 2.2f;
1296</pre></td></tr>
1297
1298
1299<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
1300<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1301
1302Example matches x.y() and y()
1303  X x;
1304  x.y();
1305  y();
1306</pre></td></tr>
1307
1308
1309<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
1310<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1311
1312Given
1313  switch(a) { case 42: break; default: break; }
1314caseStmt()
1315  matches 'case 42:'.
1316</pre></td></tr>
1317
1318
1319<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
1320<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1321
1322Example: castExpr() matches each of the following:
1323  (int) 3;
1324  const_cast&lt;Expr *&gt;(SubExpr);
1325  char c = 0;
1326but does not match
1327  int i = (0);
1328  int k = 0;
1329</pre></td></tr>
1330
1331
1332<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
1333<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1334
1335Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1336though.
1337
1338Example matches 'a', L'a'
1339  char ch = 'a';
1340  wchar_t chw = L'a';
1341</pre></td></tr>
1342
1343
1344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
1345<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1346</pre></td></tr>
1347
1348
1349<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>&gt;...</td></tr>
1350<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1351
1352Given
1353  co_await 1;
1354coawaitExpr()
1355  matches 'co_await 1'
1356</pre></td></tr>
1357
1358
1359<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
1360<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1361
1362Example match: {1}, (1, 2)
1363  int array[4] = {1};
1364  vector int myvec = (vector int)(1, 2);
1365</pre></td></tr>
1366
1367
1368<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
1369<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1370
1371Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1372  for (;;) {{}}
1373</pre></td></tr>
1374
1375
1376<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
1377<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1378
1379Example matches a ? b : c
1380  (a ? b : c) + 42
1381</pre></td></tr>
1382
1383
1384<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
1385<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1386
1387Example matches the constant in the case statement:
1388    (matcher = constantExpr())
1389  switch (a) {
1390  case 37: break;
1391  }
1392</pre></td></tr>
1393
1394
1395<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
1396<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1397
1398Given
1399  while (true) { continue; }
1400continueStmt()
1401  matches 'continue'
1402</pre></td></tr>
1403
1404
1405<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>&gt;...</td></tr>
1406<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1407
1408Given
1409  while (true) { co_return; }
1410coreturnStmt()
1411  matches 'co_return'
1412</pre></td></tr>
1413
1414
1415<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>&gt;...</td></tr>
1416<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1417
1418Given
1419  co_yield 1;
1420coyieldExpr()
1421  matches 'co_yield 1'
1422</pre></td></tr>
1423
1424
1425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
1426<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1427
1428Example matches,
1429  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
1430</pre></td></tr>
1431
1432
1433<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
1434<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1435
1436Example matches FunctionTakesString(GetStringByValue())
1437    (matcher = cxxBindTemporaryExpr())
1438  FunctionTakesString(GetStringByValue());
1439  FunctionTakesStringByPointer(GetStringPointer());
1440</pre></td></tr>
1441
1442
1443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
1444<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1445
1446Example matches true
1447  true
1448</pre></td></tr>
1449
1450
1451<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
1452<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1453
1454  try {} catch(int i) {}
1455cxxCatchStmt()
1456  matches 'catch(int i)'
1457</pre></td></tr>
1458
1459
1460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
1461<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1462
1463Example: Matches const_cast&lt;int*&gt;(&amp;r) in
1464  int n = 42;
1465  const int &amp;r(n);
1466  int* p = const_cast&lt;int*&gt;(&amp;r);
1467</pre></td></tr>
1468
1469
1470<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
1471<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1472
1473Example matches string(ptr, n) and ptr within arguments of f
1474    (matcher = cxxConstructExpr())
1475  void f(const string &amp;a, const string &amp;b);
1476  char *ptr;
1477  int n;
1478  f(string(ptr, n), ptr);
1479</pre></td></tr>
1480
1481
1482<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
1483<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1484
1485Example matches the CXXDefaultArgExpr placeholder inserted for the
1486    default value of the second parameter in the call expression f(42)
1487    (matcher = cxxDefaultArgExpr())
1488  void f(int x, int y = 0);
1489  f(42);
1490</pre></td></tr>
1491
1492
1493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
1494<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1495
1496Given
1497  delete X;
1498cxxDeleteExpr()
1499  matches 'delete X'.
1500</pre></td></tr>
1501
1502
1503<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
1504<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1505resolved because the base expression or the member name was dependent.
1506
1507Given
1508  template &lt;class T&gt; void f() { T t; t.g(); }
1509cxxDependentScopeMemberExpr()
1510  matches t.g
1511</pre></td></tr>
1512
1513
1514<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
1515<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1516
1517Example:
1518  cxxDynamicCastExpr()
1519matches
1520  dynamic_cast&lt;D*&gt;(&amp;b);
1521in
1522  struct B { virtual ~B() {} }; struct D : B {};
1523  B b;
1524  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1525</pre></td></tr>
1526
1527
1528<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
1529<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1530
1531cxxForRangeStmt() matches 'for (auto a : i)'
1532  int i[] =  {1, 2, 3}; for (auto a : i);
1533  for(int j = 0; j &lt; 5; ++j);
1534</pre></td></tr>
1535
1536
1537<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
1538<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1539
1540Example: Matches Foo(bar);
1541  Foo f = bar;
1542  Foo g = (Foo) bar;
1543  Foo h = Foo(bar);
1544</pre></td></tr>
1545
1546
1547<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
1548<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1549
1550Example matches x.y()
1551  X x;
1552  x.y();
1553</pre></td></tr>
1554
1555
1556<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
1557<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1558
1559Given
1560  new X;
1561cxxNewExpr()
1562  matches 'new X'.
1563</pre></td></tr>
1564
1565
1566<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>&gt;...</td></tr>
1567<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1568
1569Given
1570  bool a() noexcept;
1571  bool b() noexcept(true);
1572  bool c() noexcept(false);
1573  bool d() noexcept(noexcept(a()));
1574  bool e = noexcept(b()) || noexcept(c());
1575cxxNoexceptExpr()
1576  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1577  doesn't match the noexcept specifier in the declarations a, b, c or d.
1578</pre></td></tr>
1579
1580
1581<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
1582<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1583</pre></td></tr>
1584
1585
1586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
1587<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1588
1589Note that if an operator isn't overloaded, it won't match. Instead, use
1590binaryOperator matcher.
1591Currently it does not match operators such as new delete.
1592FIXME: figure out why these do not match?
1593
1594Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1595    (matcher = cxxOperatorCallExpr())
1596  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1597  ostream &amp;o; int b = 1, c = 1;
1598  o &lt;&lt; b &lt;&lt; c;
1599See also the binaryOperation() matcher for more-general matching of binary
1600uses of this AST node.
1601</pre></td></tr>
1602
1603
1604<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
1605<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1606
1607Either the source expression or the destination type can be matched
1608using has(), but hasDestinationType() is more specific and can be
1609more readable.
1610
1611Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1612  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1613</pre></td></tr>
1614
1615
1616<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;...</td></tr>
1617<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1618
1619Example matches use of "&lt;":
1620  #include &lt;compare&gt;
1621  struct HasSpaceshipMem {
1622    int a;
1623    constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
1624  };
1625  void compare() {
1626    HasSpaceshipMem hs1, hs2;
1627    if (hs1 &lt; hs2)
1628        return;
1629  }
1630See also the binaryOperation() matcher for more-general matching
1631of this AST node.
1632</pre></td></tr>
1633
1634
1635<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
1636<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1637
1638See also: hasDestinationType
1639See also: reinterpretCast
1640
1641Example:
1642  cxxStaticCastExpr()
1643matches
1644  static_cast&lt;long&gt;(8)
1645in
1646  long eight(static_cast&lt;long&gt;(8));
1647</pre></td></tr>
1648
1649
1650<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
1651<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1652
1653Given
1654  std::vector&lt;int&gt; a({ 1, 2, 3 });
1655  std::vector&lt;int&gt; b = { 4, 5 };
1656  int c[] = { 6, 7 };
1657  std::pair&lt;int, int&gt; d = { 8, 9 };
1658cxxStdInitializerListExpr()
1659  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1660</pre></td></tr>
1661
1662
1663<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1664<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1665
1666Example: Matches Foo(bar, bar)
1667  Foo h = Foo(bar, bar);
1668</pre></td></tr>
1669
1670
1671<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1672<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1673
1674Example matches the implicit this expression in "return i".
1675    (matcher = cxxThisExpr())
1676struct foo {
1677  int i;
1678  int f() { return i; }
1679};
1680</pre></td></tr>
1681
1682
1683<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1684<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1685
1686  try { throw 5; } catch(int i) {}
1687cxxThrowExpr()
1688  matches 'throw 5'
1689</pre></td></tr>
1690
1691
1692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1693<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1694
1695  try {} catch(int i) {}
1696cxxTryStmt()
1697  matches 'try {}'
1698</pre></td></tr>
1699
1700
1701<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1702<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1703
1704Example matches T(t) in return statement of f
1705    (matcher = cxxUnresolvedConstructExpr())
1706  template &lt;typename T&gt;
1707  void f(const T&amp; t) { return T(t); }
1708</pre></td></tr>
1709
1710
1711<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
1712<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1713
1714Example matches x in if (x)
1715  bool x;
1716  if (x) {}
1717</pre></td></tr>
1718
1719
1720<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
1721<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1722
1723Given
1724  int a;
1725declStmt()
1726  matches 'int a'.
1727</pre></td></tr>
1728
1729
1730<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
1731<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1732
1733Given
1734  switch(a) { case 42: break; default: break; }
1735defaultStmt()
1736  matches 'default:'.
1737</pre></td></tr>
1738
1739
1740<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>&gt;...</td></tr>
1741<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1742</pre></td></tr>
1743
1744
1745<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1746<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1747
1748Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1749  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1750</pre></td></tr>
1751
1752
1753<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
1754<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1755
1756Given
1757  do {} while (true);
1758doStmt()
1759  matches 'do {} while(true)'
1760</pre></td></tr>
1761
1762
1763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
1764<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1765
1766Matches any cast expression written in user code, whether it be a
1767C-style cast, a functional-style cast, or a keyword cast.
1768
1769Does not match implicit conversions.
1770
1771Note: the name "explicitCast" is chosen to match Clang's terminology, as
1772Clang uses the term "cast" to apply to implicit conversions as well as to
1773actual cast expressions.
1774
1775See also: hasDestinationType.
1776
1777Example: matches all five of the casts in
1778  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1779but does not match the implicit conversion in
1780  long ell = 42;
1781</pre></td></tr>
1782
1783
1784<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
1785<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1786
1787Example matches x()
1788  void f() { x(); }
1789</pre></td></tr>
1790
1791
1792<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
1793<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1794of the sub-expression's evaluation.
1795
1796Example matches std::string()
1797  const std::string str = std::string();
1798</pre></td></tr>
1799
1800
1801<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>&gt;...</td></tr>
1802<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1803</pre></td></tr>
1804
1805
1806<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
1807<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
18081.0, 1.0f, 1.0L and 1e10.
1809
1810Does not match implicit conversions such as
1811  float a = 10;
1812</pre></td></tr>
1813
1814
1815<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
1816<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1817
1818Example matches 'for (;;) {}'
1819  for (;;) {}
1820  int i[] =  {1, 2, 3}; for (auto a : i);
1821</pre></td></tr>
1822
1823
1824<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>&gt;...</td></tr>
1825<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1826</pre></td></tr>
1827
1828
1829<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1830<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1831</pre></td></tr>
1832
1833
1834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
1835<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1836
1837Given
1838  goto FOO;
1839  FOO: bar();
1840gotoStmt()
1841  matches 'goto FOO'
1842</pre></td></tr>
1843
1844
1845<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
1846<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1847
1848Example matches 'if (x) {}'
1849  if (x) {}
1850</pre></td></tr>
1851
1852
1853<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
1854<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1855point literals e.g.: 1i, 1.0i
1856</pre></td></tr>
1857
1858
1859<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
1860<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1861
1862This matches many different places, including function call return value
1863eliding, as well as any type conversions.
1864</pre></td></tr>
1865
1866
1867<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1868<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1869
1870Given
1871  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1872implicitValueInitExpr()
1873  matches "[0].y" (implicitly)
1874</pre></td></tr>
1875
1876
1877<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
1878<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1879
1880Given
1881  int a[] = { 1, 2 };
1882  struct B { int x, y; };
1883  B b = { 5, 6 };
1884initListExpr()
1885  matches "{ 1, 2 }" and "{ 5, 6 }"
1886</pre></td></tr>
1887
1888
1889<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
1890<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
18911, 1L, 0x1 and 1U.
1892
1893Does not match character-encoded integers such as L'a'.
1894</pre></td></tr>
1895
1896
1897<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
1898<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1899
1900Given
1901  goto FOO;
1902  FOO: bar();
1903labelStmt()
1904  matches 'FOO:'
1905</pre></td></tr>
1906
1907
1908<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
1909<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1910
1911Example matches [&amp;](){return 5;}
1912  [&amp;](){return 5;}
1913</pre></td></tr>
1914
1915
1916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
1917<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1918
1919Example: Given
1920  struct T {void func();};
1921  T f();
1922  void g(T);
1923materializeTemporaryExpr() matches 'f()' in these statements
1924  T u(f());
1925  g(f());
1926  f().func();
1927but does not match
1928  f();
1929</pre></td></tr>
1930
1931
1932<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
1933<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1934
1935Given
1936  class Y {
1937    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1938    int a; static int b;
1939  };
1940memberExpr()
1941  matches this-&gt;x, x, y.x, a, this-&gt;b
1942</pre></td></tr>
1943
1944
1945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
1946<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1947
1948  foo();;
1949nullStmt()
1950  matches the second ';'
1951</pre></td></tr>
1952
1953
1954<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1955<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1956
1957Example matches @catch
1958  @try {}
1959  @catch (...) {}
1960</pre></td></tr>
1961
1962
1963<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1964<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1965
1966Example matches @finally
1967  @try {}
1968  @finally {}
1969</pre></td></tr>
1970
1971
1972<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
1973<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1974
1975Example: matches "a" in "init" method:
1976@implementation A {
1977  NSString *a;
1978}
1979- (void) init {
1980  a = @"hello";
1981}
1982</pre></td></tr>
1983
1984
1985<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1986<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1987
1988The innermost message send invokes the "alloc" class method on the
1989NSString class, while the outermost message send invokes the
1990"initWithString" instance method on the object returned from
1991NSString's "alloc". This matcher should match both message sends.
1992  [[NSString alloc] initWithString:@"Hello"]
1993</pre></td></tr>
1994
1995
1996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
1997<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1998
1999Example matches @throw obj;
2000</pre></td></tr>
2001
2002
2003<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
2004<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2005
2006Example matches @try
2007  @try {}
2008  @catch (...) {}
2009</pre></td></tr>
2010
2011
2012<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
2013<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2014
2015Given
2016
2017  #pragma omp parallel
2018  #pragma omp parallel default(none)
2019  #pragma omp taskyield
2020
2021``ompExecutableDirective()`` matches ``omp parallel``,
2022``omp parallel default(none)`` and ``omp taskyield``.
2023</pre></td></tr>
2024
2025
2026<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
2027<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2028to reference another expressions and can be met
2029in BinaryConditionalOperators, for example.
2030
2031Example matches 'a'
2032  (a ?: c) + 42;
2033</pre></td></tr>
2034
2035
2036<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
2037<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2038
2039Example matches (foo() + 1)
2040  int foo() { return 1; }
2041  int a = (foo() + 1);
2042</pre></td></tr>
2043
2044
2045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
2046<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2047ParenListExprs don't have a predefined type and are used for late parsing.
2048In the final AST, they can be met in template declarations.
2049
2050Given
2051  template&lt;typename T&gt; class X {
2052    void f() {
2053      X x(*this);
2054      int a = 0, b = 1; int i = (a, b);
2055    }
2056  };
2057parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2058has a predefined type and is a ParenExpr, not a ParenListExpr.
2059</pre></td></tr>
2060
2061
2062<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
2063<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2064
2065Example: Matches __func__
2066  printf("%s", __func__);
2067</pre></td></tr>
2068
2069
2070<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
2071<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2072
2073Given
2074  return 1;
2075returnStmt()
2076  matches 'return 1'
2077</pre></td></tr>
2078
2079
2080<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
2081<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2082
2083Given
2084  { ++a; }
2085stmt()
2086  matches both the compound statement '{ ++a; }' and '++a'.
2087</pre></td></tr>
2088
2089
2090<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
2091<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2092
2093Example match: ({ int X = 4; X; })
2094  int C = ({ int X = 4; X; });
2095</pre></td></tr>
2096
2097
2098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
2099<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2100
2101Example matches "abcd", L"abcd"
2102  char *s = "abcd";
2103  wchar_t *ws = L"abcd";
2104</pre></td></tr>
2105
2106
2107<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
2108<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2109
2110Given
2111  template &lt;int N&gt;
2112  struct A { static const int n = N; };
2113  struct B : public A&lt;42&gt; {};
2114substNonTypeTemplateParmExpr()
2115  matches "N" in the right-hand side of "static const int n = N;"
2116</pre></td></tr>
2117
2118
2119<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
2120<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2121
2122Given
2123  switch(a) { case 42: break; default: break; }
2124switchCase()
2125  matches 'case 42:' and 'default:'.
2126</pre></td></tr>
2127
2128
2129<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
2130<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2131
2132Given
2133  switch(a) { case 42: break; default: break; }
2134switchStmt()
2135  matches 'switch(a)'.
2136</pre></td></tr>
2137
2138
2139<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
2140<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2141
2142Given
2143  Foo x = bar;
2144  int y = sizeof(x) + alignof(x);
2145unaryExprOrTypeTraitExpr()
2146  matches sizeof(x) and alignof(x)
2147</pre></td></tr>
2148
2149
2150<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
2151<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2152
2153Example matches !a
2154  !a || b
2155</pre></td></tr>
2156
2157
2158<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
2159<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2160but could not be resolved to a specific declaration.
2161
2162Given
2163  template&lt;typename T&gt;
2164  T foo() { T a; return a; }
2165  template&lt;typename T&gt;
2166  void bar() {
2167    foo&lt;T&gt;();
2168  }
2169unresolvedLookupExpr()
2170  matches foo&lt;T&gt;() </pre></td></tr>
2171
2172
2173<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
2174<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2175
2176Given
2177  struct X {
2178    template &lt;class T&gt; void f();
2179    void g();
2180  };
2181  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
2182unresolvedMemberExpr()
2183  matches x.f&lt;T&gt;
2184</pre></td></tr>
2185
2186
2187<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
2188<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2189
2190Example match: "foo"_suffix
2191</pre></td></tr>
2192
2193
2194<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
2195<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2196
2197Given
2198  while (true) {}
2199whileStmt()
2200  matches 'while (true) {}'.
2201</pre></td></tr>
2202
2203
2204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;...</td></tr>
2205<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2206
2207Given
2208  template &lt;typename T&gt; struct C {};
2209  C&lt;int&gt; c;
2210templateArgumentLoc()
2211  matches 'int' in C&lt;int&gt;.
2212</pre></td></tr>
2213
2214
2215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
2216<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2217
2218Given
2219  template &lt;typename T&gt; struct C {};
2220  C&lt;int&gt; c;
2221templateArgument()
2222  matches 'int' in C&lt;int&gt;.
2223</pre></td></tr>
2224
2225
2226<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
2227<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2228
2229Given
2230  template &lt;typename T&gt; class X { };
2231  X&lt;int&gt; xi;
2232templateName()
2233  matches 'X' in X&lt;int&gt;.
2234</pre></td></tr>
2235
2236
2237<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
2238<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2239</pre></td></tr>
2240
2241
2242<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
2243<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2244
2245Given
2246  int a[] = { 2, 3 };
2247  int b[4];
2248  void f() { int c[a[0]]; }
2249arrayType()
2250  matches "int a[]", "int b[4]" and "int c[a[0]]";
2251</pre></td></tr>
2252
2253
2254<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
2255<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2256
2257Given
2258  _Atomic(int) i;
2259atomicType()
2260  matches "_Atomic(int) i"
2261</pre></td></tr>
2262
2263
2264<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
2265<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2266
2267Given:
2268  auto n = 4;
2269  int v[] = { 2, 3 }
2270  for (auto i : v) { }
2271autoType()
2272  matches "auto n" and "auto i"
2273</pre></td></tr>
2274
2275
2276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
2277<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2278"void (^)(int)".
2279
2280The pointee is always required to be a FunctionType.
2281</pre></td></tr>
2282
2283
2284<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
2285<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2286
2287Given
2288  struct A {};
2289  A a;
2290  int b;
2291  float c;
2292  bool d;
2293builtinType()
2294  matches "int b", "float c" and "bool d"
2295</pre></td></tr>
2296
2297
2298<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
2299<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2300
2301Given
2302  _Complex float f;
2303complexType()
2304  matches "_Complex float f"
2305</pre></td></tr>
2306
2307
2308<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
2309<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2310
2311Given
2312  void() {
2313    int a[2];
2314    int b[] = { 2, 3 };
2315    int c[b[0]];
2316  }
2317constantArrayType()
2318  matches "int a[2]"
2319</pre></td></tr>
2320
2321
2322<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
2323<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2324Example matches i[] in declaration of f.
2325    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2326Example matches i[1].
2327    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2328  void f(int i[]) {
2329    i[1] = 0;
2330  }
2331</pre></td></tr>
2332
2333
2334<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
2335<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
2336
2337Given:
2338  short i = 1;
2339  int j = 42;
2340  decltype(i + j) result = i + j;
2341decltypeType()
2342  matches "decltype(i + j)"
2343</pre></td></tr>
2344
2345
2346<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
2347<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2348template types.
2349
2350Given
2351  template &lt;typename T&gt;
2352  class C { public: C(T); };
2353
2354  C c(123);
2355deducedTemplateSpecializationType() matches the type in the declaration
2356of the variable c.
2357</pre></td></tr>
2358
2359
2360<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
2361<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2362
2363Given
2364  template&lt;typename T, int Size&gt;
2365  class array {
2366    T data[Size];
2367  };
2368dependentSizedArrayType
2369  matches "T data[Size]"
2370</pre></td></tr>
2371
2372
2373<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
2374<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2375qualified name.
2376
2377Given
2378  namespace N {
2379    namespace M {
2380      class D {};
2381    }
2382  }
2383  class C {};
2384
2385  class C c;
2386  N::M::D d;
2387
2388elaboratedType() matches the type of the variable declarations of both
2389c and d.
2390</pre></td></tr>
2391
2392
2393<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
2394<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2395
2396Given
2397  enum C { Green };
2398  enum class S { Red };
2399
2400  C c;
2401  S s;
2402
2403enumType() matches the type of the variable declarations of both c and
2404s.
2405</pre></td></tr>
2406
2407
2408<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
2409<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2410
2411Given
2412  int (*f)(int);
2413  void g();
2414functionProtoType()
2415  matches "int (*f)(int)" and the type of "g" in C++ mode.
2416  In C mode, "g" is not matched because it does not contain a prototype.
2417</pre></td></tr>
2418
2419
2420<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
2421<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2422
2423Given
2424  int (*f)(int);
2425  void g();
2426functionType()
2427  matches "int (*f)(int)" and the type of "g".
2428</pre></td></tr>
2429
2430
2431<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
2432<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2433
2434Given
2435  int a[] = { 2, 3 };
2436  int b[42];
2437  void f(int c[]) { int d[a[0]]; };
2438incompleteArrayType()
2439  matches "int a[]" and "int c[]"
2440</pre></td></tr>
2441
2442
2443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
2444<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2445
2446Example matches S s, but not S&lt;T&gt; s.
2447    (matcher = parmVarDecl(hasType(injectedClassNameType())))
2448  template &lt;typename T&gt; struct S {
2449    void f(S s);
2450    void g(S&lt;T&gt; s);
2451  };
2452</pre></td></tr>
2453
2454
2455<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
2456<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2457
2458Given:
2459  int *a;
2460  int &amp;b = *a;
2461  int &amp;&amp;c = 1;
2462  auto &amp;d = b;
2463  auto &amp;&amp;e = c;
2464  auto &amp;&amp;f = 2;
2465  int g = 5;
2466
2467lValueReferenceType() matches the types of b, d, and e. e is
2468matched since the type is deduced as int&amp; by reference collapsing rules.
2469</pre></td></tr>
2470
2471
2472<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
2473<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2474Given
2475  struct A { int i; }
2476  A::* ptr = A::i;
2477memberPointerType()
2478  matches "A::* ptr"
2479</pre></td></tr>
2480
2481
2482<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
2483<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2484a pointer type, despite being syntactically similar.
2485
2486Given
2487  int *a;
2488
2489  @interface Foo
2490  @end
2491  Foo *f;
2492pointerType()
2493  matches "Foo *f", but does not match "int *a".
2494</pre></td></tr>
2495
2496
2497<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
2498<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2499
2500Given
2501  int (*ptr_to_array)[4];
2502  int *array_of_ptrs[4];
2503
2504varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2505array_of_ptrs.
2506</pre></td></tr>
2507
2508
2509<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
2510<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2511types.
2512
2513Given
2514  int *a;
2515  int &amp;b = *a;
2516  int c = 5;
2517
2518  @interface Foo
2519  @end
2520  Foo *f;
2521pointerType()
2522  matches "int *a", but does not match "Foo *f".
2523</pre></td></tr>
2524
2525
2526<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
2527<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2528
2529Given:
2530  int *a;
2531  int &amp;b = *a;
2532  int &amp;&amp;c = 1;
2533  auto &amp;d = b;
2534  auto &amp;&amp;e = c;
2535  auto &amp;&amp;f = 2;
2536  int g = 5;
2537
2538rValueReferenceType() matches the types of c and f. e is not
2539matched as it is deduced to int&amp; by reference collapsing rules.
2540</pre></td></tr>
2541
2542
2543<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
2544<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2545
2546Given
2547  class C {};
2548  struct S {};
2549
2550  C c;
2551  S s;
2552
2553recordType() matches the type of the variable declarations of both c
2554and s.
2555</pre></td></tr>
2556
2557
2558<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
2559<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2560
2561Given
2562  int *a;
2563  int &amp;b = *a;
2564  int &amp;&amp;c = 1;
2565  auto &amp;d = b;
2566  auto &amp;&amp;e = c;
2567  auto &amp;&amp;f = 2;
2568  int g = 5;
2569
2570referenceType() matches the types of b, c, d, e, and f.
2571</pre></td></tr>
2572
2573
2574<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
2575<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2576template type parameter.
2577
2578Given
2579  template &lt;typename T&gt;
2580  void F(T t) {
2581    int i = 1 + t;
2582  }
2583
2584substTemplateTypeParmType() matches the type of 't' but not '1'
2585</pre></td></tr>
2586
2587
2588<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
2589<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2590
2591Given
2592  enum E {};
2593  class C {};
2594
2595  E e;
2596  C c;
2597
2598tagType() matches the type of the variable declarations of both e
2599and c.
2600</pre></td></tr>
2601
2602
2603<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
2604<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2605
2606Given
2607  template &lt;typename T&gt;
2608  class C { };
2609
2610  template class C&lt;int&gt;;  // A
2611  C&lt;char&gt; var;            // B
2612
2613templateSpecializationType() matches the type of the explicit
2614instantiation in A and the type of the variable declaration in B.
2615</pre></td></tr>
2616
2617
2618<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
2619<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2620
2621Example matches T, but not int.
2622    (matcher = templateTypeParmType())
2623  template &lt;typename T&gt; void f(int i);
2624</pre></td></tr>
2625
2626
2627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
2628<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2629</pre></td></tr>
2630
2631
2632<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
2633<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2634
2635Given
2636  typedef int X;
2637typedefType()
2638  matches "typedef int X"
2639</pre></td></tr>
2640
2641
2642<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
2643<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2644
2645Given:
2646  typedef __underlying_type(T) type;
2647unaryTransformType()
2648  matches "__underlying_type(T)"
2649</pre></td></tr>
2650
2651
2652<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
2653<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2654integer-constant-expression.
2655
2656Given
2657  void f() {
2658    int a[] = { 2, 3 }
2659    int b[42];
2660    int c[a[0]];
2661  }
2662variableArrayType()
2663  matches "int c[a[0]]"
2664</pre></td></tr>
2665
2666<!--END_DECL_MATCHERS -->
2667</table>
2668
2669<!-- ======================================================================= -->
2670<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2671<!-- ======================================================================= -->
2672
2673<p>Narrowing matchers match certain attributes on the current node, thus
2674narrowing down the set of nodes of the current type to match on.</p>
2675
2676<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2677which allow users to create more powerful match expressions.</p>
2678
2679<table>
2680<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2681<!-- START_NARROWING_MATCHERS -->
2682
2683<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2684<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2685
2686Usable as: Any Matcher
2687</pre></td></tr>
2688
2689
2690<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2691<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2692
2693Usable as: Any Matcher
2694</pre></td></tr>
2695
2696
2697<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2698<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2699
2700Useful when another matcher requires a child matcher, but there's no
2701additional constraint. This will often be used with an explicit conversion
2702to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2703
2704Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2705"int* p" and "void f()" in
2706  int* p;
2707  void f();
2708
2709Usable as: Any Matcher
2710</pre></td></tr>
2711
2712
2713<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2714<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2715
2716Given
2717  if (true);
2718  for (; true; );
2719with the matcher
2720  mapAnyOf(ifStmt, forStmt).with(
2721    hasCondition(cxxBoolLiteralExpr(equals(true)))
2722    ).bind("trueCond")
2723matches the if and the for. It is equivalent to:
2724  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2725  anyOf(
2726    ifStmt(trueCond).bind("trueCond"),
2727    forStmt(trueCond).bind("trueCond")
2728    );
2729
2730The with() chain-call accepts zero or more matchers which are combined
2731as-if with allOf() in each of the node matchers.
2732Usable as: Any Matcher
2733</pre></td></tr>
2734
2735
2736<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2737<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2738
2739Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2740  class X {};
2741  class Y {};
2742
2743Usable as: Any Matcher
2744</pre></td></tr>
2745
2746
2747<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2748<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2749specified names.
2750
2751   hasAnyOperatorName("+", "-")
2752 Is equivalent to
2753   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2754</pre></td></tr>
2755
2756
2757<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2758<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2759unary).
2760
2761Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2762  !(a || b)
2763</pre></td></tr>
2764
2765
2766<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2767<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2768
2769Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2770  if (a == b)
2771    a += b;
2772
2773Example 2: matches s1 = s2
2774           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2775  struct S { S&amp; operator=(const S&amp;); };
2776  void x() { S s1, s2; s1 = s2; }
2777</pre></td></tr>
2778
2779
2780<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2781<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2782
2783Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2784  if (a == b)
2785    a += b;
2786
2787Example 2: matches s1 &lt; s2
2788           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2789  struct S { bool operator&lt;(const S&amp; other); };
2790  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2791</pre></td></tr>
2792
2793
2794<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
2795<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2796inheritance.
2797
2798Examples:
2799  class C {
2800  public:    int a;
2801  protected: int b;
2802  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2803  };
2804
2805  struct Base {};
2806  struct Derived1 : private Base {}; // matches 'Base'
2807  class Derived2 : Base {}; // matches 'Base'
2808</pre></td></tr>
2809
2810
2811<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
2812<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2813protected inheritance.
2814
2815Examples:
2816  class C {
2817  public:    int a;
2818  protected: int b; // fieldDecl(isProtected()) matches 'b'
2819  private:   int c;
2820  };
2821
2822  class Base {};
2823  class Derived : protected Base {}; // matches 'Base'
2824</pre></td></tr>
2825
2826
2827<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
2828<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2829inheritance.
2830
2831Examples:
2832  class C {
2833  public:    int a; // fieldDecl(isPublic()) matches 'a'
2834  protected: int b;
2835  private:   int c;
2836  };
2837
2838  class Base {};
2839  class Derived1 : public Base {}; // matches 'Base'
2840  struct Derived2 : Base {}; // matches 'Base'
2841</pre></td></tr>
2842
2843
2844<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
2845<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2846virtual inheritance.
2847
2848Example:
2849  class A {
2850   public:
2851    virtual void x(); // matches x
2852  };
2853
2854Example:
2855  class Base {};
2856  class DirectlyDerived : virtual Base {}; // matches Base
2857  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2858
2859Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2860</pre></td></tr>
2861
2862
2863<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2864<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2865
2866
2867<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2868<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2869
2870Given
2871  f('false, 3.14, 42);
2872characterLiteral(equals(0))
2873  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2874  match false
2875floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2876  match 3.14
2877integerLiteral(equals(42))
2878  matches 42
2879
2880Note that you cannot directly match a negative numeric literal because the
2881minus sign is not part of the literal: It is a unary operator whose operand
2882is the positive numeric literal. Instead, you must use a unaryOperator()
2883matcher to match the minus sign:
2884
2885unaryOperator(hasOperatorName("-"),
2886              hasUnaryOperand(integerLiteral(equals(13))))
2887
2888Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2889           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2890</pre></td></tr>
2891
2892
2893<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2894<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2895
2896
2897<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2898<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2899
2900
2901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
2902<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2903
2904Given
2905  try {
2906    // ...
2907  } catch (int) {
2908    // ...
2909  } catch (...) {
2910    // ...
2911  }
2912cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2913</pre></td></tr>
2914
2915
2916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2917<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2918a specific number of arguments (including absent default arguments).
2919
2920Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2921  void f(int x, int y);
2922  f(0, 0);
2923</pre></td></tr>
2924
2925
2926<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
2927<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2928</pre></td></tr>
2929
2930
2931<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
2932<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2933zero initialization.
2934
2935Given
2936void foo() {
2937  struct point { double x; double y; };
2938  point pt[2] = { { 1.0, 2.0 } };
2939}
2940initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2941will match the implicit array filler for pt[1].
2942</pre></td></tr>
2943
2944
2945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2946<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2947
2948Given
2949  struct S {
2950    S(); // #1
2951    S(const S &amp;); // #2
2952    S(S &amp;&amp;); // #3
2953  };
2954cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2955</pre></td></tr>
2956
2957
2958<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2959<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2960
2961Given
2962  struct S {
2963    S(); // #1
2964    S(const S &amp;); // #2
2965    S(S &amp;&amp;); // #3
2966  };
2967cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2968</pre></td></tr>
2969
2970
2971<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2972<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2973
2974Given
2975  struct S {
2976    S(); // #1
2977    S(int) {} // #2
2978    S(S &amp;&amp;) : S() {} // #3
2979  };
2980  S::S() : S(0) {} // #4
2981cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2982#1 or #2.
2983</pre></td></tr>
2984
2985
2986<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2987<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2988that have an explicit specifier if this explicit specifier is resolved to
2989true.
2990
2991Given
2992  template&lt;bool b&gt;
2993  struct S {
2994    S(int); // #1
2995    explicit S(double); // #2
2996    operator int(); // #3
2997    explicit operator bool(); // #4
2998    explicit(false) S(bool) // # 7
2999    explicit(true) S(char) // # 8
3000    explicit(b) S(S) // # 9
3001  };
3002  S(int) -&gt; S&lt;true&gt; // #5
3003  explicit S(double) -&gt; S&lt;false&gt; // #6
3004cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3005cxxConversionDecl(isExplicit()) will match #4, but not #3.
3006cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3007</pre></td></tr>
3008
3009
3010<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
3011<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3012
3013Given
3014  struct S {
3015    S(); // #1
3016    S(const S &amp;); // #2
3017    S(S &amp;&amp;); // #3
3018  };
3019cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3020</pre></td></tr>
3021
3022
3023<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
3024<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3025that have an explicit specifier if this explicit specifier is resolved to
3026true.
3027
3028Given
3029  template&lt;bool b&gt;
3030  struct S {
3031    S(int); // #1
3032    explicit S(double); // #2
3033    operator int(); // #3
3034    explicit operator bool(); // #4
3035    explicit(false) S(bool) // # 7
3036    explicit(true) S(char) // # 8
3037    explicit(b) S(S) // # 9
3038  };
3039  S(int) -&gt; S&lt;true&gt; // #5
3040  explicit S(double) -&gt; S&lt;false&gt; // #6
3041cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3042cxxConversionDecl(isExplicit()) will match #4, but not #3.
3043cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3044</pre></td></tr>
3045
3046
3047<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
3048<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3049opposed to a member.
3050
3051Given
3052  struct B {};
3053  struct D : B {
3054    int I;
3055    D(int i) : I(i) {}
3056  };
3057  struct E : B {
3058    E() : B() {}
3059  };
3060cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3061  will match E(), but not match D(int).
3062</pre></td></tr>
3063
3064
3065<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
3066<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3067opposed to a base.
3068
3069Given
3070  struct B {};
3071  struct D : B {
3072    int I;
3073    D(int i) : I(i) {}
3074  };
3075  struct E : B {
3076    E() : B() {}
3077  };
3078cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3079  will match D(int), but not match E().
3080</pre></td></tr>
3081
3082
3083<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
3084<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3085code (as opposed to implicitly added by the compiler).
3086
3087Given
3088  struct Foo {
3089    Foo() { }
3090    Foo(int) : foo_("A") { }
3091    string foo_;
3092  };
3093cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3094  will match Foo(int), but not Foo()
3095</pre></td></tr>
3096
3097
3098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
3099<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3100that have an explicit specifier if this explicit specifier is resolved to
3101true.
3102
3103Given
3104  template&lt;bool b&gt;
3105  struct S {
3106    S(int); // #1
3107    explicit S(double); // #2
3108    operator int(); // #3
3109    explicit operator bool(); // #4
3110    explicit(false) S(bool) // # 7
3111    explicit(true) S(char) // # 8
3112    explicit(b) S(S) // # 9
3113  };
3114  S(int) -&gt; S&lt;true&gt; // #5
3115  explicit S(double) -&gt; S&lt;false&gt; // #6
3116cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3117cxxConversionDecl(isExplicit()) will match #4, but not #3.
3118cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3119</pre></td></tr>
3120
3121
3122<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr>
3123<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3124
3125In template declarations, dependent members are not resolved and so can
3126not be matched to particular named declarations.
3127
3128This matcher allows to match on the known name of members.
3129
3130Given
3131  template &lt;typename T&gt;
3132  struct S {
3133      void mem();
3134  };
3135  template &lt;typename T&gt;
3136  void x() {
3137      S&lt;T&gt; s;
3138      s.mem();
3139  }
3140cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3141</pre></td></tr>
3142
3143
3144<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
3145<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
3146to '.'.
3147
3148Member calls on the implicit this pointer match as called with '-&gt;'.
3149
3150Given
3151  class Y {
3152    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3153    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3154    int a;
3155    static int b;
3156  };
3157  template &lt;class T&gt;
3158  class Z {
3159    void x() { this-&gt;m; }
3160  };
3161memberExpr(isArrow())
3162  matches this-&gt;x, x, y.x, a, this-&gt;b
3163cxxDependentScopeMemberExpr(isArrow())
3164  matches this-&gt;m
3165unresolvedMemberExpr(isArrow())
3166  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3167</pre></td></tr>
3168
3169
3170<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr>
3171<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3172node
3173
3174In template declarations, dependent members are not resolved and so can
3175not be matched to particular named declarations.
3176
3177This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3178and CXXMethodDecl nodes.
3179
3180Given
3181  template &lt;typename T&gt;
3182  struct S {
3183      void mem();
3184  };
3185  template &lt;typename T&gt;
3186  void x() {
3187      S&lt;T&gt; s;
3188      s.mem();
3189  }
3190The matcher
3191@code
3192cxxDependentScopeMemberExpr(
3193  hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3194      hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3195          cxxMethodDecl(hasName("mem")).bind("templMem")
3196          )))))
3197      )))),
3198  memberHasSameNameAsBoundNode("templMem")
3199  )
3200@endcode
3201first matches and binds the @c mem member of the @c S template, then
3202compares its name to the usage in @c s.mem() in the @c x function template
3203</pre></td></tr>
3204
3205
3206<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
3207<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3208
3209Given
3210struct A {
3211  void foo() const;
3212  void bar();
3213};
3214
3215cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3216</pre></td></tr>
3217
3218
3219<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
3220<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3221operator.
3222
3223Given
3224struct A {
3225  A &amp;operator=(const A &amp;);
3226  A &amp;operator=(A &amp;&amp;);
3227};
3228
3229cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3230the second one.
3231</pre></td></tr>
3232
3233
3234<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
3235<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3236
3237Given:
3238  class A final {};
3239
3240  struct B {
3241    virtual void f();
3242  };
3243
3244  struct C : B {
3245    void f() final;
3246  };
3247matches A and C::f, but not B, C, or B::f
3248</pre></td></tr>
3249
3250
3251<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
3252<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3253operator.
3254
3255Given
3256struct A {
3257  A &amp;operator=(const A &amp;);
3258  A &amp;operator=(A &amp;&amp;);
3259};
3260
3261cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3262the first one.
3263</pre></td></tr>
3264
3265
3266<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
3267<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3268
3269Given
3270  class A {
3271   public:
3272    virtual void x();
3273  };
3274  class B : public A {
3275   public:
3276    virtual void x();
3277  };
3278  matches B::x
3279</pre></td></tr>
3280
3281
3282<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
3283<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3284
3285Given
3286  class A {
3287   public:
3288    virtual void x() = 0;
3289  };
3290  matches A::x
3291</pre></td></tr>
3292
3293
3294<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
3295<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3296
3297Given
3298  struct S {
3299    S(); // #1
3300    S(const S &amp;) = default; // #2
3301    S(S &amp;&amp;) = delete; // #3
3302  };
3303cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3304</pre></td></tr>
3305
3306
3307<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
3308<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3309virtual inheritance.
3310
3311Example:
3312  class A {
3313   public:
3314    virtual void x(); // matches x
3315  };
3316
3317Example:
3318  class Base {};
3319  class DirectlyDerived : virtual Base {}; // matches Base
3320  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3321
3322Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
3323</pre></td></tr>
3324
3325
3326<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
3327<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3328
3329Given
3330  class A {
3331   public:
3332    virtual void x();
3333  };
3334  class B : public A {
3335   public:
3336    void x();
3337  };
3338  matches A::x but not B::x
3339</pre></td></tr>
3340
3341
3342<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
3343<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3344
3345Given:
3346  MyClass *p1 = new MyClass[10];
3347cxxNewExpr(isArray())
3348  matches the expression 'new MyClass[10]'.
3349</pre></td></tr>
3350
3351
3352<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3353<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3354specified names.
3355
3356   hasAnyOperatorName("+", "-")
3357 Is equivalent to
3358   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3359</pre></td></tr>
3360
3361
3362<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3363<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3364
3365Matches overloaded operator names specified in strings without the
3366"operator" prefix: e.g. "&lt;&lt;".
3367
3368  hasAnyOverloadedOperatorName("+", "-")
3369Is equivalent to
3370  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3371</pre></td></tr>
3372
3373
3374<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3375<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3376unary).
3377
3378Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3379  !(a || b)
3380</pre></td></tr>
3381
3382
3383<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3384<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3385
3386Matches overloaded operator names specified in strings without the
3387"operator" prefix: e.g. "&lt;&lt;".
3388
3389Given:
3390  class A { int operator*(); };
3391  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3392  A a;
3393  a &lt;&lt; a;   // &lt;-- This matches
3394
3395cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3396specified line and
3397cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3398matches the declaration of A.
3399
3400Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
3401</pre></td></tr>
3402
3403
3404<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
3405<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3406
3407Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3408  if (a == b)
3409    a += b;
3410
3411Example 2: matches s1 = s2
3412           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3413  struct S { S&amp; operator=(const S&amp;); };
3414  void x() { S s1, s2; s1 = s2; }
3415</pre></td></tr>
3416
3417
3418<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
3419<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3420
3421Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3422  if (a == b)
3423    a += b;
3424
3425Example 2: matches s1 &lt; s2
3426           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3427  struct S { bool operator&lt;(const S&amp; other); };
3428  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3429</pre></td></tr>
3430
3431
3432<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
3433<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3434
3435Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3436class x {};
3437class y;
3438</pre></td></tr>
3439
3440
3441<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
3442<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3443</pre></td></tr>
3444
3445
3446<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
3447<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3448</pre></td></tr>
3449
3450
3451<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
3452<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3453static member variable template instantiations.
3454
3455Given
3456  template&lt;typename T&gt; void A(T t) { }
3457  template&lt;&gt; void A(int N) { }
3458functionDecl(isExplicitTemplateSpecialization())
3459  matches the specialization A&lt;int&gt;().
3460
3461Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3462</pre></td></tr>
3463
3464
3465<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
3466<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3467
3468Given:
3469  class A final {};
3470
3471  struct B {
3472    virtual void f();
3473  };
3474
3475  struct C : B {
3476    void f() final;
3477  };
3478matches A and C::f, but not B, C, or B::f
3479</pre></td></tr>
3480
3481
3482<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
3483<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3484
3485Given:
3486  auto x = []{};
3487
3488cxxRecordDecl(isLambda()) matches the implicit class declaration of
3489decltype(x)
3490</pre></td></tr>
3491
3492
3493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
3494<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3495isSameOrDerivedFrom(hasName(...)).
3496</pre></td></tr>
3497
3498
3499<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
3500<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3501member variable template instantiations.
3502
3503Given
3504  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3505or
3506  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3507or
3508  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3509cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3510  matches the template instantiation of X&lt;A&gt;.
3511
3512But given
3513  template &lt;typename T&gt;  class X {}; class A {};
3514  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3515cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3516  does not match, as X&lt;A&gt; is an explicit template specialization.
3517
3518Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3519</pre></td></tr>
3520
3521
3522<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3523<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3524specified names.
3525
3526   hasAnyOperatorName("+", "-")
3527 Is equivalent to
3528   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3529</pre></td></tr>
3530
3531
3532<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3533<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3534unary).
3535
3536Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3537  !(a || b)
3538</pre></td></tr>
3539
3540
3541<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr>
3542<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3543
3544Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3545  if (a == b)
3546    a += b;
3547
3548Example 2: matches s1 = s2
3549           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3550  struct S { S&amp; operator=(const S&amp;); };
3551  void x() { S s1, s2; s1 = s2; }
3552</pre></td></tr>
3553
3554
3555<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
3556<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3557
3558Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3559  if (a == b)
3560    a += b;
3561
3562Example 2: matches s1 &lt; s2
3563           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3564  struct S { bool operator&lt;(const S&amp; other); };
3565  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3566</pre></td></tr>
3567
3568
3569<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3570<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3571a specific number of arguments (including absent default arguments).
3572
3573Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3574  void f(int x, int y);
3575  f(0, 0);
3576</pre></td></tr>
3577
3578
3579<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3580<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3581a specific number of arguments (including absent default arguments).
3582
3583Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3584  void f(int x, int y);
3585  f(0, 0);
3586</pre></td></tr>
3587
3588
3589<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
3590<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3591
3592Example matches y(x) but not y(42) or NS::y(x).
3593  namespace NS {
3594    struct X {};
3595    void y(X);
3596  }
3597
3598  void y(...);
3599
3600  void test() {
3601    NS::X x;
3602    y(x); // Matches
3603    NS::y(x); // Doesn't match
3604    y(42); // Doesn't match
3605    using NS::y;
3606    y(x); // Found by both unqualified lookup and ADL, doesn't match
3607   }
3608</pre></td></tr>
3609
3610
3611<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
3612<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3613
3614Example: matches the implicit cast around 0
3615(matcher = castExpr(hasCastKind(CK_NullToPointer)))
3616  int *p = 0;
3617
3618If the matcher is use from clang-query, CastKind parameter
3619should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3620</pre></td></tr>
3621
3622
3623<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
3624<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3625
3626
3627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
3628<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3629
3630Given
3631  f('false, 3.14, 42);
3632characterLiteral(equals(0))
3633  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3634  match false
3635floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3636  match 3.14
3637integerLiteral(equals(42))
3638  matches 42
3639
3640Note that you cannot directly match a negative numeric literal because the
3641minus sign is not part of the literal: It is a unary operator whose operand
3642is the positive numeric literal. Instead, you must use a unaryOperator()
3643matcher to match the minus sign:
3644
3645unaryOperator(hasOperatorName("-"),
3646              hasUnaryOperand(integerLiteral(equals(13))))
3647
3648Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3649           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
3650</pre></td></tr>
3651
3652
3653<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
3654<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3655
3656
3657<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
3658<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3659
3660
3661<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
3662<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3663
3664Given
3665  template&lt;typename T&gt; struct C {};
3666  C&lt;int&gt; c;
3667classTemplateSpecializationDecl(templateArgumentCountIs(1))
3668  matches C&lt;int&gt;.
3669</pre></td></tr>
3670
3671
3672<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
3673<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3674child statements.
3675
3676Example: Given
3677  { for (;;) {} }
3678compoundStmt(statementCountIs(0)))
3679  matches '{}'
3680  but does not match the outer compound statement.
3681</pre></td></tr>
3682
3683
3684<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
3685<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3686
3687Given
3688  int a[42];
3689  int b[2 * 21];
3690  int c[41], d[43];
3691  char *s = "abcd";
3692  wchar_t *ws = L"abcd";
3693  char *w = "a";
3694constantArrayType(hasSize(42))
3695  matches "int a[42]" and "int b[2 * 21]"
3696stringLiteral(hasSize(4))
3697  matches "abcd", L"abcd"
3698</pre></td></tr>
3699
3700
3701<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
3702<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3703declarations.
3704
3705Example: Given
3706  int a, b;
3707  int c;
3708  int d = 2, e;
3709declCountIs(2)
3710  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3711</pre></td></tr>
3712
3713
3714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3715<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3716
3717Matches a node if it equals the node previously bound to ID.
3718
3719Given
3720  class X { int a; int b; };
3721cxxRecordDecl(
3722    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3723    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3724  matches the class X, as a and b have the same type.
3725
3726Note that when multiple matches are involved via forEach* matchers,
3727equalsBoundNodes acts as a filter.
3728For example:
3729compoundStmt(
3730    forEachDescendant(varDecl().bind("d")),
3731    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3732will trigger a match for each combination of variable declaration
3733and reference to that variable declaration within a compound statement.
3734</pre></td></tr>
3735
3736
3737<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
3738<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3739
3740Decl has pointer identity in the AST.
3741</pre></td></tr>
3742
3743
3744<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
3745<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3746
3747Given
3748  __attribute__((device)) void f() { ... }
3749decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3750f. If the matcher is used from clang-query, attr::Kind parameter should be
3751passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3752</pre></td></tr>
3753
3754
3755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
3756<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3757Does not match if only part of the statement is expanded from that macro or
3758if different parts of the the statement are expanded from different
3759appearances of the macro.
3760</pre></td></tr>
3761
3762
3763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
3764<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3765partially matching a given regex.
3766
3767Example matches Y but not X
3768    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3769  #include "ASTMatcher.h"
3770  class X {};
3771ASTMatcher.h:
3772  class Y {};
3773
3774Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3775
3776If the matcher is used in clang-query, RegexFlags parameter
3777should be passed as a quoted string. e.g: "NoFlags".
3778Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3779</pre></td></tr>
3780
3781
3782<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
3783<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3784
3785Example matches X but not Y
3786  (matcher = cxxRecordDecl(isExpansionInMainFile())
3787  #include &lt;Y.h&gt;
3788  class X {};
3789Y.h:
3790  class Y {};
3791
3792Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3793</pre></td></tr>
3794
3795
3796<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3797<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3798
3799Example matches Y but not X
3800    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3801  #include &lt;SystemHeader.h&gt;
3802  class X {};
3803SystemHeader.h:
3804  class Y {};
3805
3806Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3807</pre></td></tr>
3808
3809
3810<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3811<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3812by the compiler (eg. implicit default/copy constructors).
3813</pre></td></tr>
3814
3815
3816<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
3817<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3818
3819Given
3820  class vector {};
3821  namespace foo {
3822    class vector {};
3823    namespace std {
3824      class vector {};
3825    }
3826  }
3827  namespace std {
3828    inline namespace __1 {
3829      class vector {}; // #1
3830      namespace experimental {
3831        class vector {};
3832      }
3833    }
3834  }
3835cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3836</pre></td></tr>
3837
3838
3839<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
3840<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3841template instantiations.
3842
3843Given
3844  template&lt;typename T&gt; void A(T t) { T i; }
3845  A(0);
3846  A(0U);
3847functionDecl(isInstantiated())
3848  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3849</pre></td></tr>
3850
3851
3852<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
3853<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3854inheritance.
3855
3856Examples:
3857  class C {
3858  public:    int a;
3859  protected: int b;
3860  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3861  };
3862
3863  struct Base {};
3864  struct Derived1 : private Base {}; // matches 'Base'
3865  class Derived2 : Base {}; // matches 'Base'
3866</pre></td></tr>
3867
3868
3869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
3870<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3871protected inheritance.
3872
3873Examples:
3874  class C {
3875  public:    int a;
3876  protected: int b; // fieldDecl(isProtected()) matches 'b'
3877  private:   int c;
3878  };
3879
3880  class Base {};
3881  class Derived : protected Base {}; // matches 'Base'
3882</pre></td></tr>
3883
3884
3885<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
3886<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3887inheritance.
3888
3889Examples:
3890  class C {
3891  public:    int a; // fieldDecl(isPublic()) matches 'a'
3892  protected: int b;
3893  private:   int c;
3894  };
3895
3896  class Base {};
3897  class Derived1 : public Base {}; // matches 'Base'
3898  struct Derived2 : Base {}; // matches 'Base'
3899</pre></td></tr>
3900
3901
3902<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
3903<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3904a specific number of designators.
3905
3906Example: Given
3907  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3908  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3909designatorCountIs(2)
3910  matches '{ [2].y = 1.0, [0].x = 1.0 }',
3911  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3912</pre></td></tr>
3913
3914
3915<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
3916<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3917
3918Example matches Y (matcher = enumDecl(isScoped()))
3919enum X {};
3920enum class Y {};
3921</pre></td></tr>
3922
3923
3924<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
3925<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3926neither type- nor value-dependent.
3927
3928In the following example, the expression sizeof(sizeof(T() + T()))
3929is instantiation-dependent (since it involves a template parameter T),
3930but is neither type- nor value-dependent, since the type of the inner
3931sizeof is known (std::size_t) and therefore the size of the outer
3932sizeof is known.
3933  template&lt;typename T&gt;
3934  void f(T x, T y) { sizeof(sizeof(T() + T()); }
3935expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3936</pre></td></tr>
3937
3938
3939<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
3940<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3941is not yet instantiated.
3942
3943For example, the expressions "x" and "x + y" are type-dependent in
3944the following code, but "y" is not type-dependent:
3945  template&lt;typename T&gt;
3946  void add(T x, int y) {
3947    x + y;
3948  }
3949expr(isTypeDependent()) matches x + y
3950</pre></td></tr>
3951
3952
3953<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
3954<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3955non-type template parameter.
3956
3957For example, the array bound of "Chars" in the following example is
3958value-dependent.
3959  template&lt;int Size&gt; int f() { return Size; }
3960expr(isValueDependent()) matches return Size
3961</pre></td></tr>
3962
3963
3964<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3965<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3966GNU's __null, C++11's nullptr, or C's NULL macro.
3967
3968Given:
3969  void *v1 = NULL;
3970  void *v2 = nullptr;
3971  void *v3 = __null; // GNU extension
3972  char *cp = (char *)0;
3973  int *ip = 0;
3974  int i = 0;
3975expr(nullPointerConstant())
3976  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3977  initializer for i.
3978</pre></td></tr>
3979
3980
3981<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
3982<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3983bit width.
3984
3985Given
3986  class C {
3987    int a : 2;
3988    int b : 4;
3989    int c : 2;
3990  };
3991fieldDecl(hasBitWidth(2))
3992  matches 'int a;' and 'int c;' but not 'int b;'.
3993</pre></td></tr>
3994
3995
3996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
3997<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3998
3999Given
4000  class C {
4001    int a : 2;
4002    int b;
4003  };
4004fieldDecl(isBitField())
4005  matches 'int a;' but not 'int b;'.
4006</pre></td></tr>
4007
4008
4009<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4010<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4011
4012Given
4013  f('false, 3.14, 42);
4014characterLiteral(equals(0))
4015  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4016  match false
4017floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4018  match 3.14
4019integerLiteral(equals(42))
4020  matches 42
4021
4022Note that you cannot directly match a negative numeric literal because the
4023minus sign is not part of the literal: It is a unary operator whose operand
4024is the positive numeric literal. Instead, you must use a unaryOperator()
4025matcher to match the minus sign:
4026
4027unaryOperator(hasOperatorName("-"),
4028              hasUnaryOperand(integerLiteral(equals(13))))
4029
4030Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4031           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4032</pre></td></tr>
4033
4034
4035<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
4036<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4037
4038
4039<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
4040<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4041
4042Matches overloaded operator names specified in strings without the
4043"operator" prefix: e.g. "&lt;&lt;".
4044
4045  hasAnyOverloadedOperatorName("+", "-")
4046Is equivalent to
4047  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4048</pre></td></tr>
4049
4050
4051<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4052<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4053
4054Given:
4055  void f();
4056  void g() noexcept;
4057  void h() noexcept(true);
4058  void i() noexcept(false);
4059  void j() throw();
4060  void k() throw(int);
4061  void l() throw(...);
4062functionDecl(hasDynamicExceptionSpec()) and
4063  functionProtoType(hasDynamicExceptionSpec())
4064  match the declarations of j, k, and l, but not f, g, h, or i.
4065</pre></td></tr>
4066
4067
4068<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
4069<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4070
4071Matches overloaded operator names specified in strings without the
4072"operator" prefix: e.g. "&lt;&lt;".
4073
4074Given:
4075  class A { int operator*(); };
4076  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
4077  A a;
4078  a &lt;&lt; a;   // &lt;-- This matches
4079
4080cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
4081specified line and
4082cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4083matches the declaration of A.
4084
4085Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
4086</pre></td></tr>
4087
4088
4089<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
4090<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4091
4092Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4093int X() {}
4094auto Y() -&gt; int {}
4095</pre></td></tr>
4096
4097
4098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
4099<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4100       and if constexpr.
4101
4102Given:
4103  constexpr int foo = 42;
4104  constexpr int bar();
4105  void baz() { if constexpr(1 &gt; 0) {} }
4106varDecl(isConstexpr())
4107  matches the declaration of foo.
4108functionDecl(isConstexpr())
4109  matches the declaration of bar.
4110ifStmt(isConstexpr())
4111  matches the if statement in baz.
4112</pre></td></tr>
4113
4114
4115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
4116<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4117
4118Given:
4119  class A { ~A(); };
4120  class B { ~B() = default; };
4121functionDecl(isDefaulted())
4122  matches the declaration of ~B, but not ~A.
4123</pre></td></tr>
4124
4125
4126<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
4127<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4128
4129Example matches A, va, fa
4130  class A {};
4131  class B;  // Doesn't match, as it has no body.
4132  int va;
4133  extern int vb;  // Doesn't match, as it doesn't define the variable.
4134  void fa() {}
4135  void fb();  // Doesn't match, as it has no body.
4136  @interface X
4137  - (void)ma; // Doesn't match, interface is declaration.
4138  @end
4139  @implementation X
4140  - (void)ma {}
4141  @end
4142
4143Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4144  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4145</pre></td></tr>
4146
4147
4148<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
4149<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4150
4151Given:
4152  void Func();
4153  void DeletedFunc() = delete;
4154functionDecl(isDeleted())
4155  matches the declaration of DeletedFunc, but not Func.
4156</pre></td></tr>
4157
4158
4159<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
4160<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4161static member variable template instantiations.
4162
4163Given
4164  template&lt;typename T&gt; void A(T t) { }
4165  template&lt;&gt; void A(int N) { }
4166functionDecl(isExplicitTemplateSpecialization())
4167  matches the specialization A&lt;int&gt;().
4168
4169Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4170</pre></td></tr>
4171
4172
4173<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
4174<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4175
4176Given:
4177  extern "C" void f() {}
4178  extern "C" { void g() {} }
4179  void h() {}
4180  extern "C" int x = 1;
4181  extern "C" int y = 2;
4182  int z = 3;
4183functionDecl(isExternC())
4184  matches the declaration of f and g, but not the declaration of h.
4185varDecl(isExternC())
4186  matches the declaration of x and y, but not the declaration of z.
4187</pre></td></tr>
4188
4189
4190<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
4191<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4192the inline keyword.
4193
4194Given
4195  inline void f();
4196  void g();
4197  namespace n {
4198  inline namespace m {}
4199  }
4200functionDecl(isInline()) will match ::f().
4201namespaceDecl(isInline()) will match n::m.
4202</pre></td></tr>
4203
4204
4205<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
4206<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4207into an executable program.
4208</pre></td></tr>
4209
4210
4211<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
4212<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4213
4214Given
4215  void nope();
4216  [[noreturn]] void a();
4217  __attribute__((noreturn)) void b();
4218  struct c { [[noreturn]] c(); };
4219functionDecl(isNoReturn())
4220  matches all of those except
4221  void nope();
4222</pre></td></tr>
4223
4224
4225<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
4226<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4227
4228Given:
4229  void f();
4230  void g() noexcept;
4231  void h() throw();
4232  void i() throw(int);
4233  void j() noexcept(false);
4234functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4235  match the declarations of g, and h, but not f, i or j.
4236</pre></td></tr>
4237
4238
4239<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
4240<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4241class specifier ("static" keyword) written in the source.
4242
4243Given:
4244  static void f() {}
4245  static int i = 0;
4246  extern int j;
4247  int k;
4248functionDecl(isStaticStorageClass())
4249  matches the function declaration f.
4250varDecl(isStaticStorageClass())
4251  matches the variable declaration i.
4252</pre></td></tr>
4253
4254
4255<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
4256<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4257member variable template instantiations.
4258
4259Given
4260  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4261or
4262  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4263or
4264  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4265cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4266  matches the template instantiation of X&lt;A&gt;.
4267
4268But given
4269  template &lt;typename T&gt;  class X {}; class A {};
4270  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4271cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4272  does not match, as X&lt;A&gt; is an explicit template specialization.
4273
4274Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4275</pre></td></tr>
4276
4277
4278<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
4279<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4280
4281Example matches f, but not g or h. The function i will not match, even when
4282compiled in C mode.
4283  void f(...);
4284  void g(int);
4285  template &lt;typename... Ts&gt; void h(Ts...);
4286  void i();
4287</pre></td></tr>
4288
4289
4290<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr>
4291<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4292
4293Given:
4294  void foo() __attribute__((__weakref__("__foo")));
4295  void bar();
4296functionDecl(isWeak())
4297  matches the weak declaration "foo", but not "bar".
4298</pre></td></tr>
4299
4300
4301<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4302<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4303specific parameter count.
4304
4305Given
4306  void f(int i) {}
4307  void g(int i, int j) {}
4308  void h(int i, int j);
4309  void j(int i);
4310  void k(int x, int y, int z, ...);
4311functionDecl(parameterCountIs(2))
4312  matches g and h
4313functionProtoType(parameterCountIs(2))
4314  matches g and h
4315functionProtoType(parameterCountIs(3))
4316  matches k
4317</pre></td></tr>
4318
4319
4320<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4321<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4322
4323Given:
4324  void f();
4325  void g() noexcept;
4326  void h() noexcept(true);
4327  void i() noexcept(false);
4328  void j() throw();
4329  void k() throw(int);
4330  void l() throw(...);
4331functionDecl(hasDynamicExceptionSpec()) and
4332  functionProtoType(hasDynamicExceptionSpec())
4333  match the declarations of j, k, and l, but not f, g, h, or i.
4334</pre></td></tr>
4335
4336
4337<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
4338<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4339
4340Given:
4341  void f();
4342  void g() noexcept;
4343  void h() throw();
4344  void i() throw(int);
4345  void j() noexcept(false);
4346functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4347  match the declarations of g, and h, but not f, i or j.
4348</pre></td></tr>
4349
4350
4351<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4352<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4353specific parameter count.
4354
4355Given
4356  void f(int i) {}
4357  void g(int i, int j) {}
4358  void h(int i, int j);
4359  void j(int i);
4360  void k(int x, int y, int z, ...);
4361functionDecl(parameterCountIs(2))
4362  matches g and h
4363functionProtoType(parameterCountIs(2))
4364  matches g and h
4365functionProtoType(parameterCountIs(3))
4366  matches k
4367</pre></td></tr>
4368
4369
4370<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
4371<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4372       and if constexpr.
4373
4374Given:
4375  constexpr int foo = 42;
4376  constexpr int bar();
4377  void baz() { if constexpr(1 &gt; 0) {} }
4378varDecl(isConstexpr())
4379  matches the declaration of foo.
4380functionDecl(isConstexpr())
4381  matches the declaration of bar.
4382ifStmt(isConstexpr())
4383  matches the if statement in baz.
4384</pre></td></tr>
4385
4386
4387<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
4388<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4389
4390
4391<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4392<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4393
4394Given
4395  f('false, 3.14, 42);
4396characterLiteral(equals(0))
4397  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4398  match false
4399floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4400  match 3.14
4401integerLiteral(equals(42))
4402  matches 42
4403
4404Note that you cannot directly match a negative numeric literal because the
4405minus sign is not part of the literal: It is a unary operator whose operand
4406is the positive numeric literal. Instead, you must use a unaryOperator()
4407matcher to match the minus sign:
4408
4409unaryOperator(hasOperatorName("-"),
4410              hasUnaryOperand(integerLiteral(equals(13))))
4411
4412Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4413           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4414</pre></td></tr>
4415
4416
4417<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
4418<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4419
4420
4421<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
4422<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4423
4424
4425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
4426<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4427to '.'.
4428
4429Member calls on the implicit this pointer match as called with '-&gt;'.
4430
4431Given
4432  class Y {
4433    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4434    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4435    int a;
4436    static int b;
4437  };
4438  template &lt;class T&gt;
4439  class Z {
4440    void x() { this-&gt;m; }
4441  };
4442memberExpr(isArrow())
4443  matches this-&gt;x, x, y.x, a, this-&gt;b
4444cxxDependentScopeMemberExpr(isArrow())
4445  matches this-&gt;m
4446unresolvedMemberExpr(isArrow())
4447  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4448</pre></td></tr>
4449
4450
4451<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
4452<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4453
4454This matcher is only provided as a performance optimization of hasName.
4455    hasAnyName(a, b, c)
4456 is equivalent to, but faster than
4457    anyOf(hasName(a), hasName(b), hasName(c))
4458</pre></td></tr>
4459
4460
4461<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
4462<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4463
4464Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4465void f() {
4466  int x;
4467  static int y;
4468}
4469int z;
4470
4471Example matches f() because it has external formal linkage despite being
4472unique to the translation unit as though it has internal likage
4473(matcher = functionDecl(hasExternalFormalLinkage()))
4474
4475namespace {
4476void f() {}
4477}
4478</pre></td></tr>
4479
4480
4481<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr>
4482<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4483
4484Supports specifying enclosing namespaces or classes by prefixing the name
4485with '&lt;enclosing&gt;::'.
4486Does not match typedefs of an underlying type with the given name.
4487
4488Example matches X (Name == "X")
4489  class X;
4490
4491Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4492  namespace a { namespace b { class X; } }
4493</pre></td></tr>
4494
4495
4496<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4497<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4498a substring matched by the given RegExp.
4499
4500Supports specifying enclosing namespaces or classes by
4501prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4502of an underlying type with the given name.
4503
4504Example matches X (regexp == "::X")
4505  class X;
4506
4507Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4508  namespace foo { namespace bar { class X; } }
4509
4510If the matcher is used in clang-query, RegexFlags parameter
4511should be passed as a quoted string. e.g: "NoFlags".
4512Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4513</pre></td></tr>
4514
4515
4516<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
4517<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4518
4519Given
4520  namespace n {
4521  namespace {} // #1
4522  }
4523namespaceDecl(isAnonymous()) will match #1 but not ::n.
4524</pre></td></tr>
4525
4526
4527<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
4528<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4529the inline keyword.
4530
4531Given
4532  inline void f();
4533  void g();
4534  namespace n {
4535  inline namespace m {}
4536  }
4537functionDecl(isInline()) will match ::f().
4538namespaceDecl(isInline()) will match n::m.
4539</pre></td></tr>
4540
4541
4542<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr>
4543<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4544specified.
4545
4546Given
4547
4548  #pragma omp parallel
4549  #pragma omp parallel default(none)
4550  #pragma omp parallel default(shared)
4551  #pragma omp parallel default(firstprivate)
4552
4553``ompDefaultClause(isFirstPrivateKind())`` matches only
4554``default(firstprivate)``.
4555</pre></td></tr>
4556
4557
4558<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
4559<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4560
4561Given
4562
4563  #pragma omp parallel
4564  #pragma omp parallel default(none)
4565  #pragma omp parallel default(shared)
4566  #pragma omp parallel default(firstprivate)
4567
4568``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4569</pre></td></tr>
4570
4571
4572<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
4573<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4574
4575Given
4576
4577  #pragma omp parallel
4578  #pragma omp parallel default(none)
4579  #pragma omp parallel default(shared)
4580  #pragma omp parallel default(firstprivate)
4581
4582``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4583</pre></td></tr>
4584
4585
4586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
4587<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4588clause kind.
4589
4590Given
4591
4592  #pragma omp parallel
4593  #pragma omp parallel for
4594  #pragma omp          for
4595
4596`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4597``omp parallel`` and ``omp parallel for``.
4598
4599If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4600should be passed as a quoted string. e.g.,
4601``isAllowedToContainClauseKind("OMPC_default").``
4602</pre></td></tr>
4603
4604
4605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
4606<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4607i.e., directives that can't have a structured block.
4608
4609Given
4610
4611  #pragma omp parallel
4612  {}
4613  #pragma omp taskyield
4614
4615``ompExecutableDirective(isStandaloneDirective()))`` matches
4616``omp taskyield``.
4617</pre></td></tr>
4618
4619
4620<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
4621<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4622</pre></td></tr>
4623
4624
4625<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
4626<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4627</pre></td></tr>
4628
4629
4630<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
4631<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4632isSameOrDerivedFrom(hasName(...)).
4633</pre></td></tr>
4634
4635
4636<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
4637<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4638a specific number of arguments (including absent default arguments).
4639
4640Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4641  void f(int x, int y);
4642  f(0, 0);
4643</pre></td></tr>
4644
4645
4646<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
4647<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4648Selector.getAsString()
4649
4650 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4651 matches both of the expressions below:
4652    [myObj methodA:argA];
4653    [myObj methodB:argB];
4654</pre></td></tr>
4655
4656
4657<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
4658<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4659
4660objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4661message expression in
4662
4663  UIWebView *webView = ...;
4664  CGRect bodyFrame = webView.frame;
4665  bodyFrame.size.height = self.bodyContentHeight;
4666  webView.frame = bodyFrame;
4667  //     ^---- matches here
4668</pre></td></tr>
4669
4670
4671<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
4672<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4673
4674Matches only when the selector of the objCMessageExpr is NULL. This may
4675represent an error condition in the tree!
4676</pre></td></tr>
4677
4678
4679<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
4680<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4681
4682 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4683 matches the outer message expr in the code below, but NOT the message
4684 invocation for self.bodyView.
4685    [self.bodyView loadHTMLString:html baseURL:NULL];
4686</pre></td></tr>
4687
4688
4689<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
4690<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4691
4692 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4693 matches self.bodyView in the code below, but NOT the outer message
4694 invocation of "loadHTMLString:baseURL:".
4695    [self.bodyView loadHTMLString:html baseURL:NULL];
4696</pre></td></tr>
4697
4698
4699<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
4700<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4701
4702Example
4703matcher = objcMessageExpr(isClassMessage())
4704matches
4705  [NSString stringWithFormat:@"format"];
4706but not
4707  NSString *x = @"hello";
4708  [x containsString:@"h"];
4709</pre></td></tr>
4710
4711
4712<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
4713<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4714
4715Example
4716matcher = objcMessageExpr(isInstanceMessage())
4717matches
4718  NSString *x = @"hello";
4719  [x containsString:@"h"];
4720but not
4721  [NSString stringWithFormat:@"format"];
4722</pre></td></tr>
4723
4724
4725<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4726<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4727a substring matched by the given RegExp.
4728 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4729 invocation for self.bodyView.
4730    [self.bodyView loadHTMLString:html baseURL:NULL];
4731
4732If the matcher is used in clang-query, RegexFlags parameter
4733should be passed as a quoted string. e.g: "NoFlags".
4734Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4735</pre></td></tr>
4736
4737
4738<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
4739<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4740
4741 matcher = objCMessageExpr(numSelectorArgs(0));
4742 matches self.bodyView in the code below
4743
4744 matcher = objCMessageExpr(numSelectorArgs(2));
4745 matches the invocation of "loadHTMLString:baseURL:" but not that
4746 of self.bodyView
4747    [self.bodyView loadHTMLString:html baseURL:NULL];
4748</pre></td></tr>
4749
4750
4751<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
4752<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4753
4754Example
4755matcher = objcMethodDecl(isClassMethod())
4756matches
4757@interface I + (void)foo; @end
4758but not
4759@interface I - (void)bar; @end
4760</pre></td></tr>
4761
4762
4763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
4764<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4765
4766Example matches A, va, fa
4767  class A {};
4768  class B;  // Doesn't match, as it has no body.
4769  int va;
4770  extern int vb;  // Doesn't match, as it doesn't define the variable.
4771  void fa() {}
4772  void fb();  // Doesn't match, as it has no body.
4773  @interface X
4774  - (void)ma; // Doesn't match, interface is declaration.
4775  @end
4776  @implementation X
4777  - (void)ma {}
4778  @end
4779
4780Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4782</pre></td></tr>
4783
4784
4785<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr>
4786<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4787
4788Example
4789matcher = objcMethodDecl(isInstanceMethod())
4790matches
4791@interface I - (void)bar; @end
4792but not
4793@interface I + (void)foo; @end
4794</pre></td></tr>
4795
4796
4797<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
4798<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4799
4800Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4801void x(int val) {}
4802void y(int val = 0) {}
4803
4804Deprecated. Use hasInitializer() instead to be able to
4805match on the contents of the default argument.  For example:
4806
4807void x(int val = 7) {}
4808void y(int val = 42) {}
4809parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4810  matches the parameter of y
4811
4812A matcher such as
4813  parmVarDecl(hasInitializer(anything()))
4814is equivalent to parmVarDecl(hasDefaultArgument()).
4815</pre></td></tr>
4816
4817
4818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr>
4819<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4820list. The parameter list could be that of either a block, function, or
4821objc-method.
4822
4823
4824Given
4825
4826void f(int a, int b, int c) {
4827}
4828
4829``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4830
4831``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4832</pre></td></tr>
4833
4834
4835<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
4836<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4837
4838Given
4839  class Y { public: void x(); };
4840  void z() { Y* y; y-&gt;x(); }
4841cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4842  matches y-&gt;x()
4843</pre></td></tr>
4844
4845
4846<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4847<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4848
4849Matches a node if it equals the node previously bound to ID.
4850
4851Given
4852  class X { int a; int b; };
4853cxxRecordDecl(
4854    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4855    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4856  matches the class X, as a and b have the same type.
4857
4858Note that when multiple matches are involved via forEach* matchers,
4859equalsBoundNodes acts as a filter.
4860For example:
4861compoundStmt(
4862    forEachDescendant(varDecl().bind("d")),
4863    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4864will trigger a match for each combination of variable declaration
4865and reference to that variable declaration within a compound statement.
4866</pre></td></tr>
4867
4868
4869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
4870<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4871the node, not hidden within a typedef.
4872
4873Given
4874  typedef const int const_int;
4875  const_int i;
4876  int *const j;
4877  int *volatile k;
4878  int m;
4879varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4880i is const-qualified but the qualifier is not local.
4881</pre></td></tr>
4882
4883
4884<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
4885<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4886
4887Given
4888  void a(char);
4889  void b(wchar_t);
4890  void c(double);
4891functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4892matches "a(char)", "b(wchar_t)", but not "c(double)".
4893</pre></td></tr>
4894
4895
4896<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
4897<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4898the Objective-C object pointer type, which is different despite being
4899syntactically similar.
4900
4901Given
4902  int *i = nullptr;
4903
4904  @interface Foo
4905  @end
4906  Foo *f;
4907
4908  int j;
4909varDecl(hasType(isAnyPointer()))
4910  matches "int *i" and "Foo *f", but not "int j".
4911</pre></td></tr>
4912
4913
4914<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
4915<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4916include "top-level" const.
4917
4918Given
4919  void a(int);
4920  void b(int const);
4921  void c(const int);
4922  void d(const int*);
4923  void e(int const) {};
4924functionDecl(hasAnyParameter(hasType(isConstQualified())))
4925  matches "void b(int const)", "void c(const int)" and
4926  "void e(int const) {}". It does not match d as there
4927  is no top-level const on the parameter type "const int *".
4928</pre></td></tr>
4929
4930
4931<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
4932<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4933
4934Given
4935  void a(int);
4936  void b(long);
4937  void c(double);
4938functionDecl(hasAnyParameter(hasType(isInteger())))
4939matches "a(int)", "b(long)", but not "c(double)".
4940</pre></td></tr>
4941
4942
4943<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
4944<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4945
4946Given
4947  void a(int);
4948  void b(unsigned long);
4949  void c(double);
4950functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4951matches "a(int)", but not "b(unsigned long)" and "c(double)".
4952</pre></td></tr>
4953
4954
4955<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
4956<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4957
4958Given
4959  void a(int);
4960  void b(unsigned long);
4961  void c(double);
4962functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4963matches "b(unsigned long)", but not "a(int)" and "c(double)".
4964</pre></td></tr>
4965
4966
4967<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
4968<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4969include "top-level" volatile.
4970
4971Given
4972  void a(int);
4973  void b(int volatile);
4974  void c(volatile int);
4975  void d(volatile int*);
4976  void e(int volatile) {};
4977functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4978  matches "void b(int volatile)", "void c(volatile int)" and
4979  "void e(int volatile) {}". It does not match d as there
4980  is no top-level volatile on the parameter type "volatile int *".
4981</pre></td></tr>
4982
4983
4984<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4985<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4986
4987Matches a node if it equals the node previously bound to ID.
4988
4989Given
4990  class X { int a; int b; };
4991cxxRecordDecl(
4992    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4993    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4994  matches the class X, as a and b have the same type.
4995
4996Note that when multiple matches are involved via forEach* matchers,
4997equalsBoundNodes acts as a filter.
4998For example:
4999compoundStmt(
5000    forEachDescendant(varDecl().bind("d")),
5001    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5002will trigger a match for each combination of variable declaration
5003and reference to that variable declaration within a compound statement.
5004</pre></td></tr>
5005
5006
5007<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
5008<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5009
5010Stmt has pointer identity in the AST.
5011</pre></td></tr>
5012
5013
5014<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5015<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5016Does not match if only part of the statement is expanded from that macro or
5017if different parts of the the statement are expanded from different
5018appearances of the macro.
5019</pre></td></tr>
5020
5021
5022<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5023<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5024partially matching a given regex.
5025
5026Example matches Y but not X
5027    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5028  #include "ASTMatcher.h"
5029  class X {};
5030ASTMatcher.h:
5031  class Y {};
5032
5033Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5034
5035If the matcher is used in clang-query, RegexFlags parameter
5036should be passed as a quoted string. e.g: "NoFlags".
5037Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5038</pre></td></tr>
5039
5040
5041<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
5042<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5043
5044Example matches X but not Y
5045  (matcher = cxxRecordDecl(isExpansionInMainFile())
5046  #include &lt;Y.h&gt;
5047  class X {};
5048Y.h:
5049  class Y {};
5050
5051Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5052</pre></td></tr>
5053
5054
5055<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5056<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5057
5058Example matches Y but not X
5059    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5060  #include &lt;SystemHeader.h&gt;
5061  class X {};
5062SystemHeader.h:
5063  class Y {};
5064
5065Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5066</pre></td></tr>
5067
5068
5069<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
5070<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5071
5072Given
5073  int j;
5074  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5075  A(0);
5076  A(0U);
5077declStmt(isInTemplateInstantiation())
5078  matches 'int i;' and 'unsigned i'.
5079unless(stmt(isInTemplateInstantiation()))
5080  will NOT match j += 42; as it's shared between the template definition and
5081  instantiation.
5082</pre></td></tr>
5083
5084
5085<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
5086<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5087
5088Given
5089  int a[42];
5090  int b[2 * 21];
5091  int c[41], d[43];
5092  char *s = "abcd";
5093  wchar_t *ws = L"abcd";
5094  char *w = "a";
5095constantArrayType(hasSize(42))
5096  matches "int a[42]" and "int b[2 * 21]"
5097stringLiteral(hasSize(4))
5098  matches "abcd", L"abcd"
5099</pre></td></tr>
5100
5101
5102<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
5103<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5104
5105Example matches C, but not S, U or E.
5106  struct S {};
5107  class C {};
5108  union U {};
5109  enum E {};
5110</pre></td></tr>
5111
5112
5113<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
5114<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5115
5116Example matches A, va, fa
5117  class A {};
5118  class B;  // Doesn't match, as it has no body.
5119  int va;
5120  extern int vb;  // Doesn't match, as it doesn't define the variable.
5121  void fa() {}
5122  void fb();  // Doesn't match, as it has no body.
5123  @interface X
5124  - (void)ma; // Doesn't match, interface is declaration.
5125  @end
5126  @implementation X
5127  - (void)ma {}
5128  @end
5129
5130Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
5131  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5132</pre></td></tr>
5133
5134
5135<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr>
5136<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5137
5138Example matches E, but not C, S or U.
5139  struct S {};
5140  class C {};
5141  union U {};
5142  enum E {};
5143</pre></td></tr>
5144
5145
5146<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
5147<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5148
5149Example matches S, but not C, U or E.
5150  struct S {};
5151  class C {};
5152  union U {};
5153  enum E {};
5154</pre></td></tr>
5155
5156
5157<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
5158<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5159
5160Example matches U, but not C, S or E.
5161  struct S {};
5162  class C {};
5163  union U {};
5164  enum E {};
5165</pre></td></tr>
5166
5167
5168<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
5169<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5170
5171Note that 'Value' is a string as the template argument's value is
5172an arbitrary precision integer. 'Value' must be euqal to the canonical
5173representation of that integral value in base 10.
5174
5175Given
5176  template&lt;int T&gt; struct C {};
5177  C&lt;42&gt; c;
5178classTemplateSpecializationDecl(
5179  hasAnyTemplateArgument(equalsIntegralValue("42")))
5180  matches the implicit instantiation of C in C&lt;42&gt;.
5181</pre></td></tr>
5182
5183
5184<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
5185<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5186
5187Given
5188  template&lt;int T&gt; struct C {};
5189  C&lt;42&gt; c;
5190classTemplateSpecializationDecl(
5191  hasAnyTemplateArgument(isIntegral()))
5192  matches the implicit instantiation of C in C&lt;42&gt;
5193  with isIntegral() matching 42.
5194</pre></td></tr>
5195
5196
5197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
5198<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5199
5200Given
5201  template&lt;typename T&gt; struct C {};
5202  C&lt;int&gt; c;
5203classTemplateSpecializationDecl(templateArgumentCountIs(1))
5204  matches C&lt;int&gt;.
5205</pre></td></tr>
5206
5207
5208<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5209<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5210Does not match if only part of the statement is expanded from that macro or
5211if different parts of the the statement are expanded from different
5212appearances of the macro.
5213</pre></td></tr>
5214
5215
5216<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5217<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5218partially matching a given regex.
5219
5220Example matches Y but not X
5221    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5222  #include "ASTMatcher.h"
5223  class X {};
5224ASTMatcher.h:
5225  class Y {};
5226
5227Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5228
5229If the matcher is used in clang-query, RegexFlags parameter
5230should be passed as a quoted string. e.g: "NoFlags".
5231Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5232</pre></td></tr>
5233
5234
5235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
5236<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5237
5238Example matches X but not Y
5239  (matcher = cxxRecordDecl(isExpansionInMainFile())
5240  #include &lt;Y.h&gt;
5241  class X {};
5242Y.h:
5243  class Y {};
5244
5245Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5246</pre></td></tr>
5247
5248
5249<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5250<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5251
5252Example matches Y but not X
5253    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5254  #include &lt;SystemHeader.h&gt;
5255  class X {};
5256SystemHeader.h:
5257  class Y {};
5258
5259Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5260</pre></td></tr>
5261
5262
5263<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
5264<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5265
5266Given
5267 struct S { bool func(); };
5268functionDecl(returns(booleanType()))
5269  matches "bool func();"
5270</pre></td></tr>
5271
5272
5273<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
5274<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5275
5276Matches a node if it equals the node previously bound to ID.
5277
5278Given
5279  class X { int a; int b; };
5280cxxRecordDecl(
5281    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5282    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5283  matches the class X, as a and b have the same type.
5284
5285Note that when multiple matches are involved via forEach* matchers,
5286equalsBoundNodes acts as a filter.
5287For example:
5288compoundStmt(
5289    forEachDescendant(varDecl().bind("d")),
5290    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5291will trigger a match for each combination of variable declaration
5292and reference to that variable declaration within a compound statement.
5293</pre></td></tr>
5294
5295
5296<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
5297<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5298
5299Type has pointer identity in the AST.
5300</pre></td></tr>
5301
5302
5303<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
5304<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5305
5306Given
5307  int i;
5308  float f;
5309realFloatingPointType()
5310  matches "float f" but not "int i"
5311</pre></td></tr>
5312
5313
5314<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
5315<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5316
5317Given
5318 struct S { void func(); };
5319functionDecl(returns(voidType()))
5320  matches "void func();"
5321</pre></td></tr>
5322
5323
5324<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
5325<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5326
5327Given
5328  int x;
5329  int s = sizeof(x) + alignof(x)
5330unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5331  matches sizeof(x)
5332
5333If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5334should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5335</pre></td></tr>
5336
5337
5338<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
5339<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5340specified names.
5341
5342   hasAnyOperatorName("+", "-")
5343 Is equivalent to
5344   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5345</pre></td></tr>
5346
5347
5348<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
5349<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5350unary).
5351
5352Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5353  !(a || b)
5354</pre></td></tr>
5355
5356
5357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
5358<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5359to '.'.
5360
5361Member calls on the implicit this pointer match as called with '-&gt;'.
5362
5363Given
5364  class Y {
5365    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5366    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5367    int a;
5368    static int b;
5369  };
5370  template &lt;class T&gt;
5371  class Z {
5372    void x() { this-&gt;m; }
5373  };
5374memberExpr(isArrow())
5375  matches this-&gt;x, x, y.x, a, this-&gt;b
5376cxxDependentScopeMemberExpr(isArrow())
5377  matches this-&gt;m
5378unresolvedMemberExpr(isArrow())
5379  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5380</pre></td></tr>
5381
5382
5383<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
5384<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5385
5386Example matches x, but not y, z, or a.
5387(matcher = varDecl(hasAutomaticStorageDuration())
5388void f() {
5389  int x;
5390  static int y;
5391  thread_local int z;
5392}
5393int a;
5394</pre></td></tr>
5395
5396
5397<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
5398<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5399
5400Example matches y and z (matcher = varDecl(hasGlobalStorage())
5401void f() {
5402  int x;
5403  static int y;
5404}
5405int z;
5406</pre></td></tr>
5407
5408
5409<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
5410<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5411non-static local variable.
5412
5413Example matches x (matcher = varDecl(hasLocalStorage())
5414void f() {
5415  int x;
5416  static int y;
5417}
5418int z;
5419</pre></td></tr>
5420
5421
5422<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
5423<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5424It includes the variable declared at namespace scope and those declared
5425with "static" and "extern" storage class specifiers.
5426
5427void f() {
5428  int x;
5429  static int y;
5430  thread_local int z;
5431}
5432int a;
5433static int b;
5434extern int c;
5435varDecl(hasStaticStorageDuration())
5436  matches the function declaration y, a, b and c.
5437</pre></td></tr>
5438
5439
5440<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
5441<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5442
5443Example matches z, but not x, z, or a.
5444(matcher = varDecl(hasThreadStorageDuration())
5445void f() {
5446  int x;
5447  static int y;
5448  thread_local int z;
5449}
5450int a;
5451</pre></td></tr>
5452
5453
5454<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
5455<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5456       and if constexpr.
5457
5458Given:
5459  constexpr int foo = 42;
5460  constexpr int bar();
5461  void baz() { if constexpr(1 &gt; 0) {} }
5462varDecl(isConstexpr())
5463  matches the declaration of foo.
5464functionDecl(isConstexpr())
5465  matches the declaration of bar.
5466ifStmt(isConstexpr())
5467  matches the if statement in baz.
5468</pre></td></tr>
5469
5470
5471<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
5472<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5473
5474Example matches A, va, fa
5475  class A {};
5476  class B;  // Doesn't match, as it has no body.
5477  int va;
5478  extern int vb;  // Doesn't match, as it doesn't define the variable.
5479  void fa() {}
5480  void fb();  // Doesn't match, as it has no body.
5481  @interface X
5482  - (void)ma; // Doesn't match, interface is declaration.
5483  @end
5484  @implementation X
5485  - (void)ma {}
5486  @end
5487
5488Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
5489  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5490</pre></td></tr>
5491
5492
5493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
5494<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5495a C++ catch block, or an Objective-C statement.
5496
5497Example matches x (matcher = varDecl(isExceptionVariable())
5498void f(int y) {
5499  try {
5500  } catch (int x) {
5501  }
5502}
5503</pre></td></tr>
5504
5505
5506<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
5507<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5508static member variable template instantiations.
5509
5510Given
5511  template&lt;typename T&gt; void A(T t) { }
5512  template&lt;&gt; void A(int N) { }
5513functionDecl(isExplicitTemplateSpecialization())
5514  matches the specialization A&lt;int&gt;().
5515
5516Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
5517</pre></td></tr>
5518
5519
5520<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
5521<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5522
5523Given:
5524  extern "C" void f() {}
5525  extern "C" { void g() {} }
5526  void h() {}
5527  extern "C" int x = 1;
5528  extern "C" int y = 2;
5529  int z = 3;
5530functionDecl(isExternC())
5531  matches the declaration of f and g, but not the declaration of h.
5532varDecl(isExternC())
5533  matches the declaration of x and y, but not the declaration of z.
5534</pre></td></tr>
5535
5536
5537<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
5538<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5539
5540Example matches y (matcher = varDecl(isStaticLocal()))
5541void f() {
5542  int x;
5543  static int y;
5544}
5545static int z;
5546</pre></td></tr>
5547
5548
5549<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
5550<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5551class specifier ("static" keyword) written in the source.
5552
5553Given:
5554  static void f() {}
5555  static int i = 0;
5556  extern int j;
5557  int k;
5558functionDecl(isStaticStorageClass())
5559  matches the function declaration f.
5560varDecl(isStaticStorageClass())
5561  matches the variable declaration i.
5562</pre></td></tr>
5563
5564
5565<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
5566<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5567member variable template instantiations.
5568
5569Given
5570  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5571or
5572  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5573or
5574  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5575cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5576  matches the template instantiation of X&lt;A&gt;.
5577
5578But given
5579  template &lt;typename T&gt;  class X {}; class A {};
5580  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5581cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5582  does not match, as X&lt;A&gt; is an explicit template specialization.
5583
5584Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
5585</pre></td></tr>
5586
5587<!--END_NARROWING_MATCHERS -->
5588</table>
5589
5590<!-- ======================================================================= -->
5591<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5592<!-- ======================================================================= -->
5593
5594<p>Traversal matchers specify the relationship to other nodes that are
5595reachable from the current node.</p>
5596
5597<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5598forEachDescendant) which work on all nodes and allow users to write more generic
5599match expressions.</p>
5600
5601<table>
5602<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5603<!-- START_TRAVERSAL_MATCHERS -->
5604
5605<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
5606<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5607
5608The code
5609  var1 != var2;
5610might be represented in the clang AST as a binaryOperator, a
5611cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5612
5613* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5614  least one is a class type (cxxOperatorCallExpr)
5615* whether the code appears in a template declaration, if at least one of the
5616  vars is a dependent-type (binaryOperator)
5617* whether the code relies on a rewritten binary operator, such as a
5618spaceship operator or an inverted equality operator
5619(cxxRewrittenBinaryOperator)
5620
5621This matcher elides details in places where the matchers for the nodes are
5622compatible.
5623
5624Given
5625  binaryOperation(
5626    hasOperatorName("!="),
5627    hasLHS(expr().bind("lhs")),
5628    hasRHS(expr().bind("rhs"))
5629  )
5630matches each use of "!=" in:
5631  struct S{
5632      bool operator!=(const S&amp;) const;
5633  };
5634
5635  void foo()
5636  {
5637     1 != 2;
5638     S() != S();
5639  }
5640
5641  template&lt;typename T&gt;
5642  void templ()
5643  {
5644     1 != 2;
5645     T() != S();
5646  }
5647  struct HasOpEq
5648  {
5649      bool operator==(const HasOpEq &amp;) const;
5650  };
5651
5652  void inverse()
5653  {
5654      HasOpEq s1;
5655      HasOpEq s2;
5656      if (s1 != s2)
5657          return;
5658  }
5659
5660  struct HasSpaceship
5661  {
5662      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5663  };
5664
5665  void use_spaceship()
5666  {
5667      HasSpaceship s1;
5668      HasSpaceship s2;
5669      if (s1 != s2)
5670          return;
5671  }
5672</pre></td></tr>
5673
5674
5675<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
5676<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5677
5678Unlike anyOf, eachOf will generate a match result for each
5679matching submatcher.
5680
5681For example, in:
5682  class A { int a; int b; };
5683The matcher:
5684  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5685                       has(fieldDecl(hasName("b")).bind("v"))))
5686will generate two results binding "v", the first of which binds
5687the field declaration of a, the second the field declaration of
5688b.
5689
5690Usable as: Any Matcher
5691</pre></td></tr>
5692
5693
5694<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;*&gt;  Matcher</td></tr>
5695<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5696
5697Generates results for each match.
5698
5699For example, in:
5700  class A { class B {}; class C {}; };
5701The matcher:
5702  cxxRecordDecl(hasName("::A"),
5703                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5704will generate results for A, B and C.
5705
5706Usable as: Any Matcher
5707</pre></td></tr>
5708
5709
5710<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5711<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5712provided matcher.
5713
5714Example matches X, A, A::X, B, B::C, B::C::X
5715  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5716  class X {};
5717  class A { class X {}; };  // Matches A, because A::X is a class of name
5718                            // X inside A.
5719  class B { class C { class X {}; }; };
5720
5721DescendantT must be an AST base type.
5722
5723As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5724each result that matches instead of only on the first one.
5725
5726Note: Recursively combined ForEachDescendant can cause many matches:
5727  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5728    forEachDescendant(cxxRecordDecl())
5729  )))
5730will match 10 times (plus injected class name matches) on:
5731  class A { class B { class C { class D { class E {}; }; }; }; };
5732
5733Usable as: Any Matcher
5734</pre></td></tr>
5735
5736
5737<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5738<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5739provided matcher.
5740
5741Example matches X, Y, Y::X, Z::Y, Z::Y::X
5742  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5743  class X {};
5744  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5745                            // inside Y.
5746  class Z { class Y { class X {}; }; };  // Does not match Z.
5747
5748ChildT must be an AST base type.
5749
5750As opposed to 'has', 'forEach' will cause a match for each result that
5751matches instead of only on the first one.
5752
5753Usable as: Any Matcher
5754</pre></td></tr>
5755
5756
5757<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5758<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5759matcher.
5760
5761Given
5762void f() { if (true) { int x = 42; } }
5763void g() { for (;;) { int x = 43; } }
5764expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5765
5766Usable as: Any Matcher
5767</pre></td></tr>
5768
5769
5770<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5771<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5772provided matcher.
5773
5774Example matches X, Y, Z
5775    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5776  class X {};  // Matches X, because X::X is a class of name X inside X.
5777  class Y { class X {}; };
5778  class Z { class Y { class X {}; }; };
5779
5780DescendantT must be an AST base type.
5781
5782Usable as: Any Matcher
5783</pre></td></tr>
5784
5785
5786<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5787<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5788provided matcher.
5789
5790Example matches X, Y
5791  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5792  class X {};  // Matches X, because X::X is a class of name X inside X.
5793  class Y { class X {}; };
5794  class Z { class Y { class X {}; }; };  // Does not match Z.
5795
5796ChildT must be an AST base type.
5797
5798Usable as: Any Matcher
5799Note that has is direct matcher, so it also matches things like implicit
5800casts and paren casts. If you are matching with expr then you should
5801probably consider using ignoringParenImpCasts like:
5802has(ignoringParenImpCasts(expr())).
5803</pre></td></tr>
5804
5805
5806<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5807<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5808matcher.
5809
5810Given
5811void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5812compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5813
5814Usable as: Any Matcher
5815</pre></td></tr>
5816
5817
5818<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
5819<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5820
5821Because CallExpr and CXXConstructExpr do not share a common
5822base class with API accessing arguments etc, AST Matchers for code
5823which should match both are typically duplicated. This matcher
5824removes the need for duplication.
5825
5826Given code
5827struct ConstructorTakesInt
5828{
5829  ConstructorTakesInt(int i) {}
5830};
5831
5832void callTakesInt(int i)
5833{
5834}
5835
5836void doCall()
5837{
5838  callTakesInt(42);
5839}
5840
5841void doConstruct()
5842{
5843  ConstructorTakesInt cti(42);
5844}
5845
5846The matcher
5847invocation(hasArgument(0, integerLiteral(equals(42))))
5848matches the expression in both doCall and doConstruct
5849</pre></td></tr>
5850
5851
5852<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
5853<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5854
5855However, optionally will retain any bindings generated by the submatcher.
5856Useful when additional information which may or may not present about a main
5857matching node is desired.
5858
5859For example, in:
5860  class Foo {
5861    int bar;
5862  }
5863The matcher:
5864  cxxRecordDecl(
5865    optionally(has(
5866      fieldDecl(hasName("bar")).bind("var")
5867  ))).bind("record")
5868will produce a result binding for both "record" and "var".
5869The matcher will produce a "record" binding for even if there is no data
5870member named "bar" in that class.
5871
5872Usable as: Any Matcher
5873</pre></td></tr>
5874
5875
5876<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher&lt;*&gt;  InnerMatcher</td></tr>
5877<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5878
5879Given
5880  void foo()
5881  {
5882      int i = 3.0;
5883  }
5884The matcher
5885  traverse(TK_IgnoreUnlessSpelledInSource,
5886    varDecl(hasInitializer(floatLiteral().bind("init")))
5887  )
5888matches the variable declaration with "init" bound to the "3.0".
5889</pre></td></tr>
5890
5891
5892<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5893<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5894switch statement or conditional operator.
5895
5896Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5897  if (true) {}
5898</pre></td></tr>
5899
5900
5901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5902<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5903(binary or ternary).
5904
5905Example matches b
5906  condition ? a : b
5907  condition ?: b
5908</pre></td></tr>
5909
5910
5911<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5912<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5913
5914Example 1 (conditional ternary operator): matches a
5915  condition ? a : b
5916
5917Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5918  condition ?: b
5919</pre></td></tr>
5920
5921
5922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5923<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5924matches the given matcher.
5925
5926The associated declaration is:
5927- for type nodes, the declaration of the underlying type
5928- for CallExpr, the declaration of the callee
5929- for MemberExpr, the declaration of the referenced member
5930- for CXXConstructExpr, the declaration of the constructor
5931- for CXXNewExpr, the declaration of the operator new
5932- for ObjCIvarExpr, the declaration of the ivar
5933
5934For type nodes, hasDeclaration will generally match the declaration of the
5935sugared type. Given
5936  class X {};
5937  typedef X Y;
5938  Y y;
5939in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5940typedefDecl. A common use case is to match the underlying, desugared type.
5941This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5942  varDecl(hasType(hasUnqualifiedDesugaredType(
5943      recordType(hasDeclaration(decl())))))
5944In this matcher, the decl will match the CXXRecordDecl of class X.
5945
5946Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5947  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5948  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5949  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5950  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5951  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5952  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5953</pre></td></tr>
5954
5955
5956<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5957<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5958
5959Given
5960  int i[5];
5961  void f() { i[1] = 42; }
5962arraySubscriptExpression(hasBase(implicitCastExpr(
5963    hasSourceExpression(declRefExpr()))))
5964  matches i[1] with the declRefExpr() matching i
5965</pre></td></tr>
5966
5967
5968<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5969<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5970
5971Given
5972  int i[5];
5973  void f() { i[1] = 42; }
5974arraySubscriptExpression(hasIndex(integerLiteral()))
5975  matches i[1] with the integerLiteral() matching 1
5976</pre></td></tr>
5977
5978
5979<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5980<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
5981
5982Example matches a (matcher = binaryOperator(hasLHS()))
5983  a || b
5984</pre></td></tr>
5985
5986
5987<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5988<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
5989
5990Example matches b (matcher = binaryOperator(hasRHS()))
5991  a || b
5992</pre></td></tr>
5993
5994
5995<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;</td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5996<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5997type.
5998
5999Given
6000  struct A {};
6001  A a[7];
6002  int b[7];
6003arrayType(hasElementType(builtinType()))
6004  matches "int b[7]"
6005
6006Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
6007</pre></td></tr>
6008
6009
6010<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;</td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
6011<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6012
6013Given
6014  _Atomic(int) i;
6015  _Atomic(float) f;
6016atomicType(hasValueType(isInteger()))
6017 matches "_Atomic(int) i"
6018
6019Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6020</pre></td></tr>
6021
6022
6023<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;</td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
6024<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6025
6026Note: There is no TypeLoc for the deduced type and thus no
6027getDeducedLoc() matcher.
6028
6029Given
6030  auto a = 1;
6031  auto b = 2.0;
6032autoType(hasDeducedType(isInteger()))
6033  matches "auto a"
6034
6035Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6036</pre></td></tr>
6037
6038
6039<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6040<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6041binary operator matches.
6042</pre></td></tr>
6043
6044
6045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6046<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6047
6048Example matches a (matcher = binaryOperator(hasLHS()))
6049  a || b
6050</pre></td></tr>
6051
6052
6053<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
6054<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6055
6056Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6057                                             integerLiteral(equals(2)))
6058  1 + 2 // Match
6059  2 + 1 // Match
6060  1 + 1 // No match
6061  2 + 2 // No match
6062</pre></td></tr>
6063
6064
6065<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6066<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6067
6068Example matches b (matcher = binaryOperator(hasRHS()))
6069  a || b
6070</pre></td></tr>
6071
6072
6073<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;</td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
6074<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6075
6076For example, in:
6077void foo()
6078{
6079    int arr[3];
6080    auto &amp;[f, s, t] = arr;
6081
6082    f = 42;
6083}
6084The matcher:
6085  bindingDecl(hasName("f"),
6086                forDecomposition(decompositionDecl())
6087matches 'f' in 'auto &amp;[f, s, t]'.
6088</pre></td></tr>
6089
6090
6091<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
6092<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6093block.
6094
6095Does not match the 'this' parameter of a method.
6096
6097Given
6098  class X { void f(int x, int y, int z) {} };
6099cxxMethodDecl(hasAnyParameter(hasName("y")))
6100  matches f(int x, int y, int z) {}
6101with hasAnyParameter(...)
6102  matching int y
6103
6104For ObjectiveC, given
6105  @interface I - (void) f:(int) y; @end
6106
6107the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6108matches the declaration of method f with hasParameter
6109matching y.
6110
6111For blocks, given
6112  b = ^(int y) { printf("%d", y) };
6113
6114the matcher blockDecl(hasAnyParameter(hasName("y")))
6115matches the declaration of the block b with hasParameter
6116matching y.
6117</pre></td></tr>
6118
6119
6120<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
6121<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6122declaration or a block.
6123
6124Given
6125  class X { void f(int x) {} };
6126cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6127  matches f(int x) {}
6128with hasParameter(...)
6129  matching int x
6130
6131For ObjectiveC, given
6132  @interface I - (void) f:(int) y; @end
6133
6134the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6135matches the declaration of method f with hasParameter
6136matching y.
6137</pre></td></tr>
6138
6139
6140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc0')"><a name="hasTypeLoc0Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6141<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6142
6143Examples:
6144  int x;
6145declaratorDecl(hasTypeLoc(loc(asString("int"))))
6146  matches int x
6147
6148auto x = int(3);
6149cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6150  matches int(3)
6151
6152struct Foo { Foo(int, int); };
6153auto x = Foo(1, 2);
6154cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6155  matches Foo(1, 2)
6156
6157Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6158  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6159  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6160  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6161  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6162  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6163  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6164  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6165</pre></td></tr>
6166
6167
6168<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee0')"><a name="pointee0Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
6169<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6170pointee matches a given matcher.
6171
6172Given
6173  int *a;
6174  int const *b;
6175  float const *f;
6176pointerType(pointee(isConstQualified(), isInteger()))
6177  matches "int const *b"
6178
6179Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
6180  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
6181</pre></td></tr>
6182
6183
6184<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6185<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6186
6187Examples:
6188  int x;
6189declaratorDecl(hasTypeLoc(loc(asString("int"))))
6190  matches int x
6191
6192auto x = int(3);
6193cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6194  matches int(3)
6195
6196struct Foo { Foo(int, int); };
6197auto x = Foo(1, 2);
6198cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6199  matches Foo(1, 2)
6200
6201Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6202  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6203  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6204  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6205  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6206  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6207  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6208  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6209</pre></td></tr>
6210
6211
6212<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
6213<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6214declaration's type.
6215
6216In case of a value declaration (for example a variable declaration),
6217this resolves one layer of indirection. For example, in the value
6218declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6219X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6220declaration of x.
6221
6222Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6223            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6224            and friend class X (matcher = friendDecl(hasType("X"))
6225            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6226                                              cxxRecordDecl(hasName("X"))))
6227 class X {};
6228 void y(X &amp;x) { x; X z; }
6229 class Y { friend class X; };
6230 class Z : public virtual X {};
6231
6232Example matches class Derived
6233(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6234class Base {};
6235class Derived : Base {};
6236
6237Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
6238Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6239</pre></td></tr>
6240
6241
6242<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
6243<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6244matcher.
6245
6246Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6247            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6248            and U (matcher = typedefDecl(hasType(asString("int")))
6249            and friend class X (matcher = friendDecl(hasType("X"))
6250            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6251                                              asString("class X")))
6252 class X {};
6253 void y(X &amp;x) { x; X z; }
6254 typedef int U;
6255 class Y { friend class X; };
6256 class Z : public virtual X {};
6257</pre></td></tr>
6258
6259
6260<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
6261<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6262
6263Given
6264  void f(int i);
6265  int y;
6266  f(y);
6267callExpr(
6268  forEachArgumentWithParam(
6269    declRefExpr(to(varDecl(hasName("y")))),
6270    parmVarDecl(hasType(isInteger()))
6271))
6272  matches f(y);
6273with declRefExpr(...)
6274  matching int y
6275and parmVarDecl(...)
6276  matching int i
6277</pre></td></tr>
6278
6279
6280<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParamType1')"><a name="forEachArgumentWithParamType1Anchor">forEachArgumentWithParamType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; ParamMatcher</td></tr>
6281<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6282CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6283it works on calls through function pointers as well.
6284
6285The difference is, that function pointers do not provide access to a
6286ParmVarDecl, but only the QualType for each argument.
6287
6288Given
6289  void f(int i);
6290  int y;
6291  f(y);
6292  void (*f_ptr)(int) = f;
6293  f_ptr(y);
6294callExpr(
6295  forEachArgumentWithParamType(
6296    declRefExpr(to(varDecl(hasName("y")))),
6297    qualType(isInteger()).bind("type)
6298))
6299  matches f(y) and f_ptr(y)
6300with declRefExpr(...)
6301  matching int y
6302and qualType(...)
6303  matching int
6304</pre></td></tr>
6305
6306
6307<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6308<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6309expression, or an ObjC-message-send expression.
6310
6311Given
6312  void x(int, int, int) { int y; x(1, y, 42); }
6313callExpr(hasAnyArgument(declRefExpr()))
6314  matches x(1, y, 42)
6315with hasAnyArgument(...)
6316  matching y
6317
6318For ObjectiveC, given
6319  @interface I - (void) f:(int) y; @end
6320  void foo(I *i) { [i f:12]; }
6321objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6322  matches [i f:12]
6323</pre></td></tr>
6324
6325
6326<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument1')"><a name="hasArgument1Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6327<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6328call expression.
6329
6330Example matches y in x(y)
6331    (matcher = callExpr(hasArgument(0, declRefExpr())))
6332  void x(int) { int y; x(y); }
6333</pre></td></tr>
6334
6335
6336<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6337<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6338matches the given matcher.
6339
6340The associated declaration is:
6341- for type nodes, the declaration of the underlying type
6342- for CallExpr, the declaration of the callee
6343- for MemberExpr, the declaration of the referenced member
6344- for CXXConstructExpr, the declaration of the constructor
6345- for CXXNewExpr, the declaration of the operator new
6346- for ObjCIvarExpr, the declaration of the ivar
6347
6348For type nodes, hasDeclaration will generally match the declaration of the
6349sugared type. Given
6350  class X {};
6351  typedef X Y;
6352  Y y;
6353in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6354typedefDecl. A common use case is to match the underlying, desugared type.
6355This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6356  varDecl(hasType(hasUnqualifiedDesugaredType(
6357      recordType(hasDeclaration(decl())))))
6358In this matcher, the decl will match the CXXRecordDecl of class X.
6359
6360Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6361  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6362  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6363  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6364  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6365  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6366  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6367</pre></td></tr>
6368
6369
6370<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('forEachConstructorInitializer0')"><a name="forEachConstructorInitializer0Anchor">forEachConstructorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
6371<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6372
6373Given
6374  class A { A() : i(42), j(42) {} int i; int j; };
6375cxxConstructorDecl(forEachConstructorInitializer(
6376  forField(decl().bind("x"))
6377))
6378  will trigger two matches, binding for 'i' and 'j' respectively.
6379</pre></td></tr>
6380
6381
6382<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyConstructorInitializer0')"><a name="hasAnyConstructorInitializer0Anchor">hasAnyConstructorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
6383<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6384
6385Given
6386  struct Foo {
6387    Foo() : foo_(1) { }
6388    int foo_;
6389  };
6390cxxRecordDecl(has(cxxConstructorDecl(
6391  hasAnyConstructorInitializer(anything())
6392)))
6393  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6394</pre></td></tr>
6395
6396
6397<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('forField0')"><a name="forField0Anchor">forField</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt; InnerMatcher</td></tr>
6398<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6399
6400Given
6401  struct Foo {
6402    Foo() : foo_(1) { }
6403    int foo_;
6404  };
6405cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6406    forField(hasName("foo_"))))))
6407  matches Foo
6408with forField matching foo_
6409</pre></td></tr>
6410
6411
6412<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6413<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6414
6415Examples:
6416  int x;
6417declaratorDecl(hasTypeLoc(loc(asString("int"))))
6418  matches int x
6419
6420auto x = int(3);
6421cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6422  matches int(3)
6423
6424struct Foo { Foo(int, int); };
6425auto x = Foo(1, 2);
6426cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6427  matches Foo(1, 2)
6428
6429Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6430  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6431  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6432  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6433  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6434  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6435  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6436  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6437</pre></td></tr>
6438
6439
6440<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('withInitializer0')"><a name="withInitializer0Anchor">withInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6441<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6442
6443Given
6444  struct Foo {
6445    Foo() : foo_(1) { }
6446    int foo_;
6447  };
6448cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6449    withInitializer(integerLiteral(equals(1)))))))
6450  matches Foo
6451with withInitializer matching (1)
6452</pre></td></tr>
6453
6454
6455<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression2')"><a name="hasObjectExpression2Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6456<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6457given matcher. Implicit object expressions are included; that is, it matches
6458use of implicit `this`.
6459
6460Given
6461  struct X {
6462    int m;
6463    int f(X x) { x.m; return m; }
6464  };
6465memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6466  matches `x.m`, but not `m`; however,
6467memberExpr(hasObjectExpression(hasType(pointsTo(
6468     cxxRecordDecl(hasName("X"))))))
6469  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6470</pre></td></tr>
6471
6472
6473<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody3')"><a name="hasBody3Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
6474<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6475
6476
6477<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasInitStatement2')"><a name="hasInitStatement2Anchor">hasInitStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
6478<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6479
6480Given:
6481 void foo() {
6482   if (int i = foobar(); i &gt; 0) {}
6483   switch (int i = foobar(); i) {}
6484   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6485 }
6486 void bar() {
6487   if (foobar() &gt; 0) {}
6488   switch (foobar()) {}
6489   for (auto&amp; x : get_range()) {}
6490 }
6491ifStmt(hasInitStatement(anything()))
6492  matches the if statement in foo but not in bar.
6493switchStmt(hasInitStatement(anything()))
6494  matches the switch statement in foo but not in bar.
6495cxxForRangeStmt(hasInitStatement(anything()))
6496  matches the range for statement in foo but not in bar.
6497</pre></td></tr>
6498
6499
6500<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopVariable0')"><a name="hasLoopVariable0Anchor">hasLoopVariable</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
6501<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6502
6503Example:
6504    forStmt(hasLoopVariable(anything()))
6505matches 'int x' in
6506    for (int x : a) { }
6507</pre></td></tr>
6508
6509
6510<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;</td><td class="name" onclick="toggle('hasRangeInit0')"><a name="hasRangeInit0Anchor">hasRangeInit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6511<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6512
6513Example:
6514    forStmt(hasRangeInit(anything()))
6515matches 'a' in
6516    for (int x : a) { }
6517</pre></td></tr>
6518
6519
6520<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6521<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6522
6523Examples:
6524  int x;
6525declaratorDecl(hasTypeLoc(loc(asString("int"))))
6526  matches int x
6527
6528auto x = int(3);
6529cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6530  matches int(3)
6531
6532struct Foo { Foo(int, int); };
6533auto x = Foo(1, 2);
6534cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6535  matches Foo(1, 2)
6536
6537Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6538  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6539  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6540  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6541  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6542  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6543  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6544  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6545</pre></td></tr>
6546
6547
6548<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('onImplicitObjectArgument0')"><a name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6549<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6550`on`, matches the argument directly without stripping away anything.
6551
6552Given
6553  class Y { public: void m(); };
6554  Y g();
6555  class X : public Y { void g(); };
6556  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6557cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6558    cxxRecordDecl(hasName("Y")))))
6559  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6560cxxMemberCallExpr(on(callExpr()))
6561  does not match `(g()).m()`, because the parens are not ignored.
6562
6563FIXME: Overload to allow directly matching types?
6564</pre></td></tr>
6565
6566
6567<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('on0')"><a name="on0Anchor">on</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6568<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6569stripping off any parentheses or implicit casts.
6570
6571Given
6572  class Y { public: void m(); };
6573  Y g();
6574  class X : public Y {};
6575  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6576cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6577  matches `y.m()` and `(g()).m()`.
6578cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6579  matches `x.m()`.
6580cxxMemberCallExpr(on(callExpr()))
6581  matches `(g()).m()`.
6582
6583FIXME: Overload to allow directly matching types?
6584</pre></td></tr>
6585
6586
6587<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType1')"><a name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
6588<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6589</pre></td></tr>
6590
6591
6592<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;</td><td class="name" onclick="toggle('thisPointerType0')"><a name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
6593<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6594matches the InnerMatcher, or is a pointer to a type that matches the
6595InnerMatcher.
6596
6597Given
6598  class Y { public: void m(); };
6599  class X : public Y { void g(); };
6600  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6601cxxMemberCallExpr(thisPointerType(hasDeclaration(
6602    cxxRecordDecl(hasName("Y")))))
6603  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6604cxxMemberCallExpr(thisPointerType(hasDeclaration(
6605    cxxRecordDecl(hasName("X")))))
6606  matches `x.g()`.
6607</pre></td></tr>
6608
6609
6610<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
6611<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6612produce multiple matches.
6613
6614Given
6615  class A { virtual void f(); };
6616  class B : public A { void f(); };
6617  class C : public B { void f(); };
6618cxxMethodDecl(ofClass(hasName("C")),
6619              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6620  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6621  that B::f is not overridden by C::f).
6622
6623The check can produce multiple matches in case of multiple inheritance, e.g.
6624  class A1 { virtual void f(); };
6625  class A2 { virtual void f(); };
6626  class C : public A1, public A2 { void f(); };
6627cxxMethodDecl(ofClass(hasName("C")),
6628              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6629  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6630  once with "b" binding "A2::f" and "d" binding "C::f".
6631</pre></td></tr>
6632
6633
6634<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt; InnerMatcher</td></tr>
6635<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6636belongs to.
6637
6638FIXME: Generalize this for other kinds of declarations.
6639FIXME: What other kind of declarations would we need to generalize
6640this to?
6641
6642Example matches A() in the last line
6643    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6644        ofClass(hasName("A"))))))
6645  class A {
6646   public:
6647    A();
6648  };
6649  A a = A();
6650</pre></td></tr>
6651
6652
6653<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyPlacementArg0')"><a name="hasAnyPlacementArg0Anchor">hasAnyPlacementArg</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6654<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6655
6656Given:
6657  MyClass *p1 = new (Storage) MyClass();
6658cxxNewExpr(hasAnyPlacementArg(anything()))
6659  matches the expression 'new (Storage, 16) MyClass()'.
6660</pre></td></tr>
6661
6662
6663<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasArraySize0')"><a name="hasArraySize0Anchor">hasArraySize</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6664<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6665
6666Given:
6667  MyClass *p1 = new MyClass[10];
6668cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6669  matches the expression 'new MyClass[10]'.
6670</pre></td></tr>
6671
6672
6673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6674<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6675matches the given matcher.
6676
6677The associated declaration is:
6678- for type nodes, the declaration of the underlying type
6679- for CallExpr, the declaration of the callee
6680- for MemberExpr, the declaration of the referenced member
6681- for CXXConstructExpr, the declaration of the constructor
6682- for CXXNewExpr, the declaration of the operator new
6683- for ObjCIvarExpr, the declaration of the ivar
6684
6685For type nodes, hasDeclaration will generally match the declaration of the
6686sugared type. Given
6687  class X {};
6688  typedef X Y;
6689  Y y;
6690in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6691typedefDecl. A common use case is to match the underlying, desugared type.
6692This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6693  varDecl(hasType(hasUnqualifiedDesugaredType(
6694      recordType(hasDeclaration(decl())))))
6695In this matcher, the decl will match the CXXRecordDecl of class X.
6696
6697Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
6698  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
6699  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
6700  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
6701  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
6702  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
6703  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6704</pre></td></tr>
6705
6706
6707<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasPlacementArg0')"><a name="hasPlacementArg0Anchor">hasPlacementArg</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6708<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6709
6710Given:
6711  MyClass *p1 = new (Storage, 16) MyClass();
6712cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6713  matches the expression 'new (Storage, 16) MyClass()'.
6714</pre></td></tr>
6715
6716
6717<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6718<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6719
6720Examples:
6721  int x;
6722declaratorDecl(hasTypeLoc(loc(asString("int"))))
6723  matches int x
6724
6725auto x = int(3);
6726cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6727  matches int(3)
6728
6729struct Foo { Foo(int, int); };
6730auto x = Foo(1, 2);
6731cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6732  matches Foo(1, 2)
6733
6734Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6735  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6736  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6737  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6738  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6739  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6740  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6741  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6742</pre></td></tr>
6743
6744
6745<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6746<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6747binary operator matches.
6748</pre></td></tr>
6749
6750
6751<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6752<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6753
6754Example matches a (matcher = binaryOperator(hasLHS()))
6755  a || b
6756</pre></td></tr>
6757
6758
6759<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperands1')"><a name="hasOperands1Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
6760<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6761
6762Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6763                                             integerLiteral(equals(2)))
6764  1 + 2 // Match
6765  2 + 1 // Match
6766  1 + 1 // No match
6767  2 + 2 // No match
6768</pre></td></tr>
6769
6770
6771<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6772<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6773
6774Example matches b (matcher = binaryOperator(hasRHS()))
6775  a || b
6776</pre></td></tr>
6777
6778
6779<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand1')"><a name="hasUnaryOperand1Anchor">hasUnaryOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6780<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6781
6782Example matches true (matcher = hasUnaryOperand(
6783                                  cxxBoolLiteral(equals(true))))
6784  !true
6785</pre></td></tr>
6786
6787
6788<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBase0')"><a name="hasAnyBase0Anchor">hasAnyBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt; BaseSpecMatcher</td></tr>
6789<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6790
6791Example:
6792matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6793  class Foo;
6794  class Bar : Foo {};
6795  class Baz : Bar {};
6796  class SpecialBase;
6797  class Proxy : SpecialBase {};  // matches Proxy
6798  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6799
6800FIXME: Refactor this and isDerivedFrom to reuse implementation.
6801</pre></td></tr>
6802
6803
6804<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDirectBase0')"><a name="hasDirectBase0Anchor">hasDirectBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt; BaseSpecMatcher</td></tr>
6805<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6806
6807Example:
6808matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6809  class Foo;
6810  class Bar : Foo {};
6811  class Baz : Bar {};
6812  class SpecialBase;
6813  class Proxy : SpecialBase {};  // matches Proxy
6814  class IndirectlyDerived : Proxy {};  // doesn't match
6815</pre></td></tr>
6816
6817
6818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasMethod0')"><a name="hasMethod0Anchor">hasMethod</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
6819<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6820
6821Given:
6822  class A { void func(); };
6823  class B { void member(); };
6824
6825cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
6826A but not B.
6827</pre></td></tr>
6828
6829
6830<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom0')"><a name="isDerivedFrom0Anchor">isDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
6831<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
6832matching Base, or Objective-C classes that directly or indirectly
6833subclass a class matching Base.
6834
6835Note that a class is not considered to be derived from itself.
6836
6837Example matches Y, Z, C (Base == hasName("X"))
6838  class X;
6839  class Y : public X {};  // directly derived
6840  class Z : public Y {};  // indirectly derived
6841  typedef X A;
6842  typedef A B;
6843  class C : public B {};  // derived from a typedef of X
6844
6845In the following example, Bar matches isDerivedFrom(hasName("X")):
6846  class Foo;
6847  typedef Foo X;
6848  class Bar : public Foo {};  // derived from a type that X is a typedef of
6849
6850In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6851  @interface NSObject @end
6852  @interface Bar : NSObject @end
6853
6854Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;
6855</pre></td></tr>
6856
6857
6858<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
6859<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6860matching Base.
6861
6862Note that a class is not considered to be derived from itself.
6863
6864Example matches Y, C (Base == hasName("X"))
6865  class X;
6866  class Y : public X {};  // directly derived
6867  class Z : public Y {};  // indirectly derived
6868  typedef X A;
6869  typedef A B;
6870  class C : public B {};  // derived from a typedef of X
6871
6872In the following example, Bar matches isDerivedFrom(hasName("X")):
6873  class Foo;
6874  typedef Foo X;
6875  class Bar : public Foo {};  // derived from a type that X is a typedef of
6876</pre></td></tr>
6877
6878
6879<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom0')"><a name="isSameOrDerivedFrom0Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
6880<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6881match Base.
6882</pre></td></tr>
6883
6884
6885<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand2')"><a name="hasEitherOperand2Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6886<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
6887binary operator matches.
6888</pre></td></tr>
6889
6890
6891<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS2')"><a name="hasLHS2Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6892<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
6893
6894Example matches a (matcher = binaryOperator(hasLHS()))
6895  a || b
6896</pre></td></tr>
6897
6898
6899<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperands2')"><a name="hasOperands2Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
6900<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
6901
6902Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6903                                             integerLiteral(equals(2)))
6904  1 + 2 // Match
6905  2 + 1 // Match
6906  1 + 1 // No match
6907  2 + 2 // No match
6908</pre></td></tr>
6909
6910
6911<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS2')"><a name="hasRHS2Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6912<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
6913
6914Example matches b (matcher = binaryOperator(hasRHS()))
6915  a || b
6916</pre></td></tr>
6917
6918
6919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6920<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
6921
6922Examples:
6923  int x;
6924declaratorDecl(hasTypeLoc(loc(asString("int"))))
6925  matches int x
6926
6927auto x = int(3);
6928cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6929  matches int(3)
6930
6931struct Foo { Foo(int, int); };
6932auto x = Foo(1, 2);
6933cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6934  matches Foo(1, 2)
6935
6936Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6937  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6938  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6939  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6940  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6941  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6942  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6943  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6944</pre></td></tr>
6945
6946
6947<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6948<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
6949expression, or an ObjC-message-send expression.
6950
6951Given
6952  void x(int, int, int) { int y; x(1, y, 42); }
6953callExpr(hasAnyArgument(declRefExpr()))
6954  matches x(1, y, 42)
6955with hasAnyArgument(...)
6956  matching y
6957
6958For ObjectiveC, given
6959  @interface I - (void) f:(int) y; @end
6960  void foo(I *i) { [i f:12]; }
6961objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6962  matches [i f:12]
6963</pre></td></tr>
6964
6965
6966<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6967<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6968call expression.
6969
6970Example matches y in x(y)
6971    (matcher = callExpr(hasArgument(0, declRefExpr())))
6972  void x(int) { int y; x(y); }
6973</pre></td></tr>
6974
6975
6976<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6977<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
6978
6979Examples:
6980  int x;
6981declaratorDecl(hasTypeLoc(loc(asString("int"))))
6982  matches int x
6983
6984auto x = int(3);
6985cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6986  matches int(3)
6987
6988struct Foo { Foo(int, int); };
6989auto x = Foo(1, 2);
6990cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6991  matches Foo(1, 2)
6992
6993Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6994  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6995  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6996  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6997  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6998  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6999  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7000  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7001</pre></td></tr>
7002
7003
7004<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee1')"><a name="callee1Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
7005<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7006given matcher.
7007
7008Example matches y.x() (matcher = callExpr(callee(
7009                                   cxxMethodDecl(hasName("x")))))
7010  class Y { public: void x(); };
7011  void z() { Y y; y.x(); }
7012</pre></td></tr>
7013
7014
7015<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('callee0')"><a name="callee0Anchor">callee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7016<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7017
7018Given
7019  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
7020  void f() { f(); }
7021callExpr(callee(expr()))
7022  matches this-&gt;x(), x(), y.x(), f()
7023with callee(...)
7024  matching this-&gt;x, x, y.x, f respectively
7025
7026Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7027because this introduces ambiguous overloads with calls to Callee taking a
7028internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7029implemented in terms of implicit casts.
7030</pre></td></tr>
7031
7032
7033<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
7034<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7035
7036Given
7037  void f(int i);
7038  int y;
7039  f(y);
7040callExpr(
7041  forEachArgumentWithParam(
7042    declRefExpr(to(varDecl(hasName("y")))),
7043    parmVarDecl(hasType(isInteger()))
7044))
7045  matches f(y);
7046with declRefExpr(...)
7047  matching int y
7048and parmVarDecl(...)
7049  matching int i
7050</pre></td></tr>
7051
7052
7053<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParamType0')"><a name="forEachArgumentWithParamType0Anchor">forEachArgumentWithParamType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; ParamMatcher</td></tr>
7054<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7055CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7056it works on calls through function pointers as well.
7057
7058The difference is, that function pointers do not provide access to a
7059ParmVarDecl, but only the QualType for each argument.
7060
7061Given
7062  void f(int i);
7063  int y;
7064  f(y);
7065  void (*f_ptr)(int) = f;
7066  f_ptr(y);
7067callExpr(
7068  forEachArgumentWithParamType(
7069    declRefExpr(to(varDecl(hasName("y")))),
7070    qualType(isInteger()).bind("type)
7071))
7072  matches f(y) and f_ptr(y)
7073with declRefExpr(...)
7074  matching int y
7075and qualType(...)
7076  matching int
7077</pre></td></tr>
7078
7079
7080<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7081<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7082expression, or an ObjC-message-send expression.
7083
7084Given
7085  void x(int, int, int) { int y; x(1, y, 42); }
7086callExpr(hasAnyArgument(declRefExpr()))
7087  matches x(1, y, 42)
7088with hasAnyArgument(...)
7089  matching y
7090
7091For ObjectiveC, given
7092  @interface I - (void) f:(int) y; @end
7093  void foo(I *i) { [i f:12]; }
7094objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7095  matches [i f:12]
7096</pre></td></tr>
7097
7098
7099<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument0')"><a name="hasArgument0Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7100<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7101call expression.
7102
7103Example matches y in x(y)
7104    (matcher = callExpr(hasArgument(0, declRefExpr())))
7105  void x(int) { int y; x(y); }
7106</pre></td></tr>
7107
7108
7109<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7110<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7111matches the given matcher.
7112
7113The associated declaration is:
7114- for type nodes, the declaration of the underlying type
7115- for CallExpr, the declaration of the callee
7116- for MemberExpr, the declaration of the referenced member
7117- for CXXConstructExpr, the declaration of the constructor
7118- for CXXNewExpr, the declaration of the operator new
7119- for ObjCIvarExpr, the declaration of the ivar
7120
7121For type nodes, hasDeclaration will generally match the declaration of the
7122sugared type. Given
7123  class X {};
7124  typedef X Y;
7125  Y y;
7126in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7127typedefDecl. A common use case is to match the underlying, desugared type.
7128This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7129  varDecl(hasType(hasUnqualifiedDesugaredType(
7130      recordType(hasDeclaration(decl())))))
7131In this matcher, the decl will match the CXXRecordDecl of class X.
7132
7133Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
7134  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
7135  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
7136  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
7137  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
7138  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
7139  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7140</pre></td></tr>
7141
7142
7143<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;</td><td class="name" onclick="toggle('hasCaseConstant0')"><a name="hasCaseConstant0Anchor">hasCaseConstant</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7144<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7145extension, matches the constant given in the statement.
7146
7147Given
7148  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7149caseStmt(hasCaseConstant(integerLiteral()))
7150  matches "case 1:"
7151</pre></td></tr>
7152
7153
7154<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression0')"><a name="hasSourceExpression0Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7155<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7156or opaque value's source expression matches the given matcher.
7157
7158Example 1: matches "a string"
7159(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7160class URL { URL(string); };
7161URL url = "a string";
7162
7163Example 2: matches 'b' (matcher =
7164opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7165int a = b ?: 1;
7166</pre></td></tr>
7167
7168
7169<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument0')"><a name="hasAnyTemplateArgument0Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
7170<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7171functionDecl that have at least one TemplateArgument matching the given
7172InnerMatcher.
7173
7174Given
7175  template&lt;typename T&gt; class A {};
7176  template&lt;&gt; class A&lt;double&gt; {};
7177  A&lt;int&gt; a;
7178
7179  template&lt;typename T&gt; f() {};
7180  void func() { f&lt;int&gt;(); };
7181
7182classTemplateSpecializationDecl(hasAnyTemplateArgument(
7183    refersToType(asString("int"))))
7184  matches the specialization A&lt;int&gt;
7185
7186functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7187  matches the specialization f&lt;int&gt;
7188</pre></td></tr>
7189
7190
7191<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasSpecializedTemplate0')"><a name="hasSpecializedTemplate0Anchor">hasSpecializedTemplate</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt; InnerMatcher</td></tr>
7192<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7193
7194Given
7195  template&lt;typename T&gt; class A {}; #1
7196  template&lt;&gt; class A&lt;int&gt; {}; #2
7197classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7198  matches '#2' with classTemplateDecl() matching the class template
7199  declaration of 'A' at #1.
7200</pre></td></tr>
7201
7202
7203<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument0')"><a name="hasTemplateArgument0Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
7204<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7205functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7206
7207Given
7208  template&lt;typename T, typename U&gt; class A {};
7209  A&lt;bool, int&gt; b;
7210  A&lt;int, bool&gt; c;
7211
7212  template&lt;typename T&gt; void f() {}
7213  void func() { f&lt;int&gt;(); };
7214classTemplateSpecializationDecl(hasTemplateArgument(
7215    1, refersToType(asString("int"))))
7216  matches the specialization A&lt;bool, int&gt;
7217
7218functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7219  matches the specialization f&lt;int&gt;
7220</pre></td></tr>
7221
7222
7223<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7224<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7225
7226Examples:
7227  int x;
7228declaratorDecl(hasTypeLoc(loc(asString("int"))))
7229  matches int x
7230
7231auto x = int(3);
7232cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7233  matches int(3)
7234
7235struct Foo { Foo(int, int); };
7236auto x = Foo(1, 2);
7237cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7238  matches Foo(1, 2)
7239
7240Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7241  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7242  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7243  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7244  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7245  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7246  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7247  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7248</pre></td></tr>
7249
7250
7251<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;</td><td class="name" onclick="toggle('hasElementType1')"><a name="hasElementType1Anchor">hasElementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
7252<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7253type.
7254
7255Given
7256  struct A {};
7257  A a[7];
7258  int b[7];
7259arrayType(hasElementType(builtinType()))
7260  matches "int b[7]"
7261
7262Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
7263</pre></td></tr>
7264
7265
7266<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7267<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7268
7269Examples:
7270  int x;
7271declaratorDecl(hasTypeLoc(loc(asString("int"))))
7272  matches int x
7273
7274auto x = int(3);
7275cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7276  matches int(3)
7277
7278struct Foo { Foo(int, int); };
7279auto x = Foo(1, 2);
7280cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7281  matches Foo(1, 2)
7282
7283Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7284  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7285  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7286  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7287  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7288  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7289  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7290  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7291</pre></td></tr>
7292
7293
7294<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement0')"><a name="hasAnySubstatement0Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7295<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7296a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7297
7298Given
7299  { {}; 1+2; }
7300hasAnySubstatement(compoundStmt())
7301  matches '{ {}; 1+2; }'
7302with compoundStmt()
7303  matching '{}'
7304</pre></td></tr>
7305
7306
7307<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
7308<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7309</pre></td></tr>
7310
7311
7312<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7313<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7314matches the given matcher.
7315
7316The associated declaration is:
7317- for type nodes, the declaration of the underlying type
7318- for CallExpr, the declaration of the callee
7319- for MemberExpr, the declaration of the referenced member
7320- for CXXConstructExpr, the declaration of the constructor
7321- for CXXNewExpr, the declaration of the operator new
7322- for ObjCIvarExpr, the declaration of the ivar
7323
7324For type nodes, hasDeclaration will generally match the declaration of the
7325sugared type. Given
7326  class X {};
7327  typedef X Y;
7328  Y y;
7329in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7330typedefDecl. A common use case is to match the underlying, desugared type.
7331This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7332  varDecl(hasType(hasUnqualifiedDesugaredType(
7333      recordType(hasDeclaration(decl())))))
7334In this matcher, the decl will match the CXXRecordDecl of class X.
7335
7336Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
7337  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
7338  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
7339  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
7340  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
7341  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
7342  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7343</pre></td></tr>
7344
7345
7346<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
7347<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7348specific using shadow declaration.
7349
7350Given
7351  namespace a { void f() {} }
7352  using a::f;
7353  void g() {
7354    f();     // Matches this ..
7355    a::f();  // .. but not this.
7356  }
7357declRefExpr(throughUsingDecl(anything()))
7358  matches f()
7359</pre></td></tr>
7360
7361
7362<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('to0')"><a name="to0Anchor">to</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
7363<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7364specified matcher.
7365
7366Example matches x in if(x)
7367    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7368  bool x;
7369  if (x) {}
7370</pre></td></tr>
7371
7372
7373<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('containsDeclaration0')"><a name="containsDeclaration0Anchor">containsDeclaration</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
7374<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7375
7376Note that this does not work for global declarations because the AST
7377breaks up multiple-declaration DeclStmt's into multiple single-declaration
7378DeclStmt's.
7379Example: Given non-global declarations
7380  int a, b = 0;
7381  int c;
7382  int d = 2, e;
7383declStmt(containsDeclaration(
7384      0, varDecl(hasInitializer(anything()))))
7385  matches only 'int d = 2, e;', and
7386declStmt(containsDeclaration(1, varDecl()))
7387  matches 'int a, b = 0' as well as 'int d = 2, e;'
7388  but 'int c;' is not matched.
7389</pre></td></tr>
7390
7391
7392<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('hasSingleDecl0')"><a name="hasSingleDecl0Anchor">hasSingleDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
7393<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7394
7395Given
7396  int a, b;
7397  int c;
7398declStmt(hasSingleDecl(anything()))
7399  matches 'int c;' but not 'int a, b;'.
7400</pre></td></tr>
7401
7402
7403<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7404<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7405
7406Examples:
7407  int x;
7408declaratorDecl(hasTypeLoc(loc(asString("int"))))
7409  matches int x
7410
7411auto x = int(3);
7412cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7413  matches int(3)
7414
7415struct Foo { Foo(int, int); };
7416auto x = Foo(1, 2);
7417cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7418  matches Foo(1, 2)
7419
7420Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7421  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7422  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7423  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7424  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7425  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7426  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7427  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7428</pre></td></tr>
7429
7430
7431<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasDeclContext0')"><a name="hasDeclContext0Anchor">hasDeclContext</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
7432<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7433Decl, matches InnerMatcher.
7434
7435Given
7436  namespace N {
7437    namespace M {
7438      class D {};
7439    }
7440  }
7441
7442cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7443declaration of class D.
7444</pre></td></tr>
7445
7446
7447<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingType0')"><a name="hasUnderlyingType0Anchor">hasUnderlyingType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
7448<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7449
7450Given
7451  decltype(1) a = 1;
7452  decltype(2.0) b = 2.0;
7453decltypeType(hasUnderlyingType(isInteger()))
7454  matches the type of "a"
7455
7456Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7457</pre></td></tr>
7458
7459
7460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBinding0')"><a name="hasAnyBinding0Anchor">hasAnyBinding</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt; InnerMatcher</td></tr>
7461<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7462
7463For example, in:
7464void foo()
7465{
7466    int arr[3];
7467    auto &amp;[f, s, t] = arr;
7468
7469    f = 42;
7470}
7471The matcher:
7472  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7473matches the decomposition decl with 'f' bound to "fBinding".
7474</pre></td></tr>
7475
7476
7477<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBinding0')"><a name="hasBinding0Anchor">hasBinding</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt; InnerMatcher</td></tr>
7478<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7479
7480For example, in:
7481void foo()
7482{
7483    int arr[3];
7484    auto &amp;[f, s, t] = arr;
7485
7486    f = 42;
7487}
7488The matcher:
7489  decompositionDecl(hasBinding(0,
7490  bindingDecl(hasName("f").bind("fBinding"))))
7491matches the decomposition decl with 'f' bound to "fBinding".
7492</pre></td></tr>
7493
7494
7495<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody0')"><a name="hasBody0Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7496<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7497
7498
7499<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition3')"><a name="hasCondition3Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7500<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7501switch statement or conditional operator.
7502
7503Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7504  if (true) {}
7505</pre></td></tr>
7506
7507
7508<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('hasQualifier0')"><a name="hasQualifier0Anchor">hasQualifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
7509<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7510matches InnerMatcher if the qualifier exists.
7511
7512Given
7513  namespace N {
7514    namespace M {
7515      class D {};
7516    }
7517  }
7518  N::M::D d;
7519
7520elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7521matches the type of the variable declaration of d.
7522</pre></td></tr>
7523
7524
7525<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;</td><td class="name" onclick="toggle('namesType0')"><a name="namesType0Anchor">namesType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
7526<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7527
7528Given
7529  namespace N {
7530    namespace M {
7531      class D {};
7532    }
7533  }
7534  N::M::D d;
7535
7536elaboratedType(namesType(recordType(
7537hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7538declaration of d.
7539</pre></td></tr>
7540
7541
7542<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7543<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7544matches the given matcher.
7545
7546The associated declaration is:
7547- for type nodes, the declaration of the underlying type
7548- for CallExpr, the declaration of the callee
7549- for MemberExpr, the declaration of the referenced member
7550- for CXXConstructExpr, the declaration of the constructor
7551- for CXXNewExpr, the declaration of the operator new
7552- for ObjCIvarExpr, the declaration of the ivar
7553
7554For type nodes, hasDeclaration will generally match the declaration of the
7555sugared type. Given
7556  class X {};
7557  typedef X Y;
7558  Y y;
7559in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7560typedefDecl. A common use case is to match the underlying, desugared type.
7561This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7562  varDecl(hasType(hasUnqualifiedDesugaredType(
7563      recordType(hasDeclaration(decl())))))
7564In this matcher, the decl will match the CXXRecordDecl of class X.
7565
7566Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
7567  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
7568  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
7569  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
7570  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
7571  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
7572  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7573</pre></td></tr>
7574
7575
7576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasDestinationType0')"><a name="hasDestinationType0Anchor">hasDestinationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
7577<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7578
7579(Note: Clang's AST refers to other conversions as "casts" too, and calls
7580actual casts "explicit" casts.)
7581</pre></td></tr>
7582
7583
7584<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7585<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7586
7587Examples:
7588  int x;
7589declaratorDecl(hasTypeLoc(loc(asString("int"))))
7590  matches int x
7591
7592auto x = int(3);
7593cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7594  matches int(3)
7595
7596struct Foo { Foo(int, int); };
7597auto x = Foo(1, 2);
7598cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7599  matches Foo(1, 2)
7600
7601Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7602  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7603  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7604  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7605  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7606  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7607  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7608  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7609</pre></td></tr>
7610
7611
7612<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType5')"><a name="hasType5Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
7613<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7614declaration's type.
7615
7616In case of a value declaration (for example a variable declaration),
7617this resolves one layer of indirection. For example, in the value
7618declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7619X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7620declaration of x.
7621
7622Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7623            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7624            and friend class X (matcher = friendDecl(hasType("X"))
7625            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7626                                              cxxRecordDecl(hasName("X"))))
7627 class X {};
7628 void y(X &amp;x) { x; X z; }
7629 class Y { friend class X; };
7630 class Z : public virtual X {};
7631
7632Example matches class Derived
7633(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7634class Base {};
7635class Derived : Base {};
7636
7637Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
7638Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7639</pre></td></tr>
7640
7641
7642<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType0')"><a name="hasType0Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
7643<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7644matcher.
7645
7646Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7647            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7648            and U (matcher = typedefDecl(hasType(asString("int")))
7649            and friend class X (matcher = friendDecl(hasType("X"))
7650            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7651                                              asString("class X")))
7652 class X {};
7653 void y(X &amp;x) { x; X z; }
7654 typedef int U;
7655 class Y { friend class X; };
7656 class Z : public virtual X {};
7657</pre></td></tr>
7658
7659
7660<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringElidableConstructorCall0')"><a name="ignoringElidableConstructorCall0Anchor">ignoringElidableConstructorCall</a></td><td>ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7661<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7662elidable constructor and other corresponding bookkeeping nodes.
7663
7664In C++17, elidable copy constructors are no longer being generated in the
7665AST as it is not permitted by the standard. They are, however, part of the
7666AST in C++14 and earlier. So, a matcher must abstract over these differences
7667to work in all language modes. This matcher skips elidable constructor-call
7668AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7669various implicit nodes inside the constructor calls, all of which will not
7670appear in the C++17 AST.
7671
7672Given
7673
7674struct H {};
7675H G();
7676void f() {
7677  H D = G();
7678}
7679
7680``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7681matches ``H D = G()`` in C++11 through C++17 (and beyond).
7682</pre></td></tr>
7683
7684
7685<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImpCasts0')"><a name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7686<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7687are stripped off.
7688
7689Parentheses and explicit casts are not discarded.
7690Given
7691  int arr[5];
7692  int a = 0;
7693  char b = 0;
7694  const int c = a;
7695  int *d = arr;
7696  long e = (long) 0l;
7697The matchers
7698   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7699   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7700would match the declarations for a, b, c, and d, but not e.
7701While
7702   varDecl(hasInitializer(integerLiteral()))
7703   varDecl(hasInitializer(declRefExpr()))
7704only match the declarations for a.
7705</pre></td></tr>
7706
7707
7708<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringImplicit0')"><a name="ignoringImplicit0Anchor">ignoringImplicit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7709<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7710nodes are stripped off.
7711
7712Parentheses and explicit casts are not discarded.
7713Given
7714  class C {};
7715  C a = C();
7716  C b;
7717  C c = b;
7718The matchers
7719   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7720would match the declarations for a, b, and c.
7721While
7722   varDecl(hasInitializer(cxxConstructExpr()))
7723only match the declarations for b and c.
7724</pre></td></tr>
7725
7726
7727<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenCasts0')"><a name="ignoringParenCasts0Anchor">ignoringParenCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7728<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7729casts are stripped off.
7730
7731Implicit and non-C Style casts are also discarded.
7732Given
7733  int a = 0;
7734  char b = (0);
7735  void* c = reinterpret_cast&lt;char*&gt;(0);
7736  char d = char(0);
7737The matcher
7738   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7739would match the declarations for a, b, c, and d.
7740while
7741   varDecl(hasInitializer(integerLiteral()))
7742only match the declaration for a.
7743</pre></td></tr>
7744
7745
7746<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParenImpCasts0')"><a name="ignoringParenImpCasts0Anchor">ignoringParenImpCasts</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7747<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7748parentheses are stripped off.
7749
7750Explicit casts are not discarded.
7751Given
7752  int arr[5];
7753  int a = 0;
7754  char b = (0);
7755  const int c = a;
7756  int *d = (arr);
7757  long e = ((long) 0l);
7758The matchers
7759   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7760   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7761would match the declarations for a, b, c, and d, but not e.
7762while
7763   varDecl(hasInitializer(integerLiteral()))
7764   varDecl(hasInitializer(declRefExpr()))
7765would only match the declaration for a.
7766</pre></td></tr>
7767
7768
7769<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('ignoringParens1')"><a name="ignoringParens1Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7770<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7771
7772Given
7773  const char* str = ("my-string");
7774The matcher
7775  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7776would match the implicit cast resulting from the assignment.
7777</pre></td></tr>
7778
7779
7780<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasInClassInitializer0')"><a name="hasInClassInitializer0Anchor">hasInClassInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7781<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7782
7783Given
7784  class C {
7785    int a = 2;
7786    int b = 3;
7787    int c;
7788  };
7789fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7790  matches 'int a;' but not 'int b;'.
7791fieldDecl(hasInClassInitializer(anything()))
7792  matches 'int a;' and 'int b;' but not 'int c;'.
7793</pre></td></tr>
7794
7795
7796<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7797<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7798
7799
7800<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition1')"><a name="hasCondition1Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7801<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7802switch statement or conditional operator.
7803
7804Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7805  if (true) {}
7806</pre></td></tr>
7807
7808
7809<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasIncrement0')"><a name="hasIncrement0Anchor">hasIncrement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7810<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7811
7812Example:
7813    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7814matches '++x' in
7815    for (x; x &lt; N; ++x) { }
7816</pre></td></tr>
7817
7818
7819<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('hasLoopInit0')"><a name="hasLoopInit0Anchor">hasLoopInit</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7820<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7821
7822Example:
7823    forStmt(hasLoopInit(declStmt()))
7824matches 'int x = 0' in
7825    for (int x = 0; x &lt; N; ++x) { }
7826</pre></td></tr>
7827
7828
7829<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;</td><td class="name" onclick="toggle('hasType6')"><a name="hasType6Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
7830<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7831declaration's type.
7832
7833In case of a value declaration (for example a variable declaration),
7834this resolves one layer of indirection. For example, in the value
7835declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7836X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7837declaration of x.
7838
7839Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7840            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7841            and friend class X (matcher = friendDecl(hasType("X"))
7842            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7843                                              cxxRecordDecl(hasName("X"))))
7844 class X {};
7845 void y(X &amp;x) { x; X z; }
7846 class Y { friend class X; };
7847 class Z : public virtual X {};
7848
7849Example matches class Derived
7850(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7851class Base {};
7852class Derived : Base {};
7853
7854Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
7855Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7856</pre></td></tr>
7857
7858
7859<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
7860<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
7861matcher.
7862
7863Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7864            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7865            and U (matcher = typedefDecl(hasType(asString("int")))
7866            and friend class X (matcher = friendDecl(hasType("X"))
7867            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7868                                              asString("class X")))
7869 class X {};
7870 void y(X &amp;x) { x; X z; }
7871 typedef int U;
7872 class Y { friend class X; };
7873 class Z : public virtual X {};
7874</pre></td></tr>
7875
7876
7877<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7878<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
7879Note that this matcher matches all the declarations of a function whose
7880body is present in the AST.
7881
7882Given
7883  void f();
7884  void f() {}
7885  void g();
7886functionDecl(hasAnyBody(compoundStmt()))
7887  matches both 'void f();'
7888  and 'void f() {}'
7889with compoundStmt()
7890  matching '{}'
7891  but does not match 'void g();'
7892</pre></td></tr>
7893
7894
7895<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter0')"><a name="hasAnyParameter0Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
7896<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
7897block.
7898
7899Does not match the 'this' parameter of a method.
7900
7901Given
7902  class X { void f(int x, int y, int z) {} };
7903cxxMethodDecl(hasAnyParameter(hasName("y")))
7904  matches f(int x, int y, int z) {}
7905with hasAnyParameter(...)
7906  matching int y
7907
7908For ObjectiveC, given
7909  @interface I - (void) f:(int) y; @end
7910
7911the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7912matches the declaration of method f with hasParameter
7913matching y.
7914
7915For blocks, given
7916  b = ^(int y) { printf("%d", y) };
7917
7918the matcher blockDecl(hasAnyParameter(hasName("y")))
7919matches the declaration of the block b with hasParameter
7920matching y.
7921</pre></td></tr>
7922
7923
7924<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument2')"><a name="hasAnyTemplateArgument2Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
7925<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7926functionDecl that have at least one TemplateArgument matching the given
7927InnerMatcher.
7928
7929Given
7930  template&lt;typename T&gt; class A {};
7931  template&lt;&gt; class A&lt;double&gt; {};
7932  A&lt;int&gt; a;
7933
7934  template&lt;typename T&gt; f() {};
7935  void func() { f&lt;int&gt;(); };
7936
7937classTemplateSpecializationDecl(hasAnyTemplateArgument(
7938    refersToType(asString("int"))))
7939  matches the specialization A&lt;int&gt;
7940
7941functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7942  matches the specialization f&lt;int&gt;
7943</pre></td></tr>
7944
7945
7946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
7947<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
7948
7949
7950<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasExplicitSpecifier0')"><a name="hasExplicitSpecifier0Anchor">hasExplicitSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7951<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
7952declaration.
7953
7954Given
7955  template&lt;bool b&gt;
7956  struct S {
7957    S(int); // #1
7958    explicit S(double); // #2
7959    operator int(); // #3
7960    explicit operator bool(); // #4
7961    explicit(false) S(bool) // # 7
7962    explicit(true) S(char) // # 8
7963    explicit(b) S(S) // # 9
7964  };
7965  S(int) -&gt; S&lt;true&gt; // #5
7966  explicit S(double) -&gt; S&lt;false&gt; // #6
7967cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
7968cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
7969cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
7970</pre></td></tr>
7971
7972
7973<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter0')"><a name="hasParameter0Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
7974<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
7975declaration or a block.
7976
7977Given
7978  class X { void f(int x) {} };
7979cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7980  matches f(int x) {}
7981with hasParameter(...)
7982  matching int x
7983
7984For ObjectiveC, given
7985  @interface I - (void) f:(int) y; @end
7986
7987the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7988matches the declaration of method f with hasParameter
7989matching y.
7990</pre></td></tr>
7991
7992
7993<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument2')"><a name="hasTemplateArgument2Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
7994<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7995functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7996
7997Given
7998  template&lt;typename T, typename U&gt; class A {};
7999  A&lt;bool, int&gt; b;
8000  A&lt;int, bool&gt; c;
8001
8002  template&lt;typename T&gt; void f() {}
8003  void func() { f&lt;int&gt;(); };
8004classTemplateSpecializationDecl(hasTemplateArgument(
8005    1, refersToType(asString("int"))))
8006  matches the specialization A&lt;bool, int&gt;
8007
8008functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8009  matches the specialization f&lt;int&gt;
8010</pre></td></tr>
8011
8012
8013<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('returns0')"><a name="returns0Anchor">returns</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8014<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8015
8016Given:
8017  class X { int f() { return 1; } };
8018cxxMethodDecl(returns(asString("int")))
8019  matches int f() { return 1; }
8020</pre></td></tr>
8021
8022
8023<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition0')"><a name="hasCondition0Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8024<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8025switch statement or conditional operator.
8026
8027Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8028  if (true) {}
8029</pre></td></tr>
8030
8031
8032<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasConditionVariableStatement0')"><a name="hasConditionVariableStatement0Anchor">hasConditionVariableStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt; InnerMatcher</td></tr>
8033<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8034
8035Given
8036  if (A* a = GetAPointer()) {}
8037hasConditionVariableStatement(...)
8038  matches 'A* a = GetAPointer()'.
8039</pre></td></tr>
8040
8041
8042<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
8043<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8044
8045Examples matches the if statement
8046  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8047  if (false) false; else true;
8048</pre></td></tr>
8049
8050
8051<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasInitStatement0')"><a name="hasInitStatement0Anchor">hasInitStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
8052<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8053
8054Given:
8055 void foo() {
8056   if (int i = foobar(); i &gt; 0) {}
8057   switch (int i = foobar(); i) {}
8058   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8059 }
8060 void bar() {
8061   if (foobar() &gt; 0) {}
8062   switch (foobar()) {}
8063   for (auto&amp; x : get_range()) {}
8064 }
8065ifStmt(hasInitStatement(anything()))
8066  matches the if statement in foo but not in bar.
8067switchStmt(hasInitStatement(anything()))
8068  matches the switch statement in foo but not in bar.
8069cxxForRangeStmt(hasInitStatement(anything()))
8070  matches the range for statement in foo but not in bar.
8071</pre></td></tr>
8072
8073
8074<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
8075<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8076
8077Examples matches the if statement
8078  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8079  if (false) true; else false;
8080</pre></td></tr>
8081
8082
8083<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8084<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8085matcher.
8086
8087FIXME: Unit test this matcher
8088</pre></td></tr>
8089
8090
8091<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasInit0')"><a name="hasInit0Anchor">hasInit</a></td><td>unsigned N, ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8092<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8093
8094Example matches y.
8095    (matcher = initListExpr(hasInit(0, expr())))
8096  int x{y}.
8097</pre></td></tr>
8098
8099
8100<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;</td><td class="name" onclick="toggle('hasSyntacticForm0')"><a name="hasSyntacticForm0Anchor">hasSyntacticForm</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8101<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8102(if expression have it).
8103</pre></td></tr>
8104
8105
8106<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8107<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8108matches the given matcher.
8109
8110The associated declaration is:
8111- for type nodes, the declaration of the underlying type
8112- for CallExpr, the declaration of the callee
8113- for MemberExpr, the declaration of the referenced member
8114- for CXXConstructExpr, the declaration of the constructor
8115- for CXXNewExpr, the declaration of the operator new
8116- for ObjCIvarExpr, the declaration of the ivar
8117
8118For type nodes, hasDeclaration will generally match the declaration of the
8119sugared type. Given
8120  class X {};
8121  typedef X Y;
8122  Y y;
8123in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8124typedefDecl. A common use case is to match the underlying, desugared type.
8125This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8126  varDecl(hasType(hasUnqualifiedDesugaredType(
8127      recordType(hasDeclaration(decl())))))
8128In this matcher, the decl will match the CXXRecordDecl of class X.
8129
8130Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8131  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8132  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8133  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8134  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8135  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8136  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8137</pre></td></tr>
8138
8139
8140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8141<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8142matches the given matcher.
8143
8144The associated declaration is:
8145- for type nodes, the declaration of the underlying type
8146- for CallExpr, the declaration of the callee
8147- for MemberExpr, the declaration of the referenced member
8148- for CXXConstructExpr, the declaration of the constructor
8149- for CXXNewExpr, the declaration of the operator new
8150- for ObjCIvarExpr, the declaration of the ivar
8151
8152For type nodes, hasDeclaration will generally match the declaration of the
8153sugared type. Given
8154  class X {};
8155  typedef X Y;
8156  Y y;
8157in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8158typedefDecl. A common use case is to match the underlying, desugared type.
8159This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8160  varDecl(hasType(hasUnqualifiedDesugaredType(
8161      recordType(hasDeclaration(decl())))))
8162In this matcher, the decl will match the CXXRecordDecl of class X.
8163
8164Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8165  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8166  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8167  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8168  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8169  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8170  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8171</pre></td></tr>
8172
8173
8174<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt; InnerMatcher</td></tr>
8175<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
8176
8177Given
8178  struct foo {
8179    void bar() {
8180      auto f = [this](){};
8181    }
8182  }
8183lambdaExpr(hasAnyCapture(cxxThisExpr()))
8184  matches [this](){};
8185</pre></td></tr>
8186
8187
8188<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
8189<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
8190
8191Given
8192  void foo() {
8193    int x;
8194    auto f = [x](){};
8195  }
8196lambdaExpr(hasAnyCapture(anything()))
8197  matches [x](){};
8198</pre></td></tr>
8199
8200
8201<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8202<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8203matches the given matcher.
8204
8205The associated declaration is:
8206- for type nodes, the declaration of the underlying type
8207- for CallExpr, the declaration of the callee
8208- for MemberExpr, the declaration of the referenced member
8209- for CXXConstructExpr, the declaration of the constructor
8210- for CXXNewExpr, the declaration of the operator new
8211- for ObjCIvarExpr, the declaration of the ivar
8212
8213For type nodes, hasDeclaration will generally match the declaration of the
8214sugared type. Given
8215  class X {};
8216  typedef X Y;
8217  Y y;
8218in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8219typedefDecl. A common use case is to match the underlying, desugared type.
8220This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8221  varDecl(hasType(hasUnqualifiedDesugaredType(
8222      recordType(hasDeclaration(decl())))))
8223In this matcher, the decl will match the CXXRecordDecl of class X.
8224
8225Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8226  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8227  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8228  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8229  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8230  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8231  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8232</pre></td></tr>
8233
8234
8235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8236<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8237given matcher. Implicit object expressions are included; that is, it matches
8238use of implicit `this`.
8239
8240Given
8241  struct X {
8242    int m;
8243    int f(X x) { x.m; return m; }
8244  };
8245memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8246  matches `x.m`, but not `m`; however,
8247memberExpr(hasObjectExpression(hasType(pointsTo(
8248     cxxRecordDecl(hasName("X"))))))
8249  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8250</pre></td></tr>
8251
8252
8253<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
8254<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8255given matcher.
8256
8257Given
8258  struct { int first, second; } first, second;
8259  int i(second.first);
8260  int j(first.second);
8261memberExpr(member(hasName("first")))
8262  matches second.first
8263  but not first.second (because the member name there is "second").
8264</pre></td></tr>
8265
8266
8267<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8268<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8269pointee matches a given matcher.
8270
8271Given
8272  int *a;
8273  int const *b;
8274  float const *f;
8275pointerType(pointee(isConstQualified(), isInteger()))
8276  matches "int const *b"
8277
8278Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
8279  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
8280</pre></td></tr>
8281
8282
8283<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
8284<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8285matcher.
8286
8287Given
8288  namespace N { template&lt;class T&gt; void f(T t); }
8289  template &lt;class T&gt; void g() { using N::f; f(T()); }
8290unresolvedLookupExpr(hasAnyDeclaration(
8291    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8292  matches the use of f in g() .
8293</pre></td></tr>
8294
8295
8296<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt; InnerMatcher</td></tr>
8297<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8298
8299Given
8300  struct A { struct B { struct C {}; }; };
8301  A::B::C c;
8302nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8303  matches "A::"
8304</pre></td></tr>
8305
8306
8307<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
8308<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8309NestedNameSpecifier-matcher matches.
8310</pre></td></tr>
8311
8312
8313<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
8314<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8315given TypeLoc.
8316
8317Given
8318  struct A { struct B { struct C {}; }; };
8319  A::B::C c;
8320nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8321  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8322  matches "A::"
8323</pre></td></tr>
8324
8325
8326<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
8327<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8328
8329Given
8330  struct A { struct B { struct C {}; }; };
8331  A::B::C c;
8332nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8333  matches "A::"
8334</pre></td></tr>
8335
8336
8337<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt; InnerMatcher</td></tr>
8338<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8339given namespace matcher.
8340
8341Given
8342  namespace ns { struct A {}; }
8343  ns::A a;
8344nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8345  matches "ns::"
8346</pre></td></tr>
8347
8348
8349<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8350<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8351given QualType matcher without qualifiers.
8352
8353Given
8354  struct A { struct B { struct C {}; }; };
8355  A::B::C c;
8356nestedNameSpecifier(specifiesType(
8357  hasDeclaration(cxxRecordDecl(hasName("A")))
8358))
8359  matches "A::"
8360</pre></td></tr>
8361
8362
8363<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt; InnerMatcher</td></tr>
8364<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8365
8366Given
8367
8368  #pragma omp parallel
8369  #pragma omp parallel default(none)
8370
8371``ompExecutableDirective(hasAnyClause(anything()))`` matches
8372``omp parallel default(none)``.
8373</pre></td></tr>
8374
8375
8376<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
8377<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8378
8379Prerequisite: the executable directive must not be standalone directive.
8380If it is, it will never match.
8381
8382Given
8383
8384   #pragma omp parallel
8385   ;
8386   #pragma omp parallel
8387   {}
8388
8389``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8390</pre></td></tr>
8391
8392
8393<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
8394<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8395matching Base, or Objective-C classes that directly or indirectly
8396subclass a class matching Base.
8397
8398Note that a class is not considered to be derived from itself.
8399
8400Example matches Y, Z, C (Base == hasName("X"))
8401  class X;
8402  class Y : public X {};  // directly derived
8403  class Z : public Y {};  // indirectly derived
8404  typedef X A;
8405  typedef A B;
8406  class C : public B {};  // derived from a typedef of X
8407
8408In the following example, Bar matches isDerivedFrom(hasName("X")):
8409  class Foo;
8410  typedef Foo X;
8411  class Bar : public Foo {};  // derived from a type that X is a typedef of
8412
8413In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8414  @interface NSObject @end
8415  @interface Bar : NSObject @end
8416
8417Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;
8418</pre></td></tr>
8419
8420
8421<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
8422<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8423matching Base.
8424
8425Note that a class is not considered to be derived from itself.
8426
8427Example matches Y, C (Base == hasName("X"))
8428  class X;
8429  class Y : public X {};  // directly derived
8430  class Z : public Y {};  // indirectly derived
8431  typedef X A;
8432  typedef A B;
8433  class C : public B {};  // derived from a typedef of X
8434
8435In the following example, Bar matches isDerivedFrom(hasName("X")):
8436  class Foo;
8437  typedef Foo X;
8438  class Bar : public Foo {};  // derived from a type that X is a typedef of
8439</pre></td></tr>
8440
8441
8442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
8443<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8444match Base.
8445</pre></td></tr>
8446
8447
8448<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8449<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8450expression, or an ObjC-message-send expression.
8451
8452Given
8453  void x(int, int, int) { int y; x(1, y, 42); }
8454callExpr(hasAnyArgument(declRefExpr()))
8455  matches x(1, y, 42)
8456with hasAnyArgument(...)
8457  matching y
8458
8459For ObjectiveC, given
8460  @interface I - (void) f:(int) y; @end
8461  void foo(I *i) { [i f:12]; }
8462objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8463  matches [i f:12]
8464</pre></td></tr>
8465
8466
8467<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument3')"><a name="hasArgument3Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8468<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8469call expression.
8470
8471Example matches y in x(y)
8472    (matcher = callExpr(hasArgument(0, declRefExpr())))
8473  void x(int) { int y; x(y); }
8474</pre></td></tr>
8475
8476
8477<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8478<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8479and the inner matcher matches on that instance.
8480
8481For example the method call in
8482  NSString *x = @"hello";
8483  [x containsString:@"h"];
8484is matched by
8485objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8486</pre></td></tr>
8487
8488
8489<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8490<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8491
8492Example
8493matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8494matches the [webView ...] message invocation.
8495  NSString *webViewJavaScript = ...
8496  UIWebView *webView = ...
8497  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8498</pre></td></tr>
8499
8500
8501<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
8502<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8503block.
8504
8505Does not match the 'this' parameter of a method.
8506
8507Given
8508  class X { void f(int x, int y, int z) {} };
8509cxxMethodDecl(hasAnyParameter(hasName("y")))
8510  matches f(int x, int y, int z) {}
8511with hasAnyParameter(...)
8512  matching int y
8513
8514For ObjectiveC, given
8515  @interface I - (void) f:(int) y; @end
8516
8517the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8518matches the declaration of method f with hasParameter
8519matching y.
8520
8521For blocks, given
8522  b = ^(int y) { printf("%d", y) };
8523
8524the matcher blockDecl(hasAnyParameter(hasName("y")))
8525matches the declaration of the block b with hasParameter
8526matching y.
8527</pre></td></tr>
8528
8529
8530<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
8531<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8532declaration or a block.
8533
8534Given
8535  class X { void f(int x) {} };
8536cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8537  matches f(int x) {}
8538with hasParameter(...)
8539  matching int x
8540
8541For ObjectiveC, given
8542  @interface I - (void) f:(int) y; @end
8543
8544the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8545matches the declaration of method f with hasParameter
8546matching y.
8547</pre></td></tr>
8548
8549
8550<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
8551<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8552
8553Examples:
8554  int x;
8555declaratorDecl(hasTypeLoc(loc(asString("int"))))
8556  matches int x
8557
8558auto x = int(3);
8559cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8560  matches int(3)
8561
8562struct Foo { Foo(int, int); };
8563auto x = Foo(1, 2);
8564cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8565  matches Foo(1, 2)
8566
8567Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
8568  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
8569  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
8570  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8571  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
8572  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
8573  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
8574  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8575</pre></td></tr>
8576
8577
8578<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8579<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8580or opaque value's source expression matches the given matcher.
8581
8582Example 1: matches "a string"
8583(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8584class URL { URL(string); };
8585URL url = "a string";
8586
8587Example 2: matches 'b' (matcher =
8588opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8589int a = b ?: 1;
8590</pre></td></tr>
8591
8592
8593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
8594<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8595overloads matches the given matcher.
8596
8597Given
8598  template &lt;typename T&gt; void foo(T);
8599  template &lt;typename T&gt; void bar(T);
8600  template &lt;typename T&gt; void baz(T t) {
8601    foo(t);
8602    bar(t);
8603  }
8604unresolvedLookupExpr(hasAnyDeclaration(
8605    functionTemplateDecl(hasName("foo"))))
8606  matches foo in foo(t); but not bar in bar(t);
8607</pre></td></tr>
8608
8609
8610<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;</td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8611<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8612
8613Given
8614  int (*ptr_to_array)[4];
8615  int (*ptr_to_func)(int);
8616
8617varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8618ptr_to_func but not ptr_to_array.
8619
8620Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8621</pre></td></tr>
8622
8623
8624<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;</td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8625<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8626pointee matches a given matcher.
8627
8628Given
8629  int *a;
8630  int const *b;
8631  float const *f;
8632pointerType(pointee(isConstQualified(), isInteger()))
8633  matches "int const *b"
8634
8635Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
8636  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
8637</pre></td></tr>
8638
8639
8640<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8641<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8642
8643Given:
8644  typedef int &amp;int_ref;
8645  int a;
8646  int_ref b = a;
8647
8648varDecl(hasType(qualType(referenceType()))))) will not match the
8649declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8650</pre></td></tr>
8651
8652
8653<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8654<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8655matches the given matcher.
8656
8657The associated declaration is:
8658- for type nodes, the declaration of the underlying type
8659- for CallExpr, the declaration of the callee
8660- for MemberExpr, the declaration of the referenced member
8661- for CXXConstructExpr, the declaration of the constructor
8662- for CXXNewExpr, the declaration of the operator new
8663- for ObjCIvarExpr, the declaration of the ivar
8664
8665For type nodes, hasDeclaration will generally match the declaration of the
8666sugared type. Given
8667  class X {};
8668  typedef X Y;
8669  Y y;
8670in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8671typedefDecl. A common use case is to match the underlying, desugared type.
8672This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8673  varDecl(hasType(hasUnqualifiedDesugaredType(
8674      recordType(hasDeclaration(decl())))))
8675In this matcher, the decl will match the CXXRecordDecl of class X.
8676
8677Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8678  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8679  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8680  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8681  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8682  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8683  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8684</pre></td></tr>
8685
8686
8687<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8688<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8689
8690Given
8691  void (*fp)(void);
8692The matcher
8693  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8694would match the declaration for fp.
8695</pre></td></tr>
8696
8697
8698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
8699<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8700</pre></td></tr>
8701
8702
8703<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8704<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8705matches the specified matcher.
8706
8707Example matches y-&gt;x()
8708  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8709     cxxRecordDecl(hasName("Y")))))))
8710  class Y { public: void x(); };
8711  void z() { Y *y; y-&gt;x(); }
8712</pre></td></tr>
8713
8714
8715<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
8716<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8717</pre></td></tr>
8718
8719
8720<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8721<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8722type matches the specified matcher.
8723
8724Example matches X &amp;x and const X &amp;y
8725    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8726  class X {
8727    void a(X b) {
8728      X &amp;x = b;
8729      const X &amp;y = b;
8730    }
8731  };
8732</pre></td></tr>
8733
8734
8735<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8736<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8737matches the given matcher.
8738
8739The associated declaration is:
8740- for type nodes, the declaration of the underlying type
8741- for CallExpr, the declaration of the callee
8742- for MemberExpr, the declaration of the referenced member
8743- for CXXConstructExpr, the declaration of the constructor
8744- for CXXNewExpr, the declaration of the operator new
8745- for ObjCIvarExpr, the declaration of the ivar
8746
8747For type nodes, hasDeclaration will generally match the declaration of the
8748sugared type. Given
8749  class X {};
8750  typedef X Y;
8751  Y y;
8752in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8753typedefDecl. A common use case is to match the underlying, desugared type.
8754This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8755  varDecl(hasType(hasUnqualifiedDesugaredType(
8756      recordType(hasDeclaration(decl())))))
8757In this matcher, the decl will match the CXXRecordDecl of class X.
8758
8759Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8760  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8761  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8762  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8763  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8764  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8765  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8766</pre></td></tr>
8767
8768
8769<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;</td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8770<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
8771pointee matches a given matcher.
8772
8773Given
8774  int *a;
8775  int const *b;
8776  float const *f;
8777pointerType(pointee(isConstQualified(), isInteger()))
8778  matches "int const *b"
8779
8780Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
8781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
8782</pre></td></tr>
8783
8784
8785<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8786<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
8787
8788Given
8789  return a + b;
8790hasReturnValue(binaryOperator())
8791  matches 'return a + b'
8792with binaryOperator()
8793  matching 'a + b'
8794</pre></td></tr>
8795
8796
8797<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
8798<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
8799a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8800
8801Given
8802  { {}; 1+2; }
8803hasAnySubstatement(compoundStmt())
8804  matches '{ {}; 1+2; }'
8805with compoundStmt()
8806  matching '{}'
8807</pre></td></tr>
8808
8809
8810<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
8811<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8812alignof.
8813</pre></td></tr>
8814
8815
8816<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
8817<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
8818belongs to.
8819
8820Given:
8821F&amp; operator=(const F&amp; o) {
8822  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
8823  return *this;
8824}
8825returnStmt(forCallable(functionDecl(hasName("operator="))))
8826  matches 'return *this'
8827  but does not match 'return v &gt; 0'
8828
8829Given:
8830-(void) foo {
8831  int x = 1;
8832  dispatch_sync(queue, ^{ int y = 2; });
8833}
8834declStmt(forCallable(objcMethodDecl()))
8835  matches 'int x = 1'
8836  but does not match 'int y = 2'.
8837whereas declStmt(forCallable(blockDecl()))
8838  matches 'int y = 2'
8839  but does not match 'int x = 1'.
8840</pre></td></tr>
8841
8842
8843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
8844<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
8845
8846Deprecated. Use forCallable() to correctly handle the situation when
8847the declaration is not a function (but a block or an Objective-C method).
8848forFunction() not only fails to take non-functions into account but also
8849may match the wrong declaration in their presence.
8850
8851Given:
8852F&amp; operator=(const F&amp; o) {
8853  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
8854  return *this;
8855}
8856returnStmt(forFunction(hasName("operator=")))
8857  matches 'return *this'
8858  but does not match 'return v &gt; 0'
8859</pre></td></tr>
8860
8861
8862<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
8863<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8864sizeof.
8865</pre></td></tr>
8866
8867
8868<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8869<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
8870type that matches the provided matcher.
8871
8872Given
8873  template &lt;typename T&gt;
8874  double F(T t);
8875  int i;
8876  double j = F(i);
8877
8878substTemplateTypeParmType(hasReplacementType(type())) matches int
8879</pre></td></tr>
8880
8881
8882<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
8883<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
8884statement. This matcher may produce multiple matches.
8885
8886Given
8887  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
8888switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
8889  matches four times, with "c" binding each of "case 1:", "case 2:",
8890"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
8891"switch (1)", "switch (2)" and "switch (2)".
8892</pre></td></tr>
8893
8894
8895<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8896<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
8897switch statement or conditional operator.
8898
8899Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8900  if (true) {}
8901</pre></td></tr>
8902
8903
8904<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
8905<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
8906
8907Given:
8908 void foo() {
8909   if (int i = foobar(); i &gt; 0) {}
8910   switch (int i = foobar(); i) {}
8911   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8912 }
8913 void bar() {
8914   if (foobar() &gt; 0) {}
8915   switch (foobar()) {}
8916   for (auto&amp; x : get_range()) {}
8917 }
8918ifStmt(hasInitStatement(anything()))
8919  matches the if statement in foo but not in bar.
8920switchStmt(hasInitStatement(anything()))
8921  matches the switch statement in foo but not in bar.
8922cxxForRangeStmt(hasInitStatement(anything()))
8923  matches the range for statement in foo but not in bar.
8924</pre></td></tr>
8925
8926
8927<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8928<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
8929matches the given matcher.
8930
8931The associated declaration is:
8932- for type nodes, the declaration of the underlying type
8933- for CallExpr, the declaration of the callee
8934- for MemberExpr, the declaration of the referenced member
8935- for CXXConstructExpr, the declaration of the constructor
8936- for CXXNewExpr, the declaration of the operator new
8937- for ObjCIvarExpr, the declaration of the ivar
8938
8939For type nodes, hasDeclaration will generally match the declaration of the
8940sugared type. Given
8941  class X {};
8942  typedef X Y;
8943  Y y;
8944in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8945typedefDecl. A common use case is to match the underlying, desugared type.
8946This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8947  varDecl(hasType(hasUnqualifiedDesugaredType(
8948      recordType(hasDeclaration(decl())))))
8949In this matcher, the decl will match the CXXRecordDecl of class X.
8950
8951Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8952  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8953  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8954  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8955  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8956  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8957  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8958</pre></td></tr>
8959
8960
8961<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
8962<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
8963
8964Examples:
8965  int x;
8966declaratorDecl(hasTypeLoc(loc(asString("int"))))
8967  matches int x
8968
8969auto x = int(3);
8970cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8971  matches int(3)
8972
8973struct Foo { Foo(int, int); };
8974auto x = Foo(1, 2);
8975cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8976  matches Foo(1, 2)
8977
8978Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
8979  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
8980  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
8981  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8982  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
8983  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
8984  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
8985  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8986</pre></td></tr>
8987
8988
8989<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8990<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
8991
8992Given
8993  struct B { int next; };
8994  template&lt;int(B::*next_ptr)&gt; struct A {};
8995  A&lt;&amp;B::next&gt; a;
8996templateSpecializationType(hasAnyTemplateArgument(
8997  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
8998  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
8999    B::next
9000</pre></td></tr>
9001
9002
9003<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
9004<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9005declaration.
9006
9007Given
9008  struct B { int next; };
9009  template&lt;int(B::*next_ptr)&gt; struct A {};
9010  A&lt;&amp;B::next&gt; a;
9011classTemplateSpecializationDecl(hasAnyTemplateArgument(
9012    refersToDeclaration(fieldDecl(hasName("next")))))
9013  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9014    B::next
9015</pre></td></tr>
9016
9017
9018<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9019<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9020
9021Given
9022  template&lt;int T&gt; struct C {};
9023  C&lt;42&gt; c;
9024classTemplateSpecializationDecl(
9025  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9026  matches the implicit instantiation of C in C&lt;42&gt;.
9027</pre></td></tr>
9028
9029
9030<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
9031<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9032
9033Given
9034  template&lt;template &lt;typename&gt; class S&gt; class X {};
9035  template&lt;typename T&gt; class Y {};
9036  X&lt;Y&gt; xi;
9037classTemplateSpecializationDecl(hasAnyTemplateArgument(
9038    refersToTemplate(templateName())))
9039  matches the specialization X&lt;Y&gt;
9040</pre></td></tr>
9041
9042
9043<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9044<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9045
9046Given
9047  struct X {};
9048  template&lt;typename T&gt; struct A {};
9049  A&lt;X&gt; a;
9050classTemplateSpecializationDecl(hasAnyTemplateArgument(
9051    refersToType(class(hasName("X")))))
9052  matches the specialization A&lt;X&gt;
9053</pre></td></tr>
9054
9055
9056<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
9057<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9058functionDecl that have at least one TemplateArgument matching the given
9059InnerMatcher.
9060
9061Given
9062  template&lt;typename T&gt; class A {};
9063  template&lt;&gt; class A&lt;double&gt; {};
9064  A&lt;int&gt; a;
9065
9066  template&lt;typename T&gt; f() {};
9067  void func() { f&lt;int&gt;(); };
9068
9069classTemplateSpecializationDecl(hasAnyTemplateArgument(
9070    refersToType(asString("int"))))
9071  matches the specialization A&lt;int&gt;
9072
9073functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9074  matches the specialization f&lt;int&gt;
9075</pre></td></tr>
9076
9077
9078<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9079<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9080matches the given matcher.
9081
9082The associated declaration is:
9083- for type nodes, the declaration of the underlying type
9084- for CallExpr, the declaration of the callee
9085- for MemberExpr, the declaration of the referenced member
9086- for CXXConstructExpr, the declaration of the constructor
9087- for CXXNewExpr, the declaration of the operator new
9088- for ObjCIvarExpr, the declaration of the ivar
9089
9090For type nodes, hasDeclaration will generally match the declaration of the
9091sugared type. Given
9092  class X {};
9093  typedef X Y;
9094  Y y;
9095in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9096typedefDecl. A common use case is to match the underlying, desugared type.
9097This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9098  varDecl(hasType(hasUnqualifiedDesugaredType(
9099      recordType(hasDeclaration(decl())))))
9100In this matcher, the decl will match the CXXRecordDecl of class X.
9101
9102Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9103  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9104  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9105  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9106  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9107  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9108  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9109</pre></td></tr>
9110
9111
9112<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
9113<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9114functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9115
9116Given
9117  template&lt;typename T, typename U&gt; class A {};
9118  A&lt;bool, int&gt; b;
9119  A&lt;int, bool&gt; c;
9120
9121  template&lt;typename T&gt; void f() {}
9122  void func() { f&lt;int&gt;(); };
9123classTemplateSpecializationDecl(hasTemplateArgument(
9124    1, refersToType(asString("int"))))
9125  matches the specialization A&lt;bool, int&gt;
9126
9127functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9128  matches the specialization f&lt;int&gt;
9129</pre></td></tr>
9130
9131
9132<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9133<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9134matches the given matcher.
9135
9136The associated declaration is:
9137- for type nodes, the declaration of the underlying type
9138- for CallExpr, the declaration of the callee
9139- for MemberExpr, the declaration of the referenced member
9140- for CXXConstructExpr, the declaration of the constructor
9141- for CXXNewExpr, the declaration of the operator new
9142- for ObjCIvarExpr, the declaration of the ivar
9143
9144For type nodes, hasDeclaration will generally match the declaration of the
9145sugared type. Given
9146  class X {};
9147  typedef X Y;
9148  Y y;
9149in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9150typedefDecl. A common use case is to match the underlying, desugared type.
9151This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9152  varDecl(hasType(hasUnqualifiedDesugaredType(
9153      recordType(hasDeclaration(decl())))))
9154In this matcher, the decl will match the CXXRecordDecl of class X.
9155
9156Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9157  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9158  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9159  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9160  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9161  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9162  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9163</pre></td></tr>
9164
9165
9166<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9167<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9168QualType-matcher matches.
9169</pre></td></tr>
9170
9171
9172<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
9173<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9174
9175Examples:
9176  int x;
9177declaratorDecl(hasTypeLoc(loc(asString("int"))))
9178  matches int x
9179
9180auto x = int(3);
9181cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9182  matches int(3)
9183
9184struct Foo { Foo(int, int); };
9185auto x = Foo(1, 2);
9186cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9187  matches Foo(1, 2)
9188
9189Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
9190  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
9191  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
9192  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9193  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
9194  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
9195  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
9196  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9197</pre></td></tr>
9198
9199
9200<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9201<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9202matcher.
9203
9204Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9205            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9206            and U (matcher = typedefDecl(hasType(asString("int")))
9207            and friend class X (matcher = friendDecl(hasType("X"))
9208            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9209                                              asString("class X")))
9210 class X {};
9211 void y(X &amp;x) { x; X z; }
9212 typedef int U;
9213 class Y { friend class X; };
9214 class Z : public virtual X {};
9215</pre></td></tr>
9216
9217
9218<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9219<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9220matches the given matcher.
9221
9222The associated declaration is:
9223- for type nodes, the declaration of the underlying type
9224- for CallExpr, the declaration of the callee
9225- for MemberExpr, the declaration of the referenced member
9226- for CXXConstructExpr, the declaration of the constructor
9227- for CXXNewExpr, the declaration of the operator new
9228- for ObjCIvarExpr, the declaration of the ivar
9229
9230For type nodes, hasDeclaration will generally match the declaration of the
9231sugared type. Given
9232  class X {};
9233  typedef X Y;
9234  Y y;
9235in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9236typedefDecl. A common use case is to match the underlying, desugared type.
9237This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9238  varDecl(hasType(hasUnqualifiedDesugaredType(
9239      recordType(hasDeclaration(decl())))))
9240In this matcher, the decl will match the CXXRecordDecl of class X.
9241
9242Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9243  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9244  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9245  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9246  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9247  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9248  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9249</pre></td></tr>
9250
9251
9252<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
9253<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9254type of the matched node.
9255
9256For example, in:
9257  class A {};
9258  using B = A;
9259The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9260both B and A.
9261</pre></td></tr>
9262
9263
9264<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9265<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9266
9267Given
9268  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9269unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9270  matches sizeof(a) and alignof(c)
9271</pre></td></tr>
9272
9273
9274<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9275<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9276
9277Example matches true (matcher = hasUnaryOperand(
9278                                  cxxBoolLiteral(equals(true))))
9279  !true
9280</pre></td></tr>
9281
9282
9283<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9284<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9285given matcher. Implicit object expressions are included; that is, it matches
9286use of implicit `this`.
9287
9288Given
9289  struct X {
9290    int m;
9291    int f(X x) { x.m; return m; }
9292  };
9293memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9294  matches `x.m`, but not `m`; however,
9295memberExpr(hasObjectExpression(hasType(pointsTo(
9296     cxxRecordDecl(hasName("X"))))))
9297  matches `m` (aka. `this-&gt;m`), but not `x.m`.
9298</pre></td></tr>
9299
9300
9301<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9302<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9303matches the given matcher.
9304
9305The associated declaration is:
9306- for type nodes, the declaration of the underlying type
9307- for CallExpr, the declaration of the callee
9308- for MemberExpr, the declaration of the referenced member
9309- for CXXConstructExpr, the declaration of the constructor
9310- for CXXNewExpr, the declaration of the operator new
9311- for ObjCIvarExpr, the declaration of the ivar
9312
9313For type nodes, hasDeclaration will generally match the declaration of the
9314sugared type. Given
9315  class X {};
9316  typedef X Y;
9317  Y y;
9318in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9319typedefDecl. A common use case is to match the underlying, desugared type.
9320This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9321  varDecl(hasType(hasUnqualifiedDesugaredType(
9322      recordType(hasDeclaration(decl())))))
9323In this matcher, the decl will match the CXXRecordDecl of class X.
9324
9325Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9326  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9327  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9328  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9329  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9330  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9331  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9332</pre></td></tr>
9333
9334
9335<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
9336<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
9337
9338Given
9339  namespace X { void b(); }
9340  using X::b;
9341usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
9342  matches using X::b </pre></td></tr>
9343
9344
9345<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt;</td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
9346<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9347matched by the given matcher.
9348
9349Given
9350  namespace X { int a; void b(); }
9351  using X::a;
9352  using X::b;
9353usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9354  matches using X::b but not using X::a </pre></td></tr>
9355
9356
9357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
9358<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9359declaration's type.
9360
9361In case of a value declaration (for example a variable declaration),
9362this resolves one layer of indirection. For example, in the value
9363declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9364X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9365declaration of x.
9366
9367Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9368            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9369            and friend class X (matcher = friendDecl(hasType("X"))
9370            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9371                                              cxxRecordDecl(hasName("X"))))
9372 class X {};
9373 void y(X &amp;x) { x; X z; }
9374 class Y { friend class X; };
9375 class Z : public virtual X {};
9376
9377Example matches class Derived
9378(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9379class Base {};
9380class Derived : Base {};
9381
9382Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
9383Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
9384</pre></td></tr>
9385
9386
9387<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9388<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9389matcher.
9390
9391Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9392            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9393            and U (matcher = typedefDecl(hasType(asString("int")))
9394            and friend class X (matcher = friendDecl(hasType("X"))
9395            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9396                                              asString("class X")))
9397 class X {};
9398 void y(X &amp;x) { x; X z; }
9399 typedef int U;
9400 class Y { friend class X; };
9401 class Z : public virtual X {};
9402</pre></td></tr>
9403
9404
9405<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9406<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9407that matches the given matcher.
9408
9409Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9410  bool y() { return true; }
9411  bool x = y();
9412</pre></td></tr>
9413
9414
9415<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9416<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9417expression.
9418
9419Given
9420  void f(int b) {
9421    int a[b];
9422  }
9423variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9424  varDecl(hasName("b")))))))
9425  matches "int a[b]"
9426</pre></td></tr>
9427
9428
9429<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
9430<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9431
9432
9433<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9434<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9435switch statement or conditional operator.
9436
9437Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9438  if (true) {}
9439</pre></td></tr>
9440
9441<!--END_TRAVERSAL_MATCHERS -->
9442</table>
9443
9444</div>
9445</body>
9446</html>
9447
9448
9449