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_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;...</td></tr>
577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes.
578Attributes may be attached with a variety of different syntaxes (including
579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
580and ``#pragma``s). They may also be implicit.
581
582Given
583  struct [[nodiscard]] Foo{};
584  void bar(int * __attribute__((nonnull)) );
585  __declspec(noinline) void baz();
586
587  #pragma omp declare simd
588  int min();
589attr()
590  matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line.
591</pre></td></tr>
592
593
594<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>
595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
596
597Examples matches public virtual B.
598  class B {};
599  class C : public virtual B {};
600</pre></td></tr>
601
602
603<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>
604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
605
606Examples matches i(42).
607  class C {
608    C() : i(42) {}
609    int i;
610  };
611</pre></td></tr>
612
613
614<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>
615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
616
617Given
618  class C {
619  public:
620    int a;
621  };
622accessSpecDecl()
623  matches 'public:'
624</pre></td></tr>
625
626
627<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>
628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
629Example matches foo and bar
630(matcher = bindingDecl()
631
632  auto [foo, bar] = std::make_pair{42, 42};
633</pre></td></tr>
634
635
636<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>
637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
638
639Example matches the declaration of the nameless block printing an input
640integer.
641
642  myFunc(^(int p) {
643    printf("%d", p);
644  })
645</pre></td></tr>
646
647
648<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>
649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
650
651Example matches Z
652  template&lt;class T&gt; class Z {};
653</pre></td></tr>
654
655
656<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>
657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
658
659Given
660  template&lt;class T1, class T2, int I&gt;
661  class A {};
662
663  template&lt;class T, int I&gt;
664  class A&lt;T, T*, I&gt; {};
665
666  template&lt;&gt;
667  class A&lt;int, int, 1&gt; {};
668classTemplatePartialSpecializationDecl()
669  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
670</pre></td></tr>
671
672
673<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>
674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
675
676Given
677  template&lt;typename T&gt; class A {};
678  template&lt;&gt; class A&lt;double&gt; {};
679  A&lt;int&gt; a;
680classTemplateSpecializationDecl()
681  matches the specializations A&lt;int&gt; and A&lt;double&gt;
682</pre></td></tr>
683
684
685<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>
686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
687
688Example matches Foo::Foo() and Foo::Foo(int)
689  class Foo {
690   public:
691    Foo();
692    Foo(int);
693    int DoSomething();
694  };
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('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>
699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
700
701Example matches the operator.
702  class X { operator int() const; };
703</pre></td></tr>
704
705
706<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>
707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
708
709Example matches the deduction guide.
710  template&lt;typename T&gt;
711  class X { X(int) };
712  X(int) -&gt; X&lt;int&gt;;
713</pre></td></tr>
714
715
716<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>
717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
718
719Example matches Foo::~Foo()
720  class Foo {
721   public:
722    virtual ~Foo();
723  };
724</pre></td></tr>
725
726
727<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>
728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
729
730Example matches y
731  class X { void y(); };
732</pre></td></tr>
733
734
735<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>
736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
737
738Example matches X, Z
739  class X;
740  template&lt;class T&gt; class Z {};
741</pre></td></tr>
742
743
744<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>
745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
746
747Examples matches X, C, and the friend declaration inside C;
748  void X();
749  class C {
750    friend X;
751  };
752</pre></td></tr>
753
754
755<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>
756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
757and non-type template parameter declarations).
758
759Given
760  class X { int y; };
761declaratorDecl()
762  matches int y.
763</pre></td></tr>
764
765
766<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>
767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
768
769Examples matches the declaration node with foo and bar, but not
770number.
771(matcher = declStmt(has(decompositionDecl())))
772
773  int number = 42;
774  auto [foo, bar] = std::make_pair{42, 42};
775</pre></td></tr>
776
777
778<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>
779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
780
781Example matches A, B, C
782  enum X {
783    A, B, C
784  };
785</pre></td></tr>
786
787
788<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>
789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
790
791Example matches X
792  enum X {
793    A, B, C
794  };
795</pre></td></tr>
796
797
798<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>
799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
800
801Given
802  class X { int m; };
803fieldDecl()
804  matches 'm'.
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('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>
809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
810
811Given
812  class X { friend void foo(); };
813friendDecl()
814  matches 'friend void foo()'.
815</pre></td></tr>
816
817
818<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>
819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
820
821Example matches f
822  void f();
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('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>
827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
828
829Example matches f
830  template&lt;class T&gt; void f(T t) {}
831</pre></td></tr>
832
833
834<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>
835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
836
837Given
838  struct X { struct { int a; }; };
839indirectFieldDecl()
840  matches 'a'.
841</pre></td></tr>
842
843
844<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>
845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
846
847Given
848  goto FOO;
849  FOO: bar();
850labelDecl()
851  matches 'FOO:'
852</pre></td></tr>
853
854
855<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>
856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
857
858Given
859  extern "C" {}
860linkageSpecDecl()
861  matches "extern "C" {}"
862</pre></td></tr>
863
864
865<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>
866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
867
868Example matches X, S, the anonymous union type, i, and U;
869  typedef int X;
870  struct S {
871    union {
872      int i;
873    } U;
874  };
875</pre></td></tr>
876
877
878<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>
879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
880
881Given
882  namespace test {}
883  namespace alias = ::test;
884namespaceAliasDecl()
885  matches "namespace alias" but not "namespace test"
886</pre></td></tr>
887
888
889<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>
890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
891
892Given
893  namespace {}
894  namespace test {}
895namespaceDecl()
896  matches "namespace {}" and "namespace test {}"
897</pre></td></tr>
898
899
900<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>
901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
902
903Given
904  template &lt;typename T, int N&gt; struct C {};
905nonTypeTemplateParmDecl()
906  matches 'N', but not 'T'.
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('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>
911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
912
913Example matches Foo (Additions)
914  @interface Foo (Additions)
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('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>
920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
921
922Example matches Foo (Additions)
923  @implementation Foo (Additions)
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('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>
929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
930
931Example matches Foo
932  @implementation Foo
933  @end
934</pre></td></tr>
935
936
937<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>
938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
939
940Example matches Foo
941  @interface Foo
942  @end
943</pre></td></tr>
944
945
946<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>
947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
948
949Example matches _enabled
950  @implementation Foo {
951    BOOL _enabled;
952  }
953  @end
954</pre></td></tr>
955
956
957<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>
958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
959
960Example matches both declaration and definition of -[Foo method]
961  @interface Foo
962  - (void)method;
963  @end
964
965  @implementation Foo
966  - (void)method {}
967  @end
968</pre></td></tr>
969
970
971<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>
972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
973
974Example matches enabled
975  @interface Foo
976  @property BOOL enabled;
977  @end
978</pre></td></tr>
979
980
981<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>
982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
983
984Example matches FooDelegate
985  @protocol FooDelegate
986  @end
987</pre></td></tr>
988
989
990<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>
991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
992
993Given
994  void f(int x);
995parmVarDecl()
996  matches int x.
997</pre></td></tr>
998
999
1000<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>
1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
1002
1003Example matches X, Z, U, and S
1004  class X;
1005  template&lt;class T&gt; class Z {};
1006  struct S {};
1007  union U {};
1008</pre></td></tr>
1009
1010
1011<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>
1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
1013
1014Example:
1015  staticAssertDecl()
1016matches
1017  static_assert(sizeof(S) == sizeof(int))
1018in
1019  struct S {
1020    int x;
1021  };
1022  static_assert(sizeof(S) == sizeof(int));
1023</pre></td></tr>
1024
1025
1026<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>
1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1028
1029Example matches X, Z, U, S, E
1030  class X;
1031  template&lt;class T&gt; class Z {};
1032  struct S {};
1033  union U {};
1034  enum E {
1035    A, B, C
1036  };
1037</pre></td></tr>
1038
1039
1040<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>
1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1042
1043Given
1044  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
1045templateTypeParmDecl()
1046  matches 'Z', but not 'N'.
1047</pre></td></tr>
1048
1049
1050<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>
1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1052
1053Given
1054  template &lt;typename T, int N&gt; struct C {};
1055templateTypeParmDecl()
1056  matches 'T', but not 'N'.
1057</pre></td></tr>
1058
1059
1060<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>
1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1062
1063Given
1064  int X;
1065  namespace NS {
1066  int Y;
1067  }  // namespace NS
1068decl(hasDeclContext(translationUnitDecl()))
1069  matches "int X", but not "int Y".
1070</pre></td></tr>
1071
1072
1073<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>
1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1075
1076Given
1077  typedef int X;
1078  using Y = int;
1079typeAliasDecl()
1080  matches "using Y = int", but not "typedef int X"
1081</pre></td></tr>
1082
1083
1084<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>
1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1086
1087typeAliasTemplateDecl() matches
1088  template &lt;typename T&gt;
1089  using Y = X&lt;T&gt;;
1090</pre></td></tr>
1091
1092
1093<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>
1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1095
1096Given
1097  typedef int X;
1098  using Y = int;
1099typedefDecl()
1100  matches "typedef int X", but not "using Y = int"
1101</pre></td></tr>
1102
1103
1104<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>
1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1106
1107Given
1108  typedef int X;
1109  using Y = int;
1110typedefNameDecl()
1111  matches "typedef int X" and "using Y = int"
1112</pre></td></tr>
1113
1114
1115<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>
1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1117typename.
1118
1119Given
1120  template &lt;typename T&gt;
1121  struct Base { typedef T Foo; };
1122
1123  template&lt;typename T&gt;
1124  struct S : private Base&lt;T&gt; {
1125    using typename Base&lt;T&gt;::Foo;
1126  };
1127unresolvedUsingTypenameDecl()
1128  matches using Base&lt;T&gt;::Foo </pre></td></tr>
1129
1130
1131<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>
1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1133
1134Given
1135  template&lt;typename X&gt;
1136  class C : private X {
1137    using X::x;
1138  };
1139unresolvedUsingValueDecl()
1140  matches using X::x </pre></td></tr>
1141
1142
1143<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>
1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1145
1146Given
1147  namespace X { int x; }
1148  using X::x;
1149usingDecl()
1150  matches using X::x </pre></td></tr>
1151
1152
1153<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>
1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1155
1156Given
1157  namespace X { int x; }
1158  using namespace X;
1159usingDirectiveDecl()
1160  matches using namespace X </pre></td></tr>
1161
1162
1163<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>&gt;...</td></tr>
1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations.
1165
1166Given
1167  namespace X { enum x {...}; }
1168  using enum X::x;
1169usingEnumDecl()
1170  matches using enum X::x </pre></td></tr>
1171
1172
1173<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>
1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1175
1176Example matches A, B, C and F
1177  enum X { A, B, C };
1178  void F();
1179</pre></td></tr>
1180
1181
1182<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>
1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1184
1185Note: this does not match declarations of member variables, which are
1186"field" declarations in Clang parlance.
1187
1188Example matches a
1189  int a;
1190</pre></td></tr>
1191
1192
1193<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('lambdaCapture0')"><a name="lambdaCapture0Anchor">lambdaCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;...</td></tr>
1194<tr><td colspan="4" class="doc" id="lambdaCapture0"><pre>Matches lambda captures.
1195
1196Given
1197  int main() {
1198    int x;
1199    auto f = [x](){};
1200    auto g = [x = 1](){};
1201  }
1202In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`,
1203`lambdaCapture()` matches `x` and `x=1`.
1204</pre></td></tr>
1205
1206
1207<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>
1208<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1209</pre></td></tr>
1210
1211
1212<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>
1213<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1214
1215Given
1216  namespace ns {
1217    struct A { static void f(); };
1218    void A::f() {}
1219    void g() { A::f(); }
1220  }
1221  ns::A a;
1222nestedNameSpecifier()
1223  matches "ns::" and both "A::"
1224</pre></td></tr>
1225
1226
1227<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>
1228<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1229
1230Given
1231
1232  #pragma omp parallel default(none)
1233  #pragma omp parallel default(shared)
1234  #pragma omp parallel default(private)
1235  #pragma omp parallel default(firstprivate)
1236  #pragma omp parallel
1237
1238``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``,
1239`` default(private)`` and ``default(firstprivate)``
1240</pre></td></tr>
1241
1242
1243<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>
1244<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1245</pre></td></tr>
1246
1247
1248<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>
1249<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1250
1251Given
1252  FOO: bar();
1253  void *ptr = &amp;&amp;FOO;
1254  goto *bar;
1255addrLabelExpr()
1256  matches '&amp;&amp;FOO'
1257</pre></td></tr>
1258
1259
1260<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>
1261<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1262
1263Given
1264  int i = a[1];
1265arraySubscriptExpr()
1266  matches "a[1]"
1267</pre></td></tr>
1268
1269
1270<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>
1271<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1272
1273 int i = 100;
1274  __asm("mov al, 2");
1275asmStmt()
1276  matches '__asm("mov al, 2")'
1277</pre></td></tr>
1278
1279
1280<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>
1281<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1282Example matches __atomic_load_n(ptr, 1)
1283  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1284</pre></td></tr>
1285
1286
1287<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>
1288<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1289
1290Given
1291  @autoreleasepool {
1292    int x = 0;
1293  }
1294autoreleasePoolStmt(stmt()) matches the declaration of "x"
1295inside the autorelease pool.
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('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>
1300<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1301
1302Example matches a ?: b
1303  (a ?: b) + 42;
1304</pre></td></tr>
1305
1306
1307<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>
1308<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1309
1310Example matches a || b
1311  !(a || b)
1312See also the binaryOperation() matcher for more-general matching.
1313</pre></td></tr>
1314
1315
1316<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>
1317<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1318
1319Example: matches "^{}":
1320  void f() { ^{}(); }
1321</pre></td></tr>
1322
1323
1324<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>
1325<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1326
1327Given
1328  while (true) { break; }
1329breakStmt()
1330  matches 'break'
1331</pre></td></tr>
1332
1333
1334<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>
1335<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1336
1337Example: Matches (int) 2.2f in
1338  int i = (int) 2.2f;
1339</pre></td></tr>
1340
1341
1342<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>
1343<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1344
1345Example matches x.y() and y()
1346  X x;
1347  x.y();
1348  y();
1349</pre></td></tr>
1350
1351
1352<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>
1353<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1354
1355Given
1356  switch(a) { case 42: break; default: break; }
1357caseStmt()
1358  matches 'case 42:'.
1359</pre></td></tr>
1360
1361
1362<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>
1363<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1364
1365Example: castExpr() matches each of the following:
1366  (int) 3;
1367  const_cast&lt;Expr *&gt;(SubExpr);
1368  char c = 0;
1369but does not match
1370  int i = (0);
1371  int k = 0;
1372</pre></td></tr>
1373
1374
1375<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>
1376<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1377
1378Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1379though.
1380
1381Example matches 'a', L'a'
1382  char ch = 'a';
1383  wchar_t chw = L'a';
1384</pre></td></tr>
1385
1386
1387<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>
1388<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1389</pre></td></tr>
1390
1391
1392<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>
1393<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1394
1395Given
1396  co_await 1;
1397coawaitExpr()
1398  matches 'co_await 1'
1399</pre></td></tr>
1400
1401
1402<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>
1403<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1404
1405Example match: {1}, (1, 2)
1406  int array[4] = {1};
1407  vector int myvec = (vector int)(1, 2);
1408</pre></td></tr>
1409
1410
1411<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>
1412<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1413
1414Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1415  for (;;) {{}}
1416</pre></td></tr>
1417
1418
1419<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>
1420<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1421
1422Example matches a ? b : c
1423  (a ? b : c) + 42
1424</pre></td></tr>
1425
1426
1427<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>
1428<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1429
1430Example matches the constant in the case statement:
1431    (matcher = constantExpr())
1432  switch (a) {
1433  case 37: break;
1434  }
1435</pre></td></tr>
1436
1437
1438<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>
1439<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1440
1441Given
1442  while (true) { continue; }
1443continueStmt()
1444  matches 'continue'
1445</pre></td></tr>
1446
1447
1448<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>
1449<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1450
1451Given
1452  while (true) { co_return; }
1453coreturnStmt()
1454  matches 'co_return'
1455</pre></td></tr>
1456
1457
1458<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>
1459<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1460
1461Given
1462  co_yield 1;
1463coyieldExpr()
1464  matches 'co_yield 1'
1465</pre></td></tr>
1466
1467
1468<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>
1469<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1470
1471Example matches,
1472  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
1473</pre></td></tr>
1474
1475
1476<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>
1477<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1478
1479Example matches FunctionTakesString(GetStringByValue())
1480    (matcher = cxxBindTemporaryExpr())
1481  FunctionTakesString(GetStringByValue());
1482  FunctionTakesStringByPointer(GetStringPointer());
1483</pre></td></tr>
1484
1485
1486<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>
1487<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1488
1489Example matches true
1490  true
1491</pre></td></tr>
1492
1493
1494<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>
1495<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1496
1497  try {} catch(int i) {}
1498cxxCatchStmt()
1499  matches 'catch(int i)'
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('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>
1504<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1505
1506Example: Matches const_cast&lt;int*&gt;(&amp;r) in
1507  int n = 42;
1508  const int &amp;r(n);
1509  int* p = const_cast&lt;int*&gt;(&amp;r);
1510</pre></td></tr>
1511
1512
1513<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>
1514<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1515
1516Example matches string(ptr, n) and ptr within arguments of f
1517    (matcher = cxxConstructExpr())
1518  void f(const string &amp;a, const string &amp;b);
1519  char *ptr;
1520  int n;
1521  f(string(ptr, n), ptr);
1522</pre></td></tr>
1523
1524
1525<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>
1526<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1527
1528Example matches the CXXDefaultArgExpr placeholder inserted for the
1529    default value of the second parameter in the call expression f(42)
1530    (matcher = cxxDefaultArgExpr())
1531  void f(int x, int y = 0);
1532  f(42);
1533</pre></td></tr>
1534
1535
1536<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>
1537<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1538
1539Given
1540  delete X;
1541cxxDeleteExpr()
1542  matches 'delete X'.
1543</pre></td></tr>
1544
1545
1546<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>
1547<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1548resolved because the base expression or the member name was dependent.
1549
1550Given
1551  template &lt;class T&gt; void f() { T t; t.g(); }
1552cxxDependentScopeMemberExpr()
1553  matches t.g
1554</pre></td></tr>
1555
1556
1557<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>
1558<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1559
1560Example:
1561  cxxDynamicCastExpr()
1562matches
1563  dynamic_cast&lt;D*&gt;(&amp;b);
1564in
1565  struct B { virtual ~B() {} }; struct D : B {};
1566  B b;
1567  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1568</pre></td></tr>
1569
1570
1571<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>
1572<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1573
1574cxxForRangeStmt() matches 'for (auto a : i)'
1575  int i[] =  {1, 2, 3}; for (auto a : i);
1576  for(int j = 0; j &lt; 5; ++j);
1577</pre></td></tr>
1578
1579
1580<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>
1581<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1582
1583Example: Matches Foo(bar);
1584  Foo f = bar;
1585  Foo g = (Foo) bar;
1586  Foo h = Foo(bar);
1587</pre></td></tr>
1588
1589
1590<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>
1591<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1592
1593Example matches x.y()
1594  X x;
1595  x.y();
1596</pre></td></tr>
1597
1598
1599<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>
1600<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1601
1602Given
1603  new X;
1604cxxNewExpr()
1605  matches 'new X'.
1606</pre></td></tr>
1607
1608
1609<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>
1610<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1611
1612Given
1613  bool a() noexcept;
1614  bool b() noexcept(true);
1615  bool c() noexcept(false);
1616  bool d() noexcept(noexcept(a()));
1617  bool e = noexcept(b()) || noexcept(c());
1618cxxNoexceptExpr()
1619  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1620  doesn't match the noexcept specifier in the declarations a, b, c or d.
1621</pre></td></tr>
1622
1623
1624<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>
1625<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1626</pre></td></tr>
1627
1628
1629<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>
1630<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1631
1632Note that if an operator isn't overloaded, it won't match. Instead, use
1633binaryOperator matcher.
1634Currently it does not match operators such as new delete.
1635FIXME: figure out why these do not match?
1636
1637Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1638    (matcher = cxxOperatorCallExpr())
1639  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1640  ostream &amp;o; int b = 1, c = 1;
1641  o &lt;&lt; b &lt;&lt; c;
1642See also the binaryOperation() matcher for more-general matching of binary
1643uses of this AST node.
1644</pre></td></tr>
1645
1646
1647<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>
1648<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1649
1650Either the source expression or the destination type can be matched
1651using has(), but hasDestinationType() is more specific and can be
1652more readable.
1653
1654Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1655  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1656</pre></td></tr>
1657
1658
1659<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>
1660<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1661
1662Example matches use of "&lt;":
1663  #include &lt;compare&gt;
1664  struct HasSpaceshipMem {
1665    int a;
1666    constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
1667  };
1668  void compare() {
1669    HasSpaceshipMem hs1, hs2;
1670    if (hs1 &lt; hs2)
1671        return;
1672  }
1673See also the binaryOperation() matcher for more-general matching
1674of this AST node.
1675</pre></td></tr>
1676
1677
1678<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>
1679<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1680
1681See also: hasDestinationType
1682See also: reinterpretCast
1683
1684Example:
1685  cxxStaticCastExpr()
1686matches
1687  static_cast&lt;long&gt;(8)
1688in
1689  long eight(static_cast&lt;long&gt;(8));
1690</pre></td></tr>
1691
1692
1693<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>
1694<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1695
1696Given
1697  std::vector&lt;int&gt; a({ 1, 2, 3 });
1698  std::vector&lt;int&gt; b = { 4, 5 };
1699  int c[] = { 6, 7 };
1700  std::pair&lt;int, int&gt; d = { 8, 9 };
1701cxxStdInitializerListExpr()
1702  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1703</pre></td></tr>
1704
1705
1706<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>
1707<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1708
1709Example: Matches Foo(bar, bar)
1710  Foo h = Foo(bar, bar);
1711</pre></td></tr>
1712
1713
1714<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>
1715<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1716
1717Example matches the implicit this expression in "return i".
1718    (matcher = cxxThisExpr())
1719struct foo {
1720  int i;
1721  int f() { return i; }
1722};
1723</pre></td></tr>
1724
1725
1726<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>
1727<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1728
1729  try { throw 5; } catch(int i) {}
1730cxxThrowExpr()
1731  matches 'throw 5'
1732</pre></td></tr>
1733
1734
1735<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>
1736<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1737
1738  try {} catch(int i) {}
1739cxxTryStmt()
1740  matches 'try {}'
1741</pre></td></tr>
1742
1743
1744<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>
1745<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1746
1747Example matches T(t) in return statement of f
1748    (matcher = cxxUnresolvedConstructExpr())
1749  template &lt;typename T&gt;
1750  void f(const T&amp; t) { return T(t); }
1751</pre></td></tr>
1752
1753
1754<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>
1755<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1756
1757Example matches x in if (x)
1758  bool x;
1759  if (x) {}
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('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>
1764<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1765
1766Given
1767  int a;
1768declStmt()
1769  matches 'int a'.
1770</pre></td></tr>
1771
1772
1773<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>
1774<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1775
1776Given
1777  switch(a) { case 42: break; default: break; }
1778defaultStmt()
1779  matches 'default:'.
1780</pre></td></tr>
1781
1782
1783<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>
1784<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1785</pre></td></tr>
1786
1787
1788<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>
1789<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1790
1791Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1792  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1793</pre></td></tr>
1794
1795
1796<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>
1797<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1798
1799Given
1800  do {} while (true);
1801doStmt()
1802  matches 'do {} while(true)'
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('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>
1807<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1808
1809Matches any cast expression written in user code, whether it be a
1810C-style cast, a functional-style cast, or a keyword cast.
1811
1812Does not match implicit conversions.
1813
1814Note: the name "explicitCast" is chosen to match Clang's terminology, as
1815Clang uses the term "cast" to apply to implicit conversions as well as to
1816actual cast expressions.
1817
1818See also: hasDestinationType.
1819
1820Example: matches all five of the casts in
1821  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1822but does not match the implicit conversion in
1823  long ell = 42;
1824</pre></td></tr>
1825
1826
1827<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>
1828<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1829
1830Example matches x()
1831  void f() { x(); }
1832</pre></td></tr>
1833
1834
1835<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>
1836<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1837of the sub-expression's evaluation.
1838
1839Example matches std::string()
1840  const std::string str = std::string();
1841</pre></td></tr>
1842
1843
1844<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>
1845<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1846</pre></td></tr>
1847
1848
1849<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>
1850<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
18511.0, 1.0f, 1.0L and 1e10.
1852
1853Does not match implicit conversions such as
1854  float a = 10;
1855</pre></td></tr>
1856
1857
1858<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>
1859<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1860
1861Example matches 'for (;;) {}'
1862  for (;;) {}
1863  int i[] =  {1, 2, 3}; for (auto a : i);
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('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>
1868<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1869</pre></td></tr>
1870
1871
1872<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>
1873<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
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('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>
1878<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1879
1880Given
1881  goto FOO;
1882  FOO: bar();
1883gotoStmt()
1884  matches 'goto FOO'
1885</pre></td></tr>
1886
1887
1888<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>
1889<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1890
1891Example matches 'if (x) {}'
1892  if (x) {}
1893</pre></td></tr>
1894
1895
1896<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>
1897<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1898point literals e.g.: 1i, 1.0i
1899</pre></td></tr>
1900
1901
1902<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>
1903<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1904
1905This matches many different places, including function call return value
1906eliding, as well as any type conversions.
1907</pre></td></tr>
1908
1909
1910<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>
1911<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1912
1913Given
1914  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1915implicitValueInitExpr()
1916  matches "[0].y" (implicitly)
1917</pre></td></tr>
1918
1919
1920<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>
1921<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1922
1923Given
1924  int a[] = { 1, 2 };
1925  struct B { int x, y; };
1926  B b = { 5, 6 };
1927initListExpr()
1928  matches "{ 1, 2 }" and "{ 5, 6 }"
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('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>
1933<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
19341, 1L, 0x1 and 1U.
1935
1936Does not match character-encoded integers such as L'a'.
1937</pre></td></tr>
1938
1939
1940<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>
1941<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1942
1943Given
1944  goto FOO;
1945  FOO: bar();
1946labelStmt()
1947  matches 'FOO:'
1948</pre></td></tr>
1949
1950
1951<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>
1952<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1953
1954Example matches [&amp;](){return 5;}
1955  [&amp;](){return 5;}
1956</pre></td></tr>
1957
1958
1959<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>
1960<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1961
1962Example: Given
1963  struct T {void func();};
1964  T f();
1965  void g(T);
1966materializeTemporaryExpr() matches 'f()' in these statements
1967  T u(f());
1968  g(f());
1969  f().func();
1970but does not match
1971  f();
1972</pre></td></tr>
1973
1974
1975<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>
1976<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1977
1978Given
1979  class Y {
1980    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1981    int a; static int b;
1982  };
1983memberExpr()
1984  matches this-&gt;x, x, y.x, a, this-&gt;b
1985</pre></td></tr>
1986
1987
1988<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>
1989<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1990
1991  foo();;
1992nullStmt()
1993  matches the second ';'
1994</pre></td></tr>
1995
1996
1997<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>
1998<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1999
2000Example matches @catch
2001  @try {}
2002  @catch (...) {}
2003</pre></td></tr>
2004
2005
2006<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>
2007<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
2008
2009Example matches @finally
2010  @try {}
2011  @finally {}
2012</pre></td></tr>
2013
2014
2015<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>
2016<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
2017
2018Example: matches "a" in "init" method:
2019@implementation A {
2020  NSString *a;
2021}
2022- (void) init {
2023  a = @"hello";
2024}
2025</pre></td></tr>
2026
2027
2028<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>
2029<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
2030
2031The innermost message send invokes the "alloc" class method on the
2032NSString class, while the outermost message send invokes the
2033"initWithString" instance method on the object returned from
2034NSString's "alloc". This matcher should match both message sends.
2035  [[NSString alloc] initWithString:@"Hello"]
2036</pre></td></tr>
2037
2038
2039<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcStringLiteral0')"><a name="objcStringLiteral0Anchor">objcStringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCStringLiteral.html">ObjCStringLiteral</a>&gt;...</td></tr>
2040<tr><td colspan="4" class="doc" id="objcStringLiteral0"><pre>Matches ObjectiveC String literal expressions.
2041
2042Example matches @"abcd"
2043  NSString *s = @"abcd";
2044</pre></td></tr>
2045
2046
2047<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>
2048<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
2049
2050Example matches @throw obj;
2051</pre></td></tr>
2052
2053
2054<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>
2055<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2056
2057Example matches @try
2058  @try {}
2059  @catch (...) {}
2060</pre></td></tr>
2061
2062
2063<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>
2064<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2065
2066Given
2067
2068  #pragma omp parallel
2069  #pragma omp parallel default(none)
2070  #pragma omp taskyield
2071
2072``ompExecutableDirective()`` matches ``omp parallel``,
2073``omp parallel default(none)`` and ``omp taskyield``.
2074</pre></td></tr>
2075
2076
2077<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>
2078<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2079to reference another expressions and can be met
2080in BinaryConditionalOperators, for example.
2081
2082Example matches 'a'
2083  (a ?: c) + 42;
2084</pre></td></tr>
2085
2086
2087<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>
2088<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2089
2090Example matches (foo() + 1)
2091  int foo() { return 1; }
2092  int a = (foo() + 1);
2093</pre></td></tr>
2094
2095
2096<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>
2097<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2098ParenListExprs don't have a predefined type and are used for late parsing.
2099In the final AST, they can be met in template declarations.
2100
2101Given
2102  template&lt;typename T&gt; class X {
2103    void f() {
2104      X x(*this);
2105      int a = 0, b = 1; int i = (a, b);
2106    }
2107  };
2108parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2109has a predefined type and is a ParenExpr, not a ParenListExpr.
2110</pre></td></tr>
2111
2112
2113<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>
2114<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2115
2116Example: Matches __func__
2117  printf("%s", __func__);
2118</pre></td></tr>
2119
2120
2121<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>
2122<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2123
2124Given
2125  return 1;
2126returnStmt()
2127  matches 'return 1'
2128</pre></td></tr>
2129
2130
2131<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>
2132<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2133
2134Given
2135  { ++a; }
2136stmt()
2137  matches both the compound statement '{ ++a; }' and '++a'.
2138</pre></td></tr>
2139
2140
2141<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>
2142<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2143
2144Example match: ({ int X = 4; X; })
2145  int C = ({ int X = 4; X; });
2146</pre></td></tr>
2147
2148
2149<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>
2150<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2151
2152Example matches "abcd", L"abcd"
2153  char *s = "abcd";
2154  wchar_t *ws = L"abcd";
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('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>
2159<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2160
2161Given
2162  template &lt;int N&gt;
2163  struct A { static const int n = N; };
2164  struct B : public A&lt;42&gt; {};
2165substNonTypeTemplateParmExpr()
2166  matches "N" in the right-hand side of "static const int n = N;"
2167</pre></td></tr>
2168
2169
2170<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>
2171<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2172
2173Given
2174  switch(a) { case 42: break; default: break; }
2175switchCase()
2176  matches 'case 42:' and 'default:'.
2177</pre></td></tr>
2178
2179
2180<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>
2181<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2182
2183Given
2184  switch(a) { case 42: break; default: break; }
2185switchStmt()
2186  matches 'switch(a)'.
2187</pre></td></tr>
2188
2189
2190<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>
2191<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2192
2193Given
2194  Foo x = bar;
2195  int y = sizeof(x) + alignof(x);
2196unaryExprOrTypeTraitExpr()
2197  matches sizeof(x) and alignof(x)
2198</pre></td></tr>
2199
2200
2201<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>
2202<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2203
2204Example matches !a
2205  !a || b
2206</pre></td></tr>
2207
2208
2209<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>
2210<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2211but could not be resolved to a specific declaration.
2212
2213Given
2214  template&lt;typename T&gt;
2215  T foo() { T a; return a; }
2216  template&lt;typename T&gt;
2217  void bar() {
2218    foo&lt;T&gt;();
2219  }
2220unresolvedLookupExpr()
2221  matches foo&lt;T&gt;() </pre></td></tr>
2222
2223
2224<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>
2225<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2226
2227Given
2228  struct X {
2229    template &lt;class T&gt; void f();
2230    void g();
2231  };
2232  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
2233unresolvedMemberExpr()
2234  matches x.f&lt;T&gt;
2235</pre></td></tr>
2236
2237
2238<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>
2239<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2240
2241Example match: "foo"_suffix
2242</pre></td></tr>
2243
2244
2245<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>
2246<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2247
2248Given
2249  while (true) {}
2250whileStmt()
2251  matches 'while (true) {}'.
2252</pre></td></tr>
2253
2254
2255<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>
2256<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2257
2258Given
2259  template &lt;typename T&gt; struct C {};
2260  C&lt;int&gt; c;
2261templateArgumentLoc()
2262  matches 'int' in C&lt;int&gt;.
2263</pre></td></tr>
2264
2265
2266<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>
2267<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2268
2269Given
2270  template &lt;typename T&gt; struct C {};
2271  C&lt;int&gt; c;
2272templateArgument()
2273  matches 'int' in C&lt;int&gt;.
2274</pre></td></tr>
2275
2276
2277<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>
2278<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2279
2280Given
2281  template &lt;typename T&gt; class X { };
2282  X&lt;int&gt; xi;
2283templateName()
2284  matches 'X' in X&lt;int&gt;.
2285</pre></td></tr>
2286
2287
2288<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
2289<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s.
2290
2291Given
2292  struct s {};
2293  struct s ss;
2294elaboratedTypeLoc()
2295  matches the `TypeLoc` of the variable declaration of `ss`.
2296</pre></td></tr>
2297
2298
2299<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
2300<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
2301
2302Given
2303  int* x;
2304pointerTypeLoc()
2305  matches `int*`.
2306</pre></td></tr>
2307
2308
2309<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('qualifiedTypeLoc0')"><a name="qualifiedTypeLoc0Anchor">qualifiedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;...</td></tr>
2310<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST.
2311
2312Given
2313  const int x = 0;
2314qualifiedTypeLoc()
2315  matches `const int`.
2316</pre></td></tr>
2317
2318
2319<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
2320<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s.
2321
2322Given
2323  int x = 3;
2324  int&amp; l = x;
2325  int&amp;&amp; r = 3;
2326referenceTypeLoc()
2327  matches `int&amp;` and `int&amp;&amp;`.
2328</pre></td></tr>
2329
2330
2331<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
2332<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s.
2333
2334Given
2335  template &lt;typename T&gt; class C {};
2336  C&lt;char&gt; var;
2337varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
2338  matches `C&lt;char&gt; var`.
2339</pre></td></tr>
2340
2341
2342<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>
2343<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2344</pre></td></tr>
2345
2346
2347<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>
2348<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2349
2350Given
2351  int a[] = { 2, 3 };
2352  int b[4];
2353  void f() { int c[a[0]]; }
2354arrayType()
2355  matches "int a[]", "int b[4]" and "int c[a[0]]";
2356</pre></td></tr>
2357
2358
2359<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>
2360<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2361
2362Given
2363  _Atomic(int) i;
2364atomicType()
2365  matches "_Atomic(int) i"
2366</pre></td></tr>
2367
2368
2369<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>
2370<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2371
2372Given:
2373  auto n = 4;
2374  int v[] = { 2, 3 }
2375  for (auto i : v) { }
2376autoType()
2377  matches "auto n" and "auto i"
2378</pre></td></tr>
2379
2380
2381<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>
2382<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2383"void (^)(int)".
2384
2385The pointee is always required to be a FunctionType.
2386</pre></td></tr>
2387
2388
2389<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>
2390<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2391
2392Given
2393  struct A {};
2394  A a;
2395  int b;
2396  float c;
2397  bool d;
2398builtinType()
2399  matches "int b", "float c" and "bool d"
2400</pre></td></tr>
2401
2402
2403<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>
2404<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2405
2406Given
2407  _Complex float f;
2408complexType()
2409  matches "_Complex float f"
2410</pre></td></tr>
2411
2412
2413<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>
2414<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2415
2416Given
2417  void() {
2418    int a[2];
2419    int b[] = { 2, 3 };
2420    int c[b[0]];
2421  }
2422constantArrayType()
2423  matches "int a[2]"
2424</pre></td></tr>
2425
2426
2427<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>
2428<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2429Example matches i[] in declaration of f.
2430    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2431Example matches i[1].
2432    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2433  void f(int i[]) {
2434    i[1] = 0;
2435  }
2436</pre></td></tr>
2437
2438
2439<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>
2440<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
2441
2442Given:
2443  short i = 1;
2444  int j = 42;
2445  decltype(i + j) result = i + j;
2446decltypeType()
2447  matches "decltype(i + j)"
2448</pre></td></tr>
2449
2450
2451<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>
2452<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2453template types.
2454
2455Given
2456  template &lt;typename T&gt;
2457  class C { public: C(T); };
2458
2459  C c(123);
2460deducedTemplateSpecializationType() matches the type in the declaration
2461of the variable c.
2462</pre></td></tr>
2463
2464
2465<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>
2466<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2467
2468Given
2469  template&lt;typename T, int Size&gt;
2470  class array {
2471    T data[Size];
2472  };
2473dependentSizedArrayType
2474  matches "T data[Size]"
2475</pre></td></tr>
2476
2477
2478<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>
2479<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2480qualified name.
2481
2482Given
2483  namespace N {
2484    namespace M {
2485      class D {};
2486    }
2487  }
2488  class C {};
2489
2490  class C c;
2491  N::M::D d;
2492
2493elaboratedType() matches the type of the variable declarations of both
2494c and d.
2495</pre></td></tr>
2496
2497
2498<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>
2499<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2500
2501Given
2502  enum C { Green };
2503  enum class S { Red };
2504
2505  C c;
2506  S s;
2507
2508enumType() matches the type of the variable declarations of both c and
2509s.
2510</pre></td></tr>
2511
2512
2513<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>
2514<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2515
2516Given
2517  int (*f)(int);
2518  void g();
2519functionProtoType()
2520  matches "int (*f)(int)" and the type of "g" in C++ mode.
2521  In C mode, "g" is not matched because it does not contain a prototype.
2522</pre></td></tr>
2523
2524
2525<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>
2526<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2527
2528Given
2529  int (*f)(int);
2530  void g();
2531functionType()
2532  matches "int (*f)(int)" and the type of "g".
2533</pre></td></tr>
2534
2535
2536<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>
2537<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2538
2539Given
2540  int a[] = { 2, 3 };
2541  int b[42];
2542  void f(int c[]) { int d[a[0]]; };
2543incompleteArrayType()
2544  matches "int a[]" and "int c[]"
2545</pre></td></tr>
2546
2547
2548<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>
2549<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2550
2551Example matches S s, but not S&lt;T&gt; s.
2552    (matcher = parmVarDecl(hasType(injectedClassNameType())))
2553  template &lt;typename T&gt; struct S {
2554    void f(S s);
2555    void g(S&lt;T&gt; s);
2556  };
2557</pre></td></tr>
2558
2559
2560<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>
2561<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2562
2563Given:
2564  int *a;
2565  int &amp;b = *a;
2566  int &amp;&amp;c = 1;
2567  auto &amp;d = b;
2568  auto &amp;&amp;e = c;
2569  auto &amp;&amp;f = 2;
2570  int g = 5;
2571
2572lValueReferenceType() matches the types of b, d, and e. e is
2573matched since the type is deduced as int&amp; by reference collapsing rules.
2574</pre></td></tr>
2575
2576
2577<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>
2578<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2579Given
2580  struct A { int i; }
2581  A::* ptr = A::i;
2582memberPointerType()
2583  matches "A::* ptr"
2584</pre></td></tr>
2585
2586
2587<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>
2588<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2589a pointer type, despite being syntactically similar.
2590
2591Given
2592  int *a;
2593
2594  @interface Foo
2595  @end
2596  Foo *f;
2597pointerType()
2598  matches "Foo *f", but does not match "int *a".
2599</pre></td></tr>
2600
2601
2602<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>
2603<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2604
2605Given
2606  int (*ptr_to_array)[4];
2607  int *array_of_ptrs[4];
2608
2609varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2610array_of_ptrs.
2611</pre></td></tr>
2612
2613
2614<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>
2615<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2616types.
2617
2618Given
2619  int *a;
2620  int &amp;b = *a;
2621  int c = 5;
2622
2623  @interface Foo
2624  @end
2625  Foo *f;
2626pointerType()
2627  matches "int *a", but does not match "Foo *f".
2628</pre></td></tr>
2629
2630
2631<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>
2632<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2633
2634Given:
2635  int *a;
2636  int &amp;b = *a;
2637  int &amp;&amp;c = 1;
2638  auto &amp;d = b;
2639  auto &amp;&amp;e = c;
2640  auto &amp;&amp;f = 2;
2641  int g = 5;
2642
2643rValueReferenceType() matches the types of c and f. e is not
2644matched as it is deduced to int&amp; by reference collapsing rules.
2645</pre></td></tr>
2646
2647
2648<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>
2649<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2650
2651Given
2652  class C {};
2653  struct S {};
2654
2655  C c;
2656  S s;
2657
2658recordType() matches the type of the variable declarations of both c
2659and s.
2660</pre></td></tr>
2661
2662
2663<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>
2664<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2665
2666Given
2667  int *a;
2668  int &amp;b = *a;
2669  int &amp;&amp;c = 1;
2670  auto &amp;d = b;
2671  auto &amp;&amp;e = c;
2672  auto &amp;&amp;f = 2;
2673  int g = 5;
2674
2675referenceType() matches the types of b, c, d, e, and f.
2676</pre></td></tr>
2677
2678
2679<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>
2680<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2681template type parameter.
2682
2683Given
2684  template &lt;typename T&gt;
2685  void F(T t) {
2686    int i = 1 + t;
2687  }
2688
2689substTemplateTypeParmType() matches the type of 't' but not '1'
2690</pre></td></tr>
2691
2692
2693<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>
2694<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2695
2696Given
2697  enum E {};
2698  class C {};
2699
2700  E e;
2701  C c;
2702
2703tagType() matches the type of the variable declarations of both e
2704and c.
2705</pre></td></tr>
2706
2707
2708<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>
2709<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2710
2711Given
2712  template &lt;typename T&gt;
2713  class C { };
2714
2715  template class C&lt;int&gt;;  // A
2716  C&lt;char&gt; var;            // B
2717
2718templateSpecializationType() matches the type of the explicit
2719instantiation in A and the type of the variable declaration in B.
2720</pre></td></tr>
2721
2722
2723<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>
2724<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2725
2726Example matches T, but not int.
2727    (matcher = templateTypeParmType())
2728  template &lt;typename T&gt; void f(int i);
2729</pre></td></tr>
2730
2731
2732<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>
2733<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2734</pre></td></tr>
2735
2736
2737<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>
2738<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2739
2740Given
2741  typedef int X;
2742typedefType()
2743  matches "typedef int X"
2744</pre></td></tr>
2745
2746
2747<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>
2748<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2749
2750Given:
2751  typedef __underlying_type(T) type;
2752unaryTransformType()
2753  matches "__underlying_type(T)"
2754</pre></td></tr>
2755
2756
2757<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('usingType0')"><a name="usingType0Anchor">usingType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>&gt;...</td></tr>
2758<tr><td colspan="4" class="doc" id="usingType0"><pre>Matches types specified through a using declaration.
2759
2760Given
2761  namespace a { struct S {}; }
2762  using a::S;
2763  S s;
2764
2765usingType() matches the type of the variable declaration of s.
2766</pre></td></tr>
2767
2768
2769<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>
2770<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2771integer-constant-expression.
2772
2773Given
2774  void f() {
2775    int a[] = { 2, 3 }
2776    int b[42];
2777    int c[a[0]];
2778  }
2779variableArrayType()
2780  matches "int c[a[0]]"
2781</pre></td></tr>
2782
2783<!--END_DECL_MATCHERS -->
2784</table>
2785
2786<!-- ======================================================================= -->
2787<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2788<!-- ======================================================================= -->
2789
2790<p>Narrowing matchers match certain attributes on the current node, thus
2791narrowing down the set of nodes of the current type to match on.</p>
2792
2793<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2794which allow users to create more powerful match expressions.</p>
2795
2796<table>
2797<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2798<!-- START_NARROWING_MATCHERS -->
2799
2800<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>
2801<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2802
2803Usable as: Any Matcher
2804</pre></td></tr>
2805
2806
2807<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>
2808<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2809
2810Usable as: Any Matcher
2811</pre></td></tr>
2812
2813
2814<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2815<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2816
2817Useful when another matcher requires a child matcher, but there's no
2818additional constraint. This will often be used with an explicit conversion
2819to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2820
2821Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2822"int* p" and "void f()" in
2823  int* p;
2824  void f();
2825
2826Usable as: Any Matcher
2827</pre></td></tr>
2828
2829
2830<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2831<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2832
2833Given
2834  if (true);
2835  for (; true; );
2836with the matcher
2837  mapAnyOf(ifStmt, forStmt).with(
2838    hasCondition(cxxBoolLiteralExpr(equals(true)))
2839    ).bind("trueCond")
2840matches the if and the for. It is equivalent to:
2841  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2842  anyOf(
2843    ifStmt(trueCond).bind("trueCond"),
2844    forStmt(trueCond).bind("trueCond")
2845    );
2846
2847The with() chain-call accepts zero or more matchers which are combined
2848as-if with allOf() in each of the node matchers.
2849Usable as: Any Matcher
2850</pre></td></tr>
2851
2852
2853<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2854<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2855
2856Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2857  class X {};
2858  class Y {};
2859
2860Usable as: Any Matcher
2861</pre></td></tr>
2862
2863
2864<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('isImplicit1')"><a name="isImplicit1Anchor">isImplicit</a></td><td></td></tr>
2865<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
2866implicit default/copy constructors).
2867</pre></td></tr>
2868
2869
2870<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>
2871<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2872specified names.
2873
2874   hasAnyOperatorName("+", "-")
2875 Is equivalent to
2876   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2877</pre></td></tr>
2878
2879
2880<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>
2881<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2882unary).
2883
2884Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2885  !(a || b)
2886</pre></td></tr>
2887
2888
2889<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>
2890<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2891
2892Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2893  if (a == b)
2894    a += b;
2895
2896Example 2: matches s1 = s2
2897           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2898  struct S { S&amp; operator=(const S&amp;); };
2899  void x() { S s1, s2; s1 = s2; }
2900</pre></td></tr>
2901
2902
2903<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>
2904<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2905
2906Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2907  if (a == b)
2908    a += b;
2909
2910Example 2: matches s1 &lt; s2
2911           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2912  struct S { bool operator&lt;(const S&amp; other); };
2913  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2914</pre></td></tr>
2915
2916
2917<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>
2918<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2919inheritance.
2920
2921Examples:
2922  class C {
2923  public:    int a;
2924  protected: int b;
2925  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2926  };
2927
2928  struct Base {};
2929  struct Derived1 : private Base {}; // matches 'Base'
2930  class Derived2 : Base {}; // matches 'Base'
2931</pre></td></tr>
2932
2933
2934<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>
2935<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2936protected inheritance.
2937
2938Examples:
2939  class C {
2940  public:    int a;
2941  protected: int b; // fieldDecl(isProtected()) matches 'b'
2942  private:   int c;
2943  };
2944
2945  class Base {};
2946  class Derived : protected Base {}; // matches 'Base'
2947</pre></td></tr>
2948
2949
2950<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>
2951<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2952inheritance.
2953
2954Examples:
2955  class C {
2956  public:    int a; // fieldDecl(isPublic()) matches 'a'
2957  protected: int b;
2958  private:   int c;
2959  };
2960
2961  class Base {};
2962  class Derived1 : public Base {}; // matches 'Base'
2963  struct Derived2 : Base {}; // matches 'Base'
2964</pre></td></tr>
2965
2966
2967<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>
2968<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2969virtual inheritance.
2970
2971Example:
2972  class A {
2973   public:
2974    virtual void x(); // matches x
2975  };
2976
2977Example:
2978  class Base {};
2979  class DirectlyDerived : virtual Base {}; // matches Base
2980  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2981
2982Usable 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;
2983</pre></td></tr>
2984
2985
2986<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>
2987<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2988
2989
2990<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>
2991<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2992
2993Given
2994  f('false, 3.14, 42);
2995characterLiteral(equals(0))
2996  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2997  match false
2998floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2999  match 3.14
3000integerLiteral(equals(42))
3001  matches 42
3002
3003Note that you cannot directly match a negative numeric literal because the
3004minus sign is not part of the literal: It is a unary operator whose operand
3005is the positive numeric literal. Instead, you must use a unaryOperator()
3006matcher to match the minus sign:
3007
3008unaryOperator(hasOperatorName("-"),
3009              hasUnaryOperand(integerLiteral(equals(13))))
3010
3011Usable 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;,
3012           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;
3013</pre></td></tr>
3014
3015
3016<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>
3017<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
3018
3019
3020<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>
3021<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
3022
3023
3024<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>
3025<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
3026
3027Given
3028  try {
3029    // ...
3030  } catch (int) {
3031    // ...
3032  } catch (...) {
3033    // ...
3034  }
3035cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
3036</pre></td></tr>
3037
3038
3039<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>
3040<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
3041a specific number of arguments (including absent default arguments).
3042
3043Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3044  void f(int x, int y);
3045  f(0, 0);
3046</pre></td></tr>
3047
3048
3049<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>
3050<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
3051</pre></td></tr>
3052
3053
3054<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>
3055<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
3056zero initialization.
3057
3058Given
3059void foo() {
3060  struct point { double x; double y; };
3061  point pt[2] = { { 1.0, 2.0 } };
3062}
3063initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
3064will match the implicit array filler for pt[1].
3065</pre></td></tr>
3066
3067
3068<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>
3069<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
3070
3071Given
3072  struct S {
3073    S(); // #1
3074    S(const S &amp;); // #2
3075    S(S &amp;&amp;); // #3
3076  };
3077cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
3078</pre></td></tr>
3079
3080
3081<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>
3082<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
3083
3084Given
3085  struct S {
3086    S(); // #1
3087    S(const S &amp;); // #2
3088    S(S &amp;&amp;); // #3
3089  };
3090cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
3091</pre></td></tr>
3092
3093
3094<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>
3095<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
3096
3097Given
3098  struct S {
3099    S(); // #1
3100    S(int) {} // #2
3101    S(S &amp;&amp;) : S() {} // #3
3102  };
3103  S::S() : S(0) {} // #4
3104cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
3105#1 or #2.
3106</pre></td></tr>
3107
3108
3109<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>
3110<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
3111that have an explicit specifier if this explicit specifier is resolved to
3112true.
3113
3114Given
3115  template&lt;bool b&gt;
3116  struct S {
3117    S(int); // #1
3118    explicit S(double); // #2
3119    operator int(); // #3
3120    explicit operator bool(); // #4
3121    explicit(false) S(bool) // # 7
3122    explicit(true) S(char) // # 8
3123    explicit(b) S(S) // # 9
3124  };
3125  S(int) -&gt; S&lt;true&gt; // #5
3126  explicit S(double) -&gt; S&lt;false&gt; // #6
3127cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3128cxxConversionDecl(isExplicit()) will match #4, but not #3.
3129cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3130</pre></td></tr>
3131
3132
3133<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isInheritingConstructor0')"><a name="isInheritingConstructor0Anchor">isInheritingConstructor</a></td><td></td></tr>
3134<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr>
3135
3136
3137<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>
3138<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3139
3140Given
3141  struct S {
3142    S(); // #1
3143    S(const S &amp;); // #2
3144    S(S &amp;&amp;); // #3
3145  };
3146cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3147</pre></td></tr>
3148
3149
3150<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>
3151<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3152that have an explicit specifier if this explicit specifier is resolved to
3153true.
3154
3155Given
3156  template&lt;bool b&gt;
3157  struct S {
3158    S(int); // #1
3159    explicit S(double); // #2
3160    operator int(); // #3
3161    explicit operator bool(); // #4
3162    explicit(false) S(bool) // # 7
3163    explicit(true) S(char) // # 8
3164    explicit(b) S(S) // # 9
3165  };
3166  S(int) -&gt; S&lt;true&gt; // #5
3167  explicit S(double) -&gt; S&lt;false&gt; // #6
3168cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3169cxxConversionDecl(isExplicit()) will match #4, but not #3.
3170cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3171</pre></td></tr>
3172
3173
3174<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>
3175<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3176opposed to a member.
3177
3178Given
3179  struct B {};
3180  struct D : B {
3181    int I;
3182    D(int i) : I(i) {}
3183  };
3184  struct E : B {
3185    E() : B() {}
3186  };
3187cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3188  will match E(), but not match D(int).
3189</pre></td></tr>
3190
3191
3192<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>
3193<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3194opposed to a base.
3195
3196Given
3197  struct B {};
3198  struct D : B {
3199    int I;
3200    D(int i) : I(i) {}
3201  };
3202  struct E : B {
3203    E() : B() {}
3204  };
3205cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3206  will match D(int), but not match E().
3207</pre></td></tr>
3208
3209
3210<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>
3211<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3212code (as opposed to implicitly added by the compiler).
3213
3214Given
3215  struct Foo {
3216    Foo() { }
3217    Foo(int) : foo_("A") { }
3218    string foo_;
3219  };
3220cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3221  will match Foo(int), but not Foo()
3222</pre></td></tr>
3223
3224
3225<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>
3226<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3227that have an explicit specifier if this explicit specifier is resolved to
3228true.
3229
3230Given
3231  template&lt;bool b&gt;
3232  struct S {
3233    S(int); // #1
3234    explicit S(double); // #2
3235    operator int(); // #3
3236    explicit operator bool(); // #4
3237    explicit(false) S(bool) // # 7
3238    explicit(true) S(char) // # 8
3239    explicit(b) S(S) // # 9
3240  };
3241  S(int) -&gt; S&lt;true&gt; // #5
3242  explicit S(double) -&gt; S&lt;false&gt; // #6
3243cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3244cxxConversionDecl(isExplicit()) will match #4, but not #3.
3245cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3246</pre></td></tr>
3247
3248
3249<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>
3250<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3251
3252In template declarations, dependent members are not resolved and so can
3253not be matched to particular named declarations.
3254
3255This matcher allows to match on the known name of members.
3256
3257Given
3258  template &lt;typename T&gt;
3259  struct S {
3260      void mem();
3261  };
3262  template &lt;typename T&gt;
3263  void x() {
3264      S&lt;T&gt; s;
3265      s.mem();
3266  }
3267cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3268</pre></td></tr>
3269
3270
3271<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>
3272<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
3273to '.'.
3274
3275Member calls on the implicit this pointer match as called with '-&gt;'.
3276
3277Given
3278  class Y {
3279    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3280    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3281    int a;
3282    static int b;
3283  };
3284  template &lt;class T&gt;
3285  class Z {
3286    void x() { this-&gt;m; }
3287  };
3288memberExpr(isArrow())
3289  matches this-&gt;x, x, y.x, a, this-&gt;b
3290cxxDependentScopeMemberExpr(isArrow())
3291  matches this-&gt;m
3292unresolvedMemberExpr(isArrow())
3293  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3294</pre></td></tr>
3295
3296
3297<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>
3298<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3299node
3300
3301In template declarations, dependent members are not resolved and so can
3302not be matched to particular named declarations.
3303
3304This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3305and CXXMethodDecl nodes.
3306
3307Given
3308  template &lt;typename T&gt;
3309  struct S {
3310      void mem();
3311  };
3312  template &lt;typename T&gt;
3313  void x() {
3314      S&lt;T&gt; s;
3315      s.mem();
3316  }
3317The matcher
3318@code
3319cxxDependentScopeMemberExpr(
3320  hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3321      hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3322          cxxMethodDecl(hasName("mem")).bind("templMem")
3323          )))))
3324      )))),
3325  memberHasSameNameAsBoundNode("templMem")
3326  )
3327@endcode
3328first matches and binds the @c mem member of the @c S template, then
3329compares its name to the usage in @c s.mem() in the @c x function template
3330</pre></td></tr>
3331
3332
3333<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>
3334<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3335
3336Given
3337struct A {
3338  void foo() const;
3339  void bar();
3340};
3341
3342cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3343</pre></td></tr>
3344
3345
3346<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>
3347<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3348operator.
3349
3350Given
3351struct A {
3352  A &amp;operator=(const A &amp;);
3353  A &amp;operator=(A &amp;&amp;);
3354};
3355
3356cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3357the second one.
3358</pre></td></tr>
3359
3360
3361<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>
3362<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3363
3364Given:
3365  class A final {};
3366
3367  struct B {
3368    virtual void f();
3369  };
3370
3371  struct C : B {
3372    void f() final;
3373  };
3374matches A and C::f, but not B, C, or B::f
3375</pre></td></tr>
3376
3377
3378<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>
3379<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3380operator.
3381
3382Given
3383struct A {
3384  A &amp;operator=(const A &amp;);
3385  A &amp;operator=(A &amp;&amp;);
3386};
3387
3388cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3389the first one.
3390</pre></td></tr>
3391
3392
3393<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>
3394<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3395
3396Given
3397  class A {
3398   public:
3399    virtual void x();
3400  };
3401  class B : public A {
3402   public:
3403    virtual void x();
3404  };
3405  matches B::x
3406</pre></td></tr>
3407
3408
3409<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>
3410<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3411
3412Given
3413  class A {
3414   public:
3415    virtual void x() = 0;
3416  };
3417  matches A::x
3418</pre></td></tr>
3419
3420
3421<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>
3422<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3423
3424Given
3425  struct S {
3426    S(); // #1
3427    S(const S &amp;) = default; // #2
3428    S(S &amp;&amp;) = delete; // #3
3429  };
3430cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3431</pre></td></tr>
3432
3433
3434<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>
3435<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3436virtual inheritance.
3437
3438Example:
3439  class A {
3440   public:
3441    virtual void x(); // matches x
3442  };
3443
3444Example:
3445  class Base {};
3446  class DirectlyDerived : virtual Base {}; // matches Base
3447  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3448
3449Usable 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;
3450</pre></td></tr>
3451
3452
3453<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>
3454<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3455
3456Given
3457  class A {
3458   public:
3459    virtual void x();
3460  };
3461  class B : public A {
3462   public:
3463    void x();
3464  };
3465  matches A::x but not B::x
3466</pre></td></tr>
3467
3468
3469<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>
3470<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3471
3472Given:
3473  MyClass *p1 = new MyClass[10];
3474cxxNewExpr(isArray())
3475  matches the expression 'new MyClass[10]'.
3476</pre></td></tr>
3477
3478
3479<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>
3480<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3481specified names.
3482
3483   hasAnyOperatorName("+", "-")
3484 Is equivalent to
3485   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3486</pre></td></tr>
3487
3488
3489<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>
3490<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3491
3492Matches overloaded operator names specified in strings without the
3493"operator" prefix: e.g. "&lt;&lt;".
3494
3495  hasAnyOverloadedOperatorName("+", "-")
3496Is equivalent to
3497  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3498</pre></td></tr>
3499
3500
3501<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>
3502<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3503unary).
3504
3505Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3506  !(a || b)
3507</pre></td></tr>
3508
3509
3510<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>
3511<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3512
3513Matches overloaded operator names specified in strings without the
3514"operator" prefix: e.g. "&lt;&lt;".
3515
3516Given:
3517  class A { int operator*(); };
3518  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3519  A a;
3520  a &lt;&lt; a;   // &lt;-- This matches
3521
3522cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3523specified line and
3524cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3525matches the declaration of A.
3526
3527Usable 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;
3528</pre></td></tr>
3529
3530
3531<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>
3532<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3533
3534Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3535  if (a == b)
3536    a += b;
3537
3538Example 2: matches s1 = s2
3539           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3540  struct S { S&amp; operator=(const S&amp;); };
3541  void x() { S s1, s2; s1 = s2; }
3542</pre></td></tr>
3543
3544
3545<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>
3546<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3547
3548Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3549  if (a == b)
3550    a += b;
3551
3552Example 2: matches s1 &lt; s2
3553           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3554  struct S { bool operator&lt;(const S&amp; other); };
3555  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3556</pre></td></tr>
3557
3558
3559<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>
3560<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3561
3562Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3563class x {};
3564class y;
3565</pre></td></tr>
3566
3567
3568<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>
3569<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3570</pre></td></tr>
3571
3572
3573<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>
3574<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3575</pre></td></tr>
3576
3577
3578<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>
3579<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3580static member variable template instantiations.
3581
3582Given
3583  template&lt;typename T&gt; void A(T t) { }
3584  template&lt;&gt; void A(int N) { }
3585functionDecl(isExplicitTemplateSpecialization())
3586  matches the specialization A&lt;int&gt;().
3587
3588Usable 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;
3589</pre></td></tr>
3590
3591
3592<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>
3593<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3594
3595Given:
3596  class A final {};
3597
3598  struct B {
3599    virtual void f();
3600  };
3601
3602  struct C : B {
3603    void f() final;
3604  };
3605matches A and C::f, but not B, C, or B::f
3606</pre></td></tr>
3607
3608
3609<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>
3610<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3611
3612Given:
3613  auto x = []{};
3614
3615cxxRecordDecl(isLambda()) matches the implicit class declaration of
3616decltype(x)
3617</pre></td></tr>
3618
3619
3620<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>
3621<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3622isSameOrDerivedFrom(hasName(...)).
3623</pre></td></tr>
3624
3625
3626<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>
3627<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3628member variable template instantiations.
3629
3630Given
3631  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3632or
3633  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3634or
3635  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3636cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3637  matches the template instantiation of X&lt;A&gt;.
3638
3639But given
3640  template &lt;typename T&gt;  class X {}; class A {};
3641  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3642cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3643  does not match, as X&lt;A&gt; is an explicit template specialization.
3644
3645Usable 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;
3646</pre></td></tr>
3647
3648
3649<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>
3650<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3651specified names.
3652
3653   hasAnyOperatorName("+", "-")
3654 Is equivalent to
3655   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3656</pre></td></tr>
3657
3658
3659<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>
3660<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3661unary).
3662
3663Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3664  !(a || b)
3665</pre></td></tr>
3666
3667
3668<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>
3669<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3670
3671Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3672  if (a == b)
3673    a += b;
3674
3675Example 2: matches s1 = s2
3676           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3677  struct S { S&amp; operator=(const S&amp;); };
3678  void x() { S s1, s2; s1 = s2; }
3679</pre></td></tr>
3680
3681
3682<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>
3683<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3684
3685Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3686  if (a == b)
3687    a += b;
3688
3689Example 2: matches s1 &lt; s2
3690           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3691  struct S { bool operator&lt;(const S&amp; other); };
3692  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3693</pre></td></tr>
3694
3695
3696<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>
3697<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3698a specific number of arguments (including absent default arguments).
3699
3700Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3701  void f(int x, int y);
3702  f(0, 0);
3703</pre></td></tr>
3704
3705
3706<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>
3707<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3708a specific number of arguments (including absent default arguments).
3709
3710Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3711  void f(int x, int y);
3712  f(0, 0);
3713</pre></td></tr>
3714
3715
3716<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>
3717<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3718
3719Example matches y(x) but not y(42) or NS::y(x).
3720  namespace NS {
3721    struct X {};
3722    void y(X);
3723  }
3724
3725  void y(...);
3726
3727  void test() {
3728    NS::X x;
3729    y(x); // Matches
3730    NS::y(x); // Doesn't match
3731    y(42); // Doesn't match
3732    using NS::y;
3733    y(x); // Found by both unqualified lookup and ADL, doesn't match
3734   }
3735</pre></td></tr>
3736
3737
3738<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>
3739<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3740
3741Example: matches the implicit cast around 0
3742(matcher = castExpr(hasCastKind(CK_NullToPointer)))
3743  int *p = 0;
3744
3745If the matcher is use from clang-query, CastKind parameter
3746should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3747</pre></td></tr>
3748
3749
3750<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>
3751<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3752
3753
3754<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>
3755<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3756
3757Given
3758  f('false, 3.14, 42);
3759characterLiteral(equals(0))
3760  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3761  match false
3762floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3763  match 3.14
3764integerLiteral(equals(42))
3765  matches 42
3766
3767Note that you cannot directly match a negative numeric literal because the
3768minus sign is not part of the literal: It is a unary operator whose operand
3769is the positive numeric literal. Instead, you must use a unaryOperator()
3770matcher to match the minus sign:
3771
3772unaryOperator(hasOperatorName("-"),
3773              hasUnaryOperand(integerLiteral(equals(13))))
3774
3775Usable 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;,
3776           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;
3777</pre></td></tr>
3778
3779
3780<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>
3781<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3782
3783
3784<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>
3785<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3786
3787
3788<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>
3789<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3790
3791Given
3792  template&lt;typename T&gt; struct C {};
3793  C&lt;int&gt; c;
3794classTemplateSpecializationDecl(templateArgumentCountIs(1))
3795  matches C&lt;int&gt;.
3796</pre></td></tr>
3797
3798
3799<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>
3800<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3801child statements.
3802
3803Example: Given
3804  { for (;;) {} }
3805compoundStmt(statementCountIs(0)))
3806  matches '{}'
3807  but does not match the outer compound statement.
3808</pre></td></tr>
3809
3810
3811<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>
3812<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3813
3814Given
3815  int a[42];
3816  int b[2 * 21];
3817  int c[41], d[43];
3818  char *s = "abcd";
3819  wchar_t *ws = L"abcd";
3820  char *w = "a";
3821constantArrayType(hasSize(42))
3822  matches "int a[42]" and "int b[2 * 21]"
3823stringLiteral(hasSize(4))
3824  matches "abcd", L"abcd"
3825</pre></td></tr>
3826
3827
3828<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>
3829<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3830declarations.
3831
3832Example: Given
3833  int a, b;
3834  int c;
3835  int d = 2, e;
3836declCountIs(2)
3837  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3838</pre></td></tr>
3839
3840
3841<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>
3842<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3843
3844Matches a node if it equals the node previously bound to ID.
3845
3846Given
3847  class X { int a; int b; };
3848cxxRecordDecl(
3849    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3850    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3851  matches the class X, as a and b have the same type.
3852
3853Note that when multiple matches are involved via forEach* matchers,
3854equalsBoundNodes acts as a filter.
3855For example:
3856compoundStmt(
3857    forEachDescendant(varDecl().bind("d")),
3858    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3859will trigger a match for each combination of variable declaration
3860and reference to that variable declaration within a compound statement.
3861</pre></td></tr>
3862
3863
3864<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>
3865<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3866
3867Decl has pointer identity in the AST.
3868</pre></td></tr>
3869
3870
3871<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>
3872<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3873
3874Given
3875  __attribute__((device)) void f() { ... }
3876decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3877f. If the matcher is used from clang-query, attr::Kind parameter should be
3878passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3879</pre></td></tr>
3880
3881
3882<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>
3883<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3884Does not match if only part of the statement is expanded from that macro or
3885if different parts of the statement are expanded from different
3886appearances of the macro.
3887</pre></td></tr>
3888
3889
3890<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>
3891<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3892partially matching a given regex.
3893
3894Example matches Y but not X
3895    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3896  #include "ASTMatcher.h"
3897  class X {};
3898ASTMatcher.h:
3899  class Y {};
3900
3901Usable 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;
3902
3903If the matcher is used in clang-query, RegexFlags parameter
3904should be passed as a quoted string. e.g: "NoFlags".
3905Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3906</pre></td></tr>
3907
3908
3909<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>
3910<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3911
3912Example matches X but not Y
3913  (matcher = cxxRecordDecl(isExpansionInMainFile())
3914  #include &lt;Y.h&gt;
3915  class X {};
3916Y.h:
3917  class Y {};
3918
3919Usable 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;
3920</pre></td></tr>
3921
3922
3923<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>
3924<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3925
3926Example matches Y but not X
3927    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3928  #include &lt;SystemHeader.h&gt;
3929  class X {};
3930SystemHeader.h:
3931  class Y {};
3932
3933Usable 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;
3934</pre></td></tr>
3935
3936
3937<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>
3938<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
3939implicit default/copy constructors).
3940</pre></td></tr>
3941
3942
3943<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>
3944<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3945
3946Given
3947  class vector {};
3948  namespace foo {
3949    class vector {};
3950    namespace std {
3951      class vector {};
3952    }
3953  }
3954  namespace std {
3955    inline namespace __1 {
3956      class vector {}; // #1
3957      namespace experimental {
3958        class vector {};
3959      }
3960    }
3961  }
3962cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3963</pre></td></tr>
3964
3965
3966<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>
3967<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3968template instantiations.
3969
3970Given
3971  template&lt;typename T&gt; void A(T t) { T i; }
3972  A(0);
3973  A(0U);
3974functionDecl(isInstantiated())
3975  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3976</pre></td></tr>
3977
3978
3979<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>
3980<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3981inheritance.
3982
3983Examples:
3984  class C {
3985  public:    int a;
3986  protected: int b;
3987  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3988  };
3989
3990  struct Base {};
3991  struct Derived1 : private Base {}; // matches 'Base'
3992  class Derived2 : Base {}; // matches 'Base'
3993</pre></td></tr>
3994
3995
3996<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>
3997<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3998protected inheritance.
3999
4000Examples:
4001  class C {
4002  public:    int a;
4003  protected: int b; // fieldDecl(isProtected()) matches 'b'
4004  private:   int c;
4005  };
4006
4007  class Base {};
4008  class Derived : protected Base {}; // matches 'Base'
4009</pre></td></tr>
4010
4011
4012<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>
4013<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
4014inheritance.
4015
4016Examples:
4017  class C {
4018  public:    int a; // fieldDecl(isPublic()) matches 'a'
4019  protected: int b;
4020  private:   int c;
4021  };
4022
4023  class Base {};
4024  class Derived1 : public Base {}; // matches 'Base'
4025  struct Derived2 : Base {}; // matches 'Base'
4026</pre></td></tr>
4027
4028
4029<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>
4030<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
4031a specific number of designators.
4032
4033Example: Given
4034  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
4035  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
4036designatorCountIs(2)
4037  matches '{ [2].y = 1.0, [0].x = 1.0 }',
4038  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
4039</pre></td></tr>
4040
4041
4042<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>
4043<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
4044
4045Example matches Y (matcher = enumDecl(isScoped()))
4046enum X {};
4047enum class Y {};
4048</pre></td></tr>
4049
4050
4051<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>
4052<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
4053neither type- nor value-dependent.
4054
4055In the following example, the expression sizeof(sizeof(T() + T()))
4056is instantiation-dependent (since it involves a template parameter T),
4057but is neither type- nor value-dependent, since the type of the inner
4058sizeof is known (std::size_t) and therefore the size of the outer
4059sizeof is known.
4060  template&lt;typename T&gt;
4061  void f(T x, T y) { sizeof(sizeof(T() + T()); }
4062expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
4063</pre></td></tr>
4064
4065
4066<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>
4067<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
4068is not yet instantiated.
4069
4070For example, the expressions "x" and "x + y" are type-dependent in
4071the following code, but "y" is not type-dependent:
4072  template&lt;typename T&gt;
4073  void add(T x, int y) {
4074    x + y;
4075  }
4076expr(isTypeDependent()) matches x + y
4077</pre></td></tr>
4078
4079
4080<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>
4081<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
4082non-type template parameter.
4083
4084For example, the array bound of "Chars" in the following example is
4085value-dependent.
4086  template&lt;int Size&gt; int f() { return Size; }
4087expr(isValueDependent()) matches return Size
4088</pre></td></tr>
4089
4090
4091<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>
4092<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4093GNU's __null, C++11's nullptr, or C's NULL macro.
4094
4095Given:
4096  void *v1 = NULL;
4097  void *v2 = nullptr;
4098  void *v3 = __null; // GNU extension
4099  char *cp = (char *)0;
4100  int *ip = 0;
4101  int i = 0;
4102expr(nullPointerConstant())
4103  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4104  initializer for i.
4105</pre></td></tr>
4106
4107
4108<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>
4109<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
4110bit width.
4111
4112Given
4113  class C {
4114    int a : 2;
4115    int b : 4;
4116    int c : 2;
4117  };
4118fieldDecl(hasBitWidth(2))
4119  matches 'int a;' and 'int c;' but not 'int b;'.
4120</pre></td></tr>
4121
4122
4123<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>
4124<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
4125
4126Given
4127  class C {
4128    int a : 2;
4129    int b;
4130  };
4131fieldDecl(isBitField())
4132  matches 'int a;' but not 'int b;'.
4133</pre></td></tr>
4134
4135
4136<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>
4137<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4138
4139Given
4140  f('false, 3.14, 42);
4141characterLiteral(equals(0))
4142  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4143  match false
4144floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4145  match 3.14
4146integerLiteral(equals(42))
4147  matches 42
4148
4149Note that you cannot directly match a negative numeric literal because the
4150minus sign is not part of the literal: It is a unary operator whose operand
4151is the positive numeric literal. Instead, you must use a unaryOperator()
4152matcher to match the minus sign:
4153
4154unaryOperator(hasOperatorName("-"),
4155              hasUnaryOperand(integerLiteral(equals(13))))
4156
4157Usable 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;,
4158           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;
4159</pre></td></tr>
4160
4161
4162<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>
4163<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4164
4165
4166<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>
4167<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4168
4169Matches overloaded operator names specified in strings without the
4170"operator" prefix: e.g. "&lt;&lt;".
4171
4172  hasAnyOverloadedOperatorName("+", "-")
4173Is equivalent to
4174  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4175</pre></td></tr>
4176
4177
4178<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>
4179<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4180
4181Given:
4182  void f();
4183  void g() noexcept;
4184  void h() noexcept(true);
4185  void i() noexcept(false);
4186  void j() throw();
4187  void k() throw(int);
4188  void l() throw(...);
4189functionDecl(hasDynamicExceptionSpec()) and
4190  functionProtoType(hasDynamicExceptionSpec())
4191  match the declarations of j, k, and l, but not f, g, h, or i.
4192</pre></td></tr>
4193
4194
4195<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>
4196<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4197
4198Matches overloaded operator names specified in strings without the
4199"operator" prefix: e.g. "&lt;&lt;".
4200
4201Given:
4202  class A { int operator*(); };
4203  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
4204  A a;
4205  a &lt;&lt; a;   // &lt;-- This matches
4206
4207cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
4208specified line and
4209cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4210matches the declaration of A.
4211
4212Usable 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;
4213</pre></td></tr>
4214
4215
4216<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>
4217<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4218
4219Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4220int X() {}
4221auto Y() -&gt; int {}
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('isConsteval0')"><a name="isConsteval0Anchor">isConsteval</a></td><td></td></tr>
4226<tr><td colspan="4" class="doc" id="isConsteval0"><pre>Matches consteval function declarations and if consteval/if ! consteval
4227statements.
4228
4229Given:
4230  consteval int a();
4231  void b() { if consteval {} }
4232  void c() { if ! consteval {} }
4233  void d() { if ! consteval {} else {} }
4234functionDecl(isConsteval())
4235  matches the declaration of "int a()".
4236ifStmt(isConsteval())
4237  matches the if statement in "void b()", "void c()", "void d()".
4238</pre></td></tr>
4239
4240
4241<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>
4242<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4243       and if constexpr.
4244
4245Given:
4246  constexpr int foo = 42;
4247  constexpr int bar();
4248  void baz() { if constexpr(1 &gt; 0) {} }
4249varDecl(isConstexpr())
4250  matches the declaration of foo.
4251functionDecl(isConstexpr())
4252  matches the declaration of bar.
4253ifStmt(isConstexpr())
4254  matches the if statement in baz.
4255</pre></td></tr>
4256
4257
4258<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>
4259<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4260
4261Given:
4262  class A { ~A(); };
4263  class B { ~B() = default; };
4264functionDecl(isDefaulted())
4265  matches the declaration of ~B, but not ~A.
4266</pre></td></tr>
4267
4268
4269<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>
4270<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4271
4272Example matches A, va, fa
4273  class A {};
4274  class B;  // Doesn't match, as it has no body.
4275  int va;
4276  extern int vb;  // Doesn't match, as it doesn't define the variable.
4277  void fa() {}
4278  void fb();  // Doesn't match, as it has no body.
4279  @interface X
4280  - (void)ma; // Doesn't match, interface is declaration.
4281  @end
4282  @implementation X
4283  - (void)ma {}
4284  @end
4285
4286Usable 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;,
4287  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4288</pre></td></tr>
4289
4290
4291<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>
4292<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4293
4294Given:
4295  void Func();
4296  void DeletedFunc() = delete;
4297functionDecl(isDeleted())
4298  matches the declaration of DeletedFunc, but not Func.
4299</pre></td></tr>
4300
4301
4302<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>
4303<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4304static member variable template instantiations.
4305
4306Given
4307  template&lt;typename T&gt; void A(T t) { }
4308  template&lt;&gt; void A(int N) { }
4309functionDecl(isExplicitTemplateSpecialization())
4310  matches the specialization A&lt;int&gt;().
4311
4312Usable 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;
4313</pre></td></tr>
4314
4315
4316<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>
4317<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4318
4319Given:
4320  extern "C" void f() {}
4321  extern "C" { void g() {} }
4322  void h() {}
4323  extern "C" int x = 1;
4324  extern "C" int y = 2;
4325  int z = 3;
4326functionDecl(isExternC())
4327  matches the declaration of f and g, but not the declaration of h.
4328varDecl(isExternC())
4329  matches the declaration of x and y, but not the declaration of z.
4330</pre></td></tr>
4331
4332
4333<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>
4334<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches functions, variables and namespace declarations that are marked with
4335the inline keyword.
4336
4337Given
4338  inline void f();
4339  void g();
4340  namespace n {
4341  inline namespace m {}
4342  }
4343  inline int Foo = 5;
4344functionDecl(isInline()) will match ::f().
4345namespaceDecl(isInline()) will match n::m.
4346varDecl(isInline()) will match Foo;
4347</pre></td></tr>
4348
4349
4350<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>
4351<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4352into an executable program.
4353</pre></td></tr>
4354
4355
4356<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>
4357<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4358
4359Given
4360  void nope();
4361  [[noreturn]] void a();
4362  __attribute__((noreturn)) void b();
4363  struct c { [[noreturn]] c(); };
4364functionDecl(isNoReturn())
4365  matches all of those except
4366  void nope();
4367</pre></td></tr>
4368
4369
4370<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>
4371<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4372
4373Given:
4374  void f();
4375  void g() noexcept;
4376  void h() throw();
4377  void i() throw(int);
4378  void j() noexcept(false);
4379functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4380  match the declarations of g, and h, but not f, i or j.
4381</pre></td></tr>
4382
4383
4384<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>
4385<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4386class specifier ("static" keyword) written in the source.
4387
4388Given:
4389  static void f() {}
4390  static int i = 0;
4391  extern int j;
4392  int k;
4393functionDecl(isStaticStorageClass())
4394  matches the function declaration f.
4395varDecl(isStaticStorageClass())
4396  matches the variable declaration i.
4397</pre></td></tr>
4398
4399
4400<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>
4401<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4402member variable template instantiations.
4403
4404Given
4405  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4406or
4407  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4408or
4409  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4410cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4411  matches the template instantiation of X&lt;A&gt;.
4412
4413But given
4414  template &lt;typename T&gt;  class X {}; class A {};
4415  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4416cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4417  does not match, as X&lt;A&gt; is an explicit template specialization.
4418
4419Usable 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;
4420</pre></td></tr>
4421
4422
4423<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>
4424<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4425
4426Example matches f, but not g or h. The function i will not match, even when
4427compiled in C mode.
4428  void f(...);
4429  void g(int);
4430  template &lt;typename... Ts&gt; void h(Ts...);
4431  void i();
4432</pre></td></tr>
4433
4434
4435<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>
4436<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4437
4438Given:
4439  void foo() __attribute__((__weakref__("__foo")));
4440  void bar();
4441functionDecl(isWeak())
4442  matches the weak declaration "foo", but not "bar".
4443</pre></td></tr>
4444
4445
4446<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>
4447<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4448specific parameter count.
4449
4450Given
4451  void f(int i) {}
4452  void g(int i, int j) {}
4453  void h(int i, int j);
4454  void j(int i);
4455  void k(int x, int y, int z, ...);
4456functionDecl(parameterCountIs(2))
4457  matches g and h
4458functionProtoType(parameterCountIs(2))
4459  matches g and h
4460functionProtoType(parameterCountIs(3))
4461  matches k
4462</pre></td></tr>
4463
4464
4465<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>
4466<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4467
4468Given:
4469  void f();
4470  void g() noexcept;
4471  void h() noexcept(true);
4472  void i() noexcept(false);
4473  void j() throw();
4474  void k() throw(int);
4475  void l() throw(...);
4476functionDecl(hasDynamicExceptionSpec()) and
4477  functionProtoType(hasDynamicExceptionSpec())
4478  match the declarations of j, k, and l, but not f, g, h, or i.
4479</pre></td></tr>
4480
4481
4482<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>
4483<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4484
4485Given:
4486  void f();
4487  void g() noexcept;
4488  void h() throw();
4489  void i() throw(int);
4490  void j() noexcept(false);
4491functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4492  match the declarations of g, and h, but not f, i or j.
4493</pre></td></tr>
4494
4495
4496<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>
4497<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4498specific parameter count.
4499
4500Given
4501  void f(int i) {}
4502  void g(int i, int j) {}
4503  void h(int i, int j);
4504  void j(int i);
4505  void k(int x, int y, int z, ...);
4506functionDecl(parameterCountIs(2))
4507  matches g and h
4508functionProtoType(parameterCountIs(2))
4509  matches g and h
4510functionProtoType(parameterCountIs(3))
4511  matches k
4512</pre></td></tr>
4513
4514
4515<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConsteval1')"><a name="isConsteval1Anchor">isConsteval</a></td><td></td></tr>
4516<tr><td colspan="4" class="doc" id="isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval
4517statements.
4518
4519Given:
4520  consteval int a();
4521  void b() { if consteval {} }
4522  void c() { if ! consteval {} }
4523  void d() { if ! consteval {} else {} }
4524functionDecl(isConsteval())
4525  matches the declaration of "int a()".
4526ifStmt(isConsteval())
4527  matches the if statement in "void b()", "void c()", "void d()".
4528</pre></td></tr>
4529
4530
4531<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>
4532<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4533       and if constexpr.
4534
4535Given:
4536  constexpr int foo = 42;
4537  constexpr int bar();
4538  void baz() { if constexpr(1 &gt; 0) {} }
4539varDecl(isConstexpr())
4540  matches the declaration of foo.
4541functionDecl(isConstexpr())
4542  matches the declaration of bar.
4543ifStmt(isConstexpr())
4544  matches the if statement in baz.
4545</pre></td></tr>
4546
4547
4548<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>
4549<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4550
4551
4552<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>
4553<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4554
4555Given
4556  f('false, 3.14, 42);
4557characterLiteral(equals(0))
4558  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4559  match false
4560floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4561  match 3.14
4562integerLiteral(equals(42))
4563  matches 42
4564
4565Note that you cannot directly match a negative numeric literal because the
4566minus sign is not part of the literal: It is a unary operator whose operand
4567is the positive numeric literal. Instead, you must use a unaryOperator()
4568matcher to match the minus sign:
4569
4570unaryOperator(hasOperatorName("-"),
4571              hasUnaryOperand(integerLiteral(equals(13))))
4572
4573Usable 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;,
4574           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;
4575</pre></td></tr>
4576
4577
4578<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>
4579<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4580
4581
4582<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>
4583<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4584
4585
4586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('capturesThis0')"><a name="capturesThis0Anchor">capturesThis</a></td><td></td></tr>
4587<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'.
4588
4589Given
4590class C {
4591  int cc;
4592  int f() {
4593    auto l = [this]() { return cc; };
4594    return l();
4595  }
4596};
4597lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4598  matches `[this]() { return cc; }`.
4599</pre></td></tr>
4600
4601
4602<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('isImplicit2')"><a name="isImplicit2Anchor">isImplicit</a></td><td></td></tr>
4603<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4604implicit default/copy constructors).
4605</pre></td></tr>
4606
4607
4608<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>
4609<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4610to '.'.
4611
4612Member calls on the implicit this pointer match as called with '-&gt;'.
4613
4614Given
4615  class Y {
4616    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4617    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4618    int a;
4619    static int b;
4620  };
4621  template &lt;class T&gt;
4622  class Z {
4623    void x() { this-&gt;m; }
4624  };
4625memberExpr(isArrow())
4626  matches this-&gt;x, x, y.x, a, this-&gt;b
4627cxxDependentScopeMemberExpr(isArrow())
4628  matches this-&gt;m
4629unresolvedMemberExpr(isArrow())
4630  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4631</pre></td></tr>
4632
4633
4634<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>
4635<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4636
4637This matcher is only provided as a performance optimization of hasName.
4638    hasAnyName(a, b, c)
4639 is equivalent to, but faster than
4640    anyOf(hasName(a), hasName(b), hasName(c))
4641</pre></td></tr>
4642
4643
4644<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>
4645<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4646
4647Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4648void f() {
4649  int x;
4650  static int y;
4651}
4652int z;
4653
4654Example matches f() because it has external formal linkage despite being
4655unique to the translation unit as though it has internal likage
4656(matcher = functionDecl(hasExternalFormalLinkage()))
4657
4658namespace {
4659void f() {}
4660}
4661</pre></td></tr>
4662
4663
4664<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>
4665<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4666
4667Supports specifying enclosing namespaces or classes by prefixing the name
4668with '&lt;enclosing&gt;::'.
4669Does not match typedefs of an underlying type with the given name.
4670
4671Example matches X (Name == "X")
4672  class X;
4673
4674Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4675  namespace a { namespace b { class X; } }
4676</pre></td></tr>
4677
4678
4679<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>
4680<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4681a substring matched by the given RegExp.
4682
4683Supports specifying enclosing namespaces or classes by
4684prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4685of an underlying type with the given name.
4686
4687Example matches X (regexp == "::X")
4688  class X;
4689
4690Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4691  namespace foo { namespace bar { class X; } }
4692
4693If the matcher is used in clang-query, RegexFlags parameter
4694should be passed as a quoted string. e.g: "NoFlags".
4695Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4696</pre></td></tr>
4697
4698
4699<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>
4700<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4701
4702Given
4703  namespace n {
4704  namespace {} // #1
4705  }
4706namespaceDecl(isAnonymous()) will match #1 but not ::n.
4707</pre></td></tr>
4708
4709
4710<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>
4711<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches functions, variables and namespace declarations that are marked with
4712the inline keyword.
4713
4714Given
4715  inline void f();
4716  void g();
4717  namespace n {
4718  inline namespace m {}
4719  }
4720  inline int Foo = 5;
4721functionDecl(isInline()) will match ::f().
4722namespaceDecl(isInline()) will match n::m.
4723varDecl(isInline()) will match Foo;
4724</pre></td></tr>
4725
4726
4727<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>
4728<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4729specified.
4730
4731Given
4732
4733  #pragma omp parallel
4734  #pragma omp parallel default(none)
4735  #pragma omp parallel default(shared)
4736  #pragma omp parallel default(private)
4737  #pragma omp parallel default(firstprivate)
4738
4739``ompDefaultClause(isFirstPrivateKind())`` matches only
4740``default(firstprivate)``.
4741</pre></td></tr>
4742
4743
4744<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>
4745<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4746
4747Given
4748
4749  #pragma omp parallel
4750  #pragma omp parallel default(none)
4751  #pragma omp parallel default(shared)
4752  #pragma omp parallel default(private)
4753  #pragma omp parallel default(firstprivate)
4754
4755``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4756</pre></td></tr>
4757
4758
4759<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isPrivateKind0')"><a name="isPrivateKind0Anchor">isPrivateKind</a></td><td></td></tr>
4760<tr><td colspan="4" class="doc" id="isPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``private`` kind
4761specified.
4762
4763Given
4764
4765  #pragma omp parallel
4766  #pragma omp parallel default(none)
4767  #pragma omp parallel default(shared)
4768  #pragma omp parallel default(private)
4769  #pragma omp parallel default(firstprivate)
4770
4771``ompDefaultClause(isPrivateKind())`` matches only
4772``default(private)``.
4773</pre></td></tr>
4774
4775
4776<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>
4777<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4778
4779Given
4780
4781  #pragma omp parallel
4782  #pragma omp parallel default(none)
4783  #pragma omp parallel default(shared)
4784  #pragma omp parallel default(private)
4785  #pragma omp parallel default(firstprivate)
4786
4787``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4788</pre></td></tr>
4789
4790
4791<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>
4792<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4793clause kind.
4794
4795Given
4796
4797  #pragma omp parallel
4798  #pragma omp parallel for
4799  #pragma omp          for
4800
4801`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4802``omp parallel`` and ``omp parallel for``.
4803
4804If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4805should be passed as a quoted string. e.g.,
4806``isAllowedToContainClauseKind("OMPC_default").``
4807</pre></td></tr>
4808
4809
4810<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>
4811<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4812i.e., directives that can't have a structured block.
4813
4814Given
4815
4816  #pragma omp parallel
4817  {}
4818  #pragma omp taskyield
4819
4820``ompExecutableDirective(isStandaloneDirective()))`` matches
4821``omp taskyield``.
4822</pre></td></tr>
4823
4824
4825<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>
4826<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4827</pre></td></tr>
4828
4829
4830<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>
4831<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4832</pre></td></tr>
4833
4834
4835<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>
4836<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4837isSameOrDerivedFrom(hasName(...)).
4838</pre></td></tr>
4839
4840
4841<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>
4842<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4843a specific number of arguments (including absent default arguments).
4844
4845Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4846  void f(int x, int y);
4847  f(0, 0);
4848</pre></td></tr>
4849
4850
4851<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>
4852<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4853Selector.getAsString()
4854
4855 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4856 matches both of the expressions below:
4857    [myObj methodA:argA];
4858    [myObj methodB:argB];
4859</pre></td></tr>
4860
4861
4862<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>
4863<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4864
4865objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4866message expression in
4867
4868  UIWebView *webView = ...;
4869  CGRect bodyFrame = webView.frame;
4870  bodyFrame.size.height = self.bodyContentHeight;
4871  webView.frame = bodyFrame;
4872  //     ^---- matches here
4873</pre></td></tr>
4874
4875
4876<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>
4877<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4878
4879Matches only when the selector of the objCMessageExpr is NULL. This may
4880represent an error condition in the tree!
4881</pre></td></tr>
4882
4883
4884<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>
4885<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4886
4887 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4888 matches the outer message expr in the code below, but NOT the message
4889 invocation for self.bodyView.
4890    [self.bodyView loadHTMLString:html baseURL:NULL];
4891</pre></td></tr>
4892
4893
4894<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>
4895<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4896
4897 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4898 matches self.bodyView in the code below, but NOT the outer message
4899 invocation of "loadHTMLString:baseURL:".
4900    [self.bodyView loadHTMLString:html baseURL:NULL];
4901</pre></td></tr>
4902
4903
4904<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>
4905<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4906
4907Example
4908matcher = objcMessageExpr(isClassMessage())
4909matches
4910  [NSString stringWithFormat:@"format"];
4911but not
4912  NSString *x = @"hello";
4913  [x containsString:@"h"];
4914</pre></td></tr>
4915
4916
4917<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>
4918<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4919
4920Example
4921matcher = objcMessageExpr(isInstanceMessage())
4922matches
4923  NSString *x = @"hello";
4924  [x containsString:@"h"];
4925but not
4926  [NSString stringWithFormat:@"format"];
4927</pre></td></tr>
4928
4929
4930<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>
4931<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4932a substring matched by the given RegExp.
4933 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4934 invocation for self.bodyView.
4935    [self.bodyView loadHTMLString:html baseURL:NULL];
4936
4937If the matcher is used in clang-query, RegexFlags parameter
4938should be passed as a quoted string. e.g: "NoFlags".
4939Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4940</pre></td></tr>
4941
4942
4943<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>
4944<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4945
4946 matcher = objCMessageExpr(numSelectorArgs(0));
4947 matches self.bodyView in the code below
4948
4949 matcher = objCMessageExpr(numSelectorArgs(2));
4950 matches the invocation of "loadHTMLString:baseURL:" but not that
4951 of self.bodyView
4952    [self.bodyView loadHTMLString:html baseURL:NULL];
4953</pre></td></tr>
4954
4955
4956<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>
4957<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4958
4959Example
4960matcher = objcMethodDecl(isClassMethod())
4961matches
4962@interface I + (void)foo; @end
4963but not
4964@interface I - (void)bar; @end
4965</pre></td></tr>
4966
4967
4968<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>
4969<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4970
4971Example matches A, va, fa
4972  class A {};
4973  class B;  // Doesn't match, as it has no body.
4974  int va;
4975  extern int vb;  // Doesn't match, as it doesn't define the variable.
4976  void fa() {}
4977  void fb();  // Doesn't match, as it has no body.
4978  @interface X
4979  - (void)ma; // Doesn't match, interface is declaration.
4980  @end
4981  @implementation X
4982  - (void)ma {}
4983  @end
4984
4985Usable 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;,
4986  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4987</pre></td></tr>
4988
4989
4990<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>
4991<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4992
4993Example
4994matcher = objcMethodDecl(isInstanceMethod())
4995matches
4996@interface I - (void)bar; @end
4997but not
4998@interface I + (void)foo; @end
4999</pre></td></tr>
5000
5001
5002<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>
5003<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
5004
5005Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
5006void x(int val) {}
5007void y(int val = 0) {}
5008
5009Deprecated. Use hasInitializer() instead to be able to
5010match on the contents of the default argument.  For example:
5011
5012void x(int val = 7) {}
5013void y(int val = 42) {}
5014parmVarDecl(hasInitializer(integerLiteral(equals(42))))
5015  matches the parameter of y
5016
5017A matcher such as
5018  parmVarDecl(hasInitializer(anything()))
5019is equivalent to parmVarDecl(hasDefaultArgument()).
5020</pre></td></tr>
5021
5022
5023<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>
5024<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
5025list. The parameter list could be that of either a block, function, or
5026objc-method.
5027
5028
5029Given
5030
5031void f(int a, int b, int c) {
5032}
5033
5034``parmVarDecl(isAtPosition(0))`` matches ``int a``.
5035
5036``parmVarDecl(isAtPosition(1))`` matches ``int b``.
5037</pre></td></tr>
5038
5039
5040<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>
5041<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
5042
5043Given
5044  class Y { public: void x(); };
5045  void z() { Y* y; y-&gt;x(); }
5046cxxMemberCallExpr(on(hasType(asString("class Y *"))))
5047  matches y-&gt;x()
5048</pre></td></tr>
5049
5050
5051<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>
5052<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
5053
5054Matches a node if it equals the node previously bound to ID.
5055
5056Given
5057  class X { int a; int b; };
5058cxxRecordDecl(
5059    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5060    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5061  matches the class X, as a and b have the same type.
5062
5063Note that when multiple matches are involved via forEach* matchers,
5064equalsBoundNodes acts as a filter.
5065For example:
5066compoundStmt(
5067    forEachDescendant(varDecl().bind("d")),
5068    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5069will trigger a match for each combination of variable declaration
5070and reference to that variable declaration within a compound statement.
5071</pre></td></tr>
5072
5073
5074<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>
5075<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
5076the node, not hidden within a typedef.
5077
5078Given
5079  typedef const int const_int;
5080  const_int i;
5081  int *const j;
5082  int *volatile k;
5083  int m;
5084varDecl(hasType(hasLocalQualifiers())) matches only j and k.
5085i is const-qualified but the qualifier is not local.
5086</pre></td></tr>
5087
5088
5089<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>
5090<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
5091
5092Given
5093  void a(char);
5094  void b(wchar_t);
5095  void c(double);
5096functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
5097matches "a(char)", "b(wchar_t)", but not "c(double)".
5098</pre></td></tr>
5099
5100
5101<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>
5102<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
5103the Objective-C object pointer type, which is different despite being
5104syntactically similar.
5105
5106Given
5107  int *i = nullptr;
5108
5109  @interface Foo
5110  @end
5111  Foo *f;
5112
5113  int j;
5114varDecl(hasType(isAnyPointer()))
5115  matches "int *i" and "Foo *f", but not "int j".
5116</pre></td></tr>
5117
5118
5119<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>
5120<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
5121include "top-level" const.
5122
5123Given
5124  void a(int);
5125  void b(int const);
5126  void c(const int);
5127  void d(const int*);
5128  void e(int const) {};
5129functionDecl(hasAnyParameter(hasType(isConstQualified())))
5130  matches "void b(int const)", "void c(const int)" and
5131  "void e(int const) {}". It does not match d as there
5132  is no top-level const on the parameter type "const int *".
5133</pre></td></tr>
5134
5135
5136<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>
5137<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
5138
5139Given
5140  void a(int);
5141  void b(long);
5142  void c(double);
5143functionDecl(hasAnyParameter(hasType(isInteger())))
5144matches "a(int)", "b(long)", but not "c(double)".
5145</pre></td></tr>
5146
5147
5148<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>
5149<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
5150
5151Given
5152  void a(int);
5153  void b(unsigned long);
5154  void c(double);
5155functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5156matches "a(int)", but not "b(unsigned long)" and "c(double)".
5157</pre></td></tr>
5158
5159
5160<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>
5161<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
5162
5163Given
5164  void a(int);
5165  void b(unsigned long);
5166  void c(double);
5167functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5168matches "b(unsigned long)", but not "a(int)" and "c(double)".
5169</pre></td></tr>
5170
5171
5172<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>
5173<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5174include "top-level" volatile.
5175
5176Given
5177  void a(int);
5178  void b(int volatile);
5179  void c(volatile int);
5180  void d(volatile int*);
5181  void e(int volatile) {};
5182functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5183  matches "void b(int volatile)", "void c(volatile int)" and
5184  "void e(int volatile) {}". It does not match d as there
5185  is no top-level volatile on the parameter type "volatile int *".
5186</pre></td></tr>
5187
5188
5189<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>
5190<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
5191
5192Matches a node if it equals the node previously bound to ID.
5193
5194Given
5195  class X { int a; int b; };
5196cxxRecordDecl(
5197    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5198    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5199  matches the class X, as a and b have the same type.
5200
5201Note that when multiple matches are involved via forEach* matchers,
5202equalsBoundNodes acts as a filter.
5203For example:
5204compoundStmt(
5205    forEachDescendant(varDecl().bind("d")),
5206    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5207will trigger a match for each combination of variable declaration
5208and reference to that variable declaration within a compound statement.
5209</pre></td></tr>
5210
5211
5212<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>
5213<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5214
5215Stmt has pointer identity in the AST.
5216</pre></td></tr>
5217
5218
5219<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>
5220<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5221Does not match if only part of the statement is expanded from that macro or
5222if different parts of the statement are expanded from different
5223appearances of the macro.
5224</pre></td></tr>
5225
5226
5227<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>
5228<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5229partially matching a given regex.
5230
5231Example matches Y but not X
5232    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5233  #include "ASTMatcher.h"
5234  class X {};
5235ASTMatcher.h:
5236  class Y {};
5237
5238Usable 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;
5239
5240If the matcher is used in clang-query, RegexFlags parameter
5241should be passed as a quoted string. e.g: "NoFlags".
5242Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5243</pre></td></tr>
5244
5245
5246<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>
5247<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5248
5249Example matches X but not Y
5250  (matcher = cxxRecordDecl(isExpansionInMainFile())
5251  #include &lt;Y.h&gt;
5252  class X {};
5253Y.h:
5254  class Y {};
5255
5256Usable 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;
5257</pre></td></tr>
5258
5259
5260<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>
5261<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5262
5263Example matches Y but not X
5264    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5265  #include &lt;SystemHeader.h&gt;
5266  class X {};
5267SystemHeader.h:
5268  class Y {};
5269
5270Usable 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;
5271</pre></td></tr>
5272
5273
5274<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>
5275<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5276
5277Given
5278  int j;
5279  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5280  A(0);
5281  A(0U);
5282declStmt(isInTemplateInstantiation())
5283  matches 'int i;' and 'unsigned i'.
5284unless(stmt(isInTemplateInstantiation()))
5285  will NOT match j += 42; as it's shared between the template definition and
5286  instantiation.
5287</pre></td></tr>
5288
5289
5290<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>
5291<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5292
5293Given
5294  int a[42];
5295  int b[2 * 21];
5296  int c[41], d[43];
5297  char *s = "abcd";
5298  wchar_t *ws = L"abcd";
5299  char *w = "a";
5300constantArrayType(hasSize(42))
5301  matches "int a[42]" and "int b[2 * 21]"
5302stringLiteral(hasSize(4))
5303  matches "abcd", L"abcd"
5304</pre></td></tr>
5305
5306
5307<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>
5308<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5309
5310Example matches C, but not S, U or E.
5311  struct S {};
5312  class C {};
5313  union U {};
5314  enum E {};
5315</pre></td></tr>
5316
5317
5318<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>
5319<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5320
5321Example matches A, va, fa
5322  class A {};
5323  class B;  // Doesn't match, as it has no body.
5324  int va;
5325  extern int vb;  // Doesn't match, as it doesn't define the variable.
5326  void fa() {}
5327  void fb();  // Doesn't match, as it has no body.
5328  @interface X
5329  - (void)ma; // Doesn't match, interface is declaration.
5330  @end
5331  @implementation X
5332  - (void)ma {}
5333  @end
5334
5335Usable 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;,
5336  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5337</pre></td></tr>
5338
5339
5340<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>
5341<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5342
5343Example matches E, but not C, S or U.
5344  struct S {};
5345  class C {};
5346  union U {};
5347  enum E {};
5348</pre></td></tr>
5349
5350
5351<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>
5352<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5353
5354Example matches S, but not C, U or E.
5355  struct S {};
5356  class C {};
5357  union U {};
5358  enum E {};
5359</pre></td></tr>
5360
5361
5362<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>
5363<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5364
5365Example matches U, but not C, S or E.
5366  struct S {};
5367  class C {};
5368  union U {};
5369  enum E {};
5370</pre></td></tr>
5371
5372
5373<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>
5374<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5375
5376Note that 'Value' is a string as the template argument's value is
5377an arbitrary precision integer. 'Value' must be euqal to the canonical
5378representation of that integral value in base 10.
5379
5380Given
5381  template&lt;int T&gt; struct C {};
5382  C&lt;42&gt; c;
5383classTemplateSpecializationDecl(
5384  hasAnyTemplateArgument(equalsIntegralValue("42")))
5385  matches the implicit instantiation of C in C&lt;42&gt;.
5386</pre></td></tr>
5387
5388
5389<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>
5390<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5391
5392Given
5393  template&lt;int T&gt; struct C {};
5394  C&lt;42&gt; c;
5395classTemplateSpecializationDecl(
5396  hasAnyTemplateArgument(isIntegral()))
5397  matches the implicit instantiation of C in C&lt;42&gt;
5398  with isIntegral() matching 42.
5399</pre></td></tr>
5400
5401
5402<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>
5403<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5404
5405Given
5406  template&lt;typename T&gt; struct C {};
5407  C&lt;int&gt; c;
5408classTemplateSpecializationDecl(templateArgumentCountIs(1))
5409  matches C&lt;int&gt;.
5410</pre></td></tr>
5411
5412
5413<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>
5414<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5415Does not match if only part of the statement is expanded from that macro or
5416if different parts of the statement are expanded from different
5417appearances of the macro.
5418</pre></td></tr>
5419
5420
5421<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>
5422<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5423partially matching a given regex.
5424
5425Example matches Y but not X
5426    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5427  #include "ASTMatcher.h"
5428  class X {};
5429ASTMatcher.h:
5430  class Y {};
5431
5432Usable 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;
5433
5434If the matcher is used in clang-query, RegexFlags parameter
5435should be passed as a quoted string. e.g: "NoFlags".
5436Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5437</pre></td></tr>
5438
5439
5440<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>
5441<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5442
5443Example matches X but not Y
5444  (matcher = cxxRecordDecl(isExpansionInMainFile())
5445  #include &lt;Y.h&gt;
5446  class X {};
5447Y.h:
5448  class Y {};
5449
5450Usable 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;
5451</pre></td></tr>
5452
5453
5454<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>
5455<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5456
5457Example matches Y but not X
5458    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5459  #include &lt;SystemHeader.h&gt;
5460  class X {};
5461SystemHeader.h:
5462  class Y {};
5463
5464Usable 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;
5465</pre></td></tr>
5466
5467
5468<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>
5469<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5470
5471Given
5472 struct S { bool func(); };
5473functionDecl(returns(booleanType()))
5474  matches "bool func();"
5475</pre></td></tr>
5476
5477
5478<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>
5479<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5480
5481Matches a node if it equals the node previously bound to ID.
5482
5483Given
5484  class X { int a; int b; };
5485cxxRecordDecl(
5486    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5487    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5488  matches the class X, as a and b have the same type.
5489
5490Note that when multiple matches are involved via forEach* matchers,
5491equalsBoundNodes acts as a filter.
5492For example:
5493compoundStmt(
5494    forEachDescendant(varDecl().bind("d")),
5495    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5496will trigger a match for each combination of variable declaration
5497and reference to that variable declaration within a compound statement.
5498</pre></td></tr>
5499
5500
5501<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>
5502<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5503
5504Type has pointer identity in the AST.
5505</pre></td></tr>
5506
5507
5508<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>
5509<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5510
5511Given
5512  int i;
5513  float f;
5514realFloatingPointType()
5515  matches "float f" but not "int i"
5516</pre></td></tr>
5517
5518
5519<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>
5520<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5521
5522Given
5523 struct S { void func(); };
5524functionDecl(returns(voidType()))
5525  matches "void func();"
5526</pre></td></tr>
5527
5528
5529<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>
5530<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5531
5532Given
5533  int x;
5534  int s = sizeof(x) + alignof(x)
5535unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5536  matches sizeof(x)
5537
5538If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5539should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5540</pre></td></tr>
5541
5542
5543<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>
5544<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5545specified names.
5546
5547   hasAnyOperatorName("+", "-")
5548 Is equivalent to
5549   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5550</pre></td></tr>
5551
5552
5553<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>
5554<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5555unary).
5556
5557Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5558  !(a || b)
5559</pre></td></tr>
5560
5561
5562<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>
5563<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5564to '.'.
5565
5566Member calls on the implicit this pointer match as called with '-&gt;'.
5567
5568Given
5569  class Y {
5570    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5571    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5572    int a;
5573    static int b;
5574  };
5575  template &lt;class T&gt;
5576  class Z {
5577    void x() { this-&gt;m; }
5578  };
5579memberExpr(isArrow())
5580  matches this-&gt;x, x, y.x, a, this-&gt;b
5581cxxDependentScopeMemberExpr(isArrow())
5582  matches this-&gt;m
5583unresolvedMemberExpr(isArrow())
5584  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5585</pre></td></tr>
5586
5587
5588<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>
5589<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5590
5591Example matches x, but not y, z, or a.
5592(matcher = varDecl(hasAutomaticStorageDuration())
5593void f() {
5594  int x;
5595  static int y;
5596  thread_local int z;
5597}
5598int a;
5599</pre></td></tr>
5600
5601
5602<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>
5603<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5604
5605Example matches y and z (matcher = varDecl(hasGlobalStorage())
5606void f() {
5607  int x;
5608  static int y;
5609}
5610int z;
5611</pre></td></tr>
5612
5613
5614<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>
5615<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5616non-static local variable.
5617
5618Example matches x (matcher = varDecl(hasLocalStorage())
5619void f() {
5620  int x;
5621  static int y;
5622}
5623int z;
5624</pre></td></tr>
5625
5626
5627<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>
5628<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5629It includes the variable declared at namespace scope and those declared
5630with "static" and "extern" storage class specifiers.
5631
5632void f() {
5633  int x;
5634  static int y;
5635  thread_local int z;
5636}
5637int a;
5638static int b;
5639extern int c;
5640varDecl(hasStaticStorageDuration())
5641  matches the function declaration y, a, b and c.
5642</pre></td></tr>
5643
5644
5645<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>
5646<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5647
5648Example matches z, but not x, z, or a.
5649(matcher = varDecl(hasThreadStorageDuration())
5650void f() {
5651  int x;
5652  static int y;
5653  thread_local int z;
5654}
5655int a;
5656</pre></td></tr>
5657
5658
5659<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>
5660<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5661       and if constexpr.
5662
5663Given:
5664  constexpr int foo = 42;
5665  constexpr int bar();
5666  void baz() { if constexpr(1 &gt; 0) {} }
5667varDecl(isConstexpr())
5668  matches the declaration of foo.
5669functionDecl(isConstexpr())
5670  matches the declaration of bar.
5671ifStmt(isConstexpr())
5672  matches the if statement in baz.
5673</pre></td></tr>
5674
5675
5676<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstinit0')"><a name="isConstinit0Anchor">isConstinit</a></td><td></td></tr>
5677<tr><td colspan="4" class="doc" id="isConstinit0"><pre>Matches constinit variable declarations.
5678
5679Given:
5680  constinit int foo = 42;
5681  constinit const char* bar = "bar";
5682  int baz = 42;
5683  [[clang::require_constant_initialization]] int xyz = 42;
5684varDecl(isConstinit())
5685  matches the declaration of `foo` and `bar`, but not `baz` and `xyz`.
5686</pre></td></tr>
5687
5688
5689<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>
5690<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5691
5692Example matches A, va, fa
5693  class A {};
5694  class B;  // Doesn't match, as it has no body.
5695  int va;
5696  extern int vb;  // Doesn't match, as it doesn't define the variable.
5697  void fa() {}
5698  void fb();  // Doesn't match, as it has no body.
5699  @interface X
5700  - (void)ma; // Doesn't match, interface is declaration.
5701  @end
5702  @implementation X
5703  - (void)ma {}
5704  @end
5705
5706Usable 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;,
5707  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5708</pre></td></tr>
5709
5710
5711<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>
5712<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5713a C++ catch block, or an Objective-C statement.
5714
5715Example matches x (matcher = varDecl(isExceptionVariable())
5716void f(int y) {
5717  try {
5718  } catch (int x) {
5719  }
5720}
5721</pre></td></tr>
5722
5723
5724<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>
5725<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5726static member variable template instantiations.
5727
5728Given
5729  template&lt;typename T&gt; void A(T t) { }
5730  template&lt;&gt; void A(int N) { }
5731functionDecl(isExplicitTemplateSpecialization())
5732  matches the specialization A&lt;int&gt;().
5733
5734Usable 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;
5735</pre></td></tr>
5736
5737
5738<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>
5739<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5740
5741Given:
5742  extern "C" void f() {}
5743  extern "C" { void g() {} }
5744  void h() {}
5745  extern "C" int x = 1;
5746  extern "C" int y = 2;
5747  int z = 3;
5748functionDecl(isExternC())
5749  matches the declaration of f and g, but not the declaration of h.
5750varDecl(isExternC())
5751  matches the declaration of x and y, but not the declaration of z.
5752</pre></td></tr>
5753
5754
5755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isInitCapture0')"><a name="isInitCapture0Anchor">isInitCapture</a></td><td></td></tr>
5756<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init-
5757capture.
5758
5759Example matches x (matcher = varDecl(isInitCapture()))
5760auto f = [x=3]() { return x; };
5761</pre></td></tr>
5762
5763
5764<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isInline2')"><a name="isInline2Anchor">isInline</a></td><td></td></tr>
5765<tr><td colspan="4" class="doc" id="isInline2"><pre>Matches functions, variables and namespace declarations that are marked with
5766the inline keyword.
5767
5768Given
5769  inline void f();
5770  void g();
5771  namespace n {
5772  inline namespace m {}
5773  }
5774  inline int Foo = 5;
5775functionDecl(isInline()) will match ::f().
5776namespaceDecl(isInline()) will match n::m.
5777varDecl(isInline()) will match Foo;
5778</pre></td></tr>
5779
5780
5781<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>
5782<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5783
5784Example matches y (matcher = varDecl(isStaticLocal()))
5785void f() {
5786  int x;
5787  static int y;
5788}
5789static int z;
5790</pre></td></tr>
5791
5792
5793<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>
5794<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5795class specifier ("static" keyword) written in the source.
5796
5797Given:
5798  static void f() {}
5799  static int i = 0;
5800  extern int j;
5801  int k;
5802functionDecl(isStaticStorageClass())
5803  matches the function declaration f.
5804varDecl(isStaticStorageClass())
5805  matches the variable declaration i.
5806</pre></td></tr>
5807
5808
5809<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>
5810<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5811member variable template instantiations.
5812
5813Given
5814  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5815or
5816  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5817or
5818  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5819cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5820  matches the template instantiation of X&lt;A&gt;.
5821
5822But given
5823  template &lt;typename T&gt;  class X {}; class A {};
5824  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5825cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5826  does not match, as X&lt;A&gt; is an explicit template specialization.
5827
5828Usable 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;
5829</pre></td></tr>
5830
5831<!--END_NARROWING_MATCHERS -->
5832</table>
5833
5834<!-- ======================================================================= -->
5835<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5836<!-- ======================================================================= -->
5837
5838<p>Traversal matchers specify the relationship to other nodes that are
5839reachable from the current node.</p>
5840
5841<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5842forEachDescendant) which work on all nodes and allow users to write more generic
5843match expressions.</p>
5844
5845<table>
5846<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5847<!-- START_TRAVERSAL_MATCHERS -->
5848
5849<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>
5850<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5851
5852The code
5853  var1 != var2;
5854might be represented in the clang AST as a binaryOperator, a
5855cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5856
5857* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5858  least one is a class type (cxxOperatorCallExpr)
5859* whether the code appears in a template declaration, if at least one of the
5860  vars is a dependent-type (binaryOperator)
5861* whether the code relies on a rewritten binary operator, such as a
5862spaceship operator or an inverted equality operator
5863(cxxRewrittenBinaryOperator)
5864
5865This matcher elides details in places where the matchers for the nodes are
5866compatible.
5867
5868Given
5869  binaryOperation(
5870    hasOperatorName("!="),
5871    hasLHS(expr().bind("lhs")),
5872    hasRHS(expr().bind("rhs"))
5873  )
5874matches each use of "!=" in:
5875  struct S{
5876      bool operator!=(const S&amp;) const;
5877  };
5878
5879  void foo()
5880  {
5881     1 != 2;
5882     S() != S();
5883  }
5884
5885  template&lt;typename T&gt;
5886  void templ()
5887  {
5888     1 != 2;
5889     T() != S();
5890  }
5891  struct HasOpEq
5892  {
5893      bool operator==(const HasOpEq &amp;) const;
5894  };
5895
5896  void inverse()
5897  {
5898      HasOpEq s1;
5899      HasOpEq s2;
5900      if (s1 != s2)
5901          return;
5902  }
5903
5904  struct HasSpaceship
5905  {
5906      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5907  };
5908
5909  void use_spaceship()
5910  {
5911      HasSpaceship s1;
5912      HasSpaceship s2;
5913      if (s1 != s2)
5914          return;
5915  }
5916</pre></td></tr>
5917
5918
5919<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>
5920<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5921
5922Unlike anyOf, eachOf will generate a match result for each
5923matching submatcher.
5924
5925For example, in:
5926  class A { int a; int b; };
5927The matcher:
5928  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5929                       has(fieldDecl(hasName("b")).bind("v"))))
5930will generate two results binding "v", the first of which binds
5931the field declaration of a, the second the field declaration of
5932b.
5933
5934Usable as: Any Matcher
5935</pre></td></tr>
5936
5937
5938<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>
5939<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5940
5941Generates results for each match.
5942
5943For example, in:
5944  class A { class B {}; class C {}; };
5945The matcher:
5946  cxxRecordDecl(hasName("::A"),
5947                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5948will generate results for A, B and C.
5949
5950Usable as: Any Matcher
5951</pre></td></tr>
5952
5953
5954<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5955<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5956provided matcher.
5957
5958Example matches X, A, A::X, B, B::C, B::C::X
5959  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5960  class X {};
5961  class A { class X {}; };  // Matches A, because A::X is a class of name
5962                            // X inside A.
5963  class B { class C { class X {}; }; };
5964
5965DescendantT must be an AST base type.
5966
5967As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5968each result that matches instead of only on the first one.
5969
5970Note: Recursively combined ForEachDescendant can cause many matches:
5971  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5972    forEachDescendant(cxxRecordDecl())
5973  )))
5974will match 10 times (plus injected class name matches) on:
5975  class A { class B { class C { class D { class E {}; }; }; }; };
5976
5977Usable as: Any Matcher
5978</pre></td></tr>
5979
5980
5981<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5982<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5983provided matcher.
5984
5985Example matches X, Y, Y::X, Z::Y, Z::Y::X
5986  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5987  class X {};
5988  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5989                            // inside Y.
5990  class Z { class Y { class X {}; }; };  // Does not match Z.
5991
5992ChildT must be an AST base type.
5993
5994As opposed to 'has', 'forEach' will cause a match for each result that
5995matches instead of only on the first one.
5996
5997Usable as: Any Matcher
5998</pre></td></tr>
5999
6000
6001<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
6002<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
6003matcher.
6004
6005Given
6006void f() { if (true) { int x = 42; } }
6007void g() { for (;;) { int x = 43; } }
6008expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
6009
6010Usable as: Any Matcher
6011</pre></td></tr>
6012
6013
6014<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
6015<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
6016provided matcher.
6017
6018Example matches X, Y, Z
6019    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
6020  class X {};  // Matches X, because X::X is a class of name X inside X.
6021  class Y { class X {}; };
6022  class Z { class Y { class X {}; }; };
6023
6024DescendantT must be an AST base type.
6025
6026Usable as: Any Matcher
6027</pre></td></tr>
6028
6029
6030<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
6031<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
6032provided matcher.
6033
6034Example matches X, Y
6035  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
6036  class X {};  // Matches X, because X::X is a class of name X inside X.
6037  class Y { class X {}; };
6038  class Z { class Y { class X {}; }; };  // Does not match Z.
6039
6040ChildT must be an AST base type.
6041
6042Usable as: Any Matcher
6043Note that has is direct matcher, so it also matches things like implicit
6044casts and paren casts. If you are matching with expr then you should
6045probably consider using ignoringParenImpCasts like:
6046has(ignoringParenImpCasts(expr())).
6047</pre></td></tr>
6048
6049
6050<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
6051<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
6052matcher.
6053
6054Given
6055void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
6056compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
6057
6058Usable as: Any Matcher
6059</pre></td></tr>
6060
6061
6062<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>
6063<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
6064
6065Because CallExpr and CXXConstructExpr do not share a common
6066base class with API accessing arguments etc, AST Matchers for code
6067which should match both are typically duplicated. This matcher
6068removes the need for duplication.
6069
6070Given code
6071struct ConstructorTakesInt
6072{
6073  ConstructorTakesInt(int i) {}
6074};
6075
6076void callTakesInt(int i)
6077{
6078}
6079
6080void doCall()
6081{
6082  callTakesInt(42);
6083}
6084
6085void doConstruct()
6086{
6087  ConstructorTakesInt cti(42);
6088}
6089
6090The matcher
6091invocation(hasArgument(0, integerLiteral(equals(42))))
6092matches the expression in both doCall and doConstruct
6093</pre></td></tr>
6094
6095
6096<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
6097<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
6098
6099However, optionally will retain any bindings generated by the submatcher.
6100Useful when additional information which may or may not present about a main
6101matching node is desired.
6102
6103For example, in:
6104  class Foo {
6105    int bar;
6106  }
6107The matcher:
6108  cxxRecordDecl(
6109    optionally(has(
6110      fieldDecl(hasName("bar")).bind("var")
6111  ))).bind("record")
6112will produce a result binding for both "record" and "var".
6113The matcher will produce a "record" binding for even if there is no data
6114member named "bar" in that class.
6115
6116Usable as: Any Matcher
6117</pre></td></tr>
6118
6119
6120<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>
6121<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
6122
6123Given
6124  void foo()
6125  {
6126      int i = 3.0;
6127  }
6128The matcher
6129  traverse(TK_IgnoreUnlessSpelledInSource,
6130    varDecl(hasInitializer(floatLiteral().bind("init")))
6131  )
6132matches the variable declaration with "init" bound to the "3.0".
6133</pre></td></tr>
6134
6135
6136<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>
6137<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
6138switch statement or conditional operator.
6139
6140Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6141  if (true) {}
6142</pre></td></tr>
6143
6144
6145<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>
6146<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
6147(binary or ternary).
6148
6149Example matches b
6150  condition ? a : b
6151  condition ?: b
6152</pre></td></tr>
6153
6154
6155<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>
6156<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
6157
6158Example 1 (conditional ternary operator): matches a
6159  condition ? a : b
6160
6161Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6162  condition ?: b
6163</pre></td></tr>
6164
6165
6166<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>
6167<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
6168matches the given matcher.
6169
6170The associated declaration is:
6171- for type nodes, the declaration of the underlying type
6172- for CallExpr, the declaration of the callee
6173- for MemberExpr, the declaration of the referenced member
6174- for CXXConstructExpr, the declaration of the constructor
6175- for CXXNewExpr, the declaration of the operator new
6176- for ObjCIvarExpr, the declaration of the ivar
6177
6178For type nodes, hasDeclaration will generally match the declaration of the
6179sugared type. Given
6180  class X {};
6181  typedef X Y;
6182  Y y;
6183in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6184typedefDecl. A common use case is to match the underlying, desugared type.
6185This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6186  varDecl(hasType(hasUnqualifiedDesugaredType(
6187      recordType(hasDeclaration(decl())))))
6188In this matcher, the decl will match the CXXRecordDecl of class X.
6189
6190Usable 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;,
6191  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;,
6192  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;,
6193  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;,
6194  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;,
6195  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;,
6196  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6197</pre></td></tr>
6198
6199
6200<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>
6201<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
6202
6203Given
6204  int i[5];
6205  void f() { i[1] = 42; }
6206arraySubscriptExpression(hasBase(implicitCastExpr(
6207    hasSourceExpression(declRefExpr()))))
6208  matches i[1] with the declRefExpr() matching i
6209</pre></td></tr>
6210
6211
6212<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>
6213<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
6214
6215Given
6216  int i[5];
6217  void f() { i[1] = 42; }
6218arraySubscriptExpression(hasIndex(integerLiteral()))
6219  matches i[1] with the integerLiteral() matching 1
6220</pre></td></tr>
6221
6222
6223<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>
6224<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
6225
6226Example matches a (matcher = binaryOperator(hasLHS()))
6227  a || b
6228</pre></td></tr>
6229
6230
6231<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>
6232<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
6233
6234Example matches b (matcher = binaryOperator(hasRHS()))
6235  a || b
6236</pre></td></tr>
6237
6238
6239<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>
6240<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
6241type.
6242
6243Given
6244  struct A {};
6245  A a[7];
6246  int b[7];
6247arrayType(hasElementType(builtinType()))
6248  matches "int b[7]"
6249
6250Usable 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;
6251</pre></td></tr>
6252
6253
6254<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>
6255<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6256
6257Given
6258  _Atomic(int) i;
6259  _Atomic(float) f;
6260atomicType(hasValueType(isInteger()))
6261 matches "_Atomic(int) i"
6262
6263Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6264</pre></td></tr>
6265
6266
6267<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>
6268<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6269
6270Note: There is no TypeLoc for the deduced type and thus no
6271getDeducedLoc() matcher.
6272
6273Given
6274  auto a = 1;
6275  auto b = 2.0;
6276autoType(hasDeducedType(isInteger()))
6277  matches "auto a"
6278
6279Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6280</pre></td></tr>
6281
6282
6283<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BaseUsingDecl.html">BaseUsingDecl</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>
6284<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6285
6286Given
6287  namespace X { void b(); }
6288  using X::b;
6289usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6290  matches using X::b </pre></td></tr>
6291
6292
6293<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>
6294<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6295binary operator matches.
6296</pre></td></tr>
6297
6298
6299<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>
6300<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6301
6302Example matches a (matcher = binaryOperator(hasLHS()))
6303  a || b
6304</pre></td></tr>
6305
6306
6307<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>
6308<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6309
6310Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6311                                             integerLiteral(equals(2)))
6312  1 + 2 // Match
6313  2 + 1 // Match
6314  1 + 1 // No match
6315  2 + 2 // No match
6316</pre></td></tr>
6317
6318
6319<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>
6320<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6321
6322Example matches b (matcher = binaryOperator(hasRHS()))
6323  a || b
6324</pre></td></tr>
6325
6326
6327<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>
6328<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6329
6330For example, in:
6331void foo()
6332{
6333    int arr[3];
6334    auto &amp;[f, s, t] = arr;
6335
6336    f = 42;
6337}
6338The matcher:
6339  bindingDecl(hasName("f"),
6340                forDecomposition(decompositionDecl())
6341matches 'f' in 'auto &amp;[f, s, t]'.
6342</pre></td></tr>
6343
6344
6345<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>
6346<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6347block.
6348
6349Does not match the 'this' parameter of a method.
6350
6351Given
6352  class X { void f(int x, int y, int z) {} };
6353cxxMethodDecl(hasAnyParameter(hasName("y")))
6354  matches f(int x, int y, int z) {}
6355with hasAnyParameter(...)
6356  matching int y
6357
6358For ObjectiveC, given
6359  @interface I - (void) f:(int) y; @end
6360
6361the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6362matches the declaration of method f with hasParameter
6363matching y.
6364
6365For blocks, given
6366  b = ^(int y) { printf("%d", y) };
6367
6368the matcher blockDecl(hasAnyParameter(hasName("y")))
6369matches the declaration of the block b with hasParameter
6370matching y.
6371</pre></td></tr>
6372
6373
6374<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>
6375<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6376declaration or a block.
6377
6378Given
6379  class X { void f(int x) {} };
6380cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6381  matches f(int x) {}
6382with hasParameter(...)
6383  matching int x
6384
6385For ObjectiveC, given
6386  @interface I - (void) f:(int) y; @end
6387
6388the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6389matches the declaration of method f with hasParameter
6390matching y.
6391</pre></td></tr>
6392
6393
6394<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>
6395<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6396
6397Examples:
6398  int x;
6399declaratorDecl(hasTypeLoc(loc(asString("int"))))
6400  matches int x
6401
6402auto x = int(3);
6403cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6404  matches int(3)
6405
6406struct Foo { Foo(int, int); };
6407auto x = Foo(1, 2);
6408cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6409  matches Foo(1, 2)
6410
6411Usable 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;,
6412  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;,
6413  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;,
6414  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6415  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;,
6416  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;,
6417  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;,
6418  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6419</pre></td></tr>
6420
6421
6422<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>
6423<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6424pointee matches a given matcher.
6425
6426Given
6427  int *a;
6428  int const *b;
6429  float const *f;
6430pointerType(pointee(isConstQualified(), isInteger()))
6431  matches "int const *b"
6432
6433Usable 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;,
6434  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;
6435</pre></td></tr>
6436
6437
6438<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>
6439<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6440
6441Examples:
6442  int x;
6443declaratorDecl(hasTypeLoc(loc(asString("int"))))
6444  matches int x
6445
6446auto x = int(3);
6447cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6448  matches int(3)
6449
6450struct Foo { Foo(int, int); };
6451auto x = Foo(1, 2);
6452cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6453  matches Foo(1, 2)
6454
6455Usable 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;,
6456  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;,
6457  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;,
6458  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6459  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;,
6460  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;,
6461  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;,
6462  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6463</pre></td></tr>
6464
6465
6466<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>
6467<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6468declaration's type.
6469
6470In case of a value declaration (for example a variable declaration),
6471this resolves one layer of indirection. For example, in the value
6472declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6473X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6474declaration of x.
6475
6476Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6477            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6478            and friend class X (matcher = friendDecl(hasType("X"))
6479            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6480                                              cxxRecordDecl(hasName("X"))))
6481 class X {};
6482 void y(X &amp;x) { x; X z; }
6483 class Y { friend class X; };
6484 class Z : public virtual X {};
6485
6486Example matches class Derived
6487(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6488class Base {};
6489class Derived : Base {};
6490
6491Usable 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;,
6492Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6493</pre></td></tr>
6494
6495
6496<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>
6497<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6498matcher.
6499
6500Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6501            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6502            and U (matcher = typedefDecl(hasType(asString("int")))
6503            and friend class X (matcher = friendDecl(hasType("X"))
6504            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6505                                              asString("class X")))
6506 class X {};
6507 void y(X &amp;x) { x; X z; }
6508 typedef int U;
6509 class Y { friend class X; };
6510 class Z : public virtual X {};
6511</pre></td></tr>
6512
6513
6514<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>
6515<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6516
6517Given
6518  void f(int i);
6519  int y;
6520  f(y);
6521callExpr(
6522  forEachArgumentWithParam(
6523    declRefExpr(to(varDecl(hasName("y")))),
6524    parmVarDecl(hasType(isInteger()))
6525))
6526  matches f(y);
6527with declRefExpr(...)
6528  matching int y
6529and parmVarDecl(...)
6530  matching int i
6531</pre></td></tr>
6532
6533
6534<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>
6535<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6536CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6537it works on calls through function pointers as well.
6538
6539The difference is, that function pointers do not provide access to a
6540ParmVarDecl, but only the QualType for each argument.
6541
6542Given
6543  void f(int i);
6544  int y;
6545  f(y);
6546  void (*f_ptr)(int) = f;
6547  f_ptr(y);
6548callExpr(
6549  forEachArgumentWithParamType(
6550    declRefExpr(to(varDecl(hasName("y")))),
6551    qualType(isInteger()).bind("type)
6552))
6553  matches f(y) and f_ptr(y)
6554with declRefExpr(...)
6555  matching int y
6556and qualType(...)
6557  matching int
6558</pre></td></tr>
6559
6560
6561<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>
6562<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6563expression, or an ObjC-message-send expression.
6564
6565Given
6566  void x(int, int, int) { int y; x(1, y, 42); }
6567callExpr(hasAnyArgument(declRefExpr()))
6568  matches x(1, y, 42)
6569with hasAnyArgument(...)
6570  matching y
6571
6572For ObjectiveC, given
6573  @interface I - (void) f:(int) y; @end
6574  void foo(I *i) { [i f:12]; }
6575objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6576  matches [i f:12]
6577</pre></td></tr>
6578
6579
6580<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>
6581<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6582call expression.
6583
6584Example matches y in x(y)
6585    (matcher = callExpr(hasArgument(0, declRefExpr())))
6586  void x(int) { int y; x(y); }
6587</pre></td></tr>
6588
6589
6590<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>
6591<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6592matches the given matcher.
6593
6594The associated declaration is:
6595- for type nodes, the declaration of the underlying type
6596- for CallExpr, the declaration of the callee
6597- for MemberExpr, the declaration of the referenced member
6598- for CXXConstructExpr, the declaration of the constructor
6599- for CXXNewExpr, the declaration of the operator new
6600- for ObjCIvarExpr, the declaration of the ivar
6601
6602For type nodes, hasDeclaration will generally match the declaration of the
6603sugared type. Given
6604  class X {};
6605  typedef X Y;
6606  Y y;
6607in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6608typedefDecl. A common use case is to match the underlying, desugared type.
6609This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6610  varDecl(hasType(hasUnqualifiedDesugaredType(
6611      recordType(hasDeclaration(decl())))))
6612In this matcher, the decl will match the CXXRecordDecl of class X.
6613
6614Usable 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;,
6615  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;,
6616  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;,
6617  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;,
6618  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;,
6619  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;,
6620  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6621</pre></td></tr>
6622
6623
6624<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>
6625<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6626
6627Given
6628  class A { A() : i(42), j(42) {} int i; int j; };
6629cxxConstructorDecl(forEachConstructorInitializer(
6630  forField(decl().bind("x"))
6631))
6632  will trigger two matches, binding for 'i' and 'j' respectively.
6633</pre></td></tr>
6634
6635
6636<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>
6637<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6638
6639Given
6640  struct Foo {
6641    Foo() : foo_(1) { }
6642    int foo_;
6643  };
6644cxxRecordDecl(has(cxxConstructorDecl(
6645  hasAnyConstructorInitializer(anything())
6646)))
6647  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6648</pre></td></tr>
6649
6650
6651<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>
6652<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6653
6654Given
6655  struct Foo {
6656    Foo() : foo_(1) { }
6657    int foo_;
6658  };
6659cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6660    forField(hasName("foo_"))))))
6661  matches Foo
6662with forField matching foo_
6663</pre></td></tr>
6664
6665
6666<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>
6667<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6668
6669Examples:
6670  int x;
6671declaratorDecl(hasTypeLoc(loc(asString("int"))))
6672  matches int x
6673
6674auto x = int(3);
6675cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6676  matches int(3)
6677
6678struct Foo { Foo(int, int); };
6679auto x = Foo(1, 2);
6680cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6681  matches Foo(1, 2)
6682
6683Usable 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;,
6684  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;,
6685  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;,
6686  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6687  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;,
6688  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;,
6689  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;,
6690  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6691</pre></td></tr>
6692
6693
6694<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>
6695<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6696
6697Given
6698  struct Foo {
6699    Foo() : foo_(1) { }
6700    int foo_;
6701  };
6702cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6703    withInitializer(integerLiteral(equals(1)))))))
6704  matches Foo
6705with withInitializer matching (1)
6706</pre></td></tr>
6707
6708
6709<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>
6710<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6711given matcher. Implicit object expressions are included; that is, it matches
6712use of implicit `this`.
6713
6714Given
6715  struct X {
6716    int m;
6717    int f(X x) { x.m; return m; }
6718  };
6719memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6720  matches `x.m`, but not `m`; however,
6721memberExpr(hasObjectExpression(hasType(pointsTo(
6722     cxxRecordDecl(hasName("X"))))))
6723  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6724</pre></td></tr>
6725
6726
6727<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>
6728<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6729
6730
6731<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>
6732<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6733
6734Given:
6735 void foo() {
6736   if (int i = foobar(); i &gt; 0) {}
6737   switch (int i = foobar(); i) {}
6738   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6739 }
6740 void bar() {
6741   if (foobar() &gt; 0) {}
6742   switch (foobar()) {}
6743   for (auto&amp; x : get_range()) {}
6744 }
6745ifStmt(hasInitStatement(anything()))
6746  matches the if statement in foo but not in bar.
6747switchStmt(hasInitStatement(anything()))
6748  matches the switch statement in foo but not in bar.
6749cxxForRangeStmt(hasInitStatement(anything()))
6750  matches the range for statement in foo but not in bar.
6751</pre></td></tr>
6752
6753
6754<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>
6755<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6756
6757Example:
6758    forStmt(hasLoopVariable(anything()))
6759matches 'int x' in
6760    for (int x : a) { }
6761</pre></td></tr>
6762
6763
6764<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>
6765<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6766
6767Example:
6768    forStmt(hasRangeInit(anything()))
6769matches 'a' in
6770    for (int x : a) { }
6771</pre></td></tr>
6772
6773
6774<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>
6775<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6776
6777Examples:
6778  int x;
6779declaratorDecl(hasTypeLoc(loc(asString("int"))))
6780  matches int x
6781
6782auto x = int(3);
6783cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6784  matches int(3)
6785
6786struct Foo { Foo(int, int); };
6787auto x = Foo(1, 2);
6788cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6789  matches Foo(1, 2)
6790
6791Usable 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;,
6792  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;,
6793  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;,
6794  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6795  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;,
6796  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;,
6797  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;,
6798  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6799</pre></td></tr>
6800
6801
6802<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>
6803<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6804`on`, matches the argument directly without stripping away anything.
6805
6806Given
6807  class Y { public: void m(); };
6808  Y g();
6809  class X : public Y { void g(); };
6810  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6811cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6812    cxxRecordDecl(hasName("Y")))))
6813  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6814cxxMemberCallExpr(on(callExpr()))
6815  does not match `(g()).m()`, because the parens are not ignored.
6816
6817FIXME: Overload to allow directly matching types?
6818</pre></td></tr>
6819
6820
6821<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>
6822<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6823stripping off any parentheses or implicit casts.
6824
6825Given
6826  class Y { public: void m(); };
6827  Y g();
6828  class X : public Y {};
6829  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6830cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6831  matches `y.m()` and `(g()).m()`.
6832cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6833  matches `x.m()`.
6834cxxMemberCallExpr(on(callExpr()))
6835  matches `(g()).m()`.
6836
6837FIXME: Overload to allow directly matching types?
6838</pre></td></tr>
6839
6840
6841<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>
6842<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6843</pre></td></tr>
6844
6845
6846<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>
6847<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6848matches the InnerMatcher, or is a pointer to a type that matches the
6849InnerMatcher.
6850
6851Given
6852  class Y { public: void m(); };
6853  class X : public Y { void g(); };
6854  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6855cxxMemberCallExpr(thisPointerType(hasDeclaration(
6856    cxxRecordDecl(hasName("Y")))))
6857  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6858cxxMemberCallExpr(thisPointerType(hasDeclaration(
6859    cxxRecordDecl(hasName("X")))))
6860  matches `x.g()`.
6861</pre></td></tr>
6862
6863
6864<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>
6865<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6866produce multiple matches.
6867
6868Given
6869  class A { virtual void f(); };
6870  class B : public A { void f(); };
6871  class C : public B { void f(); };
6872cxxMethodDecl(ofClass(hasName("C")),
6873              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6874  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6875  that B::f is not overridden by C::f).
6876
6877The check can produce multiple matches in case of multiple inheritance, e.g.
6878  class A1 { virtual void f(); };
6879  class A2 { virtual void f(); };
6880  class C : public A1, public A2 { void f(); };
6881cxxMethodDecl(ofClass(hasName("C")),
6882              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6883  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6884  once with "b" binding "A2::f" and "d" binding "C::f".
6885</pre></td></tr>
6886
6887
6888<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>
6889<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6890belongs to.
6891
6892FIXME: Generalize this for other kinds of declarations.
6893FIXME: What other kind of declarations would we need to generalize
6894this to?
6895
6896Example matches A() in the last line
6897    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6898        ofClass(hasName("A"))))))
6899  class A {
6900   public:
6901    A();
6902  };
6903  A a = A();
6904</pre></td></tr>
6905
6906
6907<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>
6908<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6909
6910Given:
6911  MyClass *p1 = new (Storage) MyClass();
6912cxxNewExpr(hasAnyPlacementArg(anything()))
6913  matches the expression 'new (Storage, 16) MyClass()'.
6914</pre></td></tr>
6915
6916
6917<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>
6918<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6919
6920Given:
6921  MyClass *p1 = new MyClass[10];
6922cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6923  matches the expression 'new MyClass[10]'.
6924</pre></td></tr>
6925
6926
6927<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>
6928<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6929matches the given matcher.
6930
6931The associated declaration is:
6932- for type nodes, the declaration of the underlying type
6933- for CallExpr, the declaration of the callee
6934- for MemberExpr, the declaration of the referenced member
6935- for CXXConstructExpr, the declaration of the constructor
6936- for CXXNewExpr, the declaration of the operator new
6937- for ObjCIvarExpr, the declaration of the ivar
6938
6939For type nodes, hasDeclaration will generally match the declaration of the
6940sugared type. Given
6941  class X {};
6942  typedef X Y;
6943  Y y;
6944in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6945typedefDecl. A common use case is to match the underlying, desugared type.
6946This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6947  varDecl(hasType(hasUnqualifiedDesugaredType(
6948      recordType(hasDeclaration(decl())))))
6949In this matcher, the decl will match the CXXRecordDecl of class X.
6950
6951Usable 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;,
6952  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;,
6953  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;,
6954  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;,
6955  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;,
6956  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;,
6957  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6958</pre></td></tr>
6959
6960
6961<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>
6962<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6963
6964Given:
6965  MyClass *p1 = new (Storage, 16) MyClass();
6966cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6967  matches the expression 'new (Storage, 16) MyClass()'.
6968</pre></td></tr>
6969
6970
6971<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>
6972<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6973
6974Examples:
6975  int x;
6976declaratorDecl(hasTypeLoc(loc(asString("int"))))
6977  matches int x
6978
6979auto x = int(3);
6980cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6981  matches int(3)
6982
6983struct Foo { Foo(int, int); };
6984auto x = Foo(1, 2);
6985cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6986  matches Foo(1, 2)
6987
6988Usable 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;,
6989  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;,
6990  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;,
6991  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6992  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;,
6993  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;,
6994  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;,
6995  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6996</pre></td></tr>
6997
6998
6999<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>
7000<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
7001binary operator matches.
7002</pre></td></tr>
7003
7004
7005<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>
7006<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
7007
7008Example matches a (matcher = binaryOperator(hasLHS()))
7009  a || b
7010</pre></td></tr>
7011
7012
7013<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>
7014<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
7015
7016Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
7017                                             integerLiteral(equals(2)))
7018  1 + 2 // Match
7019  2 + 1 // Match
7020  1 + 1 // No match
7021  2 + 2 // No match
7022</pre></td></tr>
7023
7024
7025<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>
7026<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
7027
7028Example matches b (matcher = binaryOperator(hasRHS()))
7029  a || b
7030</pre></td></tr>
7031
7032
7033<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>
7034<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
7035
7036Example matches true (matcher = hasUnaryOperand(
7037                                  cxxBoolLiteral(equals(true))))
7038  !true
7039</pre></td></tr>
7040
7041
7042<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>
7043<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
7044
7045Example:
7046matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
7047  class Foo;
7048  class Bar : Foo {};
7049  class Baz : Bar {};
7050  class SpecialBase;
7051  class Proxy : SpecialBase {};  // matches Proxy
7052  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
7053
7054FIXME: Refactor this and isDerivedFrom to reuse implementation.
7055</pre></td></tr>
7056
7057
7058<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>
7059<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
7060
7061Example:
7062matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
7063  class Foo;
7064  class Bar : Foo {};
7065  class Baz : Bar {};
7066  class SpecialBase;
7067  class Proxy : SpecialBase {};  // matches Proxy
7068  class IndirectlyDerived : Proxy {};  // doesn't match
7069</pre></td></tr>
7070
7071
7072<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>
7073<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
7074
7075Given:
7076  class A { void func(); };
7077  class B { void member(); };
7078
7079cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
7080A but not B.
7081</pre></td></tr>
7082
7083
7084<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>
7085<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
7086matching Base, or Objective-C classes that directly or indirectly
7087subclass a class matching Base.
7088
7089Note that a class is not considered to be derived from itself.
7090
7091Example matches Y, Z, C (Base == hasName("X"))
7092  class X;
7093  class Y : public X {};  // directly derived
7094  class Z : public Y {};  // indirectly derived
7095  typedef X A;
7096  typedef A B;
7097  class C : public B {};  // derived from a typedef of X
7098
7099In the following example, Bar matches isDerivedFrom(hasName("X")):
7100  class Foo;
7101  typedef Foo X;
7102  class Bar : public Foo {};  // derived from a type that X is a typedef of
7103
7104In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7105  @interface NSObject @end
7106  @interface Bar : NSObject @end
7107
7108Usable 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;
7109</pre></td></tr>
7110
7111
7112<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>
7113<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7114matching Base.
7115
7116Note that a class is not considered to be derived from itself.
7117
7118Example matches Y, C (Base == hasName("X"))
7119  class X;
7120  class Y : public X {};  // directly derived
7121  class Z : public Y {};  // indirectly derived
7122  typedef X A;
7123  typedef A B;
7124  class C : public B {};  // derived from a typedef of X
7125
7126In the following example, Bar matches isDerivedFrom(hasName("X")):
7127  class Foo;
7128  typedef Foo X;
7129  class Bar : public Foo {};  // derived from a type that X is a typedef of
7130</pre></td></tr>
7131
7132
7133<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>
7134<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7135match Base.
7136</pre></td></tr>
7137
7138
7139<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>
7140<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
7141binary operator matches.
7142</pre></td></tr>
7143
7144
7145<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>
7146<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
7147
7148Example matches a (matcher = binaryOperator(hasLHS()))
7149  a || b
7150</pre></td></tr>
7151
7152
7153<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>
7154<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
7155
7156Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
7157                                             integerLiteral(equals(2)))
7158  1 + 2 // Match
7159  2 + 1 // Match
7160  1 + 1 // No match
7161  2 + 2 // No match
7162</pre></td></tr>
7163
7164
7165<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>
7166<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7167
7168Example matches b (matcher = binaryOperator(hasRHS()))
7169  a || b
7170</pre></td></tr>
7171
7172
7173<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>
7174<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7175
7176Examples:
7177  int x;
7178declaratorDecl(hasTypeLoc(loc(asString("int"))))
7179  matches int x
7180
7181auto x = int(3);
7182cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7183  matches int(3)
7184
7185struct Foo { Foo(int, int); };
7186auto x = Foo(1, 2);
7187cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7188  matches Foo(1, 2)
7189
7190Usable 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;,
7191  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;,
7192  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;,
7193  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7194  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;,
7195  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;,
7196  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;,
7197  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7198</pre></td></tr>
7199
7200
7201<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>
7202<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7203expression, or an ObjC-message-send expression.
7204
7205Given
7206  void x(int, int, int) { int y; x(1, y, 42); }
7207callExpr(hasAnyArgument(declRefExpr()))
7208  matches x(1, y, 42)
7209with hasAnyArgument(...)
7210  matching y
7211
7212For ObjectiveC, given
7213  @interface I - (void) f:(int) y; @end
7214  void foo(I *i) { [i f:12]; }
7215objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7216  matches [i f:12]
7217</pre></td></tr>
7218
7219
7220<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>
7221<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7222call expression.
7223
7224Example matches y in x(y)
7225    (matcher = callExpr(hasArgument(0, declRefExpr())))
7226  void x(int) { int y; x(y); }
7227</pre></td></tr>
7228
7229
7230<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>
7231<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7232
7233Examples:
7234  int x;
7235declaratorDecl(hasTypeLoc(loc(asString("int"))))
7236  matches int x
7237
7238auto x = int(3);
7239cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7240  matches int(3)
7241
7242struct Foo { Foo(int, int); };
7243auto x = Foo(1, 2);
7244cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7245  matches Foo(1, 2)
7246
7247Usable 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;,
7248  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;,
7249  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;,
7250  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7251  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;,
7252  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;,
7253  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;,
7254  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7255</pre></td></tr>
7256
7257
7258<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>
7259<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7260given matcher.
7261
7262Example matches y.x() (matcher = callExpr(callee(
7263                                   cxxMethodDecl(hasName("x")))))
7264  class Y { public: void x(); };
7265  void z() { Y y; y.x(); }
7266</pre></td></tr>
7267
7268
7269<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>
7270<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7271
7272Given
7273  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
7274  void f() { f(); }
7275callExpr(callee(expr()))
7276  matches this-&gt;x(), x(), y.x(), f()
7277with callee(...)
7278  matching this-&gt;x, x, y.x, f respectively
7279
7280Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7281because this introduces ambiguous overloads with calls to Callee taking a
7282internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7283implemented in terms of implicit casts.
7284</pre></td></tr>
7285
7286
7287<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>
7288<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7289
7290Given
7291  void f(int i);
7292  int y;
7293  f(y);
7294callExpr(
7295  forEachArgumentWithParam(
7296    declRefExpr(to(varDecl(hasName("y")))),
7297    parmVarDecl(hasType(isInteger()))
7298))
7299  matches f(y);
7300with declRefExpr(...)
7301  matching int y
7302and parmVarDecl(...)
7303  matching int i
7304</pre></td></tr>
7305
7306
7307<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>
7308<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7309CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7310it works on calls through function pointers as well.
7311
7312The difference is, that function pointers do not provide access to a
7313ParmVarDecl, but only the QualType for each argument.
7314
7315Given
7316  void f(int i);
7317  int y;
7318  f(y);
7319  void (*f_ptr)(int) = f;
7320  f_ptr(y);
7321callExpr(
7322  forEachArgumentWithParamType(
7323    declRefExpr(to(varDecl(hasName("y")))),
7324    qualType(isInteger()).bind("type)
7325))
7326  matches f(y) and f_ptr(y)
7327with declRefExpr(...)
7328  matching int y
7329and qualType(...)
7330  matching int
7331</pre></td></tr>
7332
7333
7334<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>
7335<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7336expression, or an ObjC-message-send expression.
7337
7338Given
7339  void x(int, int, int) { int y; x(1, y, 42); }
7340callExpr(hasAnyArgument(declRefExpr()))
7341  matches x(1, y, 42)
7342with hasAnyArgument(...)
7343  matching y
7344
7345For ObjectiveC, given
7346  @interface I - (void) f:(int) y; @end
7347  void foo(I *i) { [i f:12]; }
7348objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7349  matches [i f:12]
7350</pre></td></tr>
7351
7352
7353<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>
7354<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7355call expression.
7356
7357Example matches y in x(y)
7358    (matcher = callExpr(hasArgument(0, declRefExpr())))
7359  void x(int) { int y; x(y); }
7360</pre></td></tr>
7361
7362
7363<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>
7364<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7365matches the given matcher.
7366
7367The associated declaration is:
7368- for type nodes, the declaration of the underlying type
7369- for CallExpr, the declaration of the callee
7370- for MemberExpr, the declaration of the referenced member
7371- for CXXConstructExpr, the declaration of the constructor
7372- for CXXNewExpr, the declaration of the operator new
7373- for ObjCIvarExpr, the declaration of the ivar
7374
7375For type nodes, hasDeclaration will generally match the declaration of the
7376sugared type. Given
7377  class X {};
7378  typedef X Y;
7379  Y y;
7380in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7381typedefDecl. A common use case is to match the underlying, desugared type.
7382This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7383  varDecl(hasType(hasUnqualifiedDesugaredType(
7384      recordType(hasDeclaration(decl())))))
7385In this matcher, the decl will match the CXXRecordDecl of class X.
7386
7387Usable 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;,
7388  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;,
7389  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;,
7390  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;,
7391  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;,
7392  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;,
7393  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7394</pre></td></tr>
7395
7396
7397<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>
7398<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7399extension, matches the constant given in the statement.
7400
7401Given
7402  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7403caseStmt(hasCaseConstant(integerLiteral()))
7404  matches "case 1:"
7405</pre></td></tr>
7406
7407
7408<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>
7409<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7410or opaque value's source expression matches the given matcher.
7411
7412Example 1: matches "a string"
7413(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7414class URL { URL(string); };
7415URL url = "a string";
7416
7417Example 2: matches 'b' (matcher =
7418opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7419int a = b ?: 1;
7420</pre></td></tr>
7421
7422
7423<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('forEachTemplateArgument0')"><a name="forEachTemplateArgument0Anchor">forEachTemplateArgument</a></td><td>clang::ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
7424<tr><td colspan="4" class="doc" id="forEachTemplateArgument0"><pre>Matches classTemplateSpecialization, templateSpecializationType and
7425functionDecl nodes where the template argument matches the inner matcher.
7426This matcher may produce multiple matches.
7427
7428Given
7429  template &lt;typename T, unsigned N, unsigned M&gt;
7430  struct Matrix {};
7431
7432  constexpr unsigned R = 2;
7433  Matrix&lt;int, R * 2, R * 4&gt; M;
7434
7435  template &lt;typename T, typename U&gt;
7436  void f(T&amp;&amp; t, U&amp;&amp; u) {}
7437
7438  bool B = false;
7439  f(R, B);
7440templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
7441  matches twice, with expr() matching 'R * 2' and 'R * 4'
7442functionDecl(forEachTemplateArgument(refersToType(builtinType())))
7443  matches the specialization f&lt;unsigned, bool&gt; twice, for 'unsigned'
7444  and 'bool'
7445</pre></td></tr>
7446
7447
7448<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>
7449<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7450functionDecl that have at least one TemplateArgument matching the given
7451InnerMatcher.
7452
7453Given
7454  template&lt;typename T&gt; class A {};
7455  template&lt;&gt; class A&lt;double&gt; {};
7456  A&lt;int&gt; a;
7457
7458  template&lt;typename T&gt; f() {};
7459  void func() { f&lt;int&gt;(); };
7460
7461classTemplateSpecializationDecl(hasAnyTemplateArgument(
7462    refersToType(asString("int"))))
7463  matches the specialization A&lt;int&gt;
7464
7465functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7466  matches the specialization f&lt;int&gt;
7467</pre></td></tr>
7468
7469
7470<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>
7471<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7472
7473Given
7474  template&lt;typename T&gt; class A {}; #1
7475  template&lt;&gt; class A&lt;int&gt; {}; #2
7476classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7477  matches '#2' with classTemplateDecl() matching the class template
7478  declaration of 'A' at #1.
7479</pre></td></tr>
7480
7481
7482<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>
7483<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7484functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7485
7486Given
7487  template&lt;typename T, typename U&gt; class A {};
7488  A&lt;bool, int&gt; b;
7489  A&lt;int, bool&gt; c;
7490
7491  template&lt;typename T&gt; void f() {}
7492  void func() { f&lt;int&gt;(); };
7493classTemplateSpecializationDecl(hasTemplateArgument(
7494    1, refersToType(asString("int"))))
7495  matches the specialization A&lt;bool, int&gt;
7496
7497functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7498  matches the specialization f&lt;int&gt;
7499</pre></td></tr>
7500
7501
7502<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>
7503<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7504
7505Examples:
7506  int x;
7507declaratorDecl(hasTypeLoc(loc(asString("int"))))
7508  matches int x
7509
7510auto x = int(3);
7511cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7512  matches int(3)
7513
7514struct Foo { Foo(int, int); };
7515auto x = Foo(1, 2);
7516cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7517  matches Foo(1, 2)
7518
7519Usable 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;,
7520  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;,
7521  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;,
7522  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7523  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;,
7524  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;,
7525  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;,
7526  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7527</pre></td></tr>
7528
7529
7530<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>
7531<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7532type.
7533
7534Given
7535  struct A {};
7536  A a[7];
7537  int b[7];
7538arrayType(hasElementType(builtinType()))
7539  matches "int b[7]"
7540
7541Usable 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;
7542</pre></td></tr>
7543
7544
7545<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>
7546<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7547
7548Examples:
7549  int x;
7550declaratorDecl(hasTypeLoc(loc(asString("int"))))
7551  matches int x
7552
7553auto x = int(3);
7554cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7555  matches int(3)
7556
7557struct Foo { Foo(int, int); };
7558auto x = Foo(1, 2);
7559cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7560  matches Foo(1, 2)
7561
7562Usable 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;,
7563  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;,
7564  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;,
7565  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7566  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;,
7567  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;,
7568  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;,
7569  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7570</pre></td></tr>
7571
7572
7573<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>
7574<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7575a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7576
7577Given
7578  { {}; 1+2; }
7579hasAnySubstatement(compoundStmt())
7580  matches '{ {}; 1+2; }'
7581with compoundStmt()
7582  matching '{}'
7583</pre></td></tr>
7584
7585
7586<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>
7587<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7588</pre></td></tr>
7589
7590
7591<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>
7592<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7593matches the given matcher.
7594
7595The associated declaration is:
7596- for type nodes, the declaration of the underlying type
7597- for CallExpr, the declaration of the callee
7598- for MemberExpr, the declaration of the referenced member
7599- for CXXConstructExpr, the declaration of the constructor
7600- for CXXNewExpr, the declaration of the operator new
7601- for ObjCIvarExpr, the declaration of the ivar
7602
7603For type nodes, hasDeclaration will generally match the declaration of the
7604sugared type. Given
7605  class X {};
7606  typedef X Y;
7607  Y y;
7608in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7609typedefDecl. A common use case is to match the underlying, desugared type.
7610This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7611  varDecl(hasType(hasUnqualifiedDesugaredType(
7612      recordType(hasDeclaration(decl())))))
7613In this matcher, the decl will match the CXXRecordDecl of class X.
7614
7615Usable 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;,
7616  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;,
7617  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;,
7618  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;,
7619  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;,
7620  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;,
7621  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7622</pre></td></tr>
7623
7624
7625<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgumentLoc0')"><a name="hasTemplateArgumentLoc0Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
7626<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th
7627`TemplateArgumentLoc` matches the given `InnerMatcher`.
7628
7629Given
7630  template&lt;typename T, typename U&gt; class A {};
7631  A&lt;double, int&gt; b;
7632  A&lt;int, double&gt; c;
7633varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
7634  hasTypeLoc(loc(asString("double")))))))
7635  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
7636</pre></td></tr>
7637
7638
7639<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; Inner</td></tr>
7640<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches if a node refers to a declaration through a specific
7641using shadow declaration.
7642
7643Examples:
7644  namespace a { int f(); }
7645  using a::f;
7646  int x = f();
7647declRefExpr(throughUsingDecl(anything()))
7648  matches f
7649
7650  namespace a { class X{}; }
7651  using a::X;
7652  X x;
7653typeLoc(loc(usingType(throughUsingDecl(anything()))))
7654  matches X
7655
7656Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>&gt;
7657</pre></td></tr>
7658
7659
7660<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>
7661<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7662specified matcher.
7663
7664Example matches x in if(x)
7665    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7666  bool x;
7667  if (x) {}
7668</pre></td></tr>
7669
7670
7671<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>
7672<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7673
7674Note that this does not work for global declarations because the AST
7675breaks up multiple-declaration DeclStmt's into multiple single-declaration
7676DeclStmt's.
7677Example: Given non-global declarations
7678  int a, b = 0;
7679  int c;
7680  int d = 2, e;
7681declStmt(containsDeclaration(
7682      0, varDecl(hasInitializer(anything()))))
7683  matches only 'int d = 2, e;', and
7684declStmt(containsDeclaration(1, varDecl()))
7685  matches 'int a, b = 0' as well as 'int d = 2, e;'
7686  but 'int c;' is not matched.
7687</pre></td></tr>
7688
7689
7690<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>
7691<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7692
7693Given
7694  int a, b;
7695  int c;
7696declStmt(hasSingleDecl(anything()))
7697  matches 'int c;' but not 'int a, b;'.
7698</pre></td></tr>
7699
7700
7701<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>
7702<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7703
7704Examples:
7705  int x;
7706declaratorDecl(hasTypeLoc(loc(asString("int"))))
7707  matches int x
7708
7709auto x = int(3);
7710cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7711  matches int(3)
7712
7713struct Foo { Foo(int, int); };
7714auto x = Foo(1, 2);
7715cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7716  matches Foo(1, 2)
7717
7718Usable 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;,
7719  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;,
7720  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;,
7721  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7722  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;,
7723  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;,
7724  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;,
7725  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7726</pre></td></tr>
7727
7728
7729<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>
7730<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7731Decl, matches InnerMatcher.
7732
7733Given
7734  namespace N {
7735    namespace M {
7736      class D {};
7737    }
7738  }
7739
7740cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7741declaration of class D.
7742</pre></td></tr>
7743
7744
7745<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>
7746<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType or UsingType nodes to find the underlying type.
7747
7748Given
7749  decltype(1) a = 1;
7750  decltype(2.0) b = 2.0;
7751decltypeType(hasUnderlyingType(isInteger()))
7752  matches the type of "a"
7753
7754Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>&gt;
7755</pre></td></tr>
7756
7757
7758<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>
7759<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7760
7761For example, in:
7762void foo()
7763{
7764    int arr[3];
7765    auto &amp;[f, s, t] = arr;
7766
7767    f = 42;
7768}
7769The matcher:
7770  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7771matches the decomposition decl with 'f' bound to "fBinding".
7772</pre></td></tr>
7773
7774
7775<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>
7776<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7777
7778For example, in:
7779void foo()
7780{
7781    int arr[3];
7782    auto &amp;[f, s, t] = arr;
7783
7784    f = 42;
7785}
7786The matcher:
7787  decompositionDecl(hasBinding(0,
7788  bindingDecl(hasName("f").bind("fBinding"))))
7789matches the decomposition decl with 'f' bound to "fBinding".
7790</pre></td></tr>
7791
7792
7793<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>
7794<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7795
7796
7797<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>
7798<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7799switch statement or conditional operator.
7800
7801Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7802  if (true) {}
7803</pre></td></tr>
7804
7805
7806<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasNamedTypeLoc0')"><a name="hasNamedTypeLoc0Anchor">hasNamedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
7807<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
7808`InnerMatcher`.
7809
7810Given
7811  template &lt;typename T&gt;
7812  class C {};
7813  class C&lt;int&gt; c;
7814
7815  class D {};
7816  class D d;
7817elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
7818  matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
7819</pre></td></tr>
7820
7821
7822<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>
7823<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7824matches InnerMatcher if the qualifier exists.
7825
7826Given
7827  namespace N {
7828    namespace M {
7829      class D {};
7830    }
7831  }
7832  N::M::D d;
7833
7834elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7835matches the type of the variable declaration of d.
7836</pre></td></tr>
7837
7838
7839<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>
7840<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7841
7842Given
7843  namespace N {
7844    namespace M {
7845      class D {};
7846    }
7847  }
7848  N::M::D d;
7849
7850elaboratedType(namesType(recordType(
7851hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7852declaration of d.
7853</pre></td></tr>
7854
7855
7856<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>
7857<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7858matches the given matcher.
7859
7860The associated declaration is:
7861- for type nodes, the declaration of the underlying type
7862- for CallExpr, the declaration of the callee
7863- for MemberExpr, the declaration of the referenced member
7864- for CXXConstructExpr, the declaration of the constructor
7865- for CXXNewExpr, the declaration of the operator new
7866- for ObjCIvarExpr, the declaration of the ivar
7867
7868For type nodes, hasDeclaration will generally match the declaration of the
7869sugared type. Given
7870  class X {};
7871  typedef X Y;
7872  Y y;
7873in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7874typedefDecl. A common use case is to match the underlying, desugared type.
7875This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7876  varDecl(hasType(hasUnqualifiedDesugaredType(
7877      recordType(hasDeclaration(decl())))))
7878In this matcher, the decl will match the CXXRecordDecl of class X.
7879
7880Usable 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;,
7881  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;,
7882  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;,
7883  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;,
7884  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;,
7885  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;,
7886  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7887</pre></td></tr>
7888
7889
7890<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>
7891<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7892
7893(Note: Clang's AST refers to other conversions as "casts" too, and calls
7894actual casts "explicit" casts.)
7895</pre></td></tr>
7896
7897
7898<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>
7899<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7900
7901Examples:
7902  int x;
7903declaratorDecl(hasTypeLoc(loc(asString("int"))))
7904  matches int x
7905
7906auto x = int(3);
7907cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7908  matches int(3)
7909
7910struct Foo { Foo(int, int); };
7911auto x = Foo(1, 2);
7912cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7913  matches Foo(1, 2)
7914
7915Usable 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;,
7916  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;,
7917  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;,
7918  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7919  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;,
7920  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;,
7921  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;,
7922  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7923</pre></td></tr>
7924
7925
7926<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>
7927<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7928declaration's type.
7929
7930In case of a value declaration (for example a variable declaration),
7931this resolves one layer of indirection. For example, in the value
7932declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7933X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7934declaration of x.
7935
7936Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7937            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7938            and friend class X (matcher = friendDecl(hasType("X"))
7939            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7940                                              cxxRecordDecl(hasName("X"))))
7941 class X {};
7942 void y(X &amp;x) { x; X z; }
7943 class Y { friend class X; };
7944 class Z : public virtual X {};
7945
7946Example matches class Derived
7947(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7948class Base {};
7949class Derived : Base {};
7950
7951Usable 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;,
7952Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7953</pre></td></tr>
7954
7955
7956<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>
7957<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7958matcher.
7959
7960Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7961            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7962            and U (matcher = typedefDecl(hasType(asString("int")))
7963            and friend class X (matcher = friendDecl(hasType("X"))
7964            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7965                                              asString("class X")))
7966 class X {};
7967 void y(X &amp;x) { x; X z; }
7968 typedef int U;
7969 class Y { friend class X; };
7970 class Z : public virtual X {};
7971</pre></td></tr>
7972
7973
7974<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>
7975<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7976elidable constructor and other corresponding bookkeeping nodes.
7977
7978In C++17, elidable copy constructors are no longer being generated in the
7979AST as it is not permitted by the standard. They are, however, part of the
7980AST in C++14 and earlier. So, a matcher must abstract over these differences
7981to work in all language modes. This matcher skips elidable constructor-call
7982AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7983various implicit nodes inside the constructor calls, all of which will not
7984appear in the C++17 AST.
7985
7986Given
7987
7988struct H {};
7989H G();
7990void f() {
7991  H D = G();
7992}
7993
7994``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7995matches ``H D = G()`` in C++11 through C++17 (and beyond).
7996</pre></td></tr>
7997
7998
7999<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>
8000<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
8001are stripped off.
8002
8003Parentheses and explicit casts are not discarded.
8004Given
8005  int arr[5];
8006  int a = 0;
8007  char b = 0;
8008  const int c = a;
8009  int *d = arr;
8010  long e = (long) 0l;
8011The matchers
8012   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
8013   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
8014would match the declarations for a, b, c, and d, but not e.
8015While
8016   varDecl(hasInitializer(integerLiteral()))
8017   varDecl(hasInitializer(declRefExpr()))
8018only match the declarations for a.
8019</pre></td></tr>
8020
8021
8022<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>
8023<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
8024nodes are stripped off.
8025
8026Parentheses and explicit casts are not discarded.
8027Given
8028  class C {};
8029  C a = C();
8030  C b;
8031  C c = b;
8032The matchers
8033   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
8034would match the declarations for a, b, and c.
8035While
8036   varDecl(hasInitializer(cxxConstructExpr()))
8037only match the declarations for b and c.
8038</pre></td></tr>
8039
8040
8041<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>
8042<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
8043casts are stripped off.
8044
8045Implicit and non-C Style casts are also discarded.
8046Given
8047  int a = 0;
8048  char b = (0);
8049  void* c = reinterpret_cast&lt;char*&gt;(0);
8050  char d = char(0);
8051The matcher
8052   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
8053would match the declarations for a, b, c, and d.
8054while
8055   varDecl(hasInitializer(integerLiteral()))
8056only match the declaration for a.
8057</pre></td></tr>
8058
8059
8060<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>
8061<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
8062parentheses are stripped off.
8063
8064Explicit casts are not discarded.
8065Given
8066  int arr[5];
8067  int a = 0;
8068  char b = (0);
8069  const int c = a;
8070  int *d = (arr);
8071  long e = ((long) 0l);
8072The matchers
8073   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
8074   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
8075would match the declarations for a, b, c, and d, but not e.
8076while
8077   varDecl(hasInitializer(integerLiteral()))
8078   varDecl(hasInitializer(declRefExpr()))
8079would only match the declaration for a.
8080</pre></td></tr>
8081
8082
8083<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>
8084<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
8085
8086Given
8087  const char* str = ("my-string");
8088The matcher
8089  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
8090would match the implicit cast resulting from the assignment.
8091</pre></td></tr>
8092
8093
8094<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>
8095<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
8096
8097Given
8098  class C {
8099    int a = 2;
8100    int b = 3;
8101    int c;
8102  };
8103fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
8104  matches 'int a;' but not 'int b;'.
8105fieldDecl(hasInClassInitializer(anything()))
8106  matches 'int a;' and 'int b;' but not 'int c;'.
8107</pre></td></tr>
8108
8109
8110<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>
8111<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
8112
8113
8114<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>
8115<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
8116switch statement or conditional operator.
8117
8118Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8119  if (true) {}
8120</pre></td></tr>
8121
8122
8123<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>
8124<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
8125
8126Example:
8127    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
8128matches '++x' in
8129    for (x; x &lt; N; ++x) { }
8130</pre></td></tr>
8131
8132
8133<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>
8134<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
8135
8136Example:
8137    forStmt(hasLoopInit(declStmt()))
8138matches 'int x = 0' in
8139    for (int x = 0; x &lt; N; ++x) { }
8140</pre></td></tr>
8141
8142
8143<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>
8144<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
8145declaration's type.
8146
8147In case of a value declaration (for example a variable declaration),
8148this resolves one layer of indirection. For example, in the value
8149declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8150X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8151declaration of x.
8152
8153Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8154            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8155            and friend class X (matcher = friendDecl(hasType("X"))
8156            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8157                                              cxxRecordDecl(hasName("X"))))
8158 class X {};
8159 void y(X &amp;x) { x; X z; }
8160 class Y { friend class X; };
8161 class Z : public virtual X {};
8162
8163Example matches class Derived
8164(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8165class Base {};
8166class Derived : Base {};
8167
8168Usable 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;,
8169Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8170</pre></td></tr>
8171
8172
8173<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>
8174<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
8175matcher.
8176
8177Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8178            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8179            and U (matcher = typedefDecl(hasType(asString("int")))
8180            and friend class X (matcher = friendDecl(hasType("X"))
8181            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8182                                              asString("class X")))
8183 class X {};
8184 void y(X &amp;x) { x; X z; }
8185 typedef int U;
8186 class Y { friend class X; };
8187 class Z : public virtual X {};
8188</pre></td></tr>
8189
8190
8191<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('forEachTemplateArgument2')"><a name="forEachTemplateArgument2Anchor">forEachTemplateArgument</a></td><td>clang::ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
8192<tr><td colspan="4" class="doc" id="forEachTemplateArgument2"><pre>Matches classTemplateSpecialization, templateSpecializationType and
8193functionDecl nodes where the template argument matches the inner matcher.
8194This matcher may produce multiple matches.
8195
8196Given
8197  template &lt;typename T, unsigned N, unsigned M&gt;
8198  struct Matrix {};
8199
8200  constexpr unsigned R = 2;
8201  Matrix&lt;int, R * 2, R * 4&gt; M;
8202
8203  template &lt;typename T, typename U&gt;
8204  void f(T&amp;&amp; t, U&amp;&amp; u) {}
8205
8206  bool B = false;
8207  f(R, B);
8208templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
8209  matches twice, with expr() matching 'R * 2' and 'R * 4'
8210functionDecl(forEachTemplateArgument(refersToType(builtinType())))
8211  matches the specialization f&lt;unsigned, bool&gt; twice, for 'unsigned'
8212  and 'bool'
8213</pre></td></tr>
8214
8215
8216<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>
8217<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
8218Note that this matcher matches all the declarations of a function whose
8219body is present in the AST.
8220
8221Given
8222  void f();
8223  void f() {}
8224  void g();
8225functionDecl(hasAnyBody(compoundStmt()))
8226  matches both 'void f();'
8227  and 'void f() {}'
8228with compoundStmt()
8229  matching '{}'
8230  but does not match 'void g();'
8231</pre></td></tr>
8232
8233
8234<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>
8235<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
8236block.
8237
8238Does not match the 'this' parameter of a method.
8239
8240Given
8241  class X { void f(int x, int y, int z) {} };
8242cxxMethodDecl(hasAnyParameter(hasName("y")))
8243  matches f(int x, int y, int z) {}
8244with hasAnyParameter(...)
8245  matching int y
8246
8247For ObjectiveC, given
8248  @interface I - (void) f:(int) y; @end
8249
8250the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8251matches the declaration of method f with hasParameter
8252matching y.
8253
8254For blocks, given
8255  b = ^(int y) { printf("%d", y) };
8256
8257the matcher blockDecl(hasAnyParameter(hasName("y")))
8258matches the declaration of the block b with hasParameter
8259matching y.
8260</pre></td></tr>
8261
8262
8263<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>
8264<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8265functionDecl that have at least one TemplateArgument matching the given
8266InnerMatcher.
8267
8268Given
8269  template&lt;typename T&gt; class A {};
8270  template&lt;&gt; class A&lt;double&gt; {};
8271  A&lt;int&gt; a;
8272
8273  template&lt;typename T&gt; f() {};
8274  void func() { f&lt;int&gt;(); };
8275
8276classTemplateSpecializationDecl(hasAnyTemplateArgument(
8277    refersToType(asString("int"))))
8278  matches the specialization A&lt;int&gt;
8279
8280functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8281  matches the specialization f&lt;int&gt;
8282</pre></td></tr>
8283
8284
8285<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>
8286<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
8287
8288
8289<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>
8290<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
8291declaration.
8292
8293Given
8294  template&lt;bool b&gt;
8295  struct S {
8296    S(int); // #1
8297    explicit S(double); // #2
8298    operator int(); // #3
8299    explicit operator bool(); // #4
8300    explicit(false) S(bool) // # 7
8301    explicit(true) S(char) // # 8
8302    explicit(b) S(S) // # 9
8303  };
8304  S(int) -&gt; S&lt;true&gt; // #5
8305  explicit S(double) -&gt; S&lt;false&gt; // #6
8306cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8307cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8308cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8309</pre></td></tr>
8310
8311
8312<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>
8313<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
8314declaration or a block.
8315
8316Given
8317  class X { void f(int x) {} };
8318cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8319  matches f(int x) {}
8320with hasParameter(...)
8321  matching int x
8322
8323For ObjectiveC, given
8324  @interface I - (void) f:(int) y; @end
8325
8326the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8327matches the declaration of method f with hasParameter
8328matching y.
8329</pre></td></tr>
8330
8331
8332<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasReturnTypeLoc0')"><a name="hasReturnTypeLoc0Anchor">hasReturnTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; ReturnMatcher</td></tr>
8333<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`.
8334
8335Given
8336  int f() { return 5; }
8337  void g() {}
8338functionDecl(hasReturnTypeLoc(loc(asString("int"))))
8339  matches the declaration of `f`, but not `g`.
8340</pre></td></tr>
8341
8342
8343<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>
8344<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8345functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8346
8347Given
8348  template&lt;typename T, typename U&gt; class A {};
8349  A&lt;bool, int&gt; b;
8350  A&lt;int, bool&gt; c;
8351
8352  template&lt;typename T&gt; void f() {}
8353  void func() { f&lt;int&gt;(); };
8354classTemplateSpecializationDecl(hasTemplateArgument(
8355    1, refersToType(asString("int"))))
8356  matches the specialization A&lt;bool, int&gt;
8357
8358functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8359  matches the specialization f&lt;int&gt;
8360</pre></td></tr>
8361
8362
8363<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>
8364<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8365
8366Given:
8367  class X { int f() { return 1; } };
8368cxxMethodDecl(returns(asString("int")))
8369  matches int f() { return 1; }
8370</pre></td></tr>
8371
8372
8373<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>
8374<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8375switch statement or conditional operator.
8376
8377Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8378  if (true) {}
8379</pre></td></tr>
8380
8381
8382<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>
8383<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8384
8385Given
8386  if (A* a = GetAPointer()) {}
8387hasConditionVariableStatement(...)
8388  matches 'A* a = GetAPointer()'.
8389</pre></td></tr>
8390
8391
8392<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>
8393<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8394
8395Examples matches the if statement
8396  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8397  if (false) false; else true;
8398</pre></td></tr>
8399
8400
8401<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>
8402<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8403
8404Given:
8405 void foo() {
8406   if (int i = foobar(); i &gt; 0) {}
8407   switch (int i = foobar(); i) {}
8408   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8409 }
8410 void bar() {
8411   if (foobar() &gt; 0) {}
8412   switch (foobar()) {}
8413   for (auto&amp; x : get_range()) {}
8414 }
8415ifStmt(hasInitStatement(anything()))
8416  matches the if statement in foo but not in bar.
8417switchStmt(hasInitStatement(anything()))
8418  matches the switch statement in foo but not in bar.
8419cxxForRangeStmt(hasInitStatement(anything()))
8420  matches the range for statement in foo but not in bar.
8421</pre></td></tr>
8422
8423
8424<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>
8425<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8426
8427Examples matches the if statement
8428  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8429  if (false) true; else false;
8430</pre></td></tr>
8431
8432
8433<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>
8434<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8435matcher.
8436
8437FIXME: Unit test this matcher
8438</pre></td></tr>
8439
8440
8441<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>
8442<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8443
8444Example matches y.
8445    (matcher = initListExpr(hasInit(0, expr())))
8446  int x{y}.
8447</pre></td></tr>
8448
8449
8450<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>
8451<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8452(if expression have it).
8453</pre></td></tr>
8454
8455
8456<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>
8457<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8458matches the given matcher.
8459
8460The associated declaration is:
8461- for type nodes, the declaration of the underlying type
8462- for CallExpr, the declaration of the callee
8463- for MemberExpr, the declaration of the referenced member
8464- for CXXConstructExpr, the declaration of the constructor
8465- for CXXNewExpr, the declaration of the operator new
8466- for ObjCIvarExpr, the declaration of the ivar
8467
8468For type nodes, hasDeclaration will generally match the declaration of the
8469sugared type. Given
8470  class X {};
8471  typedef X Y;
8472  Y y;
8473in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8474typedefDecl. A common use case is to match the underlying, desugared type.
8475This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8476  varDecl(hasType(hasUnqualifiedDesugaredType(
8477      recordType(hasDeclaration(decl())))))
8478In this matcher, the decl will match the CXXRecordDecl of class X.
8479
8480Usable 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;,
8481  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;,
8482  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;,
8483  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;,
8484  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;,
8485  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;,
8486  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8487</pre></td></tr>
8488
8489
8490<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>
8491<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8492matches the given matcher.
8493
8494The associated declaration is:
8495- for type nodes, the declaration of the underlying type
8496- for CallExpr, the declaration of the callee
8497- for MemberExpr, the declaration of the referenced member
8498- for CXXConstructExpr, the declaration of the constructor
8499- for CXXNewExpr, the declaration of the operator new
8500- for ObjCIvarExpr, the declaration of the ivar
8501
8502For type nodes, hasDeclaration will generally match the declaration of the
8503sugared type. Given
8504  class X {};
8505  typedef X Y;
8506  Y y;
8507in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8508typedefDecl. A common use case is to match the underlying, desugared type.
8509This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8510  varDecl(hasType(hasUnqualifiedDesugaredType(
8511      recordType(hasDeclaration(decl())))))
8512In this matcher, the decl will match the CXXRecordDecl of class X.
8513
8514Usable 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;,
8515  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;,
8516  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;,
8517  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;,
8518  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;,
8519  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;,
8520  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8521</pre></td></tr>
8522
8523
8524<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('capturesVar0')"><a name="capturesVar0Anchor">capturesVar</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
8525<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
8526`VarDecl` can be a separate variable that is captured by value or
8527reference, or a synthesized variable if the capture has an initializer.
8528
8529Given
8530  void foo() {
8531    int x;
8532    auto f = [x](){};
8533    auto g = [x = 1](){};
8534  }
8535In the matcher
8536lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))),
8537capturesVar(hasName("x")) matches `x` and `x = 1`.
8538</pre></td></tr>
8539
8540
8541<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('forEachLambdaCapture0')"><a name="forEachLambdaCapture0Anchor">forEachLambdaCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8542<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression.
8543
8544Given
8545  int main() {
8546    int x, y;
8547    float z;
8548    auto f = [=]() { return x + y + z; };
8549  }
8550lambdaExpr(forEachLambdaCapture(
8551    lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
8552will trigger two matches, binding for 'x' and 'y' respectively.
8553</pre></td></tr>
8554
8555
8556<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_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8557<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression.
8558
8559Given
8560  void foo() {
8561    int t = 5;
8562    auto f = [=](){ return t; };
8563  }
8564lambdaExpr(hasAnyCapture(lambdaCapture())) and
8565lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t")))))
8566  both match `[=](){ return t; }`.
8567</pre></td></tr>
8568
8569
8570<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>
8571<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8572matches the given matcher.
8573
8574The associated declaration is:
8575- for type nodes, the declaration of the underlying type
8576- for CallExpr, the declaration of the callee
8577- for MemberExpr, the declaration of the referenced member
8578- for CXXConstructExpr, the declaration of the constructor
8579- for CXXNewExpr, the declaration of the operator new
8580- for ObjCIvarExpr, the declaration of the ivar
8581
8582For type nodes, hasDeclaration will generally match the declaration of the
8583sugared type. Given
8584  class X {};
8585  typedef X Y;
8586  Y y;
8587in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8588typedefDecl. A common use case is to match the underlying, desugared type.
8589This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8590  varDecl(hasType(hasUnqualifiedDesugaredType(
8591      recordType(hasDeclaration(decl())))))
8592In this matcher, the decl will match the CXXRecordDecl of class X.
8593
8594Usable 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;,
8595  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;,
8596  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;,
8597  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;,
8598  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;,
8599  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;,
8600  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8601</pre></td></tr>
8602
8603
8604<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>
8605<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8606given matcher. Implicit object expressions are included; that is, it matches
8607use of implicit `this`.
8608
8609Given
8610  struct X {
8611    int m;
8612    int f(X x) { x.m; return m; }
8613  };
8614memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8615  matches `x.m`, but not `m`; however,
8616memberExpr(hasObjectExpression(hasType(pointsTo(
8617     cxxRecordDecl(hasName("X"))))))
8618  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8619</pre></td></tr>
8620
8621
8622<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>
8623<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8624given matcher.
8625
8626Given
8627  struct { int first, second; } first, second;
8628  int i(second.first);
8629  int j(first.second);
8630memberExpr(member(hasName("first")))
8631  matches second.first
8632  but not first.second (because the member name there is "second").
8633</pre></td></tr>
8634
8635
8636<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>
8637<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8638pointee matches a given matcher.
8639
8640Given
8641  int *a;
8642  int const *b;
8643  float const *f;
8644pointerType(pointee(isConstQualified(), isInteger()))
8645  matches "int const *b"
8646
8647Usable 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;,
8648  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;
8649</pre></td></tr>
8650
8651
8652<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>
8653<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8654matcher.
8655
8656Given
8657  namespace N { template&lt;class T&gt; void f(T t); }
8658  template &lt;class T&gt; void g() { using N::f; f(T()); }
8659unresolvedLookupExpr(hasAnyDeclaration(
8660    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8661  matches the use of f in g() .
8662</pre></td></tr>
8663
8664
8665<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>
8666<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8667
8668Given
8669  struct A { struct B { struct C {}; }; };
8670  A::B::C c;
8671nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8672  matches "A::"
8673</pre></td></tr>
8674
8675
8676<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>
8677<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8678NestedNameSpecifier-matcher matches.
8679</pre></td></tr>
8680
8681
8682<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>
8683<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8684given TypeLoc.
8685
8686Given
8687  struct A { struct B { struct C {}; }; };
8688  A::B::C c;
8689nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8690  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8691  matches "A::"
8692</pre></td></tr>
8693
8694
8695<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>
8696<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8697
8698Given
8699  struct A { struct B { struct C {}; }; };
8700  A::B::C c;
8701nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8702  matches "A::"
8703</pre></td></tr>
8704
8705
8706<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>
8707<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8708given namespace matcher.
8709
8710Given
8711  namespace ns { struct A {}; }
8712  ns::A a;
8713nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8714  matches "ns::"
8715</pre></td></tr>
8716
8717
8718<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>
8719<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8720given QualType matcher without qualifiers.
8721
8722Given
8723  struct A { struct B { struct C {}; }; };
8724  A::B::C c;
8725nestedNameSpecifier(specifiesType(
8726  hasDeclaration(cxxRecordDecl(hasName("A")))
8727))
8728  matches "A::"
8729</pre></td></tr>
8730
8731
8732<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>
8733<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8734
8735Given
8736
8737  #pragma omp parallel
8738  #pragma omp parallel default(none)
8739
8740``ompExecutableDirective(hasAnyClause(anything()))`` matches
8741``omp parallel default(none)``.
8742</pre></td></tr>
8743
8744
8745<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>
8746<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8747
8748Prerequisite: the executable directive must not be standalone directive.
8749If it is, it will never match.
8750
8751Given
8752
8753   #pragma omp parallel
8754   ;
8755   #pragma omp parallel
8756   {}
8757
8758``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8759</pre></td></tr>
8760
8761
8762<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>
8763<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8764matching Base, or Objective-C classes that directly or indirectly
8765subclass a class matching Base.
8766
8767Note that a class is not considered to be derived from itself.
8768
8769Example matches Y, Z, C (Base == hasName("X"))
8770  class X;
8771  class Y : public X {};  // directly derived
8772  class Z : public Y {};  // indirectly derived
8773  typedef X A;
8774  typedef A B;
8775  class C : public B {};  // derived from a typedef of X
8776
8777In the following example, Bar matches isDerivedFrom(hasName("X")):
8778  class Foo;
8779  typedef Foo X;
8780  class Bar : public Foo {};  // derived from a type that X is a typedef of
8781
8782In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8783  @interface NSObject @end
8784  @interface Bar : NSObject @end
8785
8786Usable 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;
8787</pre></td></tr>
8788
8789
8790<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>
8791<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8792matching Base.
8793
8794Note that a class is not considered to be derived from itself.
8795
8796Example matches Y, C (Base == hasName("X"))
8797  class X;
8798  class Y : public X {};  // directly derived
8799  class Z : public Y {};  // indirectly derived
8800  typedef X A;
8801  typedef A B;
8802  class C : public B {};  // derived from a typedef of X
8803
8804In the following example, Bar matches isDerivedFrom(hasName("X")):
8805  class Foo;
8806  typedef Foo X;
8807  class Bar : public Foo {};  // derived from a type that X is a typedef of
8808</pre></td></tr>
8809
8810
8811<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>
8812<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8813match Base.
8814</pre></td></tr>
8815
8816
8817<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>
8818<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8819expression, or an ObjC-message-send expression.
8820
8821Given
8822  void x(int, int, int) { int y; x(1, y, 42); }
8823callExpr(hasAnyArgument(declRefExpr()))
8824  matches x(1, y, 42)
8825with hasAnyArgument(...)
8826  matching y
8827
8828For ObjectiveC, given
8829  @interface I - (void) f:(int) y; @end
8830  void foo(I *i) { [i f:12]; }
8831objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8832  matches [i f:12]
8833</pre></td></tr>
8834
8835
8836<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>
8837<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8838call expression.
8839
8840Example matches y in x(y)
8841    (matcher = callExpr(hasArgument(0, declRefExpr())))
8842  void x(int) { int y; x(y); }
8843</pre></td></tr>
8844
8845
8846<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>
8847<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8848and the inner matcher matches on that instance.
8849
8850For example the method call in
8851  NSString *x = @"hello";
8852  [x containsString:@"h"];
8853is matched by
8854objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8855</pre></td></tr>
8856
8857
8858<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>
8859<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8860
8861Example
8862matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8863matches the [webView ...] message invocation.
8864  NSString *webViewJavaScript = ...
8865  UIWebView *webView = ...
8866  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8867</pre></td></tr>
8868
8869
8870<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>
8871<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8872block.
8873
8874Does not match the 'this' parameter of a method.
8875
8876Given
8877  class X { void f(int x, int y, int z) {} };
8878cxxMethodDecl(hasAnyParameter(hasName("y")))
8879  matches f(int x, int y, int z) {}
8880with hasAnyParameter(...)
8881  matching int y
8882
8883For ObjectiveC, given
8884  @interface I - (void) f:(int) y; @end
8885
8886the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8887matches the declaration of method f with hasParameter
8888matching y.
8889
8890For blocks, given
8891  b = ^(int y) { printf("%d", y) };
8892
8893the matcher blockDecl(hasAnyParameter(hasName("y")))
8894matches the declaration of the block b with hasParameter
8895matching y.
8896</pre></td></tr>
8897
8898
8899<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>
8900<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8901declaration or a block.
8902
8903Given
8904  class X { void f(int x) {} };
8905cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8906  matches f(int x) {}
8907with hasParameter(...)
8908  matching int x
8909
8910For ObjectiveC, given
8911  @interface I - (void) f:(int) y; @end
8912
8913the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8914matches the declaration of method f with hasParameter
8915matching y.
8916</pre></td></tr>
8917
8918
8919<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>
8920<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8921
8922Examples:
8923  int x;
8924declaratorDecl(hasTypeLoc(loc(asString("int"))))
8925  matches int x
8926
8927auto x = int(3);
8928cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8929  matches int(3)
8930
8931struct Foo { Foo(int, int); };
8932auto x = Foo(1, 2);
8933cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8934  matches Foo(1, 2)
8935
8936Usable 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;,
8937  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;,
8938  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;,
8939  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8940  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;,
8941  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;,
8942  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;,
8943  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8944</pre></td></tr>
8945
8946
8947<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>
8948<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8949or opaque value's source expression matches the given matcher.
8950
8951Example 1: matches "a string"
8952(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8953class URL { URL(string); };
8954URL url = "a string";
8955
8956Example 2: matches 'b' (matcher =
8957opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8958int a = b ?: 1;
8959</pre></td></tr>
8960
8961
8962<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>
8963<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8964overloads matches the given matcher.
8965
8966Given
8967  template &lt;typename T&gt; void foo(T);
8968  template &lt;typename T&gt; void bar(T);
8969  template &lt;typename T&gt; void baz(T t) {
8970    foo(t);
8971    bar(t);
8972  }
8973unresolvedLookupExpr(hasAnyDeclaration(
8974    functionTemplateDecl(hasName("foo"))))
8975  matches foo in foo(t); but not bar in bar(t);
8976</pre></td></tr>
8977
8978
8979<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>
8980<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8981
8982Given
8983  int (*ptr_to_array)[4];
8984  int (*ptr_to_func)(int);
8985
8986varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8987ptr_to_func but not ptr_to_array.
8988
8989Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8990</pre></td></tr>
8991
8992
8993<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasPointeeLoc0')"><a name="hasPointeeLoc0Anchor">hasPointeeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; PointeeMatcher</td></tr>
8994<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
8995`PointeeMatcher`.
8996
8997Given
8998  int* x;
8999pointerTypeLoc(hasPointeeLoc(loc(asString("int"))))
9000  matches `int*`.
9001</pre></td></tr>
9002
9003
9004<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>
9005<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
9006pointee matches a given matcher.
9007
9008Given
9009  int *a;
9010  int const *b;
9011  float const *f;
9012pointerType(pointee(isConstQualified(), isInteger()))
9013  matches "int const *b"
9014
9015Usable 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;,
9016  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;
9017</pre></td></tr>
9018
9019
9020<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>
9021<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
9022
9023Given:
9024  typedef int &amp;int_ref;
9025  int a;
9026  int_ref b = a;
9027
9028varDecl(hasType(qualType(referenceType()))))) will not match the
9029declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
9030</pre></td></tr>
9031
9032
9033<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>
9034<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
9035matches the given matcher.
9036
9037The associated declaration is:
9038- for type nodes, the declaration of the underlying type
9039- for CallExpr, the declaration of the callee
9040- for MemberExpr, the declaration of the referenced member
9041- for CXXConstructExpr, the declaration of the constructor
9042- for CXXNewExpr, the declaration of the operator new
9043- for ObjCIvarExpr, the declaration of the ivar
9044
9045For type nodes, hasDeclaration will generally match the declaration of the
9046sugared type. Given
9047  class X {};
9048  typedef X Y;
9049  Y y;
9050in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9051typedefDecl. A common use case is to match the underlying, desugared type.
9052This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9053  varDecl(hasType(hasUnqualifiedDesugaredType(
9054      recordType(hasDeclaration(decl())))))
9055In this matcher, the decl will match the CXXRecordDecl of class X.
9056
9057Usable 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;,
9058  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;,
9059  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;,
9060  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;,
9061  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;,
9062  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;,
9063  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9064</pre></td></tr>
9065
9066
9067<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>
9068<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
9069
9070Given
9071  void (*fp)(void);
9072The matcher
9073  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
9074would match the declaration for fp.
9075</pre></td></tr>
9076
9077
9078<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>
9079<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
9080</pre></td></tr>
9081
9082
9083<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>
9084<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
9085matches the specified matcher.
9086
9087Example matches y-&gt;x()
9088  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
9089     cxxRecordDecl(hasName("Y")))))))
9090  class Y { public: void x(); };
9091  void z() { Y *y; y-&gt;x(); }
9092</pre></td></tr>
9093
9094
9095<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>
9096<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
9097</pre></td></tr>
9098
9099
9100<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>
9101<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
9102type matches the specified matcher.
9103
9104Example matches X &amp;x and const X &amp;y
9105    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
9106  class X {
9107    void a(X b) {
9108      X &amp;x = b;
9109      const X &amp;y = b;
9110    }
9111  };
9112</pre></td></tr>
9113
9114
9115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedLoc0')"><a name="hasUnqualifiedLoc0Anchor">hasUnqualifiedLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
9116<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
9117`InnerMatcher`.
9118
9119Given
9120  int* const x;
9121  const int y;
9122qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
9123  matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
9124</pre></td></tr>
9125
9126
9127<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>
9128<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
9129matches the given matcher.
9130
9131The associated declaration is:
9132- for type nodes, the declaration of the underlying type
9133- for CallExpr, the declaration of the callee
9134- for MemberExpr, the declaration of the referenced member
9135- for CXXConstructExpr, the declaration of the constructor
9136- for CXXNewExpr, the declaration of the operator new
9137- for ObjCIvarExpr, the declaration of the ivar
9138
9139For type nodes, hasDeclaration will generally match the declaration of the
9140sugared type. Given
9141  class X {};
9142  typedef X Y;
9143  Y y;
9144in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9145typedefDecl. A common use case is to match the underlying, desugared type.
9146This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9147  varDecl(hasType(hasUnqualifiedDesugaredType(
9148      recordType(hasDeclaration(decl())))))
9149In this matcher, the decl will match the CXXRecordDecl of class X.
9150
9151Usable 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;,
9152  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;,
9153  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;,
9154  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;,
9155  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;,
9156  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;,
9157  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9158</pre></td></tr>
9159
9160
9161<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasReferentLoc0')"><a name="hasReferentLoc0Anchor">hasReferentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; ReferentMatcher</td></tr>
9162<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
9163`ReferentMatcher`.
9164
9165Given
9166  int x = 3;
9167  int&amp; xx = x;
9168referenceTypeLoc(hasReferentLoc(loc(asString("int"))))
9169  matches `int&amp;`.
9170</pre></td></tr>
9171
9172
9173<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>
9174<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
9175pointee matches a given matcher.
9176
9177Given
9178  int *a;
9179  int const *b;
9180  float const *f;
9181pointerType(pointee(isConstQualified(), isInteger()))
9182  matches "int const *b"
9183
9184Usable 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;,
9185  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;
9186</pre></td></tr>
9187
9188
9189<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>
9190<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
9191
9192Given
9193  return a + b;
9194hasReturnValue(binaryOperator())
9195  matches 'return a + b'
9196with binaryOperator()
9197  matching 'a + b'
9198</pre></td></tr>
9199
9200
9201<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>
9202<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
9203a given matcher. Also matches StmtExprs that have CompoundStmt as children.
9204
9205Given
9206  { {}; 1+2; }
9207hasAnySubstatement(compoundStmt())
9208  matches '{ {}; 1+2; }'
9209with compoundStmt()
9210  matching '{}'
9211</pre></td></tr>
9212
9213
9214<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>
9215<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9216alignof.
9217</pre></td></tr>
9218
9219
9220<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>
9221<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
9222belongs to.
9223
9224Given:
9225F&amp; operator=(const F&amp; o) {
9226  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9227  return *this;
9228}
9229returnStmt(forCallable(functionDecl(hasName("operator="))))
9230  matches 'return *this'
9231  but does not match 'return v &gt; 0'
9232
9233Given:
9234-(void) foo {
9235  int x = 1;
9236  dispatch_sync(queue, ^{ int y = 2; });
9237}
9238declStmt(forCallable(objcMethodDecl()))
9239  matches 'int x = 1'
9240  but does not match 'int y = 2'.
9241whereas declStmt(forCallable(blockDecl()))
9242  matches 'int y = 2'
9243  but does not match 'int x = 1'.
9244</pre></td></tr>
9245
9246
9247<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>
9248<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
9249
9250Deprecated. Use forCallable() to correctly handle the situation when
9251the declaration is not a function (but a block or an Objective-C method).
9252forFunction() not only fails to take non-functions into account but also
9253may match the wrong declaration in their presence.
9254
9255Given:
9256F&amp; operator=(const F&amp; o) {
9257  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9258  return *this;
9259}
9260returnStmt(forFunction(hasName("operator=")))
9261  matches 'return *this'
9262  but does not match 'return v &gt; 0'
9263</pre></td></tr>
9264
9265
9266<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>
9267<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9268sizeof.
9269</pre></td></tr>
9270
9271
9272<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>
9273<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
9274type that matches the provided matcher.
9275
9276Given
9277  template &lt;typename T&gt;
9278  double F(T t);
9279  int i;
9280  double j = F(i);
9281
9282substTemplateTypeParmType(hasReplacementType(type())) matches int
9283</pre></td></tr>
9284
9285
9286<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>
9287<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
9288statement. This matcher may produce multiple matches.
9289
9290Given
9291  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9292switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
9293  matches four times, with "c" binding each of "case 1:", "case 2:",
9294"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
9295"switch (1)", "switch (2)" and "switch (2)".
9296</pre></td></tr>
9297
9298
9299<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>
9300<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
9301switch statement or conditional operator.
9302
9303Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9304  if (true) {}
9305</pre></td></tr>
9306
9307
9308<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>
9309<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
9310
9311Given:
9312 void foo() {
9313   if (int i = foobar(); i &gt; 0) {}
9314   switch (int i = foobar(); i) {}
9315   for (auto&amp; a = get_range(); auto&amp; x : a) {}
9316 }
9317 void bar() {
9318   if (foobar() &gt; 0) {}
9319   switch (foobar()) {}
9320   for (auto&amp; x : get_range()) {}
9321 }
9322ifStmt(hasInitStatement(anything()))
9323  matches the if statement in foo but not in bar.
9324switchStmt(hasInitStatement(anything()))
9325  matches the switch statement in foo but not in bar.
9326cxxForRangeStmt(hasInitStatement(anything()))
9327  matches the range for statement in foo but not in bar.
9328</pre></td></tr>
9329
9330
9331<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>
9332<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
9333matches the given matcher.
9334
9335The associated declaration is:
9336- for type nodes, the declaration of the underlying type
9337- for CallExpr, the declaration of the callee
9338- for MemberExpr, the declaration of the referenced member
9339- for CXXConstructExpr, the declaration of the constructor
9340- for CXXNewExpr, the declaration of the operator new
9341- for ObjCIvarExpr, the declaration of the ivar
9342
9343For type nodes, hasDeclaration will generally match the declaration of the
9344sugared type. Given
9345  class X {};
9346  typedef X Y;
9347  Y y;
9348in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9349typedefDecl. A common use case is to match the underlying, desugared type.
9350This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9351  varDecl(hasType(hasUnqualifiedDesugaredType(
9352      recordType(hasDeclaration(decl())))))
9353In this matcher, the decl will match the CXXRecordDecl of class X.
9354
9355Usable 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;,
9356  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;,
9357  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;,
9358  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;,
9359  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;,
9360  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;,
9361  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9362</pre></td></tr>
9363
9364
9365<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>
9366<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
9367
9368Examples:
9369  int x;
9370declaratorDecl(hasTypeLoc(loc(asString("int"))))
9371  matches int x
9372
9373auto x = int(3);
9374cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9375  matches int(3)
9376
9377struct Foo { Foo(int, int); };
9378auto x = Foo(1, 2);
9379cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9380  matches Foo(1, 2)
9381
9382Usable 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;,
9383  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;,
9384  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;,
9385  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9386  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;,
9387  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;,
9388  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;,
9389  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9390</pre></td></tr>
9391
9392
9393<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>
9394<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
9395
9396Given
9397  struct B { int next; };
9398  template&lt;int(B::*next_ptr)&gt; struct A {};
9399  A&lt;&amp;B::next&gt; a;
9400templateSpecializationType(hasAnyTemplateArgument(
9401  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
9402  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9403    B::next
9404</pre></td></tr>
9405
9406
9407<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>
9408<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9409declaration.
9410
9411Given
9412  struct B { int next; };
9413  template&lt;int(B::*next_ptr)&gt; struct A {};
9414  A&lt;&amp;B::next&gt; a;
9415classTemplateSpecializationDecl(hasAnyTemplateArgument(
9416    refersToDeclaration(fieldDecl(hasName("next")))))
9417  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9418    B::next
9419</pre></td></tr>
9420
9421
9422<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>
9423<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9424
9425Given
9426  template&lt;int T&gt; struct C {};
9427  C&lt;42&gt; c;
9428classTemplateSpecializationDecl(
9429  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9430  matches the implicit instantiation of C in C&lt;42&gt;.
9431</pre></td></tr>
9432
9433
9434<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>
9435<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9436
9437Given
9438  template&lt;template &lt;typename&gt; class S&gt; class X {};
9439  template&lt;typename T&gt; class Y {};
9440  X&lt;Y&gt; xi;
9441classTemplateSpecializationDecl(hasAnyTemplateArgument(
9442    refersToTemplate(templateName())))
9443  matches the specialization X&lt;Y&gt;
9444</pre></td></tr>
9445
9446
9447<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>
9448<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9449
9450Given
9451  struct X {};
9452  template&lt;typename T&gt; struct A {};
9453  A&lt;X&gt; a;
9454classTemplateSpecializationDecl(hasAnyTemplateArgument(
9455    refersToType(class(hasName("X")))))
9456  matches the specialization A&lt;X&gt;
9457</pre></td></tr>
9458
9459
9460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgumentLoc0')"><a name="hasAnyTemplateArgumentLoc0Anchor">hasAnyTemplateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9461<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one
9462`TemplateArgumentLoc` matching the given `InnerMatcher`.
9463
9464Given
9465  template&lt;typename T&gt; class A {};
9466  A&lt;int&gt; a;
9467varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
9468  hasTypeLoc(loc(asString("int")))))))
9469  matches `A&lt;int&gt; a`.
9470</pre></td></tr>
9471
9472
9473<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgumentLoc1')"><a name="hasTemplateArgumentLoc1Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9474<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th
9475`TemplateArgumentLoc` matches the given `InnerMatcher`.
9476
9477Given
9478  template&lt;typename T, typename U&gt; class A {};
9479  A&lt;double, int&gt; b;
9480  A&lt;int, double&gt; c;
9481varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
9482  hasTypeLoc(loc(asString("double")))))))
9483  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
9484</pre></td></tr>
9485
9486
9487<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('forEachTemplateArgument1')"><a name="forEachTemplateArgument1Anchor">forEachTemplateArgument</a></td><td>clang::ast_matchers::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
9488<tr><td colspan="4" class="doc" id="forEachTemplateArgument1"><pre>Matches classTemplateSpecialization, templateSpecializationType and
9489functionDecl nodes where the template argument matches the inner matcher.
9490This matcher may produce multiple matches.
9491
9492Given
9493  template &lt;typename T, unsigned N, unsigned M&gt;
9494  struct Matrix {};
9495
9496  constexpr unsigned R = 2;
9497  Matrix&lt;int, R * 2, R * 4&gt; M;
9498
9499  template &lt;typename T, typename U&gt;
9500  void f(T&amp;&amp; t, U&amp;&amp; u) {}
9501
9502  bool B = false;
9503  f(R, B);
9504templateSpecializationType(forEachTemplateArgument(isExpr(expr())))
9505  matches twice, with expr() matching 'R * 2' and 'R * 4'
9506functionDecl(forEachTemplateArgument(refersToType(builtinType())))
9507  matches the specialization f&lt;unsigned, bool&gt; twice, for 'unsigned'
9508  and 'bool'
9509</pre></td></tr>
9510
9511
9512<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>
9513<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9514functionDecl that have at least one TemplateArgument matching the given
9515InnerMatcher.
9516
9517Given
9518  template&lt;typename T&gt; class A {};
9519  template&lt;&gt; class A&lt;double&gt; {};
9520  A&lt;int&gt; a;
9521
9522  template&lt;typename T&gt; f() {};
9523  void func() { f&lt;int&gt;(); };
9524
9525classTemplateSpecializationDecl(hasAnyTemplateArgument(
9526    refersToType(asString("int"))))
9527  matches the specialization A&lt;int&gt;
9528
9529functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9530  matches the specialization f&lt;int&gt;
9531</pre></td></tr>
9532
9533
9534<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>
9535<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9536matches the given matcher.
9537
9538The associated declaration is:
9539- for type nodes, the declaration of the underlying type
9540- for CallExpr, the declaration of the callee
9541- for MemberExpr, the declaration of the referenced member
9542- for CXXConstructExpr, the declaration of the constructor
9543- for CXXNewExpr, the declaration of the operator new
9544- for ObjCIvarExpr, the declaration of the ivar
9545
9546For type nodes, hasDeclaration will generally match the declaration of the
9547sugared type. Given
9548  class X {};
9549  typedef X Y;
9550  Y y;
9551in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9552typedefDecl. A common use case is to match the underlying, desugared type.
9553This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9554  varDecl(hasType(hasUnqualifiedDesugaredType(
9555      recordType(hasDeclaration(decl())))))
9556In this matcher, the decl will match the CXXRecordDecl of class X.
9557
9558Usable 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;,
9559  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;,
9560  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;,
9561  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;,
9562  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;,
9563  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;,
9564  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9565</pre></td></tr>
9566
9567
9568<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>
9569<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9570functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9571
9572Given
9573  template&lt;typename T, typename U&gt; class A {};
9574  A&lt;bool, int&gt; b;
9575  A&lt;int, bool&gt; c;
9576
9577  template&lt;typename T&gt; void f() {}
9578  void func() { f&lt;int&gt;(); };
9579classTemplateSpecializationDecl(hasTemplateArgument(
9580    1, refersToType(asString("int"))))
9581  matches the specialization A&lt;bool, int&gt;
9582
9583functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9584  matches the specialization f&lt;int&gt;
9585</pre></td></tr>
9586
9587
9588<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>
9589<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9590matches the given matcher.
9591
9592The associated declaration is:
9593- for type nodes, the declaration of the underlying type
9594- for CallExpr, the declaration of the callee
9595- for MemberExpr, the declaration of the referenced member
9596- for CXXConstructExpr, the declaration of the constructor
9597- for CXXNewExpr, the declaration of the operator new
9598- for ObjCIvarExpr, the declaration of the ivar
9599
9600For type nodes, hasDeclaration will generally match the declaration of the
9601sugared type. Given
9602  class X {};
9603  typedef X Y;
9604  Y y;
9605in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9606typedefDecl. A common use case is to match the underlying, desugared type.
9607This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9608  varDecl(hasType(hasUnqualifiedDesugaredType(
9609      recordType(hasDeclaration(decl())))))
9610In this matcher, the decl will match the CXXRecordDecl of class X.
9611
9612Usable 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;,
9613  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;,
9614  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;,
9615  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;,
9616  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;,
9617  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;,
9618  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9619</pre></td></tr>
9620
9621
9622<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>
9623<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9624QualType-matcher matches.
9625</pre></td></tr>
9626
9627
9628<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>
9629<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9630
9631Examples:
9632  int x;
9633declaratorDecl(hasTypeLoc(loc(asString("int"))))
9634  matches int x
9635
9636auto x = int(3);
9637cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9638  matches int(3)
9639
9640struct Foo { Foo(int, int); };
9641auto x = Foo(1, 2);
9642cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9643  matches Foo(1, 2)
9644
9645Usable 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;,
9646  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;,
9647  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;,
9648  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9649  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;,
9650  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;,
9651  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;,
9652  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9653</pre></td></tr>
9654
9655
9656<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>
9657<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9658matcher.
9659
9660Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9661            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9662            and U (matcher = typedefDecl(hasType(asString("int")))
9663            and friend class X (matcher = friendDecl(hasType("X"))
9664            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9665                                              asString("class X")))
9666 class X {};
9667 void y(X &amp;x) { x; X z; }
9668 typedef int U;
9669 class Y { friend class X; };
9670 class Z : public virtual X {};
9671</pre></td></tr>
9672
9673
9674<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>
9675<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9676matches the given matcher.
9677
9678The associated declaration is:
9679- for type nodes, the declaration of the underlying type
9680- for CallExpr, the declaration of the callee
9681- for MemberExpr, the declaration of the referenced member
9682- for CXXConstructExpr, the declaration of the constructor
9683- for CXXNewExpr, the declaration of the operator new
9684- for ObjCIvarExpr, the declaration of the ivar
9685
9686For type nodes, hasDeclaration will generally match the declaration of the
9687sugared type. Given
9688  class X {};
9689  typedef X Y;
9690  Y y;
9691in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9692typedefDecl. A common use case is to match the underlying, desugared type.
9693This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9694  varDecl(hasType(hasUnqualifiedDesugaredType(
9695      recordType(hasDeclaration(decl())))))
9696In this matcher, the decl will match the CXXRecordDecl of class X.
9697
9698Usable 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;,
9699  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;,
9700  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;,
9701  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;,
9702  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;,
9703  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;,
9704  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9705</pre></td></tr>
9706
9707
9708<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>
9709<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9710type of the matched node.
9711
9712For example, in:
9713  class A {};
9714  using B = A;
9715The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9716both B and A.
9717</pre></td></tr>
9718
9719
9720<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>
9721<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9722
9723Given
9724  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9725unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9726  matches sizeof(a) and alignof(c)
9727</pre></td></tr>
9728
9729
9730<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>
9731<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9732
9733Example matches true (matcher = hasUnaryOperand(
9734                                  cxxBoolLiteral(equals(true))))
9735  !true
9736</pre></td></tr>
9737
9738
9739<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>
9740<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9741given matcher. Implicit object expressions are included; that is, it matches
9742use of implicit `this`.
9743
9744Given
9745  struct X {
9746    int m;
9747    int f(X x) { x.m; return m; }
9748  };
9749memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9750  matches `x.m`, but not `m`; however,
9751memberExpr(hasObjectExpression(hasType(pointsTo(
9752     cxxRecordDecl(hasName("X"))))))
9753  matches `m` (aka. `this-&gt;m`), but not `x.m`.
9754</pre></td></tr>
9755
9756
9757<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>
9758<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9759matches the given matcher.
9760
9761The associated declaration is:
9762- for type nodes, the declaration of the underlying type
9763- for CallExpr, the declaration of the callee
9764- for MemberExpr, the declaration of the referenced member
9765- for CXXConstructExpr, the declaration of the constructor
9766- for CXXNewExpr, the declaration of the operator new
9767- for ObjCIvarExpr, the declaration of the ivar
9768
9769For type nodes, hasDeclaration will generally match the declaration of the
9770sugared type. Given
9771  class X {};
9772  typedef X Y;
9773  Y y;
9774in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9775typedefDecl. A common use case is to match the underlying, desugared type.
9776This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9777  varDecl(hasType(hasUnqualifiedDesugaredType(
9778      recordType(hasDeclaration(decl())))))
9779In this matcher, the decl will match the CXXRecordDecl of class X.
9780
9781Usable 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;,
9782  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;,
9783  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;,
9784  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;,
9785  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;,
9786  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;,
9787  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9788</pre></td></tr>
9789
9790
9791<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>
9792<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9793matched by the given matcher.
9794
9795Given
9796  namespace X { int a; void b(); }
9797  using X::a;
9798  using X::b;
9799usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9800  matches using X::b but not using X::a </pre></td></tr>
9801
9802
9803<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingType1')"><a name="hasUnderlyingType1Anchor">hasUnderlyingType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
9804<tr><td colspan="4" class="doc" id="hasUnderlyingType1"><pre>Matches DecltypeType or UsingType nodes to find the underlying type.
9805
9806Given
9807  decltype(1) a = 1;
9808  decltype(2.0) b = 2.0;
9809decltypeType(hasUnderlyingType(isInteger()))
9810  matches the type of "a"
9811
9812Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>&gt;
9813</pre></td></tr>
9814
9815
9816<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>&gt;</td><td class="name" onclick="toggle('throughUsingDecl1')"><a name="throughUsingDecl1Anchor">throughUsingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; Inner</td></tr>
9817<tr><td colspan="4" class="doc" id="throughUsingDecl1"><pre>Matches if a node refers to a declaration through a specific
9818using shadow declaration.
9819
9820Examples:
9821  namespace a { int f(); }
9822  using a::f;
9823  int x = f();
9824declRefExpr(throughUsingDecl(anything()))
9825  matches f
9826
9827  namespace a { class X{}; }
9828  using a::X;
9829  X x;
9830typeLoc(loc(usingType(throughUsingDecl(anything()))))
9831  matches X
9832
9833Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingType.html">UsingType</a>&gt;
9834</pre></td></tr>
9835
9836
9837<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>
9838<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9839declaration's type.
9840
9841In case of a value declaration (for example a variable declaration),
9842this resolves one layer of indirection. For example, in the value
9843declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9844X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9845declaration of x.
9846
9847Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9848            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9849            and friend class X (matcher = friendDecl(hasType("X"))
9850            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9851                                              cxxRecordDecl(hasName("X"))))
9852 class X {};
9853 void y(X &amp;x) { x; X z; }
9854 class Y { friend class X; };
9855 class Z : public virtual X {};
9856
9857Example matches class Derived
9858(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9859class Base {};
9860class Derived : Base {};
9861
9862Usable 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;,
9863Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
9864</pre></td></tr>
9865
9866
9867<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>
9868<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9869matcher.
9870
9871Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9872            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9873            and U (matcher = typedefDecl(hasType(asString("int")))
9874            and friend class X (matcher = friendDecl(hasType("X"))
9875            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9876                                              asString("class X")))
9877 class X {};
9878 void y(X &amp;x) { x; X z; }
9879 typedef int U;
9880 class Y { friend class X; };
9881 class Z : public virtual X {};
9882</pre></td></tr>
9883
9884
9885<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>
9886<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9887that matches the given matcher.
9888
9889Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9890  bool y() { return true; }
9891  bool x = y();
9892</pre></td></tr>
9893
9894
9895<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>
9896<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9897expression.
9898
9899Given
9900  void f(int b) {
9901    int a[b];
9902  }
9903variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9904  varDecl(hasName("b")))))))
9905  matches "int a[b]"
9906</pre></td></tr>
9907
9908
9909<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>
9910<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9911
9912
9913<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>
9914<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9915switch statement or conditional operator.
9916
9917Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9918  if (true) {}
9919</pre></td></tr>
9920
9921<!--END_TRAVERSAL_MATCHERS -->
9922</table>
9923
9924</div>
9925</body>
9926</html>
9927
9928
9929