1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20span.mono { font-family: monospace; }
21
22.traverse_compare, .traverse_compare td, .traverse_compare th {
23  border: 1px solid black;
24  border-collapse: collapse;
25}
26</style>
27<script type="text/javascript">
28function toggle(id) {
29  if (!id) return;
30  row = document.getElementById(id);
31  if (row.style.display != 'table-cell')
32    row.style.display = 'table-cell';
33  else
34    row.style.display = 'none';
35}
36</script>
37</head>
38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39
40<!--#include virtual="../menu.html.incl"-->
41
42<div id="content">
43
44<h1>AST Matcher Reference</h1>
45
46<p>This document shows all currently implemented matchers. The matchers are grouped
47by category and node type they match. You can click on matcher names to show the
48matcher's source documentation.</p>
49
50<p>There are three different basic categories of matchers:
51<ul>
52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55</ul>
56</p>
57
58<p>Within each category the matchers are ordered by node type they match on.
59Note that if a matcher can match multiple node types, it will appear
60multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
61find all matchers that can be used to match on Stmt nodes.</p>
62
63<p>The exception to that rule are matchers that can match on any node. Those
64are marked with a * and are listed in the beginning of each category.</p>
65
66<p>Note that the categorization of matchers is a great help when you combine
67them into matcher expressions. You will usually want to form matcher expressions
68that read like english sentences by alternating between node matchers and
69narrowing or traversal matchers, like this:
70<pre>
71recordDecl(hasDescendant(
72    ifStmt(hasTrueExpression(
73        expr(hasDescendant(
74            ifStmt()))))))
75</pre>
76</p>
77
78<!-- ======================================================================= -->
79<h2 id="traverse-mode">Traverse Mode</h2>
80<!-- ======================================================================= -->
81
82<p>The default mode of operation of AST Matchers visits all nodes in the AST,
83even if they are not spelled in the source. This is
84<span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
85that explicitly traverse or ignore implicit nodes, such as parentheses
86surrounding an expression or expressions with cleanups.  These implicit
87nodes are not always obvious from the syntax of the source code, and so this
88mode requires careful consideration and testing to get the desired behavior
89from an AST matcher.
90</p>
91
92<p>In addition, because template instantiations are matched in the default mode,
93transformations can be accidentally made to template declarations. Finally,
94because implicit nodes are matched by default, transformations can be made on
95entirely incorrect places in the code.</p>
96
97<p>For these reasons, it is possible to ignore AST nodes which are not spelled
98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99mode. This is likely to be far less error-prone for users who are not already
100very familiar with where implicit nodes appear in the AST. It is also likely
101to be less error-prone for experienced AST users, as difficult cases do not
102need to be encountered and matcher expressions adjusted for these cases.</p>
103
104<p>In clang-query, the mode can be changed with
105<pre>
106set traversal IgnoreUnlessSpelledInSource
107</pre>
108</p>
109This affects both matchers and AST dump output in results.
110
111<p>When using the C++ API such as in clang-tidy checks, the
112<span class="mono">traverse()</span> matcher is used to set the mode:
113<pre>
114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115  returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116  ), this);
117</pre>
118</p>
119<p>The following table compares the <span class="mono">AsIs</span> mode with
120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121
122<table class="traverse_compare">
123<tr>
124<th></th>
125<th><span class="mono">AsIs</span></th>
126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127</tr>
128<tr>
129  <td>AST dump of <span class="mono">func1</span>:
130<pre>
131struct B {
132  B(int);
133};
134
135B func1() { return 42; }
136</pre>
137
138  </td>
139  <td>
140C++98 dialect:
141<pre>
142FunctionDecl
143`-CompoundStmt
144  `-ReturnStmt
145    `-ExprWithCleanups
146      `-CXXConstructExpr
147        `-MaterializeTemporaryExpr
148          `-ImplicitCastExpr
149            `-ImplicitCastExpr
150              `-CXXConstructExpr
151                `-IntegerLiteral 'int' 42
152</pre>
153C++11, C++14 dialect:
154<pre>
155FunctionDecl
156`-CompoundStmt
157  `-ReturnStmt
158    `-ExprWithCleanups
159      `-CXXConstructExpr
160        `-MaterializeTemporaryExpr
161          `-ImplicitCastExpr
162            `-CXXConstructExpr
163              `-IntegerLiteral 'int' 42
164</pre>
165C++17, C++20 dialect:
166<pre>
167FunctionDecl
168`-CompoundStmt
169  `-ReturnStmt
170    `-ImplicitCastExpr
171      `-CXXConstructExpr
172        `-IntegerLiteral 'int' 42
173</pre>
174</td>
175  <td>
176All dialects:
177    <pre>
178FunctionDecl
179`-CompoundStmt
180  `-ReturnStmt
181    `-IntegerLiteral 'int' 42
182</pre></td>
183</tr>
184
185<tr>
186<td>Matcher for returned <span class="mono">42</span>:
187<pre>
188struct B {
189  B(int);
190};
191
192B func1() { return 42; }
193</pre>
194
195  </td>
196  <td>
197All dialects:
198<pre>
199returnStmt(hasReturnValue(
200    ignoringImplicit(
201        ignoringElidableConstructorCall(
202            ignoringImplicit(
203                cxxConstructExpr(hasArgument(0,
204                    ignoringImplicit(
205                        integerLiteral().bind("returnVal")
206                        )
207                    ))
208                )
209            )
210        )
211    ))
212</pre></td>
213  <td>
214All dialects:
215<pre>
216returnStmt(hasReturnValue(
217    integerLiteral().bind("returnVal")
218))
219</pre></td>
220</tr>
221<tr>
222<td>Match result for
223<pre>implicitCastExpr()</pre>
224given:
225<pre>
226struct B {
227  B(int);
228};
229
230B func1() { return 42; }
231</pre>
232
233</td>
234<td>
235Match found.</td>
236  <td>
237No match.</td>
238</tr>
239<tr>
240  <td>Match result for:
241<pre>
242cxxConstructorDecl(
243  isCopyConstructor()
244  ).bind("prepend_explicit")
245</pre>
246given:
247<pre>
248struct Other {};
249struct Copyable {
250  Other m_o;
251  Copyable();
252};
253</pre>
254</td>
255<td>
256Match found. Insertion produces incorrect output:
257<pre>
258struct Other {};
259struct explicit Copyable {
260  Other m_o;
261  Copyable();
262};
263</pre>
264</td>
265<td>
266No match found. Incorrect replacement not possible.
267</td>
268</tr>
269<tr>
270  <td>Replacement of <span class="mono">begin()</span>
271    with <span class="mono">cbegin()</span>:
272<pre>
273cxxMemberCallExpr(
274  on(ConstContainerExpr),
275  callee(cxxMethodDecl(hasName("begin")))
276  ).bind("replace_with_cbegin")
277</pre>
278given:
279<pre>
280void foo() {
281  const Container c;
282  c.begin();
283
284  for (auto i : c) {
285  }
286}
287</pre>
288</td>
289<td>
2902 matches found. Replacement produces incorrect output:
291<pre>
292void foo() {
293  const Container c;
294  c.cbegin();
295
296  for (auto i :.cbegin() c) {
297  }
298}
299</pre>
300</td>
301<td>
3021 match found. Replacement produces correct output:
303<pre>
304void foo() {
305  const Container c;
306  c.cbegin();
307
308  for (auto i : c) {
309  }
310}
311</pre>
312</td>
313</tr>
314<tr>
315  <td>Replacement of <span class="mono">int</span> member
316    with <span class="mono">safe_int</span>:
317<pre>
318fieldDecl(
319  hasType(asString("int"))
320  ).bind("use_safe_int")
321</pre>
322given:
323<pre>
324struct S {
325  int m_i;
326};
327
328template &lt;typename T&gt; struct TemplStruct {
329  TemplStruct() {}
330  ~TemplStruct() {}
331
332private:
333  T m_t;
334};
335
336void instantiate() { TemplStruct&lt;int&gt; ti; }
337</pre>
338</td>
339<td>
3402 matches found. Replacement produces incorrect output:
341<pre>
342struct S {
343  safe_int m_i;
344};
345
346template &lt;typename T&gt; struct TemplStruct {
347  TemplStruct() {}
348  ~TemplStruct() {}
349
350private:
351  safe_int m_t;
352};
353
354void instantiate() { TemplStruct&lt;int&gt; ti; }
355</pre>
356</td>
357<td>
3581 match found. Replacement produces correct output:
359<pre>
360struct S {
361  safe_int m_i;
362};
363
364template &lt;typename T&gt; struct TemplStruct {
365  TemplStruct() {}
366  ~TemplStruct() {}
367
368private:
369  T m_t;
370};
371
372void instantiate() { TemplStruct&lt;int&gt; ti; }
373</pre>
374</td>
375</tr>
376<tr>
377  <td>Add prefix to member initializer
378<pre>
379cxxCtorInitializer(
380  forField(fieldDecl())
381  ).bind("add_prefix")
382</pre>
383given:
384<pre>
385struct Simple {};
386
387struct Record {
388  Record() : i(42) {}
389private:
390  int i;
391  Simple s;
392};
393</pre>
394</td>
395<td>
3962 matches found. Replacement produces incorrect output:
397<pre>
398struct Simple {};
399
400struct Record {
401  m_Record() : m_i(42) {}
402private:
403  int i;
404  Simple s;
405};
406</pre>
407</td>
408<td>
4091 match found. Replacement produces correct output:
410<pre>
411struct Simple {};
412
413struct Record {
414  Record() : m_i(42) {}
415private:
416  int i;
417  Simple s;
418};
419</pre>
420</td>
421</tr>
422<tr>
423  <td>Ignored default arguments
424<pre>
425callExpr(
426  callee(functionDecl(
427    hasName("hasDefaultArg")
428    )),
429  argumentCountIs(1)
430  ).bind("add_prefix")
431</pre>
432given:
433<pre>
434void hasDefaultArg(int i, int j = 0) {}
435void callDefaultArg() { hasDefaultArg(42); }
436</pre>
437</td>
438<td>
439No match.
440</td>
441<td>
4421 match found.
443</td>
444</tr>
445<tr>
446  <td>Lambda fields
447<pre>
448fieldDecl(
449  hasType(asString("int"))
450  ).bind("make_safe")
451</pre>
452given:
453<pre>
454struct S {
455  int m_i;
456};
457
458void func() {
459  int a = 0;
460  int c = 0;
461
462  auto l = [a, b = c](int d) { int e = d; };
463  l(43);
464}
465</pre>
466</td>
467<td>
4682 matches found. Replacement produces incorrect output:
469<pre>
470struct S {
471  safe_int m_i;
472};
473
474void func() {
475  int a = 0;
476  int c = 0;
477
478  auto l = [safe_a, safe_b = c](int d) { int e = d; };
479  l(43);
480}
481</pre>
482</td>
483<td>
4841 match found. Replacement produces correct output:
485<pre>
486struct S {
487  safe_int m_i;
488};
489
490void func() {
491  int a = 0;
492  int c = 0;
493
494  auto l = [a, b = c](int d) { int e = d; };
495  l(43);
496}
497</pre>
498</td>
499
500</tr>
501
502
503
504
505
506<tr>
507  <td>Rewritten binary operators
508<pre>
509binaryOperator(
510  hasOperatorName("&lt;"),
511  hasRHS(hasDescendant(integerLiteral(equals(0))))
512  )
513</pre>
514given:
515<pre>
516#include &lt;compare&gt;
517
518class HasSpaceship {
519public:
520   int x;
521   bool operator==(const HasSpaceship&) const = default;
522   std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523};
524
525bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526   return a < b;
527}
528</pre>
529</td>
530<td>
5311 match found.
532
533<pre>
534   return a < b;
535          ^~~~~
536</pre>
537
538</td>
539<td>
540No match found.
541</td>
542</tr>
543</table>
544
545<!-- ======================================================================= -->
546<h2 id="decl-matchers">Node Matchers</h2>
547<!-- ======================================================================= -->
548
549<p>Node matchers are at the core of matcher expressions - they specify the type
550of node that is expected. Every match expression starts with a node matcher,
551which can then be further refined with a narrowing or traversal matcher. All
552traversal matchers take node matchers as their arguments.</p>
553
554<p>For convenience, all node matchers take an arbitrary number of arguments
555and implicitly act as allOf matchers.</p>
556
557<p>Node matchers are the only matchers that support the bind("id") call to
558bind the matched node to the given string, to be later retrieved from the
559match callback.</p>
560
561<p>It is important to remember that the arguments to node matchers are
562predicates on the same node, just with additional information about the type.
563This is often useful to make matcher expression more readable by inlining bind
564calls into redundant node matchers inside another node matcher:
565<pre>
566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567// the same node.
568recordDecl(decl().bind("id"), hasName("::MyClass"))
569</pre>
570</p>
571
572<table>
573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574<!-- START_DECL_MATCHERS -->
575
576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;...</td></tr>
577<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
578
579Examples matches public virtual B.
580  class B {};
581  class C : public virtual B {};
582</pre></td></tr>
583
584
585<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
586<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
587
588Examples matches i(42).
589  class C {
590    C() : i(42) {}
591    int i;
592  };
593</pre></td></tr>
594
595
596<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
597<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
598
599Given
600  class C {
601  public:
602    int a;
603  };
604accessSpecDecl()
605  matches 'public:'
606</pre></td></tr>
607
608
609<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;...</td></tr>
610<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
611Example matches foo and bar
612(matcher = bindingDecl()
613
614  auto [foo, bar] = std::make_pair{42, 42};
615</pre></td></tr>
616
617
618<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
619<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
620
621Example matches the declaration of the nameless block printing an input
622integer.
623
624  myFunc(^(int p) {
625    printf("%d", p);
626  })
627</pre></td></tr>
628
629
630<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
631<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
632
633Example matches Z
634  template&lt;class T&gt; class Z {};
635</pre></td></tr>
636
637
638<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
639<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
640
641Given
642  template&lt;class T1, class T2, int I&gt;
643  class A {};
644
645  template&lt;class T, int I&gt;
646  class A&lt;T, T*, I&gt; {};
647
648  template&lt;&gt;
649  class A&lt;int, int, 1&gt; {};
650classTemplatePartialSpecializationDecl()
651  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
652</pre></td></tr>
653
654
655<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
656<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
657
658Given
659  template&lt;typename T&gt; class A {};
660  template&lt;&gt; class A&lt;double&gt; {};
661  A&lt;int&gt; a;
662classTemplateSpecializationDecl()
663  matches the specializations A&lt;int&gt; and A&lt;double&gt;
664</pre></td></tr>
665
666
667<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
668<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
669
670Example matches Foo::Foo() and Foo::Foo(int)
671  class Foo {
672   public:
673    Foo();
674    Foo(int);
675    int DoSomething();
676  };
677</pre></td></tr>
678
679
680<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
681<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
682
683Example matches the operator.
684  class X { operator int() const; };
685</pre></td></tr>
686
687
688<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
689<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
690
691Example matches the deduction guide.
692  template&lt;typename T&gt;
693  class X { X(int) };
694  X(int) -&gt; X&lt;int&gt;;
695</pre></td></tr>
696
697
698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
699<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
700
701Example matches Foo::~Foo()
702  class Foo {
703   public:
704    virtual ~Foo();
705  };
706</pre></td></tr>
707
708
709<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
710<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
711
712Example matches y
713  class X { void y(); };
714</pre></td></tr>
715
716
717<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
718<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
719
720Example matches X, Z
721  class X;
722  template&lt;class T&gt; class Z {};
723</pre></td></tr>
724
725
726<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
727<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
728
729Examples matches X, C, and the friend declaration inside C;
730  void X();
731  class C {
732    friend X;
733  };
734</pre></td></tr>
735
736
737<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
738<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
739and non-type template parameter declarations).
740
741Given
742  class X { int y; };
743declaratorDecl()
744  matches int y.
745</pre></td></tr>
746
747
748<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
749<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
750
751Examples matches the declaration node with foo and bar, but not
752number.
753(matcher = declStmt(has(decompositionDecl())))
754
755  int number = 42;
756  auto [foo, bar] = std::make_pair{42, 42};
757</pre></td></tr>
758
759
760<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
761<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
762
763Example matches A, B, C
764  enum X {
765    A, B, C
766  };
767</pre></td></tr>
768
769
770<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
771<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
772
773Example matches X
774  enum X {
775    A, B, C
776  };
777</pre></td></tr>
778
779
780<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
781<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
782
783Given
784  class X { int m; };
785fieldDecl()
786  matches 'm'.
787</pre></td></tr>
788
789
790<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
791<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
792
793Given
794  class X { friend void foo(); };
795friendDecl()
796  matches 'friend void foo()'.
797</pre></td></tr>
798
799
800<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
801<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
802
803Example matches f
804  void f();
805</pre></td></tr>
806
807
808<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
809<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
810
811Example matches f
812  template&lt;class T&gt; void f(T t) {}
813</pre></td></tr>
814
815
816<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
817<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
818
819Given
820  struct X { struct { int a; }; };
821indirectFieldDecl()
822  matches 'a'.
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
827<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
828
829Given
830  goto FOO;
831  FOO: bar();
832labelDecl()
833  matches 'FOO:'
834</pre></td></tr>
835
836
837<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
838<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
839
840Given
841  extern "C" {}
842linkageSpecDecl()
843  matches "extern "C" {}"
844</pre></td></tr>
845
846
847<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
848<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
849
850Example matches X, S, the anonymous union type, i, and U;
851  typedef int X;
852  struct S {
853    union {
854      int i;
855    } U;
856  };
857</pre></td></tr>
858
859
860<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
861<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
862
863Given
864  namespace test {}
865  namespace alias = ::test;
866namespaceAliasDecl()
867  matches "namespace alias" but not "namespace test"
868</pre></td></tr>
869
870
871<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
872<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
873
874Given
875  namespace {}
876  namespace test {}
877namespaceDecl()
878  matches "namespace {}" and "namespace test {}"
879</pre></td></tr>
880
881
882<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
883<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
884
885Given
886  template &lt;typename T, int N&gt; struct C {};
887nonTypeTemplateParmDecl()
888  matches 'N', but not 'T'.
889</pre></td></tr>
890
891
892<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
893<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
894
895Example matches Foo (Additions)
896  @interface Foo (Additions)
897  @end
898</pre></td></tr>
899
900
901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
902<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
903
904Example matches Foo (Additions)
905  @implementation Foo (Additions)
906  @end
907</pre></td></tr>
908
909
910<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
911<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
912
913Example matches Foo
914  @implementation Foo
915  @end
916</pre></td></tr>
917
918
919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
920<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
921
922Example matches Foo
923  @interface Foo
924  @end
925</pre></td></tr>
926
927
928<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
929<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
930
931Example matches _enabled
932  @implementation Foo {
933    BOOL _enabled;
934  }
935  @end
936</pre></td></tr>
937
938
939<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
940<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
941
942Example matches both declaration and definition of -[Foo method]
943  @interface Foo
944  - (void)method;
945  @end
946
947  @implementation Foo
948  - (void)method {}
949  @end
950</pre></td></tr>
951
952
953<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
954<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
955
956Example matches enabled
957  @interface Foo
958  @property BOOL enabled;
959  @end
960</pre></td></tr>
961
962
963<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
964<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
965
966Example matches FooDelegate
967  @protocol FooDelegate
968  @end
969</pre></td></tr>
970
971
972<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
973<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
974
975Given
976  void f(int x);
977parmVarDecl()
978  matches int x.
979</pre></td></tr>
980
981
982<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
983<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
984
985Example matches X, Z, U, and S
986  class X;
987  template&lt;class T&gt; class Z {};
988  struct S {};
989  union U {};
990</pre></td></tr>
991
992
993<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
994<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
995
996Example:
997  staticAssertExpr()
998matches
999  static_assert(sizeof(S) == sizeof(int))
1000in
1001  struct S {
1002    int x;
1003  };
1004  static_assert(sizeof(S) == sizeof(int));
1005</pre></td></tr>
1006
1007
1008<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
1009<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1010
1011Example matches X, Z, U, S, E
1012  class X;
1013  template&lt;class T&gt; class Z {};
1014  struct S {};
1015  union U {};
1016  enum E {
1017    A, B, C
1018  };
1019</pre></td></tr>
1020
1021
1022<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
1023<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1024
1025Given
1026  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
1027templateTypeParmDecl()
1028  matches 'Z', but not 'N'.
1029</pre></td></tr>
1030
1031
1032<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
1033<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1034
1035Given
1036  template &lt;typename T, int N&gt; struct C {};
1037templateTypeParmDecl()
1038  matches 'T', but not 'N'.
1039</pre></td></tr>
1040
1041
1042<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
1043<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1044
1045Given
1046  int X;
1047  namespace NS {
1048  int Y;
1049  }  // namespace NS
1050decl(hasDeclContext(translationUnitDecl()))
1051  matches "int X", but not "int Y".
1052</pre></td></tr>
1053
1054
1055<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
1056<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1057
1058Given
1059  typedef int X;
1060  using Y = int;
1061typeAliasDecl()
1062  matches "using Y = int", but not "typedef int X"
1063</pre></td></tr>
1064
1065
1066<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
1067<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1068
1069typeAliasTemplateDecl() matches
1070  template &lt;typename T&gt;
1071  using Y = X&lt;T&gt;;
1072</pre></td></tr>
1073
1074
1075<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
1076<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1077
1078Given
1079  typedef int X;
1080  using Y = int;
1081typedefDecl()
1082  matches "typedef int X", but not "using Y = int"
1083</pre></td></tr>
1084
1085
1086<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
1087<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1088
1089Given
1090  typedef int X;
1091  using Y = int;
1092typedefNameDecl()
1093  matches "typedef int X" and "using Y = int"
1094</pre></td></tr>
1095
1096
1097<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
1098<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1099typename.
1100
1101Given
1102  template &lt;typename T&gt;
1103  struct Base { typedef T Foo; };
1104
1105  template&lt;typename T&gt;
1106  struct S : private Base&lt;T&gt; {
1107    using typename Base&lt;T&gt;::Foo;
1108  };
1109unresolvedUsingTypenameDecl()
1110  matches using Base&lt;T&gt;::Foo </pre></td></tr>
1111
1112
1113<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
1114<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1115
1116Given
1117  template&lt;typename X&gt;
1118  class C : private X {
1119    using X::x;
1120  };
1121unresolvedUsingValueDecl()
1122  matches using X::x </pre></td></tr>
1123
1124
1125<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
1126<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1127
1128Given
1129  namespace X { int x; }
1130  using X::x;
1131usingDecl()
1132  matches using X::x </pre></td></tr>
1133
1134
1135<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
1136<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1137
1138Given
1139  namespace X { int x; }
1140  using namespace X;
1141usingDirectiveDecl()
1142  matches using namespace X </pre></td></tr>
1143
1144
1145<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
1146<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1147
1148Example matches A, B, C and F
1149  enum X { A, B, C };
1150  void F();
1151</pre></td></tr>
1152
1153
1154<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
1155<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1156
1157Note: this does not match declarations of member variables, which are
1158"field" declarations in Clang parlance.
1159
1160Example matches a
1161  int a;
1162</pre></td></tr>
1163
1164
1165<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
1166<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1167</pre></td></tr>
1168
1169
1170<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
1171<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1172
1173Given
1174  namespace ns {
1175    struct A { static void f(); };
1176    void A::f() {}
1177    void g() { A::f(); }
1178  }
1179  ns::A a;
1180nestedNameSpecifier()
1181  matches "ns::" and both "A::"
1182</pre></td></tr>
1183
1184
1185<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
1186<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1187
1188Given
1189
1190  #pragma omp parallel default(none)
1191  #pragma omp parallel default(shared)
1192  #pragma omp parallel default(firstprivate)
1193  #pragma omp parallel
1194
1195``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1196``default(firstprivate)``
1197</pre></td></tr>
1198
1199
1200<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
1201<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1202</pre></td></tr>
1203
1204
1205<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
1206<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1207
1208Given
1209  FOO: bar();
1210  void *ptr = &amp;&amp;FOO;
1211  goto *bar;
1212addrLabelExpr()
1213  matches '&amp;&amp;FOO'
1214</pre></td></tr>
1215
1216
1217<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
1218<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1219
1220Given
1221  int i = a[1];
1222arraySubscriptExpr()
1223  matches "a[1]"
1224</pre></td></tr>
1225
1226
1227<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
1228<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1229
1230 int i = 100;
1231  __asm("mov al, 2");
1232asmStmt()
1233  matches '__asm("mov al, 2")'
1234</pre></td></tr>
1235
1236
1237<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
1238<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1239Example matches __atomic_load_n(ptr, 1)
1240  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1241</pre></td></tr>
1242
1243
1244<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
1245<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1246
1247Given
1248  @autoreleasepool {
1249    int x = 0;
1250  }
1251autoreleasePoolStmt(stmt()) matches the declaration of "x"
1252inside the autorelease pool.
1253</pre></td></tr>
1254
1255
1256<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
1257<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1258
1259Example matches a ?: b
1260  (a ?: b) + 42;
1261</pre></td></tr>
1262
1263
1264<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
1265<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1266
1267Example matches a || b
1268  !(a || b)
1269See also the binaryOperation() matcher for more-general matching.
1270</pre></td></tr>
1271
1272
1273<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
1274<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1275
1276Example: matches "^{}":
1277  void f() { ^{}(); }
1278</pre></td></tr>
1279
1280
1281<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
1282<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1283
1284Given
1285  while (true) { break; }
1286breakStmt()
1287  matches 'break'
1288</pre></td></tr>
1289
1290
1291<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
1292<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1293
1294Example: Matches (int) 2.2f in
1295  int i = (int) 2.2f;
1296</pre></td></tr>
1297
1298
1299<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
1300<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1301
1302Example matches x.y() and y()
1303  X x;
1304  x.y();
1305  y();
1306</pre></td></tr>
1307
1308
1309<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
1310<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1311
1312Given
1313  switch(a) { case 42: break; default: break; }
1314caseStmt()
1315  matches 'case 42:'.
1316</pre></td></tr>
1317
1318
1319<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
1320<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1321
1322Example: castExpr() matches each of the following:
1323  (int) 3;
1324  const_cast&lt;Expr *&gt;(SubExpr);
1325  char c = 0;
1326but does not match
1327  int i = (0);
1328  int k = 0;
1329</pre></td></tr>
1330
1331
1332<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
1333<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1334
1335Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1336though.
1337
1338Example matches 'a', L'a'
1339  char ch = 'a';
1340  wchar_t chw = L'a';
1341</pre></td></tr>
1342
1343
1344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
1345<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1346</pre></td></tr>
1347
1348
1349<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>&gt;...</td></tr>
1350<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1351
1352Given
1353  co_await 1;
1354coawaitExpr()
1355  matches 'co_await 1'
1356</pre></td></tr>
1357
1358
1359<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
1360<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1361
1362Example match: {1}, (1, 2)
1363  int array[4] = {1};
1364  vector int myvec = (vector int)(1, 2);
1365</pre></td></tr>
1366
1367
1368<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
1369<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1370
1371Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1372  for (;;) {{}}
1373</pre></td></tr>
1374
1375
1376<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
1377<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1378
1379Example matches a ? b : c
1380  (a ? b : c) + 42
1381</pre></td></tr>
1382
1383
1384<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
1385<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1386
1387Example matches the constant in the case statement:
1388    (matcher = constantExpr())
1389  switch (a) {
1390  case 37: break;
1391  }
1392</pre></td></tr>
1393
1394
1395<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
1396<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1397
1398Given
1399  while (true) { continue; }
1400continueStmt()
1401  matches 'continue'
1402</pre></td></tr>
1403
1404
1405<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>&gt;...</td></tr>
1406<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1407
1408Given
1409  while (true) { co_return; }
1410coreturnStmt()
1411  matches 'co_return'
1412</pre></td></tr>
1413
1414
1415<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>&gt;...</td></tr>
1416<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1417
1418Given
1419  co_yield 1;
1420coyieldExpr()
1421  matches 'co_yield 1'
1422</pre></td></tr>
1423
1424
1425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
1426<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1427
1428Example matches,
1429  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
1430</pre></td></tr>
1431
1432
1433<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
1434<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1435
1436Example matches FunctionTakesString(GetStringByValue())
1437    (matcher = cxxBindTemporaryExpr())
1438  FunctionTakesString(GetStringByValue());
1439  FunctionTakesStringByPointer(GetStringPointer());
1440</pre></td></tr>
1441
1442
1443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
1444<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1445
1446Example matches true
1447  true
1448</pre></td></tr>
1449
1450
1451<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
1452<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1453
1454  try {} catch(int i) {}
1455cxxCatchStmt()
1456  matches 'catch(int i)'
1457</pre></td></tr>
1458
1459
1460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
1461<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1462
1463Example: Matches const_cast&lt;int*&gt;(&amp;r) in
1464  int n = 42;
1465  const int &amp;r(n);
1466  int* p = const_cast&lt;int*&gt;(&amp;r);
1467</pre></td></tr>
1468
1469
1470<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
1471<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1472
1473Example matches string(ptr, n) and ptr within arguments of f
1474    (matcher = cxxConstructExpr())
1475  void f(const string &amp;a, const string &amp;b);
1476  char *ptr;
1477  int n;
1478  f(string(ptr, n), ptr);
1479</pre></td></tr>
1480
1481
1482<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
1483<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1484
1485Example matches the CXXDefaultArgExpr placeholder inserted for the
1486    default value of the second parameter in the call expression f(42)
1487    (matcher = cxxDefaultArgExpr())
1488  void f(int x, int y = 0);
1489  f(42);
1490</pre></td></tr>
1491
1492
1493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
1494<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1495
1496Given
1497  delete X;
1498cxxDeleteExpr()
1499  matches 'delete X'.
1500</pre></td></tr>
1501
1502
1503<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
1504<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1505resolved because the base expression or the member name was dependent.
1506
1507Given
1508  template &lt;class T&gt; void f() { T t; t.g(); }
1509cxxDependentScopeMemberExpr()
1510  matches t.g
1511</pre></td></tr>
1512
1513
1514<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
1515<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1516
1517Example:
1518  cxxDynamicCastExpr()
1519matches
1520  dynamic_cast&lt;D*&gt;(&amp;b);
1521in
1522  struct B { virtual ~B() {} }; struct D : B {};
1523  B b;
1524  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1525</pre></td></tr>
1526
1527
1528<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
1529<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1530
1531cxxForRangeStmt() matches 'for (auto a : i)'
1532  int i[] =  {1, 2, 3}; for (auto a : i);
1533  for(int j = 0; j &lt; 5; ++j);
1534</pre></td></tr>
1535
1536
1537<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
1538<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1539
1540Example: Matches Foo(bar);
1541  Foo f = bar;
1542  Foo g = (Foo) bar;
1543  Foo h = Foo(bar);
1544</pre></td></tr>
1545
1546
1547<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
1548<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1549
1550Example matches x.y()
1551  X x;
1552  x.y();
1553</pre></td></tr>
1554
1555
1556<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
1557<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1558
1559Given
1560  new X;
1561cxxNewExpr()
1562  matches 'new X'.
1563</pre></td></tr>
1564
1565
1566<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>&gt;...</td></tr>
1567<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1568
1569Given
1570  bool a() noexcept;
1571  bool b() noexcept(true);
1572  bool c() noexcept(false);
1573  bool d() noexcept(noexcept(a()));
1574  bool e = noexcept(b()) || noexcept(c());
1575cxxNoexceptExpr()
1576  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1577  doesn't match the noexcept specifier in the declarations a, b, c or d.
1578</pre></td></tr>
1579
1580
1581<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
1582<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1583</pre></td></tr>
1584
1585
1586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
1587<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1588
1589Note that if an operator isn't overloaded, it won't match. Instead, use
1590binaryOperator matcher.
1591Currently it does not match operators such as new delete.
1592FIXME: figure out why these do not match?
1593
1594Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1595    (matcher = cxxOperatorCallExpr())
1596  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1597  ostream &amp;o; int b = 1, c = 1;
1598  o &lt;&lt; b &lt;&lt; c;
1599See also the binaryOperation() matcher for more-general matching of binary
1600uses of this AST node.
1601</pre></td></tr>
1602
1603
1604<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
1605<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1606
1607Either the source expression or the destination type can be matched
1608using has(), but hasDestinationType() is more specific and can be
1609more readable.
1610
1611Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1612  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1613</pre></td></tr>
1614
1615
1616<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;...</td></tr>
1617<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1618
1619Example matches use of "&lt;":
1620  #include &lt;compare&gt;
1621  struct HasSpaceshipMem {
1622    int a;
1623    constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
1624  };
1625  void compare() {
1626    HasSpaceshipMem hs1, hs2;
1627    if (hs1 &lt; hs2)
1628        return;
1629  }
1630See also the binaryOperation() matcher for more-general matching
1631of this AST node.
1632</pre></td></tr>
1633
1634
1635<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
1636<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1637
1638See also: hasDestinationType
1639See also: reinterpretCast
1640
1641Example:
1642  cxxStaticCastExpr()
1643matches
1644  static_cast&lt;long&gt;(8)
1645in
1646  long eight(static_cast&lt;long&gt;(8));
1647</pre></td></tr>
1648
1649
1650<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
1651<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1652
1653Given
1654  std::vector&lt;int&gt; a({ 1, 2, 3 });
1655  std::vector&lt;int&gt; b = { 4, 5 };
1656  int c[] = { 6, 7 };
1657  std::pair&lt;int, int&gt; d = { 8, 9 };
1658cxxStdInitializerListExpr()
1659  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1660</pre></td></tr>
1661
1662
1663<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1664<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1665
1666Example: Matches Foo(bar, bar)
1667  Foo h = Foo(bar, bar);
1668</pre></td></tr>
1669
1670
1671<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1672<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1673
1674Example matches the implicit this expression in "return i".
1675    (matcher = cxxThisExpr())
1676struct foo {
1677  int i;
1678  int f() { return i; }
1679};
1680</pre></td></tr>
1681
1682
1683<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1684<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1685
1686  try { throw 5; } catch(int i) {}
1687cxxThrowExpr()
1688  matches 'throw 5'
1689</pre></td></tr>
1690
1691
1692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1693<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1694
1695  try {} catch(int i) {}
1696cxxTryStmt()
1697  matches 'try {}'
1698</pre></td></tr>
1699
1700
1701<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1702<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1703
1704Example matches T(t) in return statement of f
1705    (matcher = cxxUnresolvedConstructExpr())
1706  template &lt;typename T&gt;
1707  void f(const T&amp; t) { return T(t); }
1708</pre></td></tr>
1709
1710
1711<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
1712<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1713
1714Example matches x in if (x)
1715  bool x;
1716  if (x) {}
1717</pre></td></tr>
1718
1719
1720<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
1721<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1722
1723Given
1724  int a;
1725declStmt()
1726  matches 'int a'.
1727</pre></td></tr>
1728
1729
1730<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
1731<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1732
1733Given
1734  switch(a) { case 42: break; default: break; }
1735defaultStmt()
1736  matches 'default:'.
1737</pre></td></tr>
1738
1739
1740<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>&gt;...</td></tr>
1741<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1742</pre></td></tr>
1743
1744
1745<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1746<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1747
1748Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1749  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1750</pre></td></tr>
1751
1752
1753<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
1754<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1755
1756Given
1757  do {} while (true);
1758doStmt()
1759  matches 'do {} while(true)'
1760</pre></td></tr>
1761
1762
1763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
1764<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1765
1766Matches any cast expression written in user code, whether it be a
1767C-style cast, a functional-style cast, or a keyword cast.
1768
1769Does not match implicit conversions.
1770
1771Note: the name "explicitCast" is chosen to match Clang's terminology, as
1772Clang uses the term "cast" to apply to implicit conversions as well as to
1773actual cast expressions.
1774
1775See also: hasDestinationType.
1776
1777Example: matches all five of the casts in
1778  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1779but does not match the implicit conversion in
1780  long ell = 42;
1781</pre></td></tr>
1782
1783
1784<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
1785<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1786
1787Example matches x()
1788  void f() { x(); }
1789</pre></td></tr>
1790
1791
1792<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
1793<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1794of the sub-expression's evaluation.
1795
1796Example matches std::string()
1797  const std::string str = std::string();
1798</pre></td></tr>
1799
1800
1801<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>&gt;...</td></tr>
1802<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1803</pre></td></tr>
1804
1805
1806<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
1807<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
18081.0, 1.0f, 1.0L and 1e10.
1809
1810Does not match implicit conversions such as
1811  float a = 10;
1812</pre></td></tr>
1813
1814
1815<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
1816<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1817
1818Example matches 'for (;;) {}'
1819  for (;;) {}
1820  int i[] =  {1, 2, 3}; for (auto a : i);
1821</pre></td></tr>
1822
1823
1824<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>&gt;...</td></tr>
1825<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1826</pre></td></tr>
1827
1828
1829<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1830<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1831</pre></td></tr>
1832
1833
1834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
1835<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1836
1837Given
1838  goto FOO;
1839  FOO: bar();
1840gotoStmt()
1841  matches 'goto FOO'
1842</pre></td></tr>
1843
1844
1845<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
1846<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1847
1848Example matches 'if (x) {}'
1849  if (x) {}
1850</pre></td></tr>
1851
1852
1853<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
1854<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1855point literals e.g.: 1i, 1.0i
1856</pre></td></tr>
1857
1858
1859<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
1860<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1861
1862This matches many different places, including function call return value
1863eliding, as well as any type conversions.
1864</pre></td></tr>
1865
1866
1867<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1868<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1869
1870Given
1871  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1872implicitValueInitExpr()
1873  matches "[0].y" (implicitly)
1874</pre></td></tr>
1875
1876
1877<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
1878<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1879
1880Given
1881  int a[] = { 1, 2 };
1882  struct B { int x, y; };
1883  B b = { 5, 6 };
1884initListExpr()
1885  matches "{ 1, 2 }" and "{ 5, 6 }"
1886</pre></td></tr>
1887
1888
1889<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
1890<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
18911, 1L, 0x1 and 1U.
1892
1893Does not match character-encoded integers such as L'a'.
1894</pre></td></tr>
1895
1896
1897<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
1898<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1899
1900Given
1901  goto FOO;
1902  FOO: bar();
1903labelStmt()
1904  matches 'FOO:'
1905</pre></td></tr>
1906
1907
1908<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
1909<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1910
1911Example matches [&amp;](){return 5;}
1912  [&amp;](){return 5;}
1913</pre></td></tr>
1914
1915
1916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
1917<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1918
1919Example: Given
1920  struct T {void func();};
1921  T f();
1922  void g(T);
1923materializeTemporaryExpr() matches 'f()' in these statements
1924  T u(f());
1925  g(f());
1926  f().func();
1927but does not match
1928  f();
1929</pre></td></tr>
1930
1931
1932<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
1933<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1934
1935Given
1936  class Y {
1937    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1938    int a; static int b;
1939  };
1940memberExpr()
1941  matches this-&gt;x, x, y.x, a, this-&gt;b
1942</pre></td></tr>
1943
1944
1945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
1946<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1947
1948  foo();;
1949nullStmt()
1950  matches the second ';'
1951</pre></td></tr>
1952
1953
1954<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1955<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1956
1957Example matches @catch
1958  @try {}
1959  @catch (...) {}
1960</pre></td></tr>
1961
1962
1963<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1964<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1965
1966Example matches @finally
1967  @try {}
1968  @finally {}
1969</pre></td></tr>
1970
1971
1972<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
1973<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1974
1975Example: matches "a" in "init" method:
1976@implementation A {
1977  NSString *a;
1978}
1979- (void) init {
1980  a = @"hello";
1981}
1982</pre></td></tr>
1983
1984
1985<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1986<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1987
1988The innermost message send invokes the "alloc" class method on the
1989NSString class, while the outermost message send invokes the
1990"initWithString" instance method on the object returned from
1991NSString's "alloc". This matcher should match both message sends.
1992  [[NSString alloc] initWithString:@"Hello"]
1993</pre></td></tr>
1994
1995
1996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
1997<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1998
1999Example matches @throw obj;
2000</pre></td></tr>
2001
2002
2003<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
2004<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2005
2006Example matches @try
2007  @try {}
2008  @catch (...) {}
2009</pre></td></tr>
2010
2011
2012<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
2013<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2014
2015Given
2016
2017  #pragma omp parallel
2018  #pragma omp parallel default(none)
2019  #pragma omp taskyield
2020
2021``ompExecutableDirective()`` matches ``omp parallel``,
2022``omp parallel default(none)`` and ``omp taskyield``.
2023</pre></td></tr>
2024
2025
2026<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
2027<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2028to reference another expressions and can be met
2029in BinaryConditionalOperators, for example.
2030
2031Example matches 'a'
2032  (a ?: c) + 42;
2033</pre></td></tr>
2034
2035
2036<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
2037<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2038
2039Example matches (foo() + 1)
2040  int foo() { return 1; }
2041  int a = (foo() + 1);
2042</pre></td></tr>
2043
2044
2045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
2046<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2047ParenListExprs don't have a predefined type and are used for late parsing.
2048In the final AST, they can be met in template declarations.
2049
2050Given
2051  template&lt;typename T&gt; class X {
2052    void f() {
2053      X x(*this);
2054      int a = 0, b = 1; int i = (a, b);
2055    }
2056  };
2057parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2058has a predefined type and is a ParenExpr, not a ParenListExpr.
2059</pre></td></tr>
2060
2061
2062<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
2063<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2064
2065Example: Matches __func__
2066  printf("%s", __func__);
2067</pre></td></tr>
2068
2069
2070<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
2071<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2072
2073Given
2074  return 1;
2075returnStmt()
2076  matches 'return 1'
2077</pre></td></tr>
2078
2079
2080<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
2081<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2082
2083Given
2084  { ++a; }
2085stmt()
2086  matches both the compound statement '{ ++a; }' and '++a'.
2087</pre></td></tr>
2088
2089
2090<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
2091<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2092
2093Example match: ({ int X = 4; X; })
2094  int C = ({ int X = 4; X; });
2095</pre></td></tr>
2096
2097
2098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
2099<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2100
2101Example matches "abcd", L"abcd"
2102  char *s = "abcd";
2103  wchar_t *ws = L"abcd";
2104</pre></td></tr>
2105
2106
2107<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
2108<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2109
2110Given
2111  template &lt;int N&gt;
2112  struct A { static const int n = N; };
2113  struct B : public A&lt;42&gt; {};
2114substNonTypeTemplateParmExpr()
2115  matches "N" in the right-hand side of "static const int n = N;"
2116</pre></td></tr>
2117
2118
2119<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
2120<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2121
2122Given
2123  switch(a) { case 42: break; default: break; }
2124switchCase()
2125  matches 'case 42:' and 'default:'.
2126</pre></td></tr>
2127
2128
2129<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
2130<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2131
2132Given
2133  switch(a) { case 42: break; default: break; }
2134switchStmt()
2135  matches 'switch(a)'.
2136</pre></td></tr>
2137
2138
2139<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
2140<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2141
2142Given
2143  Foo x = bar;
2144  int y = sizeof(x) + alignof(x);
2145unaryExprOrTypeTraitExpr()
2146  matches sizeof(x) and alignof(x)
2147</pre></td></tr>
2148
2149
2150<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
2151<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2152
2153Example matches !a
2154  !a || b
2155</pre></td></tr>
2156
2157
2158<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
2159<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2160but could not be resolved to a specific declaration.
2161
2162Given
2163  template&lt;typename T&gt;
2164  T foo() { T a; return a; }
2165  template&lt;typename T&gt;
2166  void bar() {
2167    foo&lt;T&gt;();
2168  }
2169unresolvedLookupExpr()
2170  matches foo&lt;T&gt;() </pre></td></tr>
2171
2172
2173<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
2174<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2175
2176Given
2177  struct X {
2178    template &lt;class T&gt; void f();
2179    void g();
2180  };
2181  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
2182unresolvedMemberExpr()
2183  matches x.f&lt;T&gt;
2184</pre></td></tr>
2185
2186
2187<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
2188<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2189
2190Example match: "foo"_suffix
2191</pre></td></tr>
2192
2193
2194<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
2195<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2196
2197Given
2198  while (true) {}
2199whileStmt()
2200  matches 'while (true) {}'.
2201</pre></td></tr>
2202
2203
2204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;...</td></tr>
2205<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2206
2207Given
2208  template &lt;typename T&gt; struct C {};
2209  C&lt;int&gt; c;
2210templateArgumentLoc()
2211  matches 'int' in C&lt;int&gt;.
2212</pre></td></tr>
2213
2214
2215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
2216<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2217
2218Given
2219  template &lt;typename T&gt; struct C {};
2220  C&lt;int&gt; c;
2221templateArgument()
2222  matches 'int' in C&lt;int&gt;.
2223</pre></td></tr>
2224
2225
2226<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
2227<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2228
2229Given
2230  template &lt;typename T&gt; class X { };
2231  X&lt;int&gt; xi;
2232templateName()
2233  matches 'X' in X&lt;int&gt;.
2234</pre></td></tr>
2235
2236
2237<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
2238<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2239</pre></td></tr>
2240
2241
2242<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
2243<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2244
2245Given
2246  int a[] = { 2, 3 };
2247  int b[4];
2248  void f() { int c[a[0]]; }
2249arrayType()
2250  matches "int a[]", "int b[4]" and "int c[a[0]]";
2251</pre></td></tr>
2252
2253
2254<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
2255<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2256
2257Given
2258  _Atomic(int) i;
2259atomicType()
2260  matches "_Atomic(int) i"
2261</pre></td></tr>
2262
2263
2264<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
2265<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2266
2267Given:
2268  auto n = 4;
2269  int v[] = { 2, 3 }
2270  for (auto i : v) { }
2271autoType()
2272  matches "auto n" and "auto i"
2273</pre></td></tr>
2274
2275
2276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
2277<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2278"void (^)(int)".
2279
2280The pointee is always required to be a FunctionType.
2281</pre></td></tr>
2282
2283
2284<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
2285<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2286
2287Given
2288  struct A {};
2289  A a;
2290  int b;
2291  float c;
2292  bool d;
2293builtinType()
2294  matches "int b", "float c" and "bool d"
2295</pre></td></tr>
2296
2297
2298<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
2299<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2300
2301Given
2302  _Complex float f;
2303complexType()
2304  matches "_Complex float f"
2305</pre></td></tr>
2306
2307
2308<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
2309<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2310
2311Given
2312  void() {
2313    int a[2];
2314    int b[] = { 2, 3 };
2315    int c[b[0]];
2316  }
2317constantArrayType()
2318  matches "int a[2]"
2319</pre></td></tr>
2320
2321
2322<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
2323<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2324Example matches i[] in declaration of f.
2325    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2326Example matches i[1].
2327    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2328  void f(int i[]) {
2329    i[1] = 0;
2330  }
2331</pre></td></tr>
2332
2333
2334<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
2335<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
2336
2337Given:
2338  short i = 1;
2339  int j = 42;
2340  decltype(i + j) result = i + j;
2341decltypeType()
2342  matches "decltype(i + j)"
2343</pre></td></tr>
2344
2345
2346<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
2347<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2348template types.
2349
2350Given
2351  template &lt;typename T&gt;
2352  class C { public: C(T); };
2353
2354  C c(123);
2355deducedTemplateSpecializationType() matches the type in the declaration
2356of the variable c.
2357</pre></td></tr>
2358
2359
2360<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
2361<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2362
2363Given
2364  template&lt;typename T, int Size&gt;
2365  class array {
2366    T data[Size];
2367  };
2368dependentSizedArrayType
2369  matches "T data[Size]"
2370</pre></td></tr>
2371
2372
2373<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
2374<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2375qualified name.
2376
2377Given
2378  namespace N {
2379    namespace M {
2380      class D {};
2381    }
2382  }
2383  class C {};
2384
2385  class C c;
2386  N::M::D d;
2387
2388elaboratedType() matches the type of the variable declarations of both
2389c and d.
2390</pre></td></tr>
2391
2392
2393<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
2394<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2395
2396Given
2397  enum C { Green };
2398  enum class S { Red };
2399
2400  C c;
2401  S s;
2402
2403enumType() matches the type of the variable declarations of both c and
2404s.
2405</pre></td></tr>
2406
2407
2408<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
2409<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2410
2411Given
2412  int (*f)(int);
2413  void g();
2414functionProtoType()
2415  matches "int (*f)(int)" and the type of "g" in C++ mode.
2416  In C mode, "g" is not matched because it does not contain a prototype.
2417</pre></td></tr>
2418
2419
2420<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
2421<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2422
2423Given
2424  int (*f)(int);
2425  void g();
2426functionType()
2427  matches "int (*f)(int)" and the type of "g".
2428</pre></td></tr>
2429
2430
2431<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
2432<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2433
2434Given
2435  int a[] = { 2, 3 };
2436  int b[42];
2437  void f(int c[]) { int d[a[0]]; };
2438incompleteArrayType()
2439  matches "int a[]" and "int c[]"
2440</pre></td></tr>
2441
2442
2443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
2444<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2445
2446Example matches S s, but not S&lt;T&gt; s.
2447    (matcher = parmVarDecl(hasType(injectedClassNameType())))
2448  template &lt;typename T&gt; struct S {
2449    void f(S s);
2450    void g(S&lt;T&gt; s);
2451  };
2452</pre></td></tr>
2453
2454
2455<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
2456<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2457
2458Given:
2459  int *a;
2460  int &amp;b = *a;
2461  int &amp;&amp;c = 1;
2462  auto &amp;d = b;
2463  auto &amp;&amp;e = c;
2464  auto &amp;&amp;f = 2;
2465  int g = 5;
2466
2467lValueReferenceType() matches the types of b, d, and e. e is
2468matched since the type is deduced as int&amp; by reference collapsing rules.
2469</pre></td></tr>
2470
2471
2472<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
2473<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2474Given
2475  struct A { int i; }
2476  A::* ptr = A::i;
2477memberPointerType()
2478  matches "A::* ptr"
2479</pre></td></tr>
2480
2481
2482<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
2483<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2484a pointer type, despite being syntactically similar.
2485
2486Given
2487  int *a;
2488
2489  @interface Foo
2490  @end
2491  Foo *f;
2492pointerType()
2493  matches "Foo *f", but does not match "int *a".
2494</pre></td></tr>
2495
2496
2497<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
2498<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2499
2500Given
2501  int (*ptr_to_array)[4];
2502  int *array_of_ptrs[4];
2503
2504varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2505array_of_ptrs.
2506</pre></td></tr>
2507
2508
2509<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
2510<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2511types.
2512
2513Given
2514  int *a;
2515  int &amp;b = *a;
2516  int c = 5;
2517
2518  @interface Foo
2519  @end
2520  Foo *f;
2521pointerType()
2522  matches "int *a", but does not match "Foo *f".
2523</pre></td></tr>
2524
2525
2526<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
2527<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2528
2529Given:
2530  int *a;
2531  int &amp;b = *a;
2532  int &amp;&amp;c = 1;
2533  auto &amp;d = b;
2534  auto &amp;&amp;e = c;
2535  auto &amp;&amp;f = 2;
2536  int g = 5;
2537
2538rValueReferenceType() matches the types of c and f. e is not
2539matched as it is deduced to int&amp; by reference collapsing rules.
2540</pre></td></tr>
2541
2542
2543<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
2544<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2545
2546Given
2547  class C {};
2548  struct S {};
2549
2550  C c;
2551  S s;
2552
2553recordType() matches the type of the variable declarations of both c
2554and s.
2555</pre></td></tr>
2556
2557
2558<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
2559<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2560
2561Given
2562  int *a;
2563  int &amp;b = *a;
2564  int &amp;&amp;c = 1;
2565  auto &amp;d = b;
2566  auto &amp;&amp;e = c;
2567  auto &amp;&amp;f = 2;
2568  int g = 5;
2569
2570referenceType() matches the types of b, c, d, e, and f.
2571</pre></td></tr>
2572
2573
2574<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
2575<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2576template type parameter.
2577
2578Given
2579  template &lt;typename T&gt;
2580  void F(T t) {
2581    int i = 1 + t;
2582  }
2583
2584substTemplateTypeParmType() matches the type of 't' but not '1'
2585</pre></td></tr>
2586
2587
2588<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
2589<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2590
2591Given
2592  enum E {};
2593  class C {};
2594
2595  E e;
2596  C c;
2597
2598tagType() matches the type of the variable declarations of both e
2599and c.
2600</pre></td></tr>
2601
2602
2603<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
2604<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2605
2606Given
2607  template &lt;typename T&gt;
2608  class C { };
2609
2610  template class C&lt;int&gt;;  // A
2611  C&lt;char&gt; var;            // B
2612
2613templateSpecializationType() matches the type of the explicit
2614instantiation in A and the type of the variable declaration in B.
2615</pre></td></tr>
2616
2617
2618<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
2619<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2620
2621Example matches T, but not int.
2622    (matcher = templateTypeParmType())
2623  template &lt;typename T&gt; void f(int i);
2624</pre></td></tr>
2625
2626
2627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
2628<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2629</pre></td></tr>
2630
2631
2632<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
2633<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2634
2635Given
2636  typedef int X;
2637typedefType()
2638  matches "typedef int X"
2639</pre></td></tr>
2640
2641
2642<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
2643<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2644
2645Given:
2646  typedef __underlying_type(T) type;
2647unaryTransformType()
2648  matches "__underlying_type(T)"
2649</pre></td></tr>
2650
2651
2652<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
2653<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2654integer-constant-expression.
2655
2656Given
2657  void f() {
2658    int a[] = { 2, 3 }
2659    int b[42];
2660    int c[a[0]];
2661  }
2662variableArrayType()
2663  matches "int c[a[0]]"
2664</pre></td></tr>
2665
2666<!--END_DECL_MATCHERS -->
2667</table>
2668
2669<!-- ======================================================================= -->
2670<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2671<!-- ======================================================================= -->
2672
2673<p>Narrowing matchers match certain attributes on the current node, thus
2674narrowing down the set of nodes of the current type to match on.</p>
2675
2676<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2677which allow users to create more powerful match expressions.</p>
2678
2679<table>
2680<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2681<!-- START_NARROWING_MATCHERS -->
2682
2683<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2684<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2685
2686Usable as: Any Matcher
2687</pre></td></tr>
2688
2689
2690<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2691<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2692
2693Usable as: Any Matcher
2694</pre></td></tr>
2695
2696
2697<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2698<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2699
2700Useful when another matcher requires a child matcher, but there's no
2701additional constraint. This will often be used with an explicit conversion
2702to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2703
2704Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2705"int* p" and "void f()" in
2706  int* p;
2707  void f();
2708
2709Usable as: Any Matcher
2710</pre></td></tr>
2711
2712
2713<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2714<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2715
2716Given
2717  if (true);
2718  for (; true; );
2719with the matcher
2720  mapAnyOf(ifStmt, forStmt).with(
2721    hasCondition(cxxBoolLiteralExpr(equals(true)))
2722    ).bind("trueCond")
2723matches the if and the for. It is equivalent to:
2724  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2725  anyOf(
2726    ifStmt(trueCond).bind("trueCond"),
2727    forStmt(trueCond).bind("trueCond")
2728    );
2729
2730The with() chain-call accepts zero or more matchers which are combined
2731as-if with allOf() in each of the node matchers.
2732Usable as: Any Matcher
2733</pre></td></tr>
2734
2735
2736<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2737<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2738
2739Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2740  class X {};
2741  class Y {};
2742
2743Usable as: Any Matcher
2744</pre></td></tr>
2745
2746
2747<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2748<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2749specified names.
2750
2751   hasAnyOperatorName("+", "-")
2752 Is equivalent to
2753   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2754</pre></td></tr>
2755
2756
2757<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2758<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2759unary).
2760
2761Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2762  !(a || b)
2763</pre></td></tr>
2764
2765
2766<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2767<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2768
2769Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2770  if (a == b)
2771    a += b;
2772
2773Example 2: matches s1 = s2
2774           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2775  struct S { S&amp; operator=(const S&amp;); };
2776  void x() { S s1, s2; s1 = s2; }
2777</pre></td></tr>
2778
2779
2780<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2781<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2782
2783Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2784  if (a == b)
2785    a += b;
2786
2787Example 2: matches s1 &lt; s2
2788           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2789  struct S { bool operator&lt;(const S&amp; other); };
2790  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2791</pre></td></tr>
2792
2793
2794<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
2795<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2796inheritance.
2797
2798Examples:
2799  class C {
2800  public:    int a;
2801  protected: int b;
2802  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2803  };
2804
2805  struct Base {};
2806  struct Derived1 : private Base {}; // matches 'Base'
2807  class Derived2 : Base {}; // matches 'Base'
2808</pre></td></tr>
2809
2810
2811<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
2812<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2813protected inheritance.
2814
2815Examples:
2816  class C {
2817  public:    int a;
2818  protected: int b; // fieldDecl(isProtected()) matches 'b'
2819  private:   int c;
2820  };
2821
2822  class Base {};
2823  class Derived : protected Base {}; // matches 'Base'
2824</pre></td></tr>
2825
2826
2827<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
2828<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2829inheritance.
2830
2831Examples:
2832  class C {
2833  public:    int a; // fieldDecl(isPublic()) matches 'a'
2834  protected: int b;
2835  private:   int c;
2836  };
2837
2838  class Base {};
2839  class Derived1 : public Base {}; // matches 'Base'
2840  struct Derived2 : Base {}; // matches 'Base'
2841</pre></td></tr>
2842
2843
2844<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
2845<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2846virtual inheritance.
2847
2848Example:
2849  class A {
2850   public:
2851    virtual void x(); // matches x
2852  };
2853
2854Example:
2855  class Base {};
2856  class DirectlyDerived : virtual Base {}; // matches Base
2857  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2858
2859Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2860</pre></td></tr>
2861
2862
2863<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2864<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2865
2866
2867<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2868<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2869
2870Given
2871  f('false, 3.14, 42);
2872characterLiteral(equals(0))
2873  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2874  match false
2875floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2876  match 3.14
2877integerLiteral(equals(42))
2878  matches 42
2879
2880Note that you cannot directly match a negative numeric literal because the
2881minus sign is not part of the literal: It is a unary operator whose operand
2882is the positive numeric literal. Instead, you must use a unaryOperator()
2883matcher to match the minus sign:
2884
2885unaryOperator(hasOperatorName("-"),
2886              hasUnaryOperand(integerLiteral(equals(13))))
2887
2888Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2889           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2890</pre></td></tr>
2891
2892
2893<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2894<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2895
2896
2897<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2898<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2899
2900
2901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
2902<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2903
2904Given
2905  try {
2906    // ...
2907  } catch (int) {
2908    // ...
2909  } catch (...) {
2910    // ...
2911  }
2912cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2913</pre></td></tr>
2914
2915
2916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2917<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2918a specific number of arguments (including absent default arguments).
2919
2920Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2921  void f(int x, int y);
2922  f(0, 0);
2923</pre></td></tr>
2924
2925
2926<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
2927<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2928</pre></td></tr>
2929
2930
2931<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
2932<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2933zero initialization.
2934
2935Given
2936void foo() {
2937  struct point { double x; double y; };
2938  point pt[2] = { { 1.0, 2.0 } };
2939}
2940initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2941will match the implicit array filler for pt[1].
2942</pre></td></tr>
2943
2944
2945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2946<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2947
2948Given
2949  struct S {
2950    S(); // #1
2951    S(const S &amp;); // #2
2952    S(S &amp;&amp;); // #3
2953  };
2954cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2955</pre></td></tr>
2956
2957
2958<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2959<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2960
2961Given
2962  struct S {
2963    S(); // #1
2964    S(const S &amp;); // #2
2965    S(S &amp;&amp;); // #3
2966  };
2967cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2968</pre></td></tr>
2969
2970
2971<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2972<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2973
2974Given
2975  struct S {
2976    S(); // #1
2977    S(int) {} // #2
2978    S(S &amp;&amp;) : S() {} // #3
2979  };
2980  S::S() : S(0) {} // #4
2981cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2982#1 or #2.
2983</pre></td></tr>
2984
2985
2986<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2987<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2988that have an explicit specifier if this explicit specifier is resolved to
2989true.
2990
2991Given
2992  template&lt;bool b&gt;
2993  struct S {
2994    S(int); // #1
2995    explicit S(double); // #2
2996    operator int(); // #3
2997    explicit operator bool(); // #4
2998    explicit(false) S(bool) // # 7
2999    explicit(true) S(char) // # 8
3000    explicit(b) S(S) // # 9
3001  };
3002  S(int) -&gt; S&lt;true&gt; // #5
3003  explicit S(double) -&gt; S&lt;false&gt; // #6
3004cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3005cxxConversionDecl(isExplicit()) will match #4, but not #3.
3006cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3007</pre></td></tr>
3008
3009
3010<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
3011<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3012
3013Given
3014  struct S {
3015    S(); // #1
3016    S(const S &amp;); // #2
3017    S(S &amp;&amp;); // #3
3018  };
3019cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3020</pre></td></tr>
3021
3022
3023<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
3024<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3025that have an explicit specifier if this explicit specifier is resolved to
3026true.
3027
3028Given
3029  template&lt;bool b&gt;
3030  struct S {
3031    S(int); // #1
3032    explicit S(double); // #2
3033    operator int(); // #3
3034    explicit operator bool(); // #4
3035    explicit(false) S(bool) // # 7
3036    explicit(true) S(char) // # 8
3037    explicit(b) S(S) // # 9
3038  };
3039  S(int) -&gt; S&lt;true&gt; // #5
3040  explicit S(double) -&gt; S&lt;false&gt; // #6
3041cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3042cxxConversionDecl(isExplicit()) will match #4, but not #3.
3043cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3044</pre></td></tr>
3045
3046
3047<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
3048<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3049opposed to a member.
3050
3051Given
3052  struct B {};
3053  struct D : B {
3054    int I;
3055    D(int i) : I(i) {}
3056  };
3057  struct E : B {
3058    E() : B() {}
3059  };
3060cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3061  will match E(), but not match D(int).
3062</pre></td></tr>
3063
3064
3065<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
3066<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3067opposed to a base.
3068
3069Given
3070  struct B {};
3071  struct D : B {
3072    int I;
3073    D(int i) : I(i) {}
3074  };
3075  struct E : B {
3076    E() : B() {}
3077  };
3078cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3079  will match D(int), but not match E().
3080</pre></td></tr>
3081
3082
3083<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
3084<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3085code (as opposed to implicitly added by the compiler).
3086
3087Given
3088  struct Foo {
3089    Foo() { }
3090    Foo(int) : foo_("A") { }
3091    string foo_;
3092  };
3093cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3094  will match Foo(int), but not Foo()
3095</pre></td></tr>
3096
3097
3098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
3099<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3100that have an explicit specifier if this explicit specifier is resolved to
3101true.
3102
3103Given
3104  template&lt;bool b&gt;
3105  struct S {
3106    S(int); // #1
3107    explicit S(double); // #2
3108    operator int(); // #3
3109    explicit operator bool(); // #4
3110    explicit(false) S(bool) // # 7
3111    explicit(true) S(char) // # 8
3112    explicit(b) S(S) // # 9
3113  };
3114  S(int) -&gt; S&lt;true&gt; // #5
3115  explicit S(double) -&gt; S&lt;false&gt; // #6
3116cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3117cxxConversionDecl(isExplicit()) will match #4, but not #3.
3118cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3119</pre></td></tr>
3120
3121
3122<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr>
3123<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3124
3125In template declarations, dependent members are not resolved and so can
3126not be matched to particular named declarations.
3127
3128This matcher allows to match on the known name of members.
3129
3130Given
3131  template &lt;typename T&gt;
3132  struct S {
3133      void mem();
3134  };
3135  template &lt;typename T&gt;
3136  void x() {
3137      S&lt;T&gt; s;
3138      s.mem();
3139  }
3140cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3141</pre></td></tr>
3142
3143
3144<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
3145<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
3146to '.'.
3147
3148Member calls on the implicit this pointer match as called with '-&gt;'.
3149
3150Given
3151  class Y {
3152    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3153    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3154    int a;
3155    static int b;
3156  };
3157  template &lt;class T&gt;
3158  class Z {
3159    void x() { this-&gt;m; }
3160  };
3161memberExpr(isArrow())
3162  matches this-&gt;x, x, y.x, a, this-&gt;b
3163cxxDependentScopeMemberExpr(isArrow())
3164  matches this-&gt;m
3165unresolvedMemberExpr(isArrow())
3166  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3167</pre></td></tr>
3168
3169
3170<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr>
3171<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3172node
3173
3174In template declarations, dependent members are not resolved and so can
3175not be matched to particular named declarations.
3176
3177This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3178and CXXMethodDecl nodes.
3179
3180Given
3181  template &lt;typename T&gt;
3182  struct S {
3183      void mem();
3184  };
3185  template &lt;typename T&gt;
3186  void x() {
3187      S&lt;T&gt; s;
3188      s.mem();
3189  }
3190The matcher
3191@code
3192cxxDependentScopeMemberExpr(
3193  hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3194      hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3195          cxxMethodDecl(hasName("mem")).bind("templMem")
3196          )))))
3197      )))),
3198  memberHasSameNameAsBoundNode("templMem")
3199  )
3200@endcode
3201first matches and binds the @c mem member of the @c S template, then
3202compares its name to the usage in @c s.mem() in the @c x function template
3203</pre></td></tr>
3204
3205
3206<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
3207<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3208
3209Given
3210struct A {
3211  void foo() const;
3212  void bar();
3213};
3214
3215cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3216</pre></td></tr>
3217
3218
3219<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
3220<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3221operator.
3222
3223Given
3224struct A {
3225  A &amp;operator=(const A &amp;);
3226  A &amp;operator=(A &amp;&amp;);
3227};
3228
3229cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3230the second one.
3231</pre></td></tr>
3232
3233
3234<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
3235<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3236
3237Given:
3238  class A final {};
3239
3240  struct B {
3241    virtual void f();
3242  };
3243
3244  struct C : B {
3245    void f() final;
3246  };
3247matches A and C::f, but not B, C, or B::f
3248</pre></td></tr>
3249
3250
3251<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
3252<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3253operator.
3254
3255Given
3256struct A {
3257  A &amp;operator=(const A &amp;);
3258  A &amp;operator=(A &amp;&amp;);
3259};
3260
3261cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3262the first one.
3263</pre></td></tr>
3264
3265
3266<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
3267<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3268
3269Given
3270  class A {
3271   public:
3272    virtual void x();
3273  };
3274  class B : public A {
3275   public:
3276    virtual void x();
3277  };
3278  matches B::x
3279</pre></td></tr>
3280
3281
3282<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
3283<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3284
3285Given
3286  class A {
3287   public:
3288    virtual void x() = 0;
3289  };
3290  matches A::x
3291</pre></td></tr>
3292
3293
3294<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
3295<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3296
3297Given
3298  struct S {
3299    S(); // #1
3300    S(const S &amp;) = default; // #2
3301    S(S &amp;&amp;) = delete; // #3
3302  };
3303cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3304</pre></td></tr>
3305
3306
3307<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
3308<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3309virtual inheritance.
3310
3311Example:
3312  class A {
3313   public:
3314    virtual void x(); // matches x
3315  };
3316
3317Example:
3318  class Base {};
3319  class DirectlyDerived : virtual Base {}; // matches Base
3320  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3321
3322Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
3323</pre></td></tr>
3324
3325
3326<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
3327<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3328
3329Given
3330  class A {
3331   public:
3332    virtual void x();
3333  };
3334  class B : public A {
3335   public:
3336    void x();
3337  };
3338  matches A::x but not B::x
3339</pre></td></tr>
3340
3341
3342<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
3343<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3344
3345Given:
3346  MyClass *p1 = new MyClass[10];
3347cxxNewExpr(isArray())
3348  matches the expression 'new MyClass[10]'.
3349</pre></td></tr>
3350
3351
3352<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3353<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3354specified names.
3355
3356   hasAnyOperatorName("+", "-")
3357 Is equivalent to
3358   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3359</pre></td></tr>
3360
3361
3362<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3363<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3364
3365Matches overloaded operator names specified in strings without the
3366"operator" prefix: e.g. "&lt;&lt;".
3367
3368  hasAnyOverloadedOperatorName("+", "-")
3369Is equivalent to
3370  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3371</pre></td></tr>
3372
3373
3374<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3375<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3376unary).
3377
3378Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3379  !(a || b)
3380</pre></td></tr>
3381
3382
3383<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3384<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3385
3386Matches overloaded operator names specified in strings without the
3387"operator" prefix: e.g. "&lt;&lt;".
3388
3389Given:
3390  class A { int operator*(); };
3391  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3392  A a;
3393  a &lt;&lt; a;   // &lt;-- This matches
3394
3395cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3396specified line and
3397cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3398matches the declaration of A.
3399
3400Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
3401</pre></td></tr>
3402
3403
3404<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
3405<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3406
3407Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3408  if (a == b)
3409    a += b;
3410
3411Example 2: matches s1 = s2
3412           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3413  struct S { S&amp; operator=(const S&amp;); };
3414  void x() { S s1, s2; s1 = s2; }
3415</pre></td></tr>
3416
3417
3418<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
3419<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3420
3421Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3422  if (a == b)
3423    a += b;
3424
3425Example 2: matches s1 &lt; s2
3426           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3427  struct S { bool operator&lt;(const S&amp; other); };
3428  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3429</pre></td></tr>
3430
3431
3432<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
3433<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3434
3435Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3436class x {};
3437class y;
3438</pre></td></tr>
3439
3440
3441<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
3442<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3443</pre></td></tr>
3444
3445
3446<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
3447<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3448</pre></td></tr>
3449
3450
3451<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
3452<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3453static member variable template instantiations.
3454
3455Given
3456  template&lt;typename T&gt; void A(T t) { }
3457  template&lt;&gt; void A(int N) { }
3458functionDecl(isExplicitTemplateSpecialization())
3459  matches the specialization A&lt;int&gt;().
3460
3461Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3462</pre></td></tr>
3463
3464
3465<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
3466<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3467
3468Given:
3469  class A final {};
3470
3471  struct B {
3472    virtual void f();
3473  };
3474
3475  struct C : B {
3476    void f() final;
3477  };
3478matches A and C::f, but not B, C, or B::f
3479</pre></td></tr>
3480
3481
3482<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
3483<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3484
3485Given:
3486  auto x = []{};
3487
3488cxxRecordDecl(isLambda()) matches the implicit class declaration of
3489decltype(x)
3490</pre></td></tr>
3491
3492
3493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
3494<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3495isSameOrDerivedFrom(hasName(...)).
3496</pre></td></tr>
3497
3498
3499<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
3500<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3501member variable template instantiations.
3502
3503Given
3504  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3505or
3506  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3507or
3508  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3509cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3510  matches the template instantiation of X&lt;A&gt;.
3511
3512But given
3513  template &lt;typename T&gt;  class X {}; class A {};
3514  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3515cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3516  does not match, as X&lt;A&gt; is an explicit template specialization.
3517
3518Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3519</pre></td></tr>
3520
3521
3522<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3523<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3524specified names.
3525
3526   hasAnyOperatorName("+", "-")
3527 Is equivalent to
3528   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3529</pre></td></tr>
3530
3531
3532<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3533<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3534unary).
3535
3536Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3537  !(a || b)
3538</pre></td></tr>
3539
3540
3541<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr>
3542<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3543
3544Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3545  if (a == b)
3546    a += b;
3547
3548Example 2: matches s1 = s2
3549           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3550  struct S { S&amp; operator=(const S&amp;); };
3551  void x() { S s1, s2; s1 = s2; }
3552</pre></td></tr>
3553
3554
3555<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
3556<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3557
3558Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3559  if (a == b)
3560    a += b;
3561
3562Example 2: matches s1 &lt; s2
3563           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3564  struct S { bool operator&lt;(const S&amp; other); };
3565  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3566</pre></td></tr>
3567
3568
3569<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3570<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3571a specific number of arguments (including absent default arguments).
3572
3573Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3574  void f(int x, int y);
3575  f(0, 0);
3576</pre></td></tr>
3577
3578
3579<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3580<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3581a specific number of arguments (including absent default arguments).
3582
3583Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3584  void f(int x, int y);
3585  f(0, 0);
3586</pre></td></tr>
3587
3588
3589<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
3590<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3591
3592Example matches y(x) but not y(42) or NS::y(x).
3593  namespace NS {
3594    struct X {};
3595    void y(X);
3596  }
3597
3598  void y(...);
3599
3600  void test() {
3601    NS::X x;
3602    y(x); // Matches
3603    NS::y(x); // Doesn't match
3604    y(42); // Doesn't match
3605    using NS::y;
3606    y(x); // Found by both unqualified lookup and ADL, doesn't match
3607   }
3608</pre></td></tr>
3609
3610
3611<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
3612<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3613
3614Example: matches the implicit cast around 0
3615(matcher = castExpr(hasCastKind(CK_NullToPointer)))
3616  int *p = 0;
3617
3618If the matcher is use from clang-query, CastKind parameter
3619should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3620</pre></td></tr>
3621
3622
3623<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
3624<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3625
3626
3627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
3628<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3629
3630Given
3631  f('false, 3.14, 42);
3632characterLiteral(equals(0))
3633  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3634  match false
3635floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3636  match 3.14
3637integerLiteral(equals(42))
3638  matches 42
3639
3640Note that you cannot directly match a negative numeric literal because the
3641minus sign is not part of the literal: It is a unary operator whose operand
3642is the positive numeric literal. Instead, you must use a unaryOperator()
3643matcher to match the minus sign:
3644
3645unaryOperator(hasOperatorName("-"),
3646              hasUnaryOperand(integerLiteral(equals(13))))
3647
3648Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3649           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
3650</pre></td></tr>
3651
3652
3653<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
3654<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3655
3656
3657<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
3658<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3659
3660
3661<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
3662<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3663
3664Given
3665  template&lt;typename T&gt; struct C {};
3666  C&lt;int&gt; c;
3667classTemplateSpecializationDecl(templateArgumentCountIs(1))
3668  matches C&lt;int&gt;.
3669</pre></td></tr>
3670
3671
3672<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
3673<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3674child statements.
3675
3676Example: Given
3677  { for (;;) {} }
3678compoundStmt(statementCountIs(0)))
3679  matches '{}'
3680  but does not match the outer compound statement.
3681</pre></td></tr>
3682
3683
3684<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
3685<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3686
3687Given
3688  int a[42];
3689  int b[2 * 21];
3690  int c[41], d[43];
3691  char *s = "abcd";
3692  wchar_t *ws = L"abcd";
3693  char *w = "a";
3694constantArrayType(hasSize(42))
3695  matches "int a[42]" and "int b[2 * 21]"
3696stringLiteral(hasSize(4))
3697  matches "abcd", L"abcd"
3698</pre></td></tr>
3699
3700
3701<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
3702<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3703declarations.
3704
3705Example: Given
3706  int a, b;
3707  int c;
3708  int d = 2, e;
3709declCountIs(2)
3710  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3711</pre></td></tr>
3712
3713
3714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3715<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3716
3717Matches a node if it equals the node previously bound to ID.
3718
3719Given
3720  class X { int a; int b; };
3721cxxRecordDecl(
3722    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3723    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3724  matches the class X, as a and b have the same type.
3725
3726Note that when multiple matches are involved via forEach* matchers,
3727equalsBoundNodes acts as a filter.
3728For example:
3729compoundStmt(
3730    forEachDescendant(varDecl().bind("d")),
3731    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3732will trigger a match for each combination of variable declaration
3733and reference to that variable declaration within a compound statement.
3734</pre></td></tr>
3735
3736
3737<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
3738<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3739
3740Decl has pointer identity in the AST.
3741</pre></td></tr>
3742
3743
3744<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
3745<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3746
3747Given
3748  __attribute__((device)) void f() { ... }
3749decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3750f. If the matcher is used from clang-query, attr::Kind parameter should be
3751passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3752</pre></td></tr>
3753
3754
3755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
3756<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3757Does not match if only part of the statement is expanded from that macro or
3758if different parts of the the statement are expanded from different
3759appearances of the macro.
3760</pre></td></tr>
3761
3762
3763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
3764<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3765partially matching a given regex.
3766
3767Example matches Y but not X
3768    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3769  #include "ASTMatcher.h"
3770  class X {};
3771ASTMatcher.h:
3772  class Y {};
3773
3774Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3775
3776If the matcher is used in clang-query, RegexFlags parameter
3777should be passed as a quoted string. e.g: "NoFlags".
3778Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3779</pre></td></tr>
3780
3781
3782<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
3783<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3784
3785Example matches X but not Y
3786  (matcher = cxxRecordDecl(isExpansionInMainFile())
3787  #include &lt;Y.h&gt;
3788  class X {};
3789Y.h:
3790  class Y {};
3791
3792Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3793</pre></td></tr>
3794
3795
3796<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3797<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3798
3799Example matches Y but not X
3800    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3801  #include &lt;SystemHeader.h&gt;
3802  class X {};
3803SystemHeader.h:
3804  class Y {};
3805
3806Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3807</pre></td></tr>
3808
3809
3810<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3811<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3812by the compiler (eg. implicit default/copy constructors).
3813</pre></td></tr>
3814
3815
3816<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
3817<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3818
3819Given
3820  class vector {};
3821  namespace foo {
3822    class vector {};
3823    namespace std {
3824      class vector {};
3825    }
3826  }
3827  namespace std {
3828    inline namespace __1 {
3829      class vector {}; // #1
3830      namespace experimental {
3831        class vector {};
3832      }
3833    }
3834  }
3835cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3836</pre></td></tr>
3837
3838
3839<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
3840<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3841template instantiations.
3842
3843Given
3844  template&lt;typename T&gt; void A(T t) { T i; }
3845  A(0);
3846  A(0U);
3847functionDecl(isInstantiated())
3848  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3849</pre></td></tr>
3850
3851
3852<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
3853<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3854inheritance.
3855
3856Examples:
3857  class C {
3858  public:    int a;
3859  protected: int b;
3860  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3861  };
3862
3863  struct Base {};
3864  struct Derived1 : private Base {}; // matches 'Base'
3865  class Derived2 : Base {}; // matches 'Base'
3866</pre></td></tr>
3867
3868
3869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
3870<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3871protected inheritance.
3872
3873Examples:
3874  class C {
3875  public:    int a;
3876  protected: int b; // fieldDecl(isProtected()) matches 'b'
3877  private:   int c;
3878  };
3879
3880  class Base {};
3881  class Derived : protected Base {}; // matches 'Base'
3882</pre></td></tr>
3883
3884
3885<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
3886<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3887inheritance.
3888
3889Examples:
3890  class C {
3891  public:    int a; // fieldDecl(isPublic()) matches 'a'
3892  protected: int b;
3893  private:   int c;
3894  };
3895
3896  class Base {};
3897  class Derived1 : public Base {}; // matches 'Base'
3898  struct Derived2 : Base {}; // matches 'Base'
3899</pre></td></tr>
3900
3901
3902<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
3903<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3904a specific number of designators.
3905
3906Example: Given
3907  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3908  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3909designatorCountIs(2)
3910  matches '{ [2].y = 1.0, [0].x = 1.0 }',
3911  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3912</pre></td></tr>
3913
3914
3915<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
3916<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3917
3918Example matches Y (matcher = enumDecl(isScoped()))
3919enum X {};
3920enum class Y {};
3921</pre></td></tr>
3922
3923
3924<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
3925<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3926neither type- nor value-dependent.
3927
3928In the following example, the expression sizeof(sizeof(T() + T()))
3929is instantiation-dependent (since it involves a template parameter T),
3930but is neither type- nor value-dependent, since the type of the inner
3931sizeof is known (std::size_t) and therefore the size of the outer
3932sizeof is known.
3933  template&lt;typename T&gt;
3934  void f(T x, T y) { sizeof(sizeof(T() + T()); }
3935expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3936</pre></td></tr>
3937
3938
3939<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
3940<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3941is not yet instantiated.
3942
3943For example, the expressions "x" and "x + y" are type-dependent in
3944the following code, but "y" is not type-dependent:
3945  template&lt;typename T&gt;
3946  void add(T x, int y) {
3947    x + y;
3948  }
3949expr(isTypeDependent()) matches x + y
3950</pre></td></tr>
3951
3952
3953<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
3954<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3955non-type template parameter.
3956
3957For example, the array bound of "Chars" in the following example is
3958value-dependent.
3959  template&lt;int Size&gt; int f() { return Size; }
3960expr(isValueDependent()) matches return Size
3961</pre></td></tr>
3962
3963
3964<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3965<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3966GNU's __null, C++11's nullptr, or C's NULL macro.
3967
3968Given:
3969  void *v1 = NULL;
3970  void *v2 = nullptr;
3971  void *v3 = __null; // GNU extension
3972  char *cp = (char *)0;
3973  int *ip = 0;
3974  int i = 0;
3975expr(nullPointerConstant())
3976  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3977  initializer for i.
3978</pre></td></tr>
3979
3980
3981<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
3982<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3983bit width.
3984
3985Given
3986  class C {
3987    int a : 2;
3988    int b : 4;
3989    int c : 2;
3990  };
3991fieldDecl(hasBitWidth(2))
3992  matches 'int a;' and 'int c;' but not 'int b;'.
3993</pre></td></tr>
3994
3995
3996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
3997<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3998
3999Given
4000  class C {
4001    int a : 2;
4002    int b;
4003  };
4004fieldDecl(isBitField())
4005  matches 'int a;' but not 'int b;'.
4006</pre></td></tr>
4007
4008
4009<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4010<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4011
4012Given
4013  f('false, 3.14, 42);
4014characterLiteral(equals(0))
4015  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4016  match false
4017floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4018  match 3.14
4019integerLiteral(equals(42))
4020  matches 42
4021
4022Note that you cannot directly match a negative numeric literal because the
4023minus sign is not part of the literal: It is a unary operator whose operand
4024is the positive numeric literal. Instead, you must use a unaryOperator()
4025matcher to match the minus sign:
4026
4027unaryOperator(hasOperatorName("-"),
4028              hasUnaryOperand(integerLiteral(equals(13))))
4029
4030Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4031           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4032</pre></td></tr>
4033
4034
4035<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
4036<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4037
4038
4039<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
4040<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4041
4042Matches overloaded operator names specified in strings without the
4043"operator" prefix: e.g. "&lt;&lt;".
4044
4045  hasAnyOverloadedOperatorName("+", "-")
4046Is equivalent to
4047  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4048</pre></td></tr>
4049
4050
4051<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4052<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4053
4054Given:
4055  void f();
4056  void g() noexcept;
4057  void h() noexcept(true);
4058  void i() noexcept(false);
4059  void j() throw();
4060  void k() throw(int);
4061  void l() throw(...);
4062functionDecl(hasDynamicExceptionSpec()) and
4063  functionProtoType(hasDynamicExceptionSpec())
4064  match the declarations of j, k, and l, but not f, g, h, or i.
4065</pre></td></tr>
4066
4067
4068<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
4069<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4070
4071Matches overloaded operator names specified in strings without the
4072"operator" prefix: e.g. "&lt;&lt;".
4073
4074Given:
4075  class A { int operator*(); };
4076  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
4077  A a;
4078  a &lt;&lt; a;   // &lt;-- This matches
4079
4080cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
4081specified line and
4082cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4083matches the declaration of A.
4084
4085Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
4086</pre></td></tr>
4087
4088
4089<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
4090<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4091
4092Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4093int X() {}
4094auto Y() -&gt; int {}
4095</pre></td></tr>
4096
4097
4098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
4099<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4100       and if constexpr.
4101
4102Given:
4103  constexpr int foo = 42;
4104  constexpr int bar();
4105  void baz() { if constexpr(1 &gt; 0) {} }
4106varDecl(isConstexpr())
4107  matches the declaration of foo.
4108functionDecl(isConstexpr())
4109  matches the declaration of bar.
4110ifStmt(isConstexpr())
4111  matches the if statement in baz.
4112</pre></td></tr>
4113
4114
4115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
4116<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4117
4118Given:
4119  class A { ~A(); };
4120  class B { ~B() = default; };
4121functionDecl(isDefaulted())
4122  matches the declaration of ~B, but not ~A.
4123</pre></td></tr>
4124
4125
4126<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
4127<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4128
4129Example matches A, va, fa
4130  class A {};
4131  class B;  // Doesn't match, as it has no body.
4132  int va;
4133  extern int vb;  // Doesn't match, as it doesn't define the variable.
4134  void fa() {}
4135  void fb();  // Doesn't match, as it has no body.
4136  @interface X
4137  - (void)ma; // Doesn't match, interface is declaration.
4138  @end
4139  @implementation X
4140  - (void)ma {}
4141  @end
4142
4143Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4144  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4145</pre></td></tr>
4146
4147
4148<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
4149<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4150
4151Given:
4152  void Func();
4153  void DeletedFunc() = delete;
4154functionDecl(isDeleted())
4155  matches the declaration of DeletedFunc, but not Func.
4156</pre></td></tr>
4157
4158
4159<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
4160<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4161static member variable template instantiations.
4162
4163Given
4164  template&lt;typename T&gt; void A(T t) { }
4165  template&lt;&gt; void A(int N) { }
4166functionDecl(isExplicitTemplateSpecialization())
4167  matches the specialization A&lt;int&gt;().
4168
4169Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4170</pre></td></tr>
4171
4172
4173<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
4174<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4175
4176Given:
4177  extern "C" void f() {}
4178  extern "C" { void g() {} }
4179  void h() {}
4180  extern "C" int x = 1;
4181  extern "C" int y = 2;
4182  int z = 3;
4183functionDecl(isExternC())
4184  matches the declaration of f and g, but not the declaration of h.
4185varDecl(isExternC())
4186  matches the declaration of x and y, but not the declaration of z.
4187</pre></td></tr>
4188
4189
4190<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
4191<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4192the inline keyword.
4193
4194Given
4195  inline void f();
4196  void g();
4197  namespace n {
4198  inline namespace m {}
4199  }
4200functionDecl(isInline()) will match ::f().
4201namespaceDecl(isInline()) will match n::m.
4202</pre></td></tr>
4203
4204
4205<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
4206<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4207into an executable program.
4208</pre></td></tr>
4209
4210
4211<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
4212<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4213
4214Given
4215  void nope();
4216  [[noreturn]] void a();
4217  __attribute__((noreturn)) void b();
4218  struct c { [[noreturn]] c(); };
4219functionDecl(isNoReturn())
4220  matches all of those except
4221  void nope();
4222</pre></td></tr>
4223
4224
4225<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
4226<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4227
4228Given:
4229  void f();
4230  void g() noexcept;
4231  void h() throw();
4232  void i() throw(int);
4233  void j() noexcept(false);
4234functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4235  match the declarations of g, and h, but not f, i or j.
4236</pre></td></tr>
4237
4238
4239<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
4240<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4241class specifier ("static" keyword) written in the source.
4242
4243Given:
4244  static void f() {}
4245  static int i = 0;
4246  extern int j;
4247  int k;
4248functionDecl(isStaticStorageClass())
4249  matches the function declaration f.
4250varDecl(isStaticStorageClass())
4251  matches the variable declaration i.
4252</pre></td></tr>
4253
4254
4255<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
4256<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4257member variable template instantiations.
4258
4259Given
4260  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4261or
4262  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4263or
4264  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4265cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4266  matches the template instantiation of X&lt;A&gt;.
4267
4268But given
4269  template &lt;typename T&gt;  class X {}; class A {};
4270  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4271cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4272  does not match, as X&lt;A&gt; is an explicit template specialization.
4273
4274Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4275</pre></td></tr>
4276
4277
4278<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
4279<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4280
4281Example matches f, but not g or h. The function i will not match, even when
4282compiled in C mode.
4283  void f(...);
4284  void g(int);
4285  template &lt;typename... Ts&gt; void h(Ts...);
4286  void i();
4287</pre></td></tr>
4288
4289
4290<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr>
4291<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4292
4293Given:
4294  void foo() __attribute__((__weakref__("__foo")));
4295  void bar();
4296functionDecl(isWeak())
4297  matches the weak declaration "foo", but not "bar".
4298</pre></td></tr>
4299
4300
4301<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4302<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4303specific parameter count.
4304
4305Given
4306  void f(int i) {}
4307  void g(int i, int j) {}
4308  void h(int i, int j);
4309  void j(int i);
4310  void k(int x, int y, int z, ...);
4311functionDecl(parameterCountIs(2))
4312  matches g and h
4313functionProtoType(parameterCountIs(2))
4314  matches g and h
4315functionProtoType(parameterCountIs(3))
4316  matches k
4317</pre></td></tr>
4318
4319
4320<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4321<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4322
4323Given:
4324  void f();
4325  void g() noexcept;
4326  void h() noexcept(true);
4327  void i() noexcept(false);
4328  void j() throw();
4329  void k() throw(int);
4330  void l() throw(...);
4331functionDecl(hasDynamicExceptionSpec()) and
4332  functionProtoType(hasDynamicExceptionSpec())
4333  match the declarations of j, k, and l, but not f, g, h, or i.
4334</pre></td></tr>
4335
4336
4337<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
4338<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4339
4340Given:
4341  void f();
4342  void g() noexcept;
4343  void h() throw();
4344  void i() throw(int);
4345  void j() noexcept(false);
4346functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4347  match the declarations of g, and h, but not f, i or j.
4348</pre></td></tr>
4349
4350
4351<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4352<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4353specific parameter count.
4354
4355Given
4356  void f(int i) {}
4357  void g(int i, int j) {}
4358  void h(int i, int j);
4359  void j(int i);
4360  void k(int x, int y, int z, ...);
4361functionDecl(parameterCountIs(2))
4362  matches g and h
4363functionProtoType(parameterCountIs(2))
4364  matches g and h
4365functionProtoType(parameterCountIs(3))
4366  matches k
4367</pre></td></tr>
4368
4369
4370<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
4371<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4372       and if constexpr.
4373
4374Given:
4375  constexpr int foo = 42;
4376  constexpr int bar();
4377  void baz() { if constexpr(1 &gt; 0) {} }
4378varDecl(isConstexpr())
4379  matches the declaration of foo.
4380functionDecl(isConstexpr())
4381  matches the declaration of bar.
4382ifStmt(isConstexpr())
4383  matches the if statement in baz.
4384</pre></td></tr>
4385
4386
4387<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
4388<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4389
4390
4391<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4392<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4393
4394Given
4395  f('false, 3.14, 42);
4396characterLiteral(equals(0))
4397  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4398  match false
4399floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4400  match 3.14
4401integerLiteral(equals(42))
4402  matches 42
4403
4404Note that you cannot directly match a negative numeric literal because the
4405minus sign is not part of the literal: It is a unary operator whose operand
4406is the positive numeric literal. Instead, you must use a unaryOperator()
4407matcher to match the minus sign:
4408
4409unaryOperator(hasOperatorName("-"),
4410              hasUnaryOperand(integerLiteral(equals(13))))
4411
4412Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4413           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4414</pre></td></tr>
4415
4416
4417<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
4418<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4419
4420
4421<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
4422<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4423
4424
4425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
4426<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4427to '.'.
4428
4429Member calls on the implicit this pointer match as called with '-&gt;'.
4430
4431Given
4432  class Y {
4433    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4434    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4435    int a;
4436    static int b;
4437  };
4438  template &lt;class T&gt;
4439  class Z {
4440    void x() { this-&gt;m; }
4441  };
4442memberExpr(isArrow())
4443  matches this-&gt;x, x, y.x, a, this-&gt;b
4444cxxDependentScopeMemberExpr(isArrow())
4445  matches this-&gt;m
4446unresolvedMemberExpr(isArrow())
4447  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4448</pre></td></tr>
4449
4450
4451<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
4452<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4453
4454This matcher is only provided as a performance optimization of hasName.
4455    hasAnyName(a, b, c)
4456 is equivalent to, but faster than
4457    anyOf(hasName(a), hasName(b), hasName(c))
4458</pre></td></tr>
4459
4460
4461<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
4462<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4463
4464Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4465void f() {
4466  int x;
4467  static int y;
4468}
4469int z;
4470
4471Example matches f() because it has external formal linkage despite being
4472unique to the translation unit as though it has internal likage
4473(matcher = functionDecl(hasExternalFormalLinkage()))
4474
4475namespace {
4476void f() {}
4477}
4478</pre></td></tr>
4479
4480
4481<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr>
4482<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4483
4484Supports specifying enclosing namespaces or classes by prefixing the name
4485with '&lt;enclosing&gt;::'.
4486Does not match typedefs of an underlying type with the given name.
4487
4488Example matches X (Name == "X")
4489  class X;
4490
4491Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4492  namespace a { namespace b { class X; } }
4493</pre></td></tr>
4494
4495
4496<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4497<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4498a substring matched by the given RegExp.
4499
4500Supports specifying enclosing namespaces or classes by
4501prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4502of an underlying type with the given name.
4503
4504Example matches X (regexp == "::X")
4505  class X;
4506
4507Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4508  namespace foo { namespace bar { class X; } }
4509
4510If the matcher is used in clang-query, RegexFlags parameter
4511should be passed as a quoted string. e.g: "NoFlags".
4512Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4513</pre></td></tr>
4514
4515
4516<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
4517<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4518
4519Given
4520  namespace n {
4521  namespace {} // #1
4522  }
4523namespaceDecl(isAnonymous()) will match #1 but not ::n.
4524</pre></td></tr>
4525
4526
4527<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
4528<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4529the inline keyword.
4530
4531Given
4532  inline void f();
4533  void g();
4534  namespace n {
4535  inline namespace m {}
4536  }
4537functionDecl(isInline()) will match ::f().
4538namespaceDecl(isInline()) will match n::m.
4539</pre></td></tr>
4540
4541
4542<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr>
4543<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4544specified.
4545
4546Given
4547
4548  #pragma omp parallel
4549  #pragma omp parallel default(none)
4550  #pragma omp parallel default(shared)
4551  #pragma omp parallel default(firstprivate)
4552
4553``ompDefaultClause(isFirstPrivateKind())`` matches only
4554``default(firstprivate)``.
4555</pre></td></tr>
4556
4557
4558<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
4559<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4560
4561Given
4562
4563  #pragma omp parallel
4564  #pragma omp parallel default(none)
4565  #pragma omp parallel default(shared)
4566  #pragma omp parallel default(firstprivate)
4567
4568``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4569</pre></td></tr>
4570
4571
4572<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
4573<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4574
4575Given
4576
4577  #pragma omp parallel
4578  #pragma omp parallel default(none)
4579  #pragma omp parallel default(shared)
4580  #pragma omp parallel default(firstprivate)
4581
4582``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4583</pre></td></tr>
4584
4585
4586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
4587<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4588clause kind.
4589
4590Given
4591
4592  #pragma omp parallel
4593  #pragma omp parallel for
4594  #pragma omp          for
4595
4596`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4597``omp parallel`` and ``omp parallel for``.
4598
4599If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4600should be passed as a quoted string. e.g.,
4601``isAllowedToContainClauseKind("OMPC_default").``
4602</pre></td></tr>
4603
4604
4605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
4606<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4607i.e., directives that can't have a structured block.
4608
4609Given
4610
4611  #pragma omp parallel
4612  {}
4613  #pragma omp taskyield
4614
4615``ompExecutableDirective(isStandaloneDirective()))`` matches
4616``omp taskyield``.
4617</pre></td></tr>
4618
4619
4620<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
4621<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4622</pre></td></tr>
4623
4624
4625<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
4626<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4627</pre></td></tr>
4628
4629
4630<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
4631<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4632isSameOrDerivedFrom(hasName(...)).
4633</pre></td></tr>
4634
4635
4636<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
4637<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4638a specific number of arguments (including absent default arguments).
4639
4640Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4641  void f(int x, int y);
4642  f(0, 0);
4643</pre></td></tr>
4644
4645
4646<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
4647<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4648Selector.getAsString()
4649
4650 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4651 matches both of the expressions below:
4652    [myObj methodA:argA];
4653    [myObj methodB:argB];
4654</pre></td></tr>
4655
4656
4657<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
4658<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4659
4660objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4661message expression in
4662
4663  UIWebView *webView = ...;
4664  CGRect bodyFrame = webView.frame;
4665  bodyFrame.size.height = self.bodyContentHeight;
4666  webView.frame = bodyFrame;
4667  //     ^---- matches here
4668</pre></td></tr>
4669
4670
4671<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
4672<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4673
4674Matches only when the selector of the objCMessageExpr is NULL. This may
4675represent an error condition in the tree!
4676</pre></td></tr>
4677
4678
4679<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
4680<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4681
4682 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4683 matches the outer message expr in the code below, but NOT the message
4684 invocation for self.bodyView.
4685    [self.bodyView loadHTMLString:html baseURL:NULL];
4686</pre></td></tr>
4687
4688
4689<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
4690<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4691
4692 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4693 matches self.bodyView in the code below, but NOT the outer message
4694 invocation of "loadHTMLString:baseURL:".
4695    [self.bodyView loadHTMLString:html baseURL:NULL];
4696</pre></td></tr>
4697
4698
4699<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
4700<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4701
4702Example
4703matcher = objcMessageExpr(isClassMessage())
4704matches
4705  [NSString stringWithFormat:@"format"];
4706but not
4707  NSString *x = @"hello";
4708  [x containsString:@"h"];
4709</pre></td></tr>
4710
4711
4712<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
4713<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4714
4715Example
4716matcher = objcMessageExpr(isInstanceMessage())
4717matches
4718  NSString *x = @"hello";
4719  [x containsString:@"h"];
4720but not
4721  [NSString stringWithFormat:@"format"];
4722</pre></td></tr>
4723
4724
4725<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4726<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4727a substring matched by the given RegExp.
4728 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4729 invocation for self.bodyView.
4730    [self.bodyView loadHTMLString:html baseURL:NULL];
4731
4732If the matcher is used in clang-query, RegexFlags parameter
4733should be passed as a quoted string. e.g: "NoFlags".
4734Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4735</pre></td></tr>
4736
4737
4738<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
4739<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4740
4741 matcher = objCMessageExpr(numSelectorArgs(0));
4742 matches self.bodyView in the code below
4743
4744 matcher = objCMessageExpr(numSelectorArgs(2));
4745 matches the invocation of "loadHTMLString:baseURL:" but not that
4746 of self.bodyView
4747    [self.bodyView loadHTMLString:html baseURL:NULL];
4748</pre></td></tr>
4749
4750
4751<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
4752<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4753
4754Example
4755matcher = objcMethodDecl(isClassMethod())
4756matches
4757@interface I + (void)foo; @end
4758but not
4759@interface I - (void)bar; @end
4760</pre></td></tr>
4761
4762
4763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
4764<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4765
4766Example matches A, va, fa
4767  class A {};
4768  class B;  // Doesn't match, as it has no body.
4769  int va;
4770  extern int vb;  // Doesn't match, as it doesn't define the variable.
4771  void fa() {}
4772  void fb();  // Doesn't match, as it has no body.
4773  @interface X
4774  - (void)ma; // Doesn't match, interface is declaration.
4775  @end
4776  @implementation X
4777  - (void)ma {}
4778  @end
4779
4780Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4782</pre></td></tr>
4783
4784
4785<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr>
4786<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4787
4788Example
4789matcher = objcMethodDecl(isInstanceMethod())
4790matches
4791@interface I - (void)bar; @end
4792but not
4793@interface I + (void)foo; @end
4794</pre></td></tr>
4795
4796
4797<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
4798<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4799
4800Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4801void x(int val) {}
4802void y(int val = 0) {}
4803
4804Deprecated. Use hasInitializer() instead to be able to
4805match on the contents of the default argument.  For example:
4806
4807void x(int val = 7) {}
4808void y(int val = 42) {}
4809parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4810  matches the parameter of y
4811
4812A matcher such as
4813  parmVarDecl(hasInitializer(anything()))
4814is equivalent to parmVarDecl(hasDefaultArgument()).
4815</pre></td></tr>
4816
4817
4818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr>
4819<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4820list. The parameter list could be that of either a block, function, or
4821objc-method.
4822
4823
4824Given
4825
4826void f(int a, int b, int c) {
4827}
4828
4829``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4830
4831``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4832</pre></td></tr>
4833
4834
4835<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
4836<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4837
4838Given
4839  class Y { public: void x(); };
4840  void z() { Y* y; y-&gt;x(); }
4841cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4842  matches y-&gt;x()
4843</pre></td></tr>
4844
4845
4846<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4847<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4848
4849Matches a node if it equals the node previously bound to ID.
4850
4851Given
4852  class X { int a; int b; };
4853cxxRecordDecl(
4854    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4855    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4856  matches the class X, as a and b have the same type.
4857
4858Note that when multiple matches are involved via forEach* matchers,
4859equalsBoundNodes acts as a filter.
4860For example:
4861compoundStmt(
4862    forEachDescendant(varDecl().bind("d")),
4863    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4864will trigger a match for each combination of variable declaration
4865and reference to that variable declaration within a compound statement.
4866</pre></td></tr>
4867
4868
4869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
4870<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4871the node, not hidden within a typedef.
4872
4873Given
4874  typedef const int const_int;
4875  const_int i;
4876  int *const j;
4877  int *volatile k;
4878  int m;
4879varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4880i is const-qualified but the qualifier is not local.
4881</pre></td></tr>
4882
4883
4884<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
4885<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4886
4887Given
4888  void a(char);
4889  void b(wchar_t);
4890  void c(double);
4891functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4892matches "a(char)", "b(wchar_t)", but not "c(double)".
4893</pre></td></tr>
4894
4895
4896<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
4897<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4898the Objective-C object pointer type, which is different despite being
4899syntactically similar.
4900
4901Given
4902  int *i = nullptr;
4903
4904  @interface Foo
4905  @end
4906  Foo *f;
4907
4908  int j;
4909varDecl(hasType(isAnyPointer()))
4910  matches "int *i" and "Foo *f", but not "int j".
4911</pre></td></tr>
4912
4913
4914<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
4915<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4916include "top-level" const.
4917
4918Given
4919  void a(int);
4920  void b(int const);
4921  void c(const int);
4922  void d(const int*);
4923  void e(int const) {};
4924functionDecl(hasAnyParameter(hasType(isConstQualified())))
4925  matches "void b(int const)", "void c(const int)" and
4926  "void e(int const) {}". It does not match d as there
4927  is no top-level const on the parameter type "const int *".
4928</pre></td></tr>
4929
4930
4931<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
4932<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4933
4934Given
4935  void a(int);
4936  void b(long);
4937  void c(double);
4938functionDecl(hasAnyParameter(hasType(isInteger())))
4939matches "a(int)", "b(long)", but not "c(double)".
4940</pre></td></tr>
4941
4942
4943<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
4944<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4945
4946Given
4947  void a(int);
4948  void b(unsigned long);
4949  void c(double);
4950functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4951matches "a(int)", but not "b(unsigned long)" and "c(double)".
4952</pre></td></tr>
4953
4954
4955<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
4956<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4957
4958Given
4959  void a(int);
4960  void b(unsigned long);
4961  void c(double);
4962functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4963matches "b(unsigned long)", but not "a(int)" and "c(double)".
4964</pre></td></tr>
4965
4966
4967<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
4968<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4969include "top-level" volatile.
4970
4971Given
4972  void a(int);
4973  void b(int volatile);
4974  void c(volatile int);
4975  void d(volatile int*);
4976  void e(int volatile) {};
4977functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4978  matches "void b(int volatile)", "void c(volatile int)" and
4979  "void e(int volatile) {}". It does not match d as there
4980  is no top-level volatile on the parameter type "volatile int *".
4981</pre></td></tr>
4982
4983
4984<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4985<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4986
4987Matches a node if it equals the node previously bound to ID.
4988
4989Given
4990  class X { int a; int b; };
4991cxxRecordDecl(
4992    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4993    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4994  matches the class X, as a and b have the same type.
4995
4996Note that when multiple matches are involved via forEach* matchers,
4997equalsBoundNodes acts as a filter.
4998For example:
4999compoundStmt(
5000    forEachDescendant(varDecl().bind("d")),
5001    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5002will trigger a match for each combination of variable declaration
5003and reference to that variable declaration within a compound statement.
5004</pre></td></tr>
5005
5006
5007<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
5008<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5009
5010Stmt has pointer identity in the AST.
5011</pre></td></tr>
5012
5013
5014<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5015<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5016Does not match if only part of the statement is expanded from that macro or
5017if different parts of the the statement are expanded from different
5018appearances of the macro.
5019</pre></td></tr>
5020
5021
5022<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5023<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5024partially matching a given regex.
5025
5026Example matches Y but not X
5027    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5028  #include "ASTMatcher.h"
5029  class X {};
5030ASTMatcher.h:
5031  class Y {};
5032
5033Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5034
5035If the matcher is used in clang-query, RegexFlags parameter
5036should be passed as a quoted string. e.g: "NoFlags".
5037Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5038</pre></td></tr>
5039
5040
5041<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
5042<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5043
5044Example matches X but not Y
5045  (matcher = cxxRecordDecl(isExpansionInMainFile())
5046  #include &lt;Y.h&gt;
5047  class X {};
5048Y.h:
5049  class Y {};
5050
5051Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5052</pre></td></tr>
5053
5054
5055<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5056<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5057
5058Example matches Y but not X
5059    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5060  #include &lt;SystemHeader.h&gt;
5061  class X {};
5062SystemHeader.h:
5063  class Y {};
5064
5065Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5066</pre></td></tr>
5067
5068
5069<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
5070<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5071
5072Given
5073  int j;
5074  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5075  A(0);
5076  A(0U);
5077declStmt(isInTemplateInstantiation())
5078  matches 'int i;' and 'unsigned i'.
5079unless(stmt(isInTemplateInstantiation()))
5080  will NOT match j += 42; as it's shared between the template definition and
5081  instantiation.
5082</pre></td></tr>
5083
5084
5085<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
5086<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5087
5088Given
5089  int a[42];
5090  int b[2 * 21];
5091  int c[41], d[43];
5092  char *s = "abcd";
5093  wchar_t *ws = L"abcd";
5094  char *w = "a";
5095constantArrayType(hasSize(42))
5096  matches "int a[42]" and "int b[2 * 21]"
5097stringLiteral(hasSize(4))
5098  matches "abcd", L"abcd"
5099</pre></td></tr>
5100
5101
5102<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
5103<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5104
5105Example matches C, but not S, U or E.
5106  struct S {};
5107  class C {};
5108  union U {};
5109  enum E {};
5110</pre></td></tr>
5111
5112
5113<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
5114<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5115
5116Example matches A, va, fa
5117  class A {};
5118  class B;  // Doesn't match, as it has no body.
5119  int va;
5120  extern int vb;  // Doesn't match, as it doesn't define the variable.
5121  void fa() {}
5122  void fb();  // Doesn't match, as it has no body.
5123  @interface X
5124  - (void)ma; // Doesn't match, interface is declaration.
5125  @end
5126  @implementation X
5127  - (void)ma {}
5128  @end
5129
5130Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
5131  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5132</pre></td></tr>
5133
5134
5135<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr>
5136<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5137
5138Example matches E, but not C, S or U.
5139  struct S {};
5140  class C {};
5141  union U {};
5142  enum E {};
5143</pre></td></tr>
5144
5145
5146<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
5147<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5148
5149Example matches S, but not C, U or E.
5150  struct S {};
5151  class C {};
5152  union U {};
5153  enum E {};
5154</pre></td></tr>
5155
5156
5157<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
5158<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5159
5160Example matches U, but not C, S or E.
5161  struct S {};
5162  class C {};
5163  union U {};
5164  enum E {};
5165</pre></td></tr>
5166
5167
5168<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
5169<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5170
5171Note that 'Value' is a string as the template argument's value is
5172an arbitrary precision integer. 'Value' must be euqal to the canonical
5173representation of that integral value in base 10.
5174
5175Given
5176  template&lt;int T&gt; struct C {};
5177  C&lt;42&gt; c;
5178classTemplateSpecializationDecl(
5179  hasAnyTemplateArgument(equalsIntegralValue("42")))
5180  matches the implicit instantiation of C in C&lt;42&gt;.
5181</pre></td></tr>
5182
5183
5184<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
5185<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5186
5187Given
5188  template&lt;int T&gt; struct C {};
5189  C&lt;42&gt; c;
5190classTemplateSpecializationDecl(
5191  hasAnyTemplateArgument(isIntegral()))
5192  matches the implicit instantiation of C in C&lt;42&gt;
5193  with isIntegral() matching 42.
5194</pre></td></tr>
5195
5196
5197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
5198<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5199
5200Given
5201  template&lt;typename T&gt; struct C {};
5202  C&lt;int&gt; c;
5203classTemplateSpecializationDecl(templateArgumentCountIs(1))
5204  matches C&lt;int&gt;.
5205</pre></td></tr>
5206
5207
5208<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5209<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5210Does not match if only part of the statement is expanded from that macro or
5211if different parts of the the statement are expanded from different
5212appearances of the macro.
5213</pre></td></tr>
5214
5215
5216<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5217<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5218partially matching a given regex.
5219
5220Example matches Y but not X
5221    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5222  #include "ASTMatcher.h"
5223  class X {};
5224ASTMatcher.h:
5225  class Y {};
5226
5227Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5228
5229If the matcher is used in clang-query, RegexFlags parameter
5230should be passed as a quoted string. e.g: "NoFlags".
5231Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5232</pre></td></tr>
5233
5234
5235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
5236<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5237
5238Example matches X but not Y
5239  (matcher = cxxRecordDecl(isExpansionInMainFile())
5240  #include &lt;Y.h&gt;
5241  class X {};
5242Y.h:
5243  class Y {};
5244
5245Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5246</pre></td></tr>
5247
5248
5249<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5250<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5251
5252Example matches Y but not X
5253    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5254  #include &lt;SystemHeader.h&gt;
5255  class X {};
5256SystemHeader.h:
5257  class Y {};
5258
5259Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5260</pre></td></tr>
5261
5262
5263<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
5264<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5265
5266Given
5267 struct S { bool func(); };
5268functionDecl(returns(booleanType()))
5269  matches "bool func();"
5270</pre></td></tr>
5271
5272
5273<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
5274<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5275
5276Matches a node if it equals the node previously bound to ID.
5277
5278Given
5279  class X { int a; int b; };
5280cxxRecordDecl(
5281    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5282    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5283  matches the class X, as a and b have the same type.
5284
5285Note that when multiple matches are involved via forEach* matchers,
5286equalsBoundNodes acts as a filter.
5287For example:
5288compoundStmt(
5289    forEachDescendant(varDecl().bind("d")),
5290    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5291will trigger a match for each combination of variable declaration
5292and reference to that variable declaration within a compound statement.
5293</pre></td></tr>
5294
5295
5296<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
5297<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5298
5299Type has pointer identity in the AST.
5300</pre></td></tr>
5301
5302
5303<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
5304<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5305
5306Given
5307  int i;
5308  float f;
5309realFloatingPointType()
5310  matches "float f" but not "int i"
5311</pre></td></tr>
5312
5313
5314<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
5315<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5316
5317Given
5318 struct S { void func(); };
5319functionDecl(returns(voidType()))
5320  matches "void func();"
5321</pre></td></tr>
5322
5323
5324<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
5325<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5326
5327Given
5328  int x;
5329  int s = sizeof(x) + alignof(x)
5330unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5331  matches sizeof(x)
5332
5333If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5334should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5335</pre></td></tr>
5336
5337
5338<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
5339<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5340specified names.
5341
5342   hasAnyOperatorName("+", "-")
5343 Is equivalent to
5344   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5345</pre></td></tr>
5346
5347
5348<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
5349<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5350unary).
5351
5352Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5353  !(a || b)
5354</pre></td></tr>
5355
5356
5357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
5358<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5359to '.'.
5360
5361Member calls on the implicit this pointer match as called with '-&gt;'.
5362
5363Given
5364  class Y {
5365    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5366    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5367    int a;
5368    static int b;
5369  };
5370  template &lt;class T&gt;
5371  class Z {
5372    void x() { this-&gt;m; }
5373  };
5374memberExpr(isArrow())
5375  matches this-&gt;x, x, y.x, a, this-&gt;b
5376cxxDependentScopeMemberExpr(isArrow())
5377  matches this-&gt;m
5378unresolvedMemberExpr(isArrow())
5379  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5380</pre></td></tr>
5381
5382
5383<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
5384<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5385
5386Example matches x, but not y, z, or a.
5387(matcher = varDecl(hasAutomaticStorageDuration())
5388void f() {
5389  int x;
5390  static int y;
5391  thread_local int z;
5392}
5393int a;
5394</pre></td></tr>
5395
5396
5397<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
5398<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5399
5400Example matches y and z (matcher = varDecl(hasGlobalStorage())
5401void f() {
5402  int x;
5403  static int y;
5404}
5405int z;
5406</pre></td></tr>
5407
5408
5409<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
5410<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5411non-static local variable.
5412
5413Example matches x (matcher = varDecl(hasLocalStorage())
5414void f() {
5415  int x;
5416  static int y;
5417}
5418int z;
5419</pre></td></tr>
5420
5421
5422<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
5423<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5424It includes the variable declared at namespace scope and those declared
5425with "static" and "extern" storage class specifiers.
5426
5427void f() {
5428  int x;
5429  static int y;
5430  thread_local int z;
5431}
5432int a;
5433static int b;
5434extern int c;
5435varDecl(hasStaticStorageDuration())
5436  matches the function declaration y, a, b and c.
5437</pre></td></tr>
5438
5439
5440<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
5441<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5442
5443Example matches z, but not x, z, or a.
5444(matcher = varDecl(hasThreadStorageDuration())
5445void f() {
5446  int x;
5447  static int y;
5448  thread_local int z;
5449}
5450int a;
5451</pre></td></tr>
5452
5453
5454<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
5455<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5456       and if constexpr.
5457
5458Given:
5459  constexpr int foo = 42;
5460  constexpr int bar();
5461  void baz() { if constexpr(1 &gt; 0) {} }
5462varDecl(isConstexpr())
5463  matches the declaration of foo.
5464functionDecl(isConstexpr())
5465  matches the declaration of bar.
5466ifStmt(isConstexpr())
5467  matches the if statement in baz.
5468</pre></td></tr>
5469
5470
5471<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
5472<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5473
5474Example matches A, va, fa
5475  class A {};
5476  class B;  // Doesn't match, as it has no body.
5477  int va;
5478  extern int vb;  // Doesn't match, as it doesn't define the variable.
5479  void fa() {}
5480  void fb();  // Doesn't match, as it has no body.
5481  @interface X
5482  - (void)ma; // Doesn't match, interface is declaration.
5483  @end
5484  @implementation X
5485  - (void)ma {}
5486  @end
5487
5488Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
5489  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5490</pre></td></tr>
5491
5492
5493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
5494<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5495a C++ catch block, or an Objective-C statement.
5496
5497Example matches x (matcher = varDecl(isExceptionVariable())
5498void f(int y) {
5499  try {
5500  } catch (int x) {
5501  }
5502}
5503</pre></td></tr>
5504
5505
5506<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
5507<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5508static member variable template instantiations.
5509
5510Given
5511  template&lt;typename T&gt; void A(T t) { }
5512  template&lt;&gt; void A(int N) { }
5513functionDecl(isExplicitTemplateSpecialization())
5514  matches the specialization A&lt;int&gt;().
5515
5516Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
5517</pre></td></tr>
5518
5519
5520<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
5521<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5522
5523Given:
5524  extern "C" void f() {}
5525  extern "C" { void g() {} }
5526  void h() {}
5527  extern "C" int x = 1;
5528  extern "C" int y = 2;
5529  int z = 3;
5530functionDecl(isExternC())
5531  matches the declaration of f and g, but not the declaration of h.
5532varDecl(isExternC())
5533  matches the declaration of x and y, but not the declaration of z.
5534</pre></td></tr>
5535
5536
5537<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticLocal0')"><a name="isStaticLocal0Anchor">isStaticLocal</a></td><td></td></tr>
5538<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5539
5540Example matches y (matcher = varDecl(isStaticLocal()))
5541void f() {
5542  int x;
5543  static int y;
5544}
5545static int z;
5546</pre></td></tr>
5547
5548
5549<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
5550<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5551class specifier ("static" keyword) written in the source.
5552
5553Given:
5554  static void f() {}
5555  static int i = 0;
5556  extern int j;
5557  int k;
5558functionDecl(isStaticStorageClass())
5559  matches the function declaration f.
5560varDecl(isStaticStorageClass())
5561  matches the variable declaration i.
5562</pre></td></tr>
5563
5564
5565<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
5566<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5567member variable template instantiations.
5568
5569Given
5570  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5571or
5572  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5573or
5574  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5575cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5576  matches the template instantiation of X&lt;A&gt;.
5577
5578But given
5579  template &lt;typename T&gt;  class X {}; class A {};
5580  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5581cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5582  does not match, as X&lt;A&gt; is an explicit template specialization.
5583
5584Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
5585</pre></td></tr>
5586
5587<!--END_NARROWING_MATCHERS -->
5588</table>
5589
5590<!-- ======================================================================= -->
5591<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5592<!-- ======================================================================= -->
5593
5594<p>Traversal matchers specify the relationship to other nodes that are
5595reachable from the current node.</p>
5596
5597<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5598forEachDescendant) which work on all nodes and allow users to write more generic
5599match expressions.</p>
5600
5601<table>
5602<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5603<!-- START_TRAVERSAL_MATCHERS -->
5604
5605<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
5606<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5607
5608The code
5609  var1 != var2;
5610might be represented in the clang AST as a binaryOperator, a
5611cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5612
5613* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5614  least one is a class type (cxxOperatorCallExpr)
5615* whether the code appears in a template declaration, if at least one of the
5616  vars is a dependent-type (binaryOperator)
5617* whether the code relies on a rewritten binary operator, such as a
5618spaceship operator or an inverted equality operator
5619(cxxRewrittenBinaryOperator)
5620
5621This matcher elides details in places where the matchers for the nodes are
5622compatible.
5623
5624Given
5625  binaryOperation(
5626    hasOperatorName("!="),
5627    hasLHS(expr().bind("lhs")),
5628    hasRHS(expr().bind("rhs"))
5629  )
5630matches each use of "!=" in:
5631  struct S{
5632      bool operator!=(const S&amp;) const;
5633  };
5634
5635  void foo()
5636  {
5637     1 != 2;
5638     S() != S();
5639  }
5640
5641  template&lt;typename T&gt;
5642  void templ()
5643  {
5644     1 != 2;
5645     T() != S();
5646  }
5647  struct HasOpEq
5648  {
5649      bool operator==(const HasOpEq &amp;) const;
5650  };
5651
5652  void inverse()
5653  {
5654      HasOpEq s1;
5655      HasOpEq s2;
5656      if (s1 != s2)
5657          return;
5658  }
5659
5660  struct HasSpaceship
5661  {
5662      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5663  };
5664
5665  void use_spaceship()
5666  {
5667      HasSpaceship s1;
5668      HasSpaceship s2;
5669      if (s1 != s2)
5670          return;
5671  }
5672</pre></td></tr>
5673
5674
5675<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
5676<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5677
5678Unlike anyOf, eachOf will generate a match result for each
5679matching submatcher.
5680
5681For example, in:
5682  class A { int a; int b; };
5683The matcher:
5684  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5685                       has(fieldDecl(hasName("b")).bind("v"))))
5686will generate two results binding "v", the first of which binds
5687the field declaration of a, the second the field declaration of
5688b.
5689
5690Usable as: Any Matcher
5691</pre></td></tr>
5692
5693
5694<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;*&gt;  Matcher</td></tr>
5695<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5696
5697Generates results for each match.
5698
5699For example, in:
5700  class A { class B {}; class C {}; };
5701The matcher:
5702  cxxRecordDecl(hasName("::A"),
5703                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5704will generate results for A, B and C.
5705
5706Usable as: Any Matcher
5707</pre></td></tr>
5708
5709
5710<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5711<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5712provided matcher.
5713
5714Example matches X, A, A::X, B, B::C, B::C::X
5715  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5716  class X {};
5717  class A { class X {}; };  // Matches A, because A::X is a class of name
5718                            // X inside A.
5719  class B { class C { class X {}; }; };
5720
5721DescendantT must be an AST base type.
5722
5723As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5724each result that matches instead of only on the first one.
5725
5726Note: Recursively combined ForEachDescendant can cause many matches:
5727  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5728    forEachDescendant(cxxRecordDecl())
5729  )))
5730will match 10 times (plus injected class name matches) on:
5731  class A { class B { class C { class D { class E {}; }; }; }; };
5732
5733Usable as: Any Matcher
5734</pre></td></tr>
5735
5736
5737<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5738<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5739provided matcher.
5740
5741Example matches X, Y, Y::X, Z::Y, Z::Y::X
5742  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5743  class X {};
5744  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5745                            // inside Y.
5746  class Z { class Y { class X {}; }; };  // Does not match Z.
5747
5748ChildT must be an AST base type.
5749
5750As opposed to 'has', 'forEach' will cause a match for each result that
5751matches instead of only on the first one.
5752
5753Usable as: Any Matcher
5754</pre></td></tr>
5755
5756
5757<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5758<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5759matcher.
5760
5761Given
5762void f() { if (true) { int x = 42; } }
5763void g() { for (;;) { int x = 43; } }
5764expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5765
5766Usable as: Any Matcher
5767</pre></td></tr>
5768
5769
5770<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5771<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5772provided matcher.
5773
5774Example matches X, Y, Z
5775    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5776  class X {};  // Matches X, because X::X is a class of name X inside X.
5777  class Y { class X {}; };
5778  class Z { class Y { class X {}; }; };
5779
5780DescendantT must be an AST base type.
5781
5782Usable as: Any Matcher
5783</pre></td></tr>
5784
5785
5786<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5787<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5788provided matcher.
5789
5790Example matches X, Y
5791  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5792  class X {};  // Matches X, because X::X is a class of name X inside X.
5793  class Y { class X {}; };
5794  class Z { class Y { class X {}; }; };  // Does not match Z.
5795
5796ChildT must be an AST base type.
5797
5798Usable as: Any Matcher
5799Note that has is direct matcher, so it also matches things like implicit
5800casts and paren casts. If you are matching with expr then you should
5801probably consider using ignoringParenImpCasts like:
5802has(ignoringParenImpCasts(expr())).
5803</pre></td></tr>
5804
5805
5806<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5807<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5808matcher.
5809
5810Given
5811void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5812compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5813
5814Usable as: Any Matcher
5815</pre></td></tr>
5816
5817
5818<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
5819<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5820
5821Because CallExpr and CXXConstructExpr do not share a common
5822base class with API accessing arguments etc, AST Matchers for code
5823which should match both are typically duplicated. This matcher
5824removes the need for duplication.
5825
5826Given code
5827struct ConstructorTakesInt
5828{
5829  ConstructorTakesInt(int i) {}
5830};
5831
5832void callTakesInt(int i)
5833{
5834}
5835
5836void doCall()
5837{
5838  callTakesInt(42);
5839}
5840
5841void doConstruct()
5842{
5843  ConstructorTakesInt cti(42);
5844}
5845
5846The matcher
5847invocation(hasArgument(0, integerLiteral(equals(42))))
5848matches the expression in both doCall and doConstruct
5849</pre></td></tr>
5850
5851
5852<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
5853<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5854
5855However, optionally will retain any bindings generated by the submatcher.
5856Useful when additional information which may or may not present about a main
5857matching node is desired.
5858
5859For example, in:
5860  class Foo {
5861    int bar;
5862  }
5863The matcher:
5864  cxxRecordDecl(
5865    optionally(has(
5866      fieldDecl(hasName("bar")).bind("var")
5867  ))).bind("record")
5868will produce a result binding for both "record" and "var".
5869The matcher will produce a "record" binding for even if there is no data
5870member named "bar" in that class.
5871
5872Usable as: Any Matcher
5873</pre></td></tr>
5874
5875
5876<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>TraversalKind TK, Matcher&lt;*&gt;  InnerMatcher</td></tr>
5877<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5878
5879Given
5880  void foo()
5881  {
5882      int i = 3.0;
5883  }
5884The matcher
5885  traverse(TK_IgnoreUnlessSpelledInSource,
5886    varDecl(hasInitializer(floatLiteral().bind("init")))
5887  )
5888matches the variable declaration with "init" bound to the "3.0".
5889</pre></td></tr>
5890
5891
5892<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition5')"><a name="hasCondition5Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5893<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5894switch statement or conditional operator.
5895
5896Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5897  if (true) {}
5898</pre></td></tr>
5899
5900
5901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5902<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5903(binary or ternary).
5904
5905Example matches b
5906  condition ? a : b
5907  condition ?: b
5908</pre></td></tr>
5909
5910
5911<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AbstractConditionalOperator.html">AbstractConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5912<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5913
5914Example 1 (conditional ternary operator): matches a
5915  condition ? a : b
5916
5917Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5918  condition ?: b
5919</pre></td></tr>
5920
5921
5922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5923<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5924matches the given matcher.
5925
5926The associated declaration is:
5927- for type nodes, the declaration of the underlying type
5928- for CallExpr, the declaration of the callee
5929- for MemberExpr, the declaration of the referenced member
5930- for CXXConstructExpr, the declaration of the constructor
5931- for CXXNewExpr, the declaration of the operator new
5932- for ObjCIvarExpr, the declaration of the ivar
5933
5934For type nodes, hasDeclaration will generally match the declaration of the
5935sugared type. Given
5936  class X {};
5937  typedef X Y;
5938  Y y;
5939in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5940typedefDecl. A common use case is to match the underlying, desugared type.
5941This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5942  varDecl(hasType(hasUnqualifiedDesugaredType(
5943      recordType(hasDeclaration(decl())))))
5944In this matcher, the decl will match the CXXRecordDecl of class X.
5945
5946Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
5947  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
5948  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
5949  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
5950  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
5951  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
5952  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5953</pre></td></tr>
5954
5955
5956<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasBase0')"><a name="hasBase0Anchor">hasBase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5957<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5958
5959Given
5960  int i[5];
5961  void f() { i[1] = 42; }
5962arraySubscriptExpression(hasBase(implicitCastExpr(
5963    hasSourceExpression(declRefExpr()))))
5964  matches i[1] with the declRefExpr() matching i
5965</pre></td></tr>
5966
5967
5968<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasIndex0')"><a name="hasIndex0Anchor">hasIndex</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5969<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5970
5971Given
5972  int i[5];
5973  void f() { i[1] = 42; }
5974arraySubscriptExpression(hasIndex(integerLiteral()))
5975  matches i[1] with the integerLiteral() matching 1
5976</pre></td></tr>
5977
5978
5979<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5980<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
5981
5982Example matches a (matcher = binaryOperator(hasLHS()))
5983  a || b
5984</pre></td></tr>
5985
5986
5987<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
5988<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
5989
5990Example matches b (matcher = binaryOperator(hasRHS()))
5991  a || b
5992</pre></td></tr>
5993
5994
5995<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;</td><td class="name" onclick="toggle('hasElementType0')"><a name="hasElementType0Anchor">hasElementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
5996<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5997type.
5998
5999Given
6000  struct A {};
6001  A a[7];
6002  int b[7];
6003arrayType(hasElementType(builtinType()))
6004  matches "int b[7]"
6005
6006Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
6007</pre></td></tr>
6008
6009
6010<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;</td><td class="name" onclick="toggle('hasValueType0')"><a name="hasValueType0Anchor">hasValueType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
6011<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6012
6013Given
6014  _Atomic(int) i;
6015  _Atomic(float) f;
6016atomicType(hasValueType(isInteger()))
6017 matches "_Atomic(int) i"
6018
6019Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6020</pre></td></tr>
6021
6022
6023<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;</td><td class="name" onclick="toggle('hasDeducedType0')"><a name="hasDeducedType0Anchor">hasDeducedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
6024<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6025
6026Note: There is no TypeLoc for the deduced type and thus no
6027getDeducedLoc() matcher.
6028
6029Given
6030  auto a = 1;
6031  auto b = 2.0;
6032autoType(hasDeducedType(isInteger()))
6033  matches "auto a"
6034
6035Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6036</pre></td></tr>
6037
6038
6039<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6040<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6041binary operator matches.
6042</pre></td></tr>
6043
6044
6045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS0')"><a name="hasLHS0Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6046<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6047
6048Example matches a (matcher = binaryOperator(hasLHS()))
6049  a || b
6050</pre></td></tr>
6051
6052
6053<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
6054<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6055
6056Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6057                                             integerLiteral(equals(2)))
6058  1 + 2 // Match
6059  2 + 1 // Match
6060  1 + 1 // No match
6061  2 + 2 // No match
6062</pre></td></tr>
6063
6064
6065<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6066<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6067
6068Example matches b (matcher = binaryOperator(hasRHS()))
6069  a || b
6070</pre></td></tr>
6071
6072
6073<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;</td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
6074<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6075
6076For example, in:
6077void foo()
6078{
6079    int arr[3];
6080    auto &amp;[f, s, t] = arr;
6081
6082    f = 42;
6083}
6084The matcher:
6085  bindingDecl(hasName("f"),
6086                forDecomposition(decompositionDecl())
6087matches 'f' in 'auto &amp;[f, s, t]'.
6088</pre></td></tr>
6089
6090
6091<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter2')"><a name="hasAnyParameter2Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
6092<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6093block.
6094
6095Does not match the 'this' parameter of a method.
6096
6097Given
6098  class X { void f(int x, int y, int z) {} };
6099cxxMethodDecl(hasAnyParameter(hasName("y")))
6100  matches f(int x, int y, int z) {}
6101with hasAnyParameter(...)
6102  matching int y
6103
6104For ObjectiveC, given
6105  @interface I - (void) f:(int) y; @end
6106
6107the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6108matches the declaration of method f with hasParameter
6109matching y.
6110
6111For blocks, given
6112  b = ^(int y) { printf("%d", y) };
6113
6114the matcher blockDecl(hasAnyParameter(hasName("y")))
6115matches the declaration of the block b with hasParameter
6116matching y.
6117</pre></td></tr>
6118
6119
6120<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter2')"><a name="hasParameter2Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
6121<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6122declaration or a block.
6123
6124Given
6125  class X { void f(int x) {} };
6126cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6127  matches f(int x) {}
6128with hasParameter(...)
6129  matching int x
6130
6131For ObjectiveC, given
6132  @interface I - (void) f:(int) y; @end
6133
6134the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6135matches the declaration of method f with hasParameter
6136matching y.
6137</pre></td></tr>
6138
6139
6140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
6141<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6142pointee matches a given matcher.
6143
6144Given
6145  int *a;
6146  int const *b;
6147  float const *f;
6148pointerType(pointee(isConstQualified(), isInteger()))
6149  matches "int const *b"
6150
6151Usable 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;,
6152  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;
6153</pre></td></tr>
6154
6155
6156<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>
6157<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6158declaration's type.
6159
6160In case of a value declaration (for example a variable declaration),
6161this resolves one layer of indirection. For example, in the value
6162declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6163X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6164declaration of x.
6165
6166Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6167            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6168            and friend class X (matcher = friendDecl(hasType("X"))
6169            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6170                                              cxxRecordDecl(hasName("X"))))
6171 class X {};
6172 void y(X &amp;x) { x; X z; }
6173 class Y { friend class X; };
6174 class Z : public virtual X {};
6175
6176Example matches class Derived
6177(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6178class Base {};
6179class Derived : Base {};
6180
6181Usable 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;,
6182Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6183</pre></td></tr>
6184
6185
6186<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>
6187<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6188matcher.
6189
6190Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6191            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6192            and U (matcher = typedefDecl(hasType(asString("int")))
6193            and friend class X (matcher = friendDecl(hasType("X"))
6194            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6195                                              asString("class X")))
6196 class X {};
6197 void y(X &amp;x) { x; X z; }
6198 typedef int U;
6199 class Y { friend class X; };
6200 class Z : public virtual X {};
6201</pre></td></tr>
6202
6203
6204<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>
6205<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6206
6207Given
6208  void f(int i);
6209  int y;
6210  f(y);
6211callExpr(
6212  forEachArgumentWithParam(
6213    declRefExpr(to(varDecl(hasName("y")))),
6214    parmVarDecl(hasType(isInteger()))
6215))
6216  matches f(y);
6217with declRefExpr(...)
6218  matching int y
6219and parmVarDecl(...)
6220  matching int i
6221</pre></td></tr>
6222
6223
6224<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>
6225<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6226CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6227it works on calls through function pointers as well.
6228
6229The difference is, that function pointers do not provide access to a
6230ParmVarDecl, but only the QualType for each argument.
6231
6232Given
6233  void f(int i);
6234  int y;
6235  f(y);
6236  void (*f_ptr)(int) = f;
6237  f_ptr(y);
6238callExpr(
6239  forEachArgumentWithParamType(
6240    declRefExpr(to(varDecl(hasName("y")))),
6241    qualType(isInteger()).bind("type)
6242))
6243  matches f(y) and f_ptr(y)
6244with declRefExpr(...)
6245  matching int y
6246and qualType(...)
6247  matching int
6248</pre></td></tr>
6249
6250
6251<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>
6252<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6253expression, or an ObjC-message-send expression.
6254
6255Given
6256  void x(int, int, int) { int y; x(1, y, 42); }
6257callExpr(hasAnyArgument(declRefExpr()))
6258  matches x(1, y, 42)
6259with hasAnyArgument(...)
6260  matching y
6261
6262For ObjectiveC, given
6263  @interface I - (void) f:(int) y; @end
6264  void foo(I *i) { [i f:12]; }
6265objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6266  matches [i f:12]
6267</pre></td></tr>
6268
6269
6270<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>
6271<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6272call expression.
6273
6274Example matches y in x(y)
6275    (matcher = callExpr(hasArgument(0, declRefExpr())))
6276  void x(int) { int y; x(y); }
6277</pre></td></tr>
6278
6279
6280<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('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>
6281<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6282matches the given matcher.
6283
6284The associated declaration is:
6285- for type nodes, the declaration of the underlying type
6286- for CallExpr, the declaration of the callee
6287- for MemberExpr, the declaration of the referenced member
6288- for CXXConstructExpr, the declaration of the constructor
6289- for CXXNewExpr, the declaration of the operator new
6290- for ObjCIvarExpr, the declaration of the ivar
6291
6292For type nodes, hasDeclaration will generally match the declaration of the
6293sugared type. Given
6294  class X {};
6295  typedef X Y;
6296  Y y;
6297in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6298typedefDecl. A common use case is to match the underlying, desugared type.
6299This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6300  varDecl(hasType(hasUnqualifiedDesugaredType(
6301      recordType(hasDeclaration(decl())))))
6302In this matcher, the decl will match the CXXRecordDecl of class X.
6303
6304Usable 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;,
6305  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;,
6306  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;,
6307  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;,
6308  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;,
6309  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;,
6310  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6311</pre></td></tr>
6312
6313
6314<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>
6315<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6316
6317Given
6318  class A { A() : i(42), j(42) {} int i; int j; };
6319cxxConstructorDecl(forEachConstructorInitializer(
6320  forField(decl().bind("x"))
6321))
6322  will trigger two matches, binding for 'i' and 'j' respectively.
6323</pre></td></tr>
6324
6325
6326<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>
6327<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6328
6329Given
6330  struct Foo {
6331    Foo() : foo_(1) { }
6332    int foo_;
6333  };
6334cxxRecordDecl(has(cxxConstructorDecl(
6335  hasAnyConstructorInitializer(anything())
6336)))
6337  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6338</pre></td></tr>
6339
6340
6341<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>
6342<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6343
6344Given
6345  struct Foo {
6346    Foo() : foo_(1) { }
6347    int foo_;
6348  };
6349cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6350    forField(hasName("foo_"))))))
6351  matches Foo
6352with forField matching foo_
6353</pre></td></tr>
6354
6355
6356<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>
6357<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6358
6359Given
6360  struct Foo {
6361    Foo() : foo_(1) { }
6362    int foo_;
6363  };
6364cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6365    withInitializer(integerLiteral(equals(1)))))))
6366  matches Foo
6367with withInitializer matching (1)
6368</pre></td></tr>
6369
6370
6371<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>
6372<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6373given matcher. Implicit object expressions are included; that is, it matches
6374use of implicit `this`.
6375
6376Given
6377  struct X {
6378    int m;
6379    int f(X x) { x.m; return m; }
6380  };
6381memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6382  matches `x.m`, but not `m`; however,
6383memberExpr(hasObjectExpression(hasType(pointsTo(
6384     cxxRecordDecl(hasName("X"))))))
6385  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6386</pre></td></tr>
6387
6388
6389<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>
6390<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6391
6392
6393<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>
6394<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6395
6396Given:
6397 void foo() {
6398   if (int i = foobar(); i &gt; 0) {}
6399   switch (int i = foobar(); i) {}
6400   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6401 }
6402 void bar() {
6403   if (foobar() &gt; 0) {}
6404   switch (foobar()) {}
6405   for (auto&amp; x : get_range()) {}
6406 }
6407ifStmt(hasInitStatement(anything()))
6408  matches the if statement in foo but not in bar.
6409switchStmt(hasInitStatement(anything()))
6410  matches the switch statement in foo but not in bar.
6411cxxForRangeStmt(hasInitStatement(anything()))
6412  matches the range for statement in foo but not in bar.
6413</pre></td></tr>
6414
6415
6416<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>
6417<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6418
6419Example:
6420    forStmt(hasLoopVariable(anything()))
6421matches 'int x' in
6422    for (int x : a) { }
6423</pre></td></tr>
6424
6425
6426<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>
6427<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6428
6429Example:
6430    forStmt(hasRangeInit(anything()))
6431matches 'a' in
6432    for (int x : a) { }
6433</pre></td></tr>
6434
6435
6436<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>
6437<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6438`on`, matches the argument directly without stripping away anything.
6439
6440Given
6441  class Y { public: void m(); };
6442  Y g();
6443  class X : public Y { void g(); };
6444  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6445cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6446    cxxRecordDecl(hasName("Y")))))
6447  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6448cxxMemberCallExpr(on(callExpr()))
6449  does not match `(g()).m()`, because the parens are not ignored.
6450
6451FIXME: Overload to allow directly matching types?
6452</pre></td></tr>
6453
6454
6455<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>
6456<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6457stripping off any parentheses or implicit casts.
6458
6459Given
6460  class Y { public: void m(); };
6461  Y g();
6462  class X : public Y {};
6463  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6464cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6465  matches `y.m()` and `(g()).m()`.
6466cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6467  matches `x.m()`.
6468cxxMemberCallExpr(on(callExpr()))
6469  matches `(g()).m()`.
6470
6471FIXME: Overload to allow directly matching types?
6472</pre></td></tr>
6473
6474
6475<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>
6476<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6477</pre></td></tr>
6478
6479
6480<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>
6481<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6482matches the InnerMatcher, or is a pointer to a type that matches the
6483InnerMatcher.
6484
6485Given
6486  class Y { public: void m(); };
6487  class X : public Y { void g(); };
6488  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6489cxxMemberCallExpr(thisPointerType(hasDeclaration(
6490    cxxRecordDecl(hasName("Y")))))
6491  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6492cxxMemberCallExpr(thisPointerType(hasDeclaration(
6493    cxxRecordDecl(hasName("X")))))
6494  matches `x.g()`.
6495</pre></td></tr>
6496
6497
6498<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>
6499<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6500produce multiple matches.
6501
6502Given
6503  class A { virtual void f(); };
6504  class B : public A { void f(); };
6505  class C : public B { void f(); };
6506cxxMethodDecl(ofClass(hasName("C")),
6507              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6508  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6509  that B::f is not overridden by C::f).
6510
6511The check can produce multiple matches in case of multiple inheritance, e.g.
6512  class A1 { virtual void f(); };
6513  class A2 { virtual void f(); };
6514  class C : public A1, public A2 { void f(); };
6515cxxMethodDecl(ofClass(hasName("C")),
6516              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6517  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6518  once with "b" binding "A2::f" and "d" binding "C::f".
6519</pre></td></tr>
6520
6521
6522<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>
6523<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6524belongs to.
6525
6526FIXME: Generalize this for other kinds of declarations.
6527FIXME: What other kind of declarations would we need to generalize
6528this to?
6529
6530Example matches A() in the last line
6531    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6532        ofClass(hasName("A"))))))
6533  class A {
6534   public:
6535    A();
6536  };
6537  A a = A();
6538</pre></td></tr>
6539
6540
6541<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>
6542<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6543
6544Given:
6545  MyClass *p1 = new (Storage) MyClass();
6546cxxNewExpr(hasAnyPlacementArg(anything()))
6547  matches the expression 'new (Storage, 16) MyClass()'.
6548</pre></td></tr>
6549
6550
6551<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>
6552<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6553
6554Given:
6555  MyClass *p1 = new MyClass[10];
6556cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6557  matches the expression 'new MyClass[10]'.
6558</pre></td></tr>
6559
6560
6561<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>
6562<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6563matches the given matcher.
6564
6565The associated declaration is:
6566- for type nodes, the declaration of the underlying type
6567- for CallExpr, the declaration of the callee
6568- for MemberExpr, the declaration of the referenced member
6569- for CXXConstructExpr, the declaration of the constructor
6570- for CXXNewExpr, the declaration of the operator new
6571- for ObjCIvarExpr, the declaration of the ivar
6572
6573For type nodes, hasDeclaration will generally match the declaration of the
6574sugared type. Given
6575  class X {};
6576  typedef X Y;
6577  Y y;
6578in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6579typedefDecl. A common use case is to match the underlying, desugared type.
6580This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6581  varDecl(hasType(hasUnqualifiedDesugaredType(
6582      recordType(hasDeclaration(decl())))))
6583In this matcher, the decl will match the CXXRecordDecl of class X.
6584
6585Usable 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;,
6586  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;,
6587  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;,
6588  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;,
6589  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;,
6590  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;,
6591  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6592</pre></td></tr>
6593
6594
6595<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>
6596<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6597
6598Given:
6599  MyClass *p1 = new (Storage, 16) MyClass();
6600cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6601  matches the expression 'new (Storage, 16) MyClass()'.
6602</pre></td></tr>
6603
6604
6605<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>
6606<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6607binary operator matches.
6608</pre></td></tr>
6609
6610
6611<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>
6612<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6613
6614Example matches a (matcher = binaryOperator(hasLHS()))
6615  a || b
6616</pre></td></tr>
6617
6618
6619<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>
6620<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6621
6622Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6623                                             integerLiteral(equals(2)))
6624  1 + 2 // Match
6625  2 + 1 // Match
6626  1 + 1 // No match
6627  2 + 2 // No match
6628</pre></td></tr>
6629
6630
6631<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>
6632<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6633
6634Example matches b (matcher = binaryOperator(hasRHS()))
6635  a || b
6636</pre></td></tr>
6637
6638
6639<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>
6640<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6641
6642Example matches true (matcher = hasUnaryOperand(
6643                                  cxxBoolLiteral(equals(true))))
6644  !true
6645</pre></td></tr>
6646
6647
6648<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>
6649<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6650
6651Example:
6652matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6653  class Foo;
6654  class Bar : Foo {};
6655  class Baz : Bar {};
6656  class SpecialBase;
6657  class Proxy : SpecialBase {};  // matches Proxy
6658  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6659
6660FIXME: Refactor this and isDerivedFrom to reuse implementation.
6661</pre></td></tr>
6662
6663
6664<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>
6665<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6666
6667Example:
6668matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6669  class Foo;
6670  class Bar : Foo {};
6671  class Baz : Bar {};
6672  class SpecialBase;
6673  class Proxy : SpecialBase {};  // matches Proxy
6674  class IndirectlyDerived : Proxy {};  // doesn't match
6675</pre></td></tr>
6676
6677
6678<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>
6679<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6680
6681Given:
6682  class A { void func(); };
6683  class B { void member(); };
6684
6685cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
6686A but not B.
6687</pre></td></tr>
6688
6689
6690<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>
6691<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
6692matching Base, or Objective-C classes that directly or indirectly
6693subclass a class matching Base.
6694
6695Note that a class is not considered to be derived from itself.
6696
6697Example matches Y, Z, C (Base == hasName("X"))
6698  class X;
6699  class Y : public X {};  // directly derived
6700  class Z : public Y {};  // indirectly derived
6701  typedef X A;
6702  typedef A B;
6703  class C : public B {};  // derived from a typedef of X
6704
6705In the following example, Bar matches isDerivedFrom(hasName("X")):
6706  class Foo;
6707  typedef Foo X;
6708  class Bar : public Foo {};  // derived from a type that X is a typedef of
6709
6710In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6711  @interface NSObject @end
6712  @interface Bar : NSObject @end
6713
6714Usable 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;
6715</pre></td></tr>
6716
6717
6718<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>
6719<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6720matching Base.
6721
6722Note that a class is not considered to be derived from itself.
6723
6724Example matches Y, C (Base == hasName("X"))
6725  class X;
6726  class Y : public X {};  // directly derived
6727  class Z : public Y {};  // indirectly derived
6728  typedef X A;
6729  typedef A B;
6730  class C : public B {};  // derived from a typedef of X
6731
6732In the following example, Bar matches isDerivedFrom(hasName("X")):
6733  class Foo;
6734  typedef Foo X;
6735  class Bar : public Foo {};  // derived from a type that X is a typedef of
6736</pre></td></tr>
6737
6738
6739<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>
6740<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6741match Base.
6742</pre></td></tr>
6743
6744
6745<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>
6746<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
6747binary operator matches.
6748</pre></td></tr>
6749
6750
6751<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
6752<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
6753
6754Example matches a (matcher = binaryOperator(hasLHS()))
6755  a || b
6756</pre></td></tr>
6757
6758
6759<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
6760<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
6761
6762Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6763                                             integerLiteral(equals(2)))
6764  1 + 2 // Match
6765  2 + 1 // Match
6766  1 + 1 // No match
6767  2 + 2 // No match
6768</pre></td></tr>
6769
6770
6771<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
6772<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
6773
6774Example matches b (matcher = binaryOperator(hasRHS()))
6775  a || b
6776</pre></td></tr>
6777
6778
6779<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
6780<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
6781expression, or an ObjC-message-send expression.
6782
6783Given
6784  void x(int, int, int) { int y; x(1, y, 42); }
6785callExpr(hasAnyArgument(declRefExpr()))
6786  matches x(1, y, 42)
6787with hasAnyArgument(...)
6788  matching y
6789
6790For ObjectiveC, given
6791  @interface I - (void) f:(int) y; @end
6792  void foo(I *i) { [i f:12]; }
6793objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6794  matches [i f:12]
6795</pre></td></tr>
6796
6797
6798<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>
6799<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6800call expression.
6801
6802Example matches y in x(y)
6803    (matcher = callExpr(hasArgument(0, declRefExpr())))
6804  void x(int) { int y; x(y); }
6805</pre></td></tr>
6806
6807
6808<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>
6809<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
6810given matcher.
6811
6812Example matches y.x() (matcher = callExpr(callee(
6813                                   cxxMethodDecl(hasName("x")))))
6814  class Y { public: void x(); };
6815  void z() { Y y; y.x(); }
6816</pre></td></tr>
6817
6818
6819<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>
6820<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
6821
6822Given
6823  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
6824  void f() { f(); }
6825callExpr(callee(expr()))
6826  matches this-&gt;x(), x(), y.x(), f()
6827with callee(...)
6828  matching this-&gt;x, x, y.x, f respectively
6829
6830Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
6831because this introduces ambiguous overloads with calls to Callee taking a
6832internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
6833implemented in terms of implicit casts.
6834</pre></td></tr>
6835
6836
6837<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>
6838<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
6839
6840Given
6841  void f(int i);
6842  int y;
6843  f(y);
6844callExpr(
6845  forEachArgumentWithParam(
6846    declRefExpr(to(varDecl(hasName("y")))),
6847    parmVarDecl(hasType(isInteger()))
6848))
6849  matches f(y);
6850with declRefExpr(...)
6851  matching int y
6852and parmVarDecl(...)
6853  matching int i
6854</pre></td></tr>
6855
6856
6857<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>
6858<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
6859CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6860it works on calls through function pointers as well.
6861
6862The difference is, that function pointers do not provide access to a
6863ParmVarDecl, but only the QualType for each argument.
6864
6865Given
6866  void f(int i);
6867  int y;
6868  f(y);
6869  void (*f_ptr)(int) = f;
6870  f_ptr(y);
6871callExpr(
6872  forEachArgumentWithParamType(
6873    declRefExpr(to(varDecl(hasName("y")))),
6874    qualType(isInteger()).bind("type)
6875))
6876  matches f(y) and f_ptr(y)
6877with declRefExpr(...)
6878  matching int y
6879and qualType(...)
6880  matching int
6881</pre></td></tr>
6882
6883
6884<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>
6885<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
6886expression, or an ObjC-message-send expression.
6887
6888Given
6889  void x(int, int, int) { int y; x(1, y, 42); }
6890callExpr(hasAnyArgument(declRefExpr()))
6891  matches x(1, y, 42)
6892with hasAnyArgument(...)
6893  matching y
6894
6895For ObjectiveC, given
6896  @interface I - (void) f:(int) y; @end
6897  void foo(I *i) { [i f:12]; }
6898objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6899  matches [i f:12]
6900</pre></td></tr>
6901
6902
6903<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>
6904<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
6905call expression.
6906
6907Example matches y in x(y)
6908    (matcher = callExpr(hasArgument(0, declRefExpr())))
6909  void x(int) { int y; x(y); }
6910</pre></td></tr>
6911
6912
6913<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>
6914<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
6915matches the given matcher.
6916
6917The associated declaration is:
6918- for type nodes, the declaration of the underlying type
6919- for CallExpr, the declaration of the callee
6920- for MemberExpr, the declaration of the referenced member
6921- for CXXConstructExpr, the declaration of the constructor
6922- for CXXNewExpr, the declaration of the operator new
6923- for ObjCIvarExpr, the declaration of the ivar
6924
6925For type nodes, hasDeclaration will generally match the declaration of the
6926sugared type. Given
6927  class X {};
6928  typedef X Y;
6929  Y y;
6930in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6931typedefDecl. A common use case is to match the underlying, desugared type.
6932This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6933  varDecl(hasType(hasUnqualifiedDesugaredType(
6934      recordType(hasDeclaration(decl())))))
6935In this matcher, the decl will match the CXXRecordDecl of class X.
6936
6937Usable 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;,
6938  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;,
6939  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;,
6940  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;,
6941  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;,
6942  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;,
6943  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6944</pre></td></tr>
6945
6946
6947<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>
6948<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
6949extension, matches the constant given in the statement.
6950
6951Given
6952  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
6953caseStmt(hasCaseConstant(integerLiteral()))
6954  matches "case 1:"
6955</pre></td></tr>
6956
6957
6958<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>
6959<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
6960or opaque value's source expression matches the given matcher.
6961
6962Example 1: matches "a string"
6963(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6964class URL { URL(string); };
6965URL url = "a string";
6966
6967Example 2: matches 'b' (matcher =
6968opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6969int a = b ?: 1;
6970</pre></td></tr>
6971
6972
6973<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>
6974<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6975functionDecl that have at least one TemplateArgument matching the given
6976InnerMatcher.
6977
6978Given
6979  template&lt;typename T&gt; class A {};
6980  template&lt;&gt; class A&lt;double&gt; {};
6981  A&lt;int&gt; a;
6982
6983  template&lt;typename T&gt; f() {};
6984  void func() { f&lt;int&gt;(); };
6985
6986classTemplateSpecializationDecl(hasAnyTemplateArgument(
6987    refersToType(asString("int"))))
6988  matches the specialization A&lt;int&gt;
6989
6990functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6991  matches the specialization f&lt;int&gt;
6992</pre></td></tr>
6993
6994
6995<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>
6996<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
6997
6998Given
6999  template&lt;typename T&gt; class A {}; #1
7000  template&lt;&gt; class A&lt;int&gt; {}; #2
7001classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7002  matches '#2' with classTemplateDecl() matching the class template
7003  declaration of 'A' at #1.
7004</pre></td></tr>
7005
7006
7007<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>
7008<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7009functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7010
7011Given
7012  template&lt;typename T, typename U&gt; class A {};
7013  A&lt;bool, int&gt; b;
7014  A&lt;int, bool&gt; c;
7015
7016  template&lt;typename T&gt; void f() {}
7017  void func() { f&lt;int&gt;(); };
7018classTemplateSpecializationDecl(hasTemplateArgument(
7019    1, refersToType(asString("int"))))
7020  matches the specialization A&lt;bool, int&gt;
7021
7022functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7023  matches the specialization f&lt;int&gt;
7024</pre></td></tr>
7025
7026
7027<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>
7028<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7029type.
7030
7031Given
7032  struct A {};
7033  A a[7];
7034  int b[7];
7035arrayType(hasElementType(builtinType()))
7036  matches "int b[7]"
7037
7038Usable 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;
7039</pre></td></tr>
7040
7041
7042<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>
7043<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7044a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7045
7046Given
7047  { {}; 1+2; }
7048hasAnySubstatement(compoundStmt())
7049  matches '{ {}; 1+2; }'
7050with compoundStmt()
7051  matching '{}'
7052</pre></td></tr>
7053
7054
7055<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>
7056<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7057</pre></td></tr>
7058
7059
7060<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>
7061<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7062matches the given matcher.
7063
7064The associated declaration is:
7065- for type nodes, the declaration of the underlying type
7066- for CallExpr, the declaration of the callee
7067- for MemberExpr, the declaration of the referenced member
7068- for CXXConstructExpr, the declaration of the constructor
7069- for CXXNewExpr, the declaration of the operator new
7070- for ObjCIvarExpr, the declaration of the ivar
7071
7072For type nodes, hasDeclaration will generally match the declaration of the
7073sugared type. Given
7074  class X {};
7075  typedef X Y;
7076  Y y;
7077in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7078typedefDecl. A common use case is to match the underlying, desugared type.
7079This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7080  varDecl(hasType(hasUnqualifiedDesugaredType(
7081      recordType(hasDeclaration(decl())))))
7082In this matcher, the decl will match the CXXRecordDecl of class X.
7083
7084Usable 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;,
7085  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;,
7086  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;,
7087  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;,
7088  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;,
7089  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;,
7090  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7091</pre></td></tr>
7092
7093
7094<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
7095<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7096specific using shadow declaration.
7097
7098Given
7099  namespace a { void f() {} }
7100  using a::f;
7101  void g() {
7102    f();     // Matches this ..
7103    a::f();  // .. but not this.
7104  }
7105declRefExpr(throughUsingDecl(anything()))
7106  matches f()
7107</pre></td></tr>
7108
7109
7110<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>
7111<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7112specified matcher.
7113
7114Example matches x in if(x)
7115    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7116  bool x;
7117  if (x) {}
7118</pre></td></tr>
7119
7120
7121<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>
7122<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7123
7124Note that this does not work for global declarations because the AST
7125breaks up multiple-declaration DeclStmt's into multiple single-declaration
7126DeclStmt's.
7127Example: Given non-global declarations
7128  int a, b = 0;
7129  int c;
7130  int d = 2, e;
7131declStmt(containsDeclaration(
7132      0, varDecl(hasInitializer(anything()))))
7133  matches only 'int d = 2, e;', and
7134declStmt(containsDeclaration(1, varDecl()))
7135  matches 'int a, b = 0' as well as 'int d = 2, e;'
7136  but 'int c;' is not matched.
7137</pre></td></tr>
7138
7139
7140<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>
7141<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7142
7143Given
7144  int a, b;
7145  int c;
7146declStmt(hasSingleDecl(anything()))
7147  matches 'int c;' but not 'int a, b;'.
7148</pre></td></tr>
7149
7150
7151<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</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>
7152<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
7153the inner matcher.
7154
7155Given
7156  int x;
7157declaratorDecl(hasTypeLoc(loc(asString("int"))))
7158  matches int x
7159</pre></td></tr>
7160
7161
7162<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>
7163<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7164Decl, matches InnerMatcher.
7165
7166Given
7167  namespace N {
7168    namespace M {
7169      class D {};
7170    }
7171  }
7172
7173cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7174declaration of class D.
7175</pre></td></tr>
7176
7177
7178<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>
7179<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7180
7181Given
7182  decltype(1) a = 1;
7183  decltype(2.0) b = 2.0;
7184decltypeType(hasUnderlyingType(isInteger()))
7185  matches the type of "a"
7186
7187Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7188</pre></td></tr>
7189
7190
7191<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>
7192<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7193
7194For example, in:
7195void foo()
7196{
7197    int arr[3];
7198    auto &amp;[f, s, t] = arr;
7199
7200    f = 42;
7201}
7202The matcher:
7203  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7204matches the decomposition decl with 'f' bound to "fBinding".
7205</pre></td></tr>
7206
7207
7208<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>
7209<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7210
7211For example, in:
7212void foo()
7213{
7214    int arr[3];
7215    auto &amp;[f, s, t] = arr;
7216
7217    f = 42;
7218}
7219The matcher:
7220  decompositionDecl(hasBinding(0,
7221  bindingDecl(hasName("f").bind("fBinding"))))
7222matches the decomposition decl with 'f' bound to "fBinding".
7223</pre></td></tr>
7224
7225
7226<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>
7227<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7228
7229
7230<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>
7231<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7232switch statement or conditional operator.
7233
7234Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7235  if (true) {}
7236</pre></td></tr>
7237
7238
7239<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>
7240<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7241matches InnerMatcher if the qualifier exists.
7242
7243Given
7244  namespace N {
7245    namespace M {
7246      class D {};
7247    }
7248  }
7249  N::M::D d;
7250
7251elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7252matches the type of the variable declaration of d.
7253</pre></td></tr>
7254
7255
7256<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>
7257<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7258
7259Given
7260  namespace N {
7261    namespace M {
7262      class D {};
7263    }
7264  }
7265  N::M::D d;
7266
7267elaboratedType(namesType(recordType(
7268hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7269declaration of d.
7270</pre></td></tr>
7271
7272
7273<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>
7274<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7275matches the given matcher.
7276
7277The associated declaration is:
7278- for type nodes, the declaration of the underlying type
7279- for CallExpr, the declaration of the callee
7280- for MemberExpr, the declaration of the referenced member
7281- for CXXConstructExpr, the declaration of the constructor
7282- for CXXNewExpr, the declaration of the operator new
7283- for ObjCIvarExpr, the declaration of the ivar
7284
7285For type nodes, hasDeclaration will generally match the declaration of the
7286sugared type. Given
7287  class X {};
7288  typedef X Y;
7289  Y y;
7290in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7291typedefDecl. A common use case is to match the underlying, desugared type.
7292This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7293  varDecl(hasType(hasUnqualifiedDesugaredType(
7294      recordType(hasDeclaration(decl())))))
7295In this matcher, the decl will match the CXXRecordDecl of class X.
7296
7297Usable 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;,
7298  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;,
7299  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;,
7300  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;,
7301  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;,
7302  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;,
7303  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7304</pre></td></tr>
7305
7306
7307<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>
7308<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7309
7310(Note: Clang's AST refers to other conversions as "casts" too, and calls
7311actual casts "explicit" casts.)
7312</pre></td></tr>
7313
7314
7315<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>
7316<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7317declaration's type.
7318
7319In case of a value declaration (for example a variable declaration),
7320this resolves one layer of indirection. For example, in the value
7321declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7322X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7323declaration of x.
7324
7325Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7326            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7327            and friend class X (matcher = friendDecl(hasType("X"))
7328            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7329                                              cxxRecordDecl(hasName("X"))))
7330 class X {};
7331 void y(X &amp;x) { x; X z; }
7332 class Y { friend class X; };
7333 class Z : public virtual X {};
7334
7335Example matches class Derived
7336(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7337class Base {};
7338class Derived : Base {};
7339
7340Usable 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;,
7341Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7342</pre></td></tr>
7343
7344
7345<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>
7346<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7347matcher.
7348
7349Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7350            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7351            and U (matcher = typedefDecl(hasType(asString("int")))
7352            and friend class X (matcher = friendDecl(hasType("X"))
7353            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7354                                              asString("class X")))
7355 class X {};
7356 void y(X &amp;x) { x; X z; }
7357 typedef int U;
7358 class Y { friend class X; };
7359 class Z : public virtual X {};
7360</pre></td></tr>
7361
7362
7363<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>
7364<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7365elidable constructor and other corresponding bookkeeping nodes.
7366
7367In C++17, elidable copy constructors are no longer being generated in the
7368AST as it is not permitted by the standard. They are, however, part of the
7369AST in C++14 and earlier. So, a matcher must abstract over these differences
7370to work in all language modes. This matcher skips elidable constructor-call
7371AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7372various implicit nodes inside the constructor calls, all of which will not
7373appear in the C++17 AST.
7374
7375Given
7376
7377struct H {};
7378H G();
7379void f() {
7380  H D = G();
7381}
7382
7383``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7384matches ``H D = G()`` in C++11 through C++17 (and beyond).
7385</pre></td></tr>
7386
7387
7388<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>
7389<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7390are stripped off.
7391
7392Parentheses and explicit casts are not discarded.
7393Given
7394  int arr[5];
7395  int a = 0;
7396  char b = 0;
7397  const int c = a;
7398  int *d = arr;
7399  long e = (long) 0l;
7400The matchers
7401   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7402   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7403would match the declarations for a, b, c, and d, but not e.
7404While
7405   varDecl(hasInitializer(integerLiteral()))
7406   varDecl(hasInitializer(declRefExpr()))
7407only match the declarations for b, c, and d.
7408</pre></td></tr>
7409
7410
7411<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>
7412<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7413nodes are stripped off.
7414
7415Parentheses and explicit casts are not discarded.
7416Given
7417  class C {};
7418  C a = C();
7419  C b;
7420  C c = b;
7421The matchers
7422   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7423would match the declarations for a, b, and c.
7424While
7425   varDecl(hasInitializer(cxxConstructExpr()))
7426only match the declarations for b and c.
7427</pre></td></tr>
7428
7429
7430<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>
7431<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7432casts are stripped off.
7433
7434Implicit and non-C Style casts are also discarded.
7435Given
7436  int a = 0;
7437  char b = (0);
7438  void* c = reinterpret_cast&lt;char*&gt;(0);
7439  char d = char(0);
7440The matcher
7441   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7442would match the declarations for a, b, c, and d.
7443while
7444   varDecl(hasInitializer(integerLiteral()))
7445only match the declaration for a.
7446</pre></td></tr>
7447
7448
7449<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>
7450<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7451parentheses are stripped off.
7452
7453Explicit casts are not discarded.
7454Given
7455  int arr[5];
7456  int a = 0;
7457  char b = (0);
7458  const int c = a;
7459  int *d = (arr);
7460  long e = ((long) 0l);
7461The matchers
7462   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7463   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7464would match the declarations for a, b, c, and d, but not e.
7465while
7466   varDecl(hasInitializer(integerLiteral()))
7467   varDecl(hasInitializer(declRefExpr()))
7468would only match the declaration for a.
7469</pre></td></tr>
7470
7471
7472<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>
7473<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7474
7475Given
7476  const char* str = ("my-string");
7477The matcher
7478  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7479would match the implicit cast resulting from the assignment.
7480</pre></td></tr>
7481
7482
7483<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>
7484<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7485
7486Given
7487  class C {
7488    int a = 2;
7489    int b = 3;
7490    int c;
7491  };
7492fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7493  matches 'int a;' but not 'int b;'.
7494fieldDecl(hasInClassInitializer(anything()))
7495  matches 'int a;' and 'int b;' but not 'int c;'.
7496</pre></td></tr>
7497
7498
7499<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>
7500<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7501
7502
7503<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>
7504<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7505switch statement or conditional operator.
7506
7507Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7508  if (true) {}
7509</pre></td></tr>
7510
7511
7512<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>
7513<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7514
7515Example:
7516    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7517matches '++x' in
7518    for (x; x &lt; N; ++x) { }
7519</pre></td></tr>
7520
7521
7522<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>
7523<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7524
7525Example:
7526    forStmt(hasLoopInit(declStmt()))
7527matches 'int x = 0' in
7528    for (int x = 0; x &lt; N; ++x) { }
7529</pre></td></tr>
7530
7531
7532<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>
7533<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7534declaration's type.
7535
7536In case of a value declaration (for example a variable declaration),
7537this resolves one layer of indirection. For example, in the value
7538declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7539X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7540declaration of x.
7541
7542Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7543            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7544            and friend class X (matcher = friendDecl(hasType("X"))
7545            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7546                                              cxxRecordDecl(hasName("X"))))
7547 class X {};
7548 void y(X &amp;x) { x; X z; }
7549 class Y { friend class X; };
7550 class Z : public virtual X {};
7551
7552Example matches class Derived
7553(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7554class Base {};
7555class Derived : Base {};
7556
7557Usable 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;,
7558Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7559</pre></td></tr>
7560
7561
7562<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>
7563<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
7564matcher.
7565
7566Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7567            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7568            and U (matcher = typedefDecl(hasType(asString("int")))
7569            and friend class X (matcher = friendDecl(hasType("X"))
7570            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7571                                              asString("class X")))
7572 class X {};
7573 void y(X &amp;x) { x; X z; }
7574 typedef int U;
7575 class Y { friend class X; };
7576 class Z : public virtual X {};
7577</pre></td></tr>
7578
7579
7580<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>
7581<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
7582Note that this matcher matches all the declarations of a function whose
7583body is present in the AST.
7584
7585Given
7586  void f();
7587  void f() {}
7588  void g();
7589functionDecl(hasAnyBody(compoundStmt()))
7590  matches both 'void f();'
7591  and 'void f() {}'
7592with compoundStmt()
7593  matching '{}'
7594  but does not match 'void g();'
7595</pre></td></tr>
7596
7597
7598<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>
7599<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
7600block.
7601
7602Does not match the 'this' parameter of a method.
7603
7604Given
7605  class X { void f(int x, int y, int z) {} };
7606cxxMethodDecl(hasAnyParameter(hasName("y")))
7607  matches f(int x, int y, int z) {}
7608with hasAnyParameter(...)
7609  matching int y
7610
7611For ObjectiveC, given
7612  @interface I - (void) f:(int) y; @end
7613
7614the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7615matches the declaration of method f with hasParameter
7616matching y.
7617
7618For blocks, given
7619  b = ^(int y) { printf("%d", y) };
7620
7621the matcher blockDecl(hasAnyParameter(hasName("y")))
7622matches the declaration of the block b with hasParameter
7623matching y.
7624</pre></td></tr>
7625
7626
7627<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>
7628<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7629functionDecl that have at least one TemplateArgument matching the given
7630InnerMatcher.
7631
7632Given
7633  template&lt;typename T&gt; class A {};
7634  template&lt;&gt; class A&lt;double&gt; {};
7635  A&lt;int&gt; a;
7636
7637  template&lt;typename T&gt; f() {};
7638  void func() { f&lt;int&gt;(); };
7639
7640classTemplateSpecializationDecl(hasAnyTemplateArgument(
7641    refersToType(asString("int"))))
7642  matches the specialization A&lt;int&gt;
7643
7644functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7645  matches the specialization f&lt;int&gt;
7646</pre></td></tr>
7647
7648
7649<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>
7650<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
7651
7652
7653<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>
7654<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
7655declaration.
7656
7657Given
7658  template&lt;bool b&gt;
7659  struct S {
7660    S(int); // #1
7661    explicit S(double); // #2
7662    operator int(); // #3
7663    explicit operator bool(); // #4
7664    explicit(false) S(bool) // # 7
7665    explicit(true) S(char) // # 8
7666    explicit(b) S(S) // # 9
7667  };
7668  S(int) -&gt; S&lt;true&gt; // #5
7669  explicit S(double) -&gt; S&lt;false&gt; // #6
7670cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
7671cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
7672cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
7673</pre></td></tr>
7674
7675
7676<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>
7677<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
7678declaration or a block.
7679
7680Given
7681  class X { void f(int x) {} };
7682cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7683  matches f(int x) {}
7684with hasParameter(...)
7685  matching int x
7686
7687For ObjectiveC, given
7688  @interface I - (void) f:(int) y; @end
7689
7690the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7691matches the declaration of method f with hasParameter
7692matching y.
7693</pre></td></tr>
7694
7695
7696<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>
7697<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7698functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7699
7700Given
7701  template&lt;typename T, typename U&gt; class A {};
7702  A&lt;bool, int&gt; b;
7703  A&lt;int, bool&gt; c;
7704
7705  template&lt;typename T&gt; void f() {}
7706  void func() { f&lt;int&gt;(); };
7707classTemplateSpecializationDecl(hasTemplateArgument(
7708    1, refersToType(asString("int"))))
7709  matches the specialization A&lt;bool, int&gt;
7710
7711functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7712  matches the specialization f&lt;int&gt;
7713</pre></td></tr>
7714
7715
7716<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>
7717<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
7718
7719Given:
7720  class X { int f() { return 1; } };
7721cxxMethodDecl(returns(asString("int")))
7722  matches int f() { return 1; }
7723</pre></td></tr>
7724
7725
7726<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>
7727<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
7728switch statement or conditional operator.
7729
7730Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7731  if (true) {}
7732</pre></td></tr>
7733
7734
7735<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>
7736<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
7737
7738Given
7739  if (A* a = GetAPointer()) {}
7740hasConditionVariableStatement(...)
7741  matches 'A* a = GetAPointer()'.
7742</pre></td></tr>
7743
7744
7745<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>
7746<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
7747
7748Examples matches the if statement
7749  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
7750  if (false) false; else true;
7751</pre></td></tr>
7752
7753
7754<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>
7755<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
7756
7757Given:
7758 void foo() {
7759   if (int i = foobar(); i &gt; 0) {}
7760   switch (int i = foobar(); i) {}
7761   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7762 }
7763 void bar() {
7764   if (foobar() &gt; 0) {}
7765   switch (foobar()) {}
7766   for (auto&amp; x : get_range()) {}
7767 }
7768ifStmt(hasInitStatement(anything()))
7769  matches the if statement in foo but not in bar.
7770switchStmt(hasInitStatement(anything()))
7771  matches the switch statement in foo but not in bar.
7772cxxForRangeStmt(hasInitStatement(anything()))
7773  matches the range for statement in foo but not in bar.
7774</pre></td></tr>
7775
7776
7777<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>
7778<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
7779
7780Examples matches the if statement
7781  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
7782  if (false) true; else false;
7783</pre></td></tr>
7784
7785
7786<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>
7787<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
7788matcher.
7789
7790FIXME: Unit test this matcher
7791</pre></td></tr>
7792
7793
7794<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>
7795<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
7796
7797Example matches y.
7798    (matcher = initListExpr(hasInit(0, expr())))
7799  int x{y}.
7800</pre></td></tr>
7801
7802
7803<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>
7804<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
7805(if expression have it).
7806</pre></td></tr>
7807
7808
7809<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>
7810<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
7811matches the given matcher.
7812
7813The associated declaration is:
7814- for type nodes, the declaration of the underlying type
7815- for CallExpr, the declaration of the callee
7816- for MemberExpr, the declaration of the referenced member
7817- for CXXConstructExpr, the declaration of the constructor
7818- for CXXNewExpr, the declaration of the operator new
7819- for ObjCIvarExpr, the declaration of the ivar
7820
7821For type nodes, hasDeclaration will generally match the declaration of the
7822sugared type. Given
7823  class X {};
7824  typedef X Y;
7825  Y y;
7826in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7827typedefDecl. A common use case is to match the underlying, desugared type.
7828This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7829  varDecl(hasType(hasUnqualifiedDesugaredType(
7830      recordType(hasDeclaration(decl())))))
7831In this matcher, the decl will match the CXXRecordDecl of class X.
7832
7833Usable 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;,
7834  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;,
7835  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;,
7836  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;,
7837  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;,
7838  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;,
7839  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7840</pre></td></tr>
7841
7842
7843<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>
7844<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
7845matches the given matcher.
7846
7847The associated declaration is:
7848- for type nodes, the declaration of the underlying type
7849- for CallExpr, the declaration of the callee
7850- for MemberExpr, the declaration of the referenced member
7851- for CXXConstructExpr, the declaration of the constructor
7852- for CXXNewExpr, the declaration of the operator new
7853- for ObjCIvarExpr, the declaration of the ivar
7854
7855For type nodes, hasDeclaration will generally match the declaration of the
7856sugared type. Given
7857  class X {};
7858  typedef X Y;
7859  Y y;
7860in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7861typedefDecl. A common use case is to match the underlying, desugared type.
7862This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7863  varDecl(hasType(hasUnqualifiedDesugaredType(
7864      recordType(hasDeclaration(decl())))))
7865In this matcher, the decl will match the CXXRecordDecl of class X.
7866
7867Usable 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;,
7868  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;,
7869  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;,
7870  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;,
7871  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;,
7872  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;,
7873  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7874</pre></td></tr>
7875
7876
7877<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt; InnerMatcher</td></tr>
7878<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
7879
7880Given
7881  struct foo {
7882    void bar() {
7883      auto f = [this](){};
7884    }
7885  }
7886lambdaExpr(hasAnyCapture(cxxThisExpr()))
7887  matches [this](){};
7888</pre></td></tr>
7889
7890
7891<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
7892<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
7893
7894Given
7895  void foo() {
7896    int x;
7897    auto f = [x](){};
7898  }
7899lambdaExpr(hasAnyCapture(anything()))
7900  matches [x](){};
7901</pre></td></tr>
7902
7903
7904<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>
7905<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
7906matches the given matcher.
7907
7908The associated declaration is:
7909- for type nodes, the declaration of the underlying type
7910- for CallExpr, the declaration of the callee
7911- for MemberExpr, the declaration of the referenced member
7912- for CXXConstructExpr, the declaration of the constructor
7913- for CXXNewExpr, the declaration of the operator new
7914- for ObjCIvarExpr, the declaration of the ivar
7915
7916For type nodes, hasDeclaration will generally match the declaration of the
7917sugared type. Given
7918  class X {};
7919  typedef X Y;
7920  Y y;
7921in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7922typedefDecl. A common use case is to match the underlying, desugared type.
7923This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7924  varDecl(hasType(hasUnqualifiedDesugaredType(
7925      recordType(hasDeclaration(decl())))))
7926In this matcher, the decl will match the CXXRecordDecl of class X.
7927
7928Usable 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;,
7929  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;,
7930  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;,
7931  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;,
7932  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;,
7933  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;,
7934  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7935</pre></td></tr>
7936
7937
7938<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>
7939<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
7940given matcher. Implicit object expressions are included; that is, it matches
7941use of implicit `this`.
7942
7943Given
7944  struct X {
7945    int m;
7946    int f(X x) { x.m; return m; }
7947  };
7948memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7949  matches `x.m`, but not `m`; however,
7950memberExpr(hasObjectExpression(hasType(pointsTo(
7951     cxxRecordDecl(hasName("X"))))))
7952  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7953</pre></td></tr>
7954
7955
7956<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>
7957<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
7958given matcher.
7959
7960Given
7961  struct { int first, second; } first, second;
7962  int i(second.first);
7963  int j(first.second);
7964memberExpr(member(hasName("first")))
7965  matches second.first
7966  but not first.second (because the member name there is "second").
7967</pre></td></tr>
7968
7969
7970<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>
7971<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
7972pointee matches a given matcher.
7973
7974Given
7975  int *a;
7976  int const *b;
7977  float const *f;
7978pointerType(pointee(isConstQualified(), isInteger()))
7979  matches "int const *b"
7980
7981Usable 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;,
7982  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;
7983</pre></td></tr>
7984
7985
7986<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>
7987<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
7988matcher.
7989
7990Given
7991  namespace N { template&lt;class T&gt; void f(T t); }
7992  template &lt;class T&gt; void g() { using N::f; f(T()); }
7993unresolvedLookupExpr(hasAnyDeclaration(
7994    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
7995  matches the use of f in g() .
7996</pre></td></tr>
7997
7998
7999<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>
8000<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8001
8002Given
8003  struct A { struct B { struct C {}; }; };
8004  A::B::C c;
8005nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8006  matches "A::"
8007</pre></td></tr>
8008
8009
8010<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>
8011<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8012NestedNameSpecifier-matcher matches.
8013</pre></td></tr>
8014
8015
8016<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>
8017<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8018given TypeLoc.
8019
8020Given
8021  struct A { struct B { struct C {}; }; };
8022  A::B::C c;
8023nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8024  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8025  matches "A::"
8026</pre></td></tr>
8027
8028
8029<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>
8030<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8031
8032Given
8033  struct A { struct B { struct C {}; }; };
8034  A::B::C c;
8035nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8036  matches "A::"
8037</pre></td></tr>
8038
8039
8040<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>
8041<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8042given namespace matcher.
8043
8044Given
8045  namespace ns { struct A {}; }
8046  ns::A a;
8047nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8048  matches "ns::"
8049</pre></td></tr>
8050
8051
8052<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>
8053<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8054given QualType matcher without qualifiers.
8055
8056Given
8057  struct A { struct B { struct C {}; }; };
8058  A::B::C c;
8059nestedNameSpecifier(specifiesType(
8060  hasDeclaration(cxxRecordDecl(hasName("A")))
8061))
8062  matches "A::"
8063</pre></td></tr>
8064
8065
8066<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>
8067<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8068
8069Given
8070
8071  #pragma omp parallel
8072  #pragma omp parallel default(none)
8073
8074``ompExecutableDirective(hasAnyClause(anything()))`` matches
8075``omp parallel default(none)``.
8076</pre></td></tr>
8077
8078
8079<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>
8080<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8081
8082Prerequisite: the executable directive must not be standalone directive.
8083If it is, it will never match.
8084
8085Given
8086
8087   #pragma omp parallel
8088   ;
8089   #pragma omp parallel
8090   {}
8091
8092``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8093</pre></td></tr>
8094
8095
8096<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>
8097<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8098matching Base, or Objective-C classes that directly or indirectly
8099subclass a class matching Base.
8100
8101Note that a class is not considered to be derived from itself.
8102
8103Example matches Y, Z, C (Base == hasName("X"))
8104  class X;
8105  class Y : public X {};  // directly derived
8106  class Z : public Y {};  // indirectly derived
8107  typedef X A;
8108  typedef A B;
8109  class C : public B {};  // derived from a typedef of X
8110
8111In the following example, Bar matches isDerivedFrom(hasName("X")):
8112  class Foo;
8113  typedef Foo X;
8114  class Bar : public Foo {};  // derived from a type that X is a typedef of
8115
8116In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8117  @interface NSObject @end
8118  @interface Bar : NSObject @end
8119
8120Usable 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;
8121</pre></td></tr>
8122
8123
8124<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>
8125<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8126matching Base.
8127
8128Note that a class is not considered to be derived from itself.
8129
8130Example matches Y, C (Base == hasName("X"))
8131  class X;
8132  class Y : public X {};  // directly derived
8133  class Z : public Y {};  // indirectly derived
8134  typedef X A;
8135  typedef A B;
8136  class C : public B {};  // derived from a typedef of X
8137
8138In the following example, Bar matches isDerivedFrom(hasName("X")):
8139  class Foo;
8140  typedef Foo X;
8141  class Bar : public Foo {};  // derived from a type that X is a typedef of
8142</pre></td></tr>
8143
8144
8145<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>
8146<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8147match Base.
8148</pre></td></tr>
8149
8150
8151<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>
8152<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8153expression, or an ObjC-message-send expression.
8154
8155Given
8156  void x(int, int, int) { int y; x(1, y, 42); }
8157callExpr(hasAnyArgument(declRefExpr()))
8158  matches x(1, y, 42)
8159with hasAnyArgument(...)
8160  matching y
8161
8162For ObjectiveC, given
8163  @interface I - (void) f:(int) y; @end
8164  void foo(I *i) { [i f:12]; }
8165objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8166  matches [i f:12]
8167</pre></td></tr>
8168
8169
8170<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>
8171<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8172call expression.
8173
8174Example matches y in x(y)
8175    (matcher = callExpr(hasArgument(0, declRefExpr())))
8176  void x(int) { int y; x(y); }
8177</pre></td></tr>
8178
8179
8180<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>
8181<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8182and the inner matcher matches on that instance.
8183
8184For example the method call in
8185  NSString *x = @"hello";
8186  [x containsString:@"h"];
8187is matched by
8188objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8189</pre></td></tr>
8190
8191
8192<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>
8193<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8194
8195Example
8196matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8197matches the [webView ...] message invocation.
8198  NSString *webViewJavaScript = ...
8199  UIWebView *webView = ...
8200  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8201</pre></td></tr>
8202
8203
8204<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>
8205<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8206block.
8207
8208Does not match the 'this' parameter of a method.
8209
8210Given
8211  class X { void f(int x, int y, int z) {} };
8212cxxMethodDecl(hasAnyParameter(hasName("y")))
8213  matches f(int x, int y, int z) {}
8214with hasAnyParameter(...)
8215  matching int y
8216
8217For ObjectiveC, given
8218  @interface I - (void) f:(int) y; @end
8219
8220the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8221matches the declaration of method f with hasParameter
8222matching y.
8223
8224For blocks, given
8225  b = ^(int y) { printf("%d", y) };
8226
8227the matcher blockDecl(hasAnyParameter(hasName("y")))
8228matches the declaration of the block b with hasParameter
8229matching y.
8230</pre></td></tr>
8231
8232
8233<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>
8234<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8235declaration or a block.
8236
8237Given
8238  class X { void f(int x) {} };
8239cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8240  matches f(int x) {}
8241with hasParameter(...)
8242  matching int x
8243
8244For ObjectiveC, given
8245  @interface I - (void) f:(int) y; @end
8246
8247the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8248matches the declaration of method f with hasParameter
8249matching y.
8250</pre></td></tr>
8251
8252
8253<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>
8254<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8255or opaque value's source expression matches the given matcher.
8256
8257Example 1: matches "a string"
8258(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8259class URL { URL(string); };
8260URL url = "a string";
8261
8262Example 2: matches 'b' (matcher =
8263opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8264int a = b ?: 1;
8265</pre></td></tr>
8266
8267
8268<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>
8269<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8270overloads matches the given matcher.
8271
8272Given
8273  template &lt;typename T&gt; void foo(T);
8274  template &lt;typename T&gt; void bar(T);
8275  template &lt;typename T&gt; void baz(T t) {
8276    foo(t);
8277    bar(t);
8278  }
8279unresolvedLookupExpr(hasAnyDeclaration(
8280    functionTemplateDecl(hasName("foo"))))
8281  matches foo in foo(t); but not bar in bar(t);
8282</pre></td></tr>
8283
8284
8285<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>
8286<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8287
8288Given
8289  int (*ptr_to_array)[4];
8290  int (*ptr_to_func)(int);
8291
8292varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8293ptr_to_func but not ptr_to_array.
8294
8295Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8296</pre></td></tr>
8297
8298
8299<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>
8300<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8301pointee matches a given matcher.
8302
8303Given
8304  int *a;
8305  int const *b;
8306  float const *f;
8307pointerType(pointee(isConstQualified(), isInteger()))
8308  matches "int const *b"
8309
8310Usable 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;,
8311  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;
8312</pre></td></tr>
8313
8314
8315<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>
8316<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8317
8318Given:
8319  typedef int &amp;int_ref;
8320  int a;
8321  int_ref b = a;
8322
8323varDecl(hasType(qualType(referenceType()))))) will not match the
8324declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8325</pre></td></tr>
8326
8327
8328<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>
8329<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8330matches the given matcher.
8331
8332The associated declaration is:
8333- for type nodes, the declaration of the underlying type
8334- for CallExpr, the declaration of the callee
8335- for MemberExpr, the declaration of the referenced member
8336- for CXXConstructExpr, the declaration of the constructor
8337- for CXXNewExpr, the declaration of the operator new
8338- for ObjCIvarExpr, the declaration of the ivar
8339
8340For type nodes, hasDeclaration will generally match the declaration of the
8341sugared type. Given
8342  class X {};
8343  typedef X Y;
8344  Y y;
8345in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8346typedefDecl. A common use case is to match the underlying, desugared type.
8347This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8348  varDecl(hasType(hasUnqualifiedDesugaredType(
8349      recordType(hasDeclaration(decl())))))
8350In this matcher, the decl will match the CXXRecordDecl of class X.
8351
8352Usable 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;,
8353  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;,
8354  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;,
8355  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;,
8356  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;,
8357  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;,
8358  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8359</pre></td></tr>
8360
8361
8362<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>
8363<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8364
8365Given
8366  void (*fp)(void);
8367The matcher
8368  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8369would match the declaration for fp.
8370</pre></td></tr>
8371
8372
8373<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>
8374<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8375</pre></td></tr>
8376
8377
8378<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>
8379<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8380matches the specified matcher.
8381
8382Example matches y-&gt;x()
8383  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8384     cxxRecordDecl(hasName("Y")))))))
8385  class Y { public: void x(); };
8386  void z() { Y *y; y-&gt;x(); }
8387</pre></td></tr>
8388
8389
8390<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>
8391<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8392</pre></td></tr>
8393
8394
8395<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>
8396<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8397type matches the specified matcher.
8398
8399Example matches X &amp;x and const X &amp;y
8400    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8401  class X {
8402    void a(X b) {
8403      X &amp;x = b;
8404      const X &amp;y = b;
8405    }
8406  };
8407</pre></td></tr>
8408
8409
8410<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>
8411<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8412matches the given matcher.
8413
8414The associated declaration is:
8415- for type nodes, the declaration of the underlying type
8416- for CallExpr, the declaration of the callee
8417- for MemberExpr, the declaration of the referenced member
8418- for CXXConstructExpr, the declaration of the constructor
8419- for CXXNewExpr, the declaration of the operator new
8420- for ObjCIvarExpr, the declaration of the ivar
8421
8422For type nodes, hasDeclaration will generally match the declaration of the
8423sugared type. Given
8424  class X {};
8425  typedef X Y;
8426  Y y;
8427in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8428typedefDecl. A common use case is to match the underlying, desugared type.
8429This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8430  varDecl(hasType(hasUnqualifiedDesugaredType(
8431      recordType(hasDeclaration(decl())))))
8432In this matcher, the decl will match the CXXRecordDecl of class X.
8433
8434Usable 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;,
8435  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;,
8436  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;,
8437  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;,
8438  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;,
8439  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;,
8440  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8441</pre></td></tr>
8442
8443
8444<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>
8445<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
8446pointee matches a given matcher.
8447
8448Given
8449  int *a;
8450  int const *b;
8451  float const *f;
8452pointerType(pointee(isConstQualified(), isInteger()))
8453  matches "int const *b"
8454
8455Usable 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;,
8456  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;
8457</pre></td></tr>
8458
8459
8460<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>
8461<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
8462
8463Given
8464  return a + b;
8465hasReturnValue(binaryOperator())
8466  matches 'return a + b'
8467with binaryOperator()
8468  matching 'a + b'
8469</pre></td></tr>
8470
8471
8472<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>
8473<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
8474a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8475
8476Given
8477  { {}; 1+2; }
8478hasAnySubstatement(compoundStmt())
8479  matches '{ {}; 1+2; }'
8480with compoundStmt()
8481  matching '{}'
8482</pre></td></tr>
8483
8484
8485<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>
8486<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8487alignof.
8488</pre></td></tr>
8489
8490
8491<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>
8492<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
8493
8494Given:
8495F&amp; operator=(const F&amp; o) {
8496  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
8497  return *this;
8498}
8499returnStmt(forFunction(hasName("operator=")))
8500  matches 'return *this'
8501  but does not match 'return v &gt; 0'
8502</pre></td></tr>
8503
8504
8505<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>
8506<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8507sizeof.
8508</pre></td></tr>
8509
8510
8511<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>
8512<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
8513type that matches the provided matcher.
8514
8515Given
8516  template &lt;typename T&gt;
8517  double F(T t);
8518  int i;
8519  double j = F(i);
8520
8521substTemplateTypeParmType(hasReplacementType(type())) matches int
8522</pre></td></tr>
8523
8524
8525<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>
8526<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
8527statement. This matcher may produce multiple matches.
8528
8529Given
8530  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
8531switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
8532  matches four times, with "c" binding each of "case 1:", "case 2:",
8533"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
8534"switch (1)", "switch (2)" and "switch (2)".
8535</pre></td></tr>
8536
8537
8538<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>
8539<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
8540switch statement or conditional operator.
8541
8542Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8543  if (true) {}
8544</pre></td></tr>
8545
8546
8547<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>
8548<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
8549
8550Given:
8551 void foo() {
8552   if (int i = foobar(); i &gt; 0) {}
8553   switch (int i = foobar(); i) {}
8554   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8555 }
8556 void bar() {
8557   if (foobar() &gt; 0) {}
8558   switch (foobar()) {}
8559   for (auto&amp; x : get_range()) {}
8560 }
8561ifStmt(hasInitStatement(anything()))
8562  matches the if statement in foo but not in bar.
8563switchStmt(hasInitStatement(anything()))
8564  matches the switch statement in foo but not in bar.
8565cxxForRangeStmt(hasInitStatement(anything()))
8566  matches the range for statement in foo but not in bar.
8567</pre></td></tr>
8568
8569
8570<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>
8571<tr><td colspan="4" class="doc" id="hasDeclaration4"><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_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>
8605<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
8606
8607Given
8608  struct B { int next; };
8609  template&lt;int(B::*next_ptr)&gt; struct A {};
8610  A&lt;&amp;B::next&gt; a;
8611templateSpecializationType(hasAnyTemplateArgument(
8612  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
8613  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
8614    B::next
8615</pre></td></tr>
8616
8617
8618<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>
8619<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
8620declaration.
8621
8622Given
8623  struct B { int next; };
8624  template&lt;int(B::*next_ptr)&gt; struct A {};
8625  A&lt;&amp;B::next&gt; a;
8626classTemplateSpecializationDecl(hasAnyTemplateArgument(
8627    refersToDeclaration(fieldDecl(hasName("next")))))
8628  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
8629    B::next
8630</pre></td></tr>
8631
8632
8633<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>
8634<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
8635
8636Given
8637  template&lt;int T&gt; struct C {};
8638  C&lt;42&gt; c;
8639classTemplateSpecializationDecl(
8640  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
8641  matches the implicit instantiation of C in C&lt;42&gt;.
8642</pre></td></tr>
8643
8644
8645<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>
8646<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
8647
8648Given
8649  template&lt;template &lt;typename&gt; class S&gt; class X {};
8650  template&lt;typename T&gt; class Y {};
8651  X&lt;Y&gt; xi;
8652classTemplateSpecializationDecl(hasAnyTemplateArgument(
8653    refersToTemplate(templateName())))
8654  matches the specialization X&lt;Y&gt;
8655</pre></td></tr>
8656
8657
8658<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>
8659<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
8660
8661Given
8662  struct X {};
8663  template&lt;typename T&gt; struct A {};
8664  A&lt;X&gt; a;
8665classTemplateSpecializationDecl(hasAnyTemplateArgument(
8666    refersToType(class(hasName("X")))))
8667  matches the specialization A&lt;X&gt;
8668</pre></td></tr>
8669
8670
8671<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>
8672<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8673functionDecl that have at least one TemplateArgument matching the given
8674InnerMatcher.
8675
8676Given
8677  template&lt;typename T&gt; class A {};
8678  template&lt;&gt; class A&lt;double&gt; {};
8679  A&lt;int&gt; a;
8680
8681  template&lt;typename T&gt; f() {};
8682  void func() { f&lt;int&gt;(); };
8683
8684classTemplateSpecializationDecl(hasAnyTemplateArgument(
8685    refersToType(asString("int"))))
8686  matches the specialization A&lt;int&gt;
8687
8688functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8689  matches the specialization f&lt;int&gt;
8690</pre></td></tr>
8691
8692
8693<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>
8694<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
8695matches the given matcher.
8696
8697The associated declaration is:
8698- for type nodes, the declaration of the underlying type
8699- for CallExpr, the declaration of the callee
8700- for MemberExpr, the declaration of the referenced member
8701- for CXXConstructExpr, the declaration of the constructor
8702- for CXXNewExpr, the declaration of the operator new
8703- for ObjCIvarExpr, the declaration of the ivar
8704
8705For type nodes, hasDeclaration will generally match the declaration of the
8706sugared type. Given
8707  class X {};
8708  typedef X Y;
8709  Y y;
8710in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8711typedefDecl. A common use case is to match the underlying, desugared type.
8712This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8713  varDecl(hasType(hasUnqualifiedDesugaredType(
8714      recordType(hasDeclaration(decl())))))
8715In this matcher, the decl will match the CXXRecordDecl of class X.
8716
8717Usable 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;,
8718  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;,
8719  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;,
8720  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;,
8721  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;,
8722  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;,
8723  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8724</pre></td></tr>
8725
8726
8727<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>
8728<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8729functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8730
8731Given
8732  template&lt;typename T, typename U&gt; class A {};
8733  A&lt;bool, int&gt; b;
8734  A&lt;int, bool&gt; c;
8735
8736  template&lt;typename T&gt; void f() {}
8737  void func() { f&lt;int&gt;(); };
8738classTemplateSpecializationDecl(hasTemplateArgument(
8739    1, refersToType(asString("int"))))
8740  matches the specialization A&lt;bool, int&gt;
8741
8742functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8743  matches the specialization f&lt;int&gt;
8744</pre></td></tr>
8745
8746
8747<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>
8748<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
8749matches the given matcher.
8750
8751The associated declaration is:
8752- for type nodes, the declaration of the underlying type
8753- for CallExpr, the declaration of the callee
8754- for MemberExpr, the declaration of the referenced member
8755- for CXXConstructExpr, the declaration of the constructor
8756- for CXXNewExpr, the declaration of the operator new
8757- for ObjCIvarExpr, the declaration of the ivar
8758
8759For type nodes, hasDeclaration will generally match the declaration of the
8760sugared type. Given
8761  class X {};
8762  typedef X Y;
8763  Y y;
8764in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8765typedefDecl. A common use case is to match the underlying, desugared type.
8766This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8767  varDecl(hasType(hasUnqualifiedDesugaredType(
8768      recordType(hasDeclaration(decl())))))
8769In this matcher, the decl will match the CXXRecordDecl of class X.
8770
8771Usable 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;,
8772  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;,
8773  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;,
8774  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;,
8775  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;,
8776  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;,
8777  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8778</pre></td></tr>
8779
8780
8781<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>
8782<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
8783QualType-matcher matches.
8784</pre></td></tr>
8785
8786
8787<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>
8788<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
8789matcher.
8790
8791Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8792            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8793            and U (matcher = typedefDecl(hasType(asString("int")))
8794            and friend class X (matcher = friendDecl(hasType("X"))
8795            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8796                                              asString("class X")))
8797 class X {};
8798 void y(X &amp;x) { x; X z; }
8799 typedef int U;
8800 class Y { friend class X; };
8801 class Z : public virtual X {};
8802</pre></td></tr>
8803
8804
8805<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>
8806<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
8807matches the given matcher.
8808
8809The associated declaration is:
8810- for type nodes, the declaration of the underlying type
8811- for CallExpr, the declaration of the callee
8812- for MemberExpr, the declaration of the referenced member
8813- for CXXConstructExpr, the declaration of the constructor
8814- for CXXNewExpr, the declaration of the operator new
8815- for ObjCIvarExpr, the declaration of the ivar
8816
8817For type nodes, hasDeclaration will generally match the declaration of the
8818sugared type. Given
8819  class X {};
8820  typedef X Y;
8821  Y y;
8822in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8823typedefDecl. A common use case is to match the underlying, desugared type.
8824This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8825  varDecl(hasType(hasUnqualifiedDesugaredType(
8826      recordType(hasDeclaration(decl())))))
8827In this matcher, the decl will match the CXXRecordDecl of class X.
8828
8829Usable 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;,
8830  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;,
8831  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;,
8832  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;,
8833  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;,
8834  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;,
8835  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8836</pre></td></tr>
8837
8838
8839<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>
8840<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
8841type of the matched node.
8842
8843For example, in:
8844  class A {};
8845  using B = A;
8846The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
8847both B and A.
8848</pre></td></tr>
8849
8850
8851<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>
8852<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
8853
8854Given
8855  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
8856unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
8857  matches sizeof(a) and alignof(c)
8858</pre></td></tr>
8859
8860
8861<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>
8862<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
8863
8864Example matches true (matcher = hasUnaryOperand(
8865                                  cxxBoolLiteral(equals(true))))
8866  !true
8867</pre></td></tr>
8868
8869
8870<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>
8871<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
8872given matcher. Implicit object expressions are included; that is, it matches
8873use of implicit `this`.
8874
8875Given
8876  struct X {
8877    int m;
8878    int f(X x) { x.m; return m; }
8879  };
8880memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8881  matches `x.m`, but not `m`; however,
8882memberExpr(hasObjectExpression(hasType(pointsTo(
8883     cxxRecordDecl(hasName("X"))))))
8884  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8885</pre></td></tr>
8886
8887
8888<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>
8889<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
8890matches the given matcher.
8891
8892The associated declaration is:
8893- for type nodes, the declaration of the underlying type
8894- for CallExpr, the declaration of the callee
8895- for MemberExpr, the declaration of the referenced member
8896- for CXXConstructExpr, the declaration of the constructor
8897- for CXXNewExpr, the declaration of the operator new
8898- for ObjCIvarExpr, the declaration of the ivar
8899
8900For type nodes, hasDeclaration will generally match the declaration of the
8901sugared type. Given
8902  class X {};
8903  typedef X Y;
8904  Y y;
8905in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8906typedefDecl. A common use case is to match the underlying, desugared type.
8907This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8908  varDecl(hasType(hasUnqualifiedDesugaredType(
8909      recordType(hasDeclaration(decl())))))
8910In this matcher, the decl will match the CXXRecordDecl of class X.
8911
8912Usable 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;,
8913  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;,
8914  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;,
8915  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;,
8916  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;,
8917  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;,
8918  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8919</pre></td></tr>
8920
8921
8922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
8923<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
8924
8925Given
8926  namespace X { void b(); }
8927  using X::b;
8928usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
8929  matches using X::b </pre></td></tr>
8930
8931
8932<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>
8933<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
8934matched by the given matcher.
8935
8936Given
8937  namespace X { int a; void b(); }
8938  using X::a;
8939  using X::b;
8940usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
8941  matches using X::b but not using X::a </pre></td></tr>
8942
8943
8944<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>
8945<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
8946declaration's type.
8947
8948In case of a value declaration (for example a variable declaration),
8949this resolves one layer of indirection. For example, in the value
8950declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8951X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8952declaration of x.
8953
8954Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8955            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8956            and friend class X (matcher = friendDecl(hasType("X"))
8957            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8958                                              cxxRecordDecl(hasName("X"))))
8959 class X {};
8960 void y(X &amp;x) { x; X z; }
8961 class Y { friend class X; };
8962 class Z : public virtual X {};
8963
8964Example matches class Derived
8965(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8966class Base {};
8967class Derived : Base {};
8968
8969Usable 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;,
8970Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8971</pre></td></tr>
8972
8973
8974<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>
8975<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
8976matcher.
8977
8978Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8979            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8980            and U (matcher = typedefDecl(hasType(asString("int")))
8981            and friend class X (matcher = friendDecl(hasType("X"))
8982            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8983                                              asString("class X")))
8984 class X {};
8985 void y(X &amp;x) { x; X z; }
8986 typedef int U;
8987 class Y { friend class X; };
8988 class Z : public virtual X {};
8989</pre></td></tr>
8990
8991
8992<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>
8993<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
8994that matches the given matcher.
8995
8996Example matches x (matcher = varDecl(hasInitializer(callExpr())))
8997  bool y() { return true; }
8998  bool x = y();
8999</pre></td></tr>
9000
9001
9002<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>
9003<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9004expression.
9005
9006Given
9007  void f(int b) {
9008    int a[b];
9009  }
9010variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9011  varDecl(hasName("b")))))))
9012  matches "int a[b]"
9013</pre></td></tr>
9014
9015
9016<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>
9017<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9018
9019
9020<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>
9021<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9022switch statement or conditional operator.
9023
9024Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9025  if (true) {}
9026</pre></td></tr>
9027
9028<!--END_TRAVERSAL_MATCHERS -->
9029</table>
9030
9031</div>
9032</body>
9033</html>
9034
9035
9036