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