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, bindingDecl(hasName("f").bind("fBinding"))))
7156matches the decomposition decl with 'f' bound to "fBinding".
7157</pre></td></tr>
7158
7159
7160<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>
7161<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7162
7163
7164<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>
7165<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7166switch statement or conditional operator.
7167
7168Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7169  if (true) {}
7170</pre></td></tr>
7171
7172
7173<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>
7174<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7175matches InnerMatcher if the qualifier exists.
7176
7177Given
7178  namespace N {
7179    namespace M {
7180      class D {};
7181    }
7182  }
7183  N::M::D d;
7184
7185elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7186matches the type of the variable declaration of d.
7187</pre></td></tr>
7188
7189
7190<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>
7191<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7192
7193Given
7194  namespace N {
7195    namespace M {
7196      class D {};
7197    }
7198  }
7199  N::M::D d;
7200
7201elaboratedType(namesType(recordType(
7202hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7203declaration of d.
7204</pre></td></tr>
7205
7206
7207<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>
7208<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7209matches the given matcher.
7210
7211The associated declaration is:
7212- for type nodes, the declaration of the underlying type
7213- for CallExpr, the declaration of the callee
7214- for MemberExpr, the declaration of the referenced member
7215- for CXXConstructExpr, the declaration of the constructor
7216- for CXXNewExpr, the declaration of the operator new
7217- for ObjCIvarExpr, the declaration of the ivar
7218
7219For type nodes, hasDeclaration will generally match the declaration of the
7220sugared type. Given
7221  class X {};
7222  typedef X Y;
7223  Y y;
7224in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7225typedefDecl. A common use case is to match the underlying, desugared type.
7226This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7227  varDecl(hasType(hasUnqualifiedDesugaredType(
7228      recordType(hasDeclaration(decl())))))
7229In this matcher, the decl will match the CXXRecordDecl of class X.
7230
7231Usable 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;,
7232  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;,
7233  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;,
7234  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;,
7235  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;,
7236  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;,
7237  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7238</pre></td></tr>
7239
7240
7241<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>
7242<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7243
7244(Note: Clang's AST refers to other conversions as "casts" too, and calls
7245actual casts "explicit" casts.)
7246</pre></td></tr>
7247
7248
7249<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>
7250<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
7251declaration's type.
7252
7253In case of a value declaration (for example a variable declaration),
7254this resolves one layer of indirection. For example, in the value
7255declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7256X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7257declaration of x.
7258
7259Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7260            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7261            and friend class X (matcher = friendDecl(hasType("X"))
7262 class X {};
7263 void y(X &amp;x) { x; X z; }
7264 class Y { friend class X; };
7265
7266Example matches class Derived
7267(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7268class Base {};
7269class Derived : Base {};
7270
7271Usable 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;,
7272Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7273</pre></td></tr>
7274
7275
7276<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>
7277<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7278matcher.
7279
7280Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7281            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7282            and U (matcher = typedefDecl(hasType(asString("int")))
7283            and friend class X (matcher = friendDecl(hasType("X"))
7284 class X {};
7285 void y(X &amp;x) { x; X z; }
7286 typedef int U;
7287 class Y { friend class X; };
7288</pre></td></tr>
7289
7290
7291<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>
7292<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7293elidable constructor and other corresponding bookkeeping nodes.
7294
7295In C++17, elidable copy constructors are no longer being generated in the
7296AST as it is not permitted by the standard. They are, however, part of the
7297AST in C++14 and earlier. So, a matcher must abstract over these differences
7298to work in all language modes. This matcher skips elidable constructor-call
7299AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7300various implicit nodes inside the constructor calls, all of which will not
7301appear in the C++17 AST.
7302
7303Given
7304
7305struct H {};
7306H G();
7307void f() {
7308  H D = G();
7309}
7310
7311``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7312matches ``H D = G()`` in C++11 through C++17 (and beyond).
7313</pre></td></tr>
7314
7315
7316<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>
7317<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7318are stripped off.
7319
7320Parentheses and explicit casts are not discarded.
7321Given
7322  int arr[5];
7323  int a = 0;
7324  char b = 0;
7325  const int c = a;
7326  int *d = arr;
7327  long e = (long) 0l;
7328The matchers
7329   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7330   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7331would match the declarations for a, b, c, and d, but not e.
7332While
7333   varDecl(hasInitializer(integerLiteral()))
7334   varDecl(hasInitializer(declRefExpr()))
7335only match the declarations for b, c, and d.
7336</pre></td></tr>
7337
7338
7339<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>
7340<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7341nodes are stripped off.
7342
7343Parentheses and explicit casts are not discarded.
7344Given
7345  class C {};
7346  C a = C();
7347  C b;
7348  C c = b;
7349The matchers
7350   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7351would match the declarations for a, b, and c.
7352While
7353   varDecl(hasInitializer(cxxConstructExpr()))
7354only match the declarations for b and c.
7355</pre></td></tr>
7356
7357
7358<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>
7359<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7360casts are stripped off.
7361
7362Implicit and non-C Style casts are also discarded.
7363Given
7364  int a = 0;
7365  char b = (0);
7366  void* c = reinterpret_cast&lt;char*&gt;(0);
7367  char d = char(0);
7368The matcher
7369   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7370would match the declarations for a, b, c, and d.
7371while
7372   varDecl(hasInitializer(integerLiteral()))
7373only match the declaration for a.
7374</pre></td></tr>
7375
7376
7377<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>
7378<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7379parentheses are stripped off.
7380
7381Explicit casts are not discarded.
7382Given
7383  int arr[5];
7384  int a = 0;
7385  char b = (0);
7386  const int c = a;
7387  int *d = (arr);
7388  long e = ((long) 0l);
7389The matchers
7390   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7391   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7392would match the declarations for a, b, c, and d, but not e.
7393while
7394   varDecl(hasInitializer(integerLiteral()))
7395   varDecl(hasInitializer(declRefExpr()))
7396would only match the declaration for a.
7397</pre></td></tr>
7398
7399
7400<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>
7401<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7402
7403Given
7404  const char* str = ("my-string");
7405The matcher
7406  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7407would match the implicit cast resulting from the assignment.
7408</pre></td></tr>
7409
7410
7411<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>
7412<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7413
7414Given
7415  class C {
7416    int a = 2;
7417    int b = 3;
7418    int c;
7419  };
7420fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7421  matches 'int a;' but not 'int b;'.
7422fieldDecl(hasInClassInitializer(anything()))
7423  matches 'int a;' and 'int b;' but not 'int c;'.
7424</pre></td></tr>
7425
7426
7427<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>
7428<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7429
7430
7431<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>
7432<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7433switch statement or conditional operator.
7434
7435Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7436  if (true) {}
7437</pre></td></tr>
7438
7439
7440<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>
7441<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7442
7443Example:
7444    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7445matches '++x' in
7446    for (x; x &lt; N; ++x) { }
7447</pre></td></tr>
7448
7449
7450<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>
7451<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7452
7453Example:
7454    forStmt(hasLoopInit(declStmt()))
7455matches 'int x = 0' in
7456    for (int x = 0; x &lt; N; ++x) { }
7457</pre></td></tr>
7458
7459
7460<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>
7461<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7462declaration's type.
7463
7464In case of a value declaration (for example a variable declaration),
7465this resolves one layer of indirection. For example, in the value
7466declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7467X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7468declaration of x.
7469
7470Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7471            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7472            and friend class X (matcher = friendDecl(hasType("X"))
7473 class X {};
7474 void y(X &amp;x) { x; X z; }
7475 class Y { friend class X; };
7476
7477Example matches class Derived
7478(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7479class Base {};
7480class Derived : Base {};
7481
7482Usable 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;,
7483Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7484</pre></td></tr>
7485
7486
7487<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>
7488<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
7489matcher.
7490
7491Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7492            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7493            and U (matcher = typedefDecl(hasType(asString("int")))
7494            and friend class X (matcher = friendDecl(hasType("X"))
7495 class X {};
7496 void y(X &amp;x) { x; X z; }
7497 typedef int U;
7498 class Y { friend class X; };
7499</pre></td></tr>
7500
7501
7502<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>
7503<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
7504Note that this matcher matches all the declarations of a function whose
7505body is present in the AST.
7506
7507Given
7508  void f();
7509  void f() {}
7510  void g();
7511hasAnyBody(functionDecl())
7512  matches both 'void f();'
7513  and 'void f() {}'
7514with compoundStmt()
7515  matching '{}'
7516  but does not match 'void g();'
7517</pre></td></tr>
7518
7519
7520<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>
7521<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
7522block.
7523
7524Does not match the 'this' parameter of a method.
7525
7526Given
7527  class X { void f(int x, int y, int z) {} };
7528cxxMethodDecl(hasAnyParameter(hasName("y")))
7529  matches f(int x, int y, int z) {}
7530with hasAnyParameter(...)
7531  matching int y
7532
7533For ObjectiveC, given
7534  @interface I - (void) f:(int) y; @end
7535
7536the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7537matches the declaration of method f with hasParameter
7538matching y.
7539
7540For blocks, given
7541  b = ^(int y) { printf("%d", y) };
7542
7543the matcher blockDecl(hasAnyParameter(hasName("y")))
7544matches the declaration of the block b with hasParameter
7545matching y.
7546</pre></td></tr>
7547
7548
7549<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>
7550<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7551functionDecl that have at least one TemplateArgument matching the given
7552InnerMatcher.
7553
7554Given
7555  template&lt;typename T&gt; class A {};
7556  template&lt;&gt; class A&lt;double&gt; {};
7557  A&lt;int&gt; a;
7558
7559  template&lt;typename T&gt; f() {};
7560  void func() { f&lt;int&gt;(); };
7561
7562classTemplateSpecializationDecl(hasAnyTemplateArgument(
7563    refersToType(asString("int"))))
7564  matches the specialization A&lt;int&gt;
7565
7566functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7567  matches the specialization f&lt;int&gt;
7568</pre></td></tr>
7569
7570
7571<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>
7572<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
7573
7574
7575<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>
7576<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
7577declaration.
7578
7579Given
7580  template&lt;bool b&gt;
7581  struct S {
7582    S(int); // #1
7583    explicit S(double); // #2
7584    operator int(); // #3
7585    explicit operator bool(); // #4
7586    explicit(false) S(bool) // # 7
7587    explicit(true) S(char) // # 8
7588    explicit(b) S(S) // # 9
7589  };
7590  S(int) -&gt; S&lt;true&gt; // #5
7591  explicit S(double) -&gt; S&lt;false&gt; // #6
7592cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
7593cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
7594cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
7595</pre></td></tr>
7596
7597
7598<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('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>
7599<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
7600declaration or a block.
7601
7602Given
7603  class X { void f(int x) {} };
7604cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7605  matches f(int x) {}
7606with hasParameter(...)
7607  matching int x
7608
7609For ObjectiveC, given
7610  @interface I - (void) f:(int) y; @end
7611
7612the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7613matches the declaration of method f with hasParameter
7614matching y.
7615</pre></td></tr>
7616
7617
7618<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>
7619<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7620functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7621
7622Given
7623  template&lt;typename T, typename U&gt; class A {};
7624  A&lt;bool, int&gt; b;
7625  A&lt;int, bool&gt; c;
7626
7627  template&lt;typename T&gt; void f() {}
7628  void func() { f&lt;int&gt;(); };
7629classTemplateSpecializationDecl(hasTemplateArgument(
7630    1, refersToType(asString("int"))))
7631  matches the specialization A&lt;bool, int&gt;
7632
7633functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7634  matches the specialization f&lt;int&gt;
7635</pre></td></tr>
7636
7637
7638<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>
7639<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
7640
7641Given:
7642  class X { int f() { return 1; } };
7643cxxMethodDecl(returns(asString("int")))
7644  matches int f() { return 1; }
7645</pre></td></tr>
7646
7647
7648<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>
7649<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
7650switch statement or conditional operator.
7651
7652Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7653  if (true) {}
7654</pre></td></tr>
7655
7656
7657<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>
7658<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
7659
7660Given
7661  if (A* a = GetAPointer()) {}
7662hasConditionVariableStatement(...)
7663  matches 'A* a = GetAPointer()'.
7664</pre></td></tr>
7665
7666
7667<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>
7668<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
7669
7670Examples matches the if statement
7671  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
7672  if (false) false; else true;
7673</pre></td></tr>
7674
7675
7676<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>
7677<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
7678
7679Given:
7680 void foo() {
7681   if (int i = foobar(); i &gt; 0) {}
7682   switch (int i = foobar(); i) {}
7683   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7684 }
7685 void bar() {
7686   if (foobar() &gt; 0) {}
7687   switch (foobar()) {}
7688   for (auto&amp; x : get_range()) {}
7689 }
7690ifStmt(hasInitStatement(anything()))
7691  matches the if statement in foo but not in bar.
7692switchStmt(hasInitStatement(anything()))
7693  matches the switch statement in foo but not in bar.
7694cxxForRangeStmt(hasInitStatement(anything()))
7695  matches the range for statement in foo but not in bar.
7696</pre></td></tr>
7697
7698
7699<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>
7700<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
7701
7702Examples matches the if statement
7703  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
7704  if (false) true; else false;
7705</pre></td></tr>
7706
7707
7708<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>
7709<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
7710matcher.
7711
7712FIXME: Unit test this matcher
7713</pre></td></tr>
7714
7715
7716<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>
7717<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
7718
7719Example matches y.
7720    (matcher = initListExpr(hasInit(0, expr())))
7721  int x{y}.
7722</pre></td></tr>
7723
7724
7725<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>
7726<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
7727(if expression have it).
7728</pre></td></tr>
7729
7730
7731<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>
7732<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
7733matches the given matcher.
7734
7735The associated declaration is:
7736- for type nodes, the declaration of the underlying type
7737- for CallExpr, the declaration of the callee
7738- for MemberExpr, the declaration of the referenced member
7739- for CXXConstructExpr, the declaration of the constructor
7740- for CXXNewExpr, the declaration of the operator new
7741- for ObjCIvarExpr, the declaration of the ivar
7742
7743For type nodes, hasDeclaration will generally match the declaration of the
7744sugared type. Given
7745  class X {};
7746  typedef X Y;
7747  Y y;
7748in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7749typedefDecl. A common use case is to match the underlying, desugared type.
7750This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7751  varDecl(hasType(hasUnqualifiedDesugaredType(
7752      recordType(hasDeclaration(decl())))))
7753In this matcher, the decl will match the CXXRecordDecl of class X.
7754
7755Usable 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;,
7756  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;,
7757  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;,
7758  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;,
7759  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;,
7760  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;,
7761  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7762</pre></td></tr>
7763
7764
7765<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>
7766<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
7767matches the given matcher.
7768
7769The associated declaration is:
7770- for type nodes, the declaration of the underlying type
7771- for CallExpr, the declaration of the callee
7772- for MemberExpr, the declaration of the referenced member
7773- for CXXConstructExpr, the declaration of the constructor
7774- for CXXNewExpr, the declaration of the operator new
7775- for ObjCIvarExpr, the declaration of the ivar
7776
7777For type nodes, hasDeclaration will generally match the declaration of the
7778sugared type. Given
7779  class X {};
7780  typedef X Y;
7781  Y y;
7782in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7783typedefDecl. A common use case is to match the underlying, desugared type.
7784This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7785  varDecl(hasType(hasUnqualifiedDesugaredType(
7786      recordType(hasDeclaration(decl())))))
7787In this matcher, the decl will match the CXXRecordDecl of class X.
7788
7789Usable 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;,
7790  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;,
7791  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;,
7792  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;,
7793  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;,
7794  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;,
7795  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7796</pre></td></tr>
7797
7798
7799<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>
7800<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
7801
7802Given
7803  struct foo {
7804    void bar() {
7805      auto f = [this](){};
7806    }
7807  }
7808lambdaExpr(hasAnyCapture(cxxThisExpr()))
7809  matches [this](){};
7810</pre></td></tr>
7811
7812
7813<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>
7814<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
7815
7816Given
7817  void foo() {
7818    int x;
7819    auto f = [x](){};
7820  }
7821lambdaExpr(hasAnyCapture(anything()))
7822  matches [x](){};
7823</pre></td></tr>
7824
7825
7826<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>
7827<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
7828matches the given matcher.
7829
7830The associated declaration is:
7831- for type nodes, the declaration of the underlying type
7832- for CallExpr, the declaration of the callee
7833- for MemberExpr, the declaration of the referenced member
7834- for CXXConstructExpr, the declaration of the constructor
7835- for CXXNewExpr, the declaration of the operator new
7836- for ObjCIvarExpr, the declaration of the ivar
7837
7838For type nodes, hasDeclaration will generally match the declaration of the
7839sugared type. Given
7840  class X {};
7841  typedef X Y;
7842  Y y;
7843in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7844typedefDecl. A common use case is to match the underlying, desugared type.
7845This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7846  varDecl(hasType(hasUnqualifiedDesugaredType(
7847      recordType(hasDeclaration(decl())))))
7848In this matcher, the decl will match the CXXRecordDecl of class X.
7849
7850Usable 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;,
7851  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;,
7852  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;,
7853  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;,
7854  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;,
7855  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;,
7856  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7857</pre></td></tr>
7858
7859
7860<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>
7861<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
7862given matcher. Implicit object expressions are included; that is, it matches
7863use of implicit `this`.
7864
7865Given
7866  struct X {
7867    int m;
7868    int f(X x) { x.m; return m; }
7869  };
7870memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7871  matches `x.m`, but not `m`; however,
7872memberExpr(hasObjectExpression(hasType(pointsTo(
7873     cxxRecordDecl(hasName("X"))))))
7874  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7875</pre></td></tr>
7876
7877
7878<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>
7879<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
7880given matcher.
7881
7882Given
7883  struct { int first, second; } first, second;
7884  int i(second.first);
7885  int j(first.second);
7886memberExpr(member(hasName("first")))
7887  matches second.first
7888  but not first.second (because the member name there is "second").
7889</pre></td></tr>
7890
7891
7892<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>
7893<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
7894pointee matches a given matcher.
7895
7896Given
7897  int *a;
7898  int const *b;
7899  float const *f;
7900pointerType(pointee(isConstQualified(), isInteger()))
7901  matches "int const *b"
7902
7903Usable 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;,
7904  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;
7905</pre></td></tr>
7906
7907
7908<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>
7909<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
7910matcher.
7911
7912Given
7913  namespace N { template&lt;class T&gt; void f(T t); }
7914  template &lt;class T&gt; void g() { using N::f; f(T()); }
7915unresolvedLookupExpr(hasAnyDeclaration(
7916    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
7917  matches the use of f in g() .
7918</pre></td></tr>
7919
7920
7921<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>
7922<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
7923
7924Given
7925  struct A { struct B { struct C {}; }; };
7926  A::B::C c;
7927nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
7928  matches "A::"
7929</pre></td></tr>
7930
7931
7932<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>
7933<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7934NestedNameSpecifier-matcher matches.
7935</pre></td></tr>
7936
7937
7938<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>
7939<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
7940given TypeLoc.
7941
7942Given
7943  struct A { struct B { struct C {}; }; };
7944  A::B::C c;
7945nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
7946  hasDeclaration(cxxRecordDecl(hasName("A")))))))
7947  matches "A::"
7948</pre></td></tr>
7949
7950
7951<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>
7952<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
7953
7954Given
7955  struct A { struct B { struct C {}; }; };
7956  A::B::C c;
7957nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
7958  matches "A::"
7959</pre></td></tr>
7960
7961
7962<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>
7963<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
7964given namespace matcher.
7965
7966Given
7967  namespace ns { struct A {}; }
7968  ns::A a;
7969nestedNameSpecifier(specifiesNamespace(hasName("ns")))
7970  matches "ns::"
7971</pre></td></tr>
7972
7973
7974<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>
7975<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
7976given QualType matcher without qualifiers.
7977
7978Given
7979  struct A { struct B { struct C {}; }; };
7980  A::B::C c;
7981nestedNameSpecifier(specifiesType(
7982  hasDeclaration(cxxRecordDecl(hasName("A")))
7983))
7984  matches "A::"
7985</pre></td></tr>
7986
7987
7988<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>
7989<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
7990
7991Given
7992
7993  #pragma omp parallel
7994  #pragma omp parallel default(none)
7995
7996``ompExecutableDirective(hasAnyClause(anything()))`` matches
7997``omp parallel default(none)``.
7998</pre></td></tr>
7999
8000
8001<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>
8002<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8003
8004Prerequisite: the executable directive must not be standalone directive.
8005If it is, it will never match.
8006
8007Given
8008
8009   #pragma omp parallel
8010   ;
8011   #pragma omp parallel
8012   {}
8013
8014``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8015</pre></td></tr>
8016
8017
8018<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>
8019<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8020matching Base, or Objective-C classes that directly or indirectly
8021subclass a class matching Base.
8022
8023Note that a class is not considered to be derived from itself.
8024
8025Example matches Y, Z, C (Base == hasName("X"))
8026  class X;
8027  class Y : public X {};  // directly derived
8028  class Z : public Y {};  // indirectly derived
8029  typedef X A;
8030  typedef A B;
8031  class C : public B {};  // derived from a typedef of X
8032
8033In the following example, Bar matches isDerivedFrom(hasName("X")):
8034  class Foo;
8035  typedef Foo X;
8036  class Bar : public Foo {};  // derived from a type that X is a typedef of
8037
8038In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8039  @interface NSObject @end
8040  @interface Bar : NSObject @end
8041
8042Usable 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;
8043</pre></td></tr>
8044
8045
8046<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>
8047<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8048matching Base.
8049
8050Note that a class is not considered to be derived from itself.
8051
8052Example matches Y, C (Base == hasName("X"))
8053  class X;
8054  class Y : public X {};  // directly derived
8055  class Z : public Y {};  // indirectly derived
8056  typedef X A;
8057  typedef A B;
8058  class C : public B {};  // derived from a typedef of X
8059
8060In the following example, Bar matches isDerivedFrom(hasName("X")):
8061  class Foo;
8062  typedef Foo X;
8063  class Bar : public Foo {};  // derived from a type that X is a typedef of
8064</pre></td></tr>
8065
8066
8067<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>
8068<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8069match Base.
8070</pre></td></tr>
8071
8072
8073<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>
8074<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8075expression, or an ObjC-message-send expression.
8076
8077Given
8078  void x(int, int, int) { int y; x(1, y, 42); }
8079callExpr(hasAnyArgument(declRefExpr()))
8080  matches x(1, y, 42)
8081with hasAnyArgument(...)
8082  matching y
8083
8084For ObjectiveC, given
8085  @interface I - (void) f:(int) y; @end
8086  void foo(I *i) { [i f:12]; }
8087objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8088  matches [i f:12]
8089</pre></td></tr>
8090
8091
8092<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>
8093<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8094call expression.
8095
8096Example matches y in x(y)
8097    (matcher = callExpr(hasArgument(0, declRefExpr())))
8098  void x(int) { int y; x(y); }
8099</pre></td></tr>
8100
8101
8102<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>
8103<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8104and the inner matcher matches on that instance.
8105
8106For example the method call in
8107  NSString *x = @"hello";
8108  [x containsString:@"h"];
8109is matched by
8110objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8111</pre></td></tr>
8112
8113
8114<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>
8115<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8116
8117Example
8118matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8119matches the [webView ...] message invocation.
8120  NSString *webViewJavaScript = ...
8121  UIWebView *webView = ...
8122  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8123</pre></td></tr>
8124
8125
8126<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>
8127<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8128block.
8129
8130Does not match the 'this' parameter of a method.
8131
8132Given
8133  class X { void f(int x, int y, int z) {} };
8134cxxMethodDecl(hasAnyParameter(hasName("y")))
8135  matches f(int x, int y, int z) {}
8136with hasAnyParameter(...)
8137  matching int y
8138
8139For ObjectiveC, given
8140  @interface I - (void) f:(int) y; @end
8141
8142the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8143matches the declaration of method f with hasParameter
8144matching y.
8145
8146For blocks, given
8147  b = ^(int y) { printf("%d", y) };
8148
8149the matcher blockDecl(hasAnyParameter(hasName("y")))
8150matches the declaration of the block b with hasParameter
8151matching y.
8152</pre></td></tr>
8153
8154
8155<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>
8156<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8157declaration or a block.
8158
8159Given
8160  class X { void f(int x) {} };
8161cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8162  matches f(int x) {}
8163with hasParameter(...)
8164  matching int x
8165
8166For ObjectiveC, given
8167  @interface I - (void) f:(int) y; @end
8168
8169the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8170matches the declaration of method f with hasParameter
8171matching y.
8172</pre></td></tr>
8173
8174
8175<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>
8176<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8177or opaque value's source expression matches the given matcher.
8178
8179Example 1: matches "a string"
8180(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8181class URL { URL(string); };
8182URL url = "a string";
8183
8184Example 2: matches 'b' (matcher =
8185opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8186int a = b ?: 1;
8187</pre></td></tr>
8188
8189
8190<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>
8191<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8192overloads matches the given matcher.
8193
8194Given
8195  template &lt;typename T&gt; void foo(T);
8196  template &lt;typename T&gt; void bar(T);
8197  template &lt;typename T&gt; void baz(T t) {
8198    foo(t);
8199    bar(t);
8200  }
8201unresolvedLookupExpr(hasAnyDeclaration(
8202    functionTemplateDecl(hasName("foo"))))
8203  matches foo in foo(t); but not bar in bar(t);
8204</pre></td></tr>
8205
8206
8207<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>
8208<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8209
8210Given
8211  int (*ptr_to_array)[4];
8212  int (*ptr_to_func)(int);
8213
8214varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8215ptr_to_func but not ptr_to_array.
8216
8217Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8218</pre></td></tr>
8219
8220
8221<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>
8222<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8223pointee matches a given matcher.
8224
8225Given
8226  int *a;
8227  int const *b;
8228  float const *f;
8229pointerType(pointee(isConstQualified(), isInteger()))
8230  matches "int const *b"
8231
8232Usable 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;,
8233  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;
8234</pre></td></tr>
8235
8236
8237<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>
8238<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8239
8240Given:
8241  typedef int &amp;int_ref;
8242  int a;
8243  int_ref b = a;
8244
8245varDecl(hasType(qualType(referenceType()))))) will not match the
8246declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8247</pre></td></tr>
8248
8249
8250<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>
8251<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8252matches the given matcher.
8253
8254The associated declaration is:
8255- for type nodes, the declaration of the underlying type
8256- for CallExpr, the declaration of the callee
8257- for MemberExpr, the declaration of the referenced member
8258- for CXXConstructExpr, the declaration of the constructor
8259- for CXXNewExpr, the declaration of the operator new
8260- for ObjCIvarExpr, the declaration of the ivar
8261
8262For type nodes, hasDeclaration will generally match the declaration of the
8263sugared type. Given
8264  class X {};
8265  typedef X Y;
8266  Y y;
8267in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8268typedefDecl. A common use case is to match the underlying, desugared type.
8269This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8270  varDecl(hasType(hasUnqualifiedDesugaredType(
8271      recordType(hasDeclaration(decl())))))
8272In this matcher, the decl will match the CXXRecordDecl of class X.
8273
8274Usable 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;,
8275  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;,
8276  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;,
8277  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;,
8278  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;,
8279  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;,
8280  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8281</pre></td></tr>
8282
8283
8284<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>
8285<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8286
8287Given
8288  void (*fp)(void);
8289The matcher
8290  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8291would match the declaration for fp.
8292</pre></td></tr>
8293
8294
8295<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>
8296<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8297</pre></td></tr>
8298
8299
8300<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>
8301<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8302matches the specified matcher.
8303
8304Example matches y-&gt;x()
8305  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8306     cxxRecordDecl(hasName("Y")))))))
8307  class Y { public: void x(); };
8308  void z() { Y *y; y-&gt;x(); }
8309</pre></td></tr>
8310
8311
8312<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>
8313<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8314</pre></td></tr>
8315
8316
8317<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>
8318<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8319type matches the specified matcher.
8320
8321Example matches X &amp;x and const X &amp;y
8322    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8323  class X {
8324    void a(X b) {
8325      X &amp;x = b;
8326      const X &amp;y = b;
8327    }
8328  };
8329</pre></td></tr>
8330
8331
8332<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>
8333<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8334matches the given matcher.
8335
8336The associated declaration is:
8337- for type nodes, the declaration of the underlying type
8338- for CallExpr, the declaration of the callee
8339- for MemberExpr, the declaration of the referenced member
8340- for CXXConstructExpr, the declaration of the constructor
8341- for CXXNewExpr, the declaration of the operator new
8342- for ObjCIvarExpr, the declaration of the ivar
8343
8344For type nodes, hasDeclaration will generally match the declaration of the
8345sugared type. Given
8346  class X {};
8347  typedef X Y;
8348  Y y;
8349in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8350typedefDecl. A common use case is to match the underlying, desugared type.
8351This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8352  varDecl(hasType(hasUnqualifiedDesugaredType(
8353      recordType(hasDeclaration(decl())))))
8354In this matcher, the decl will match the CXXRecordDecl of class X.
8355
8356Usable 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;,
8357  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;,
8358  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;,
8359  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;,
8360  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;,
8361  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;,
8362  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8363</pre></td></tr>
8364
8365
8366<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>
8367<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
8368pointee matches a given matcher.
8369
8370Given
8371  int *a;
8372  int const *b;
8373  float const *f;
8374pointerType(pointee(isConstQualified(), isInteger()))
8375  matches "int const *b"
8376
8377Usable 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;,
8378  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;
8379</pre></td></tr>
8380
8381
8382<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>
8383<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
8384
8385Given
8386  return a + b;
8387hasReturnValue(binaryOperator())
8388  matches 'return a + b'
8389with binaryOperator()
8390  matching 'a + b'
8391</pre></td></tr>
8392
8393
8394<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>
8395<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
8396a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8397
8398Given
8399  { {}; 1+2; }
8400hasAnySubstatement(compoundStmt())
8401  matches '{ {}; 1+2; }'
8402with compoundStmt()
8403  matching '{}'
8404</pre></td></tr>
8405
8406
8407<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>
8408<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8409alignof.
8410</pre></td></tr>
8411
8412
8413<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>
8414<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
8415
8416Given:
8417F&amp; operator=(const F&amp; o) {
8418  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
8419  return *this;
8420}
8421returnStmt(forFunction(hasName("operator=")))
8422  matches 'return *this'
8423  but does not match 'return v &gt; 0'
8424</pre></td></tr>
8425
8426
8427<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>
8428<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8429sizeof.
8430</pre></td></tr>
8431
8432
8433<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>
8434<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
8435type that matches the provided matcher.
8436
8437Given
8438  template &lt;typename T&gt;
8439  double F(T t);
8440  int i;
8441  double j = F(i);
8442
8443substTemplateTypeParmType(hasReplacementType(type())) matches int
8444</pre></td></tr>
8445
8446
8447<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>
8448<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
8449statement. This matcher may produce multiple matches.
8450
8451Given
8452  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
8453switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
8454  matches four times, with "c" binding each of "case 1:", "case 2:",
8455"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
8456"switch (1)", "switch (2)" and "switch (2)".
8457</pre></td></tr>
8458
8459
8460<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>
8461<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
8462switch statement or conditional operator.
8463
8464Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8465  if (true) {}
8466</pre></td></tr>
8467
8468
8469<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>
8470<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
8471
8472Given:
8473 void foo() {
8474   if (int i = foobar(); i &gt; 0) {}
8475   switch (int i = foobar(); i) {}
8476   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8477 }
8478 void bar() {
8479   if (foobar() &gt; 0) {}
8480   switch (foobar()) {}
8481   for (auto&amp; x : get_range()) {}
8482 }
8483ifStmt(hasInitStatement(anything()))
8484  matches the if statement in foo but not in bar.
8485switchStmt(hasInitStatement(anything()))
8486  matches the switch statement in foo but not in bar.
8487cxxForRangeStmt(hasInitStatement(anything()))
8488  matches the range for statement in foo but not in bar.
8489</pre></td></tr>
8490
8491
8492<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>
8493<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
8494matches the given matcher.
8495
8496The associated declaration is:
8497- for type nodes, the declaration of the underlying type
8498- for CallExpr, the declaration of the callee
8499- for MemberExpr, the declaration of the referenced member
8500- for CXXConstructExpr, the declaration of the constructor
8501- for CXXNewExpr, the declaration of the operator new
8502- for ObjCIvarExpr, the declaration of the ivar
8503
8504For type nodes, hasDeclaration will generally match the declaration of the
8505sugared type. Given
8506  class X {};
8507  typedef X Y;
8508  Y y;
8509in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8510typedefDecl. A common use case is to match the underlying, desugared type.
8511This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8512  varDecl(hasType(hasUnqualifiedDesugaredType(
8513      recordType(hasDeclaration(decl())))))
8514In this matcher, the decl will match the CXXRecordDecl of class X.
8515
8516Usable 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;,
8517  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;,
8518  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;,
8519  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;,
8520  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;,
8521  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;,
8522  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8523</pre></td></tr>
8524
8525
8526<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>
8527<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
8528
8529Given
8530  struct B { int next; };
8531  template&lt;int(B::*next_ptr)&gt; struct A {};
8532  A&lt;&amp;B::next&gt; a;
8533templateSpecializationType(hasAnyTemplateArgument(
8534  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
8535  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
8536    B::next
8537</pre></td></tr>
8538
8539
8540<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>
8541<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
8542declaration.
8543
8544Given
8545  struct B { int next; };
8546  template&lt;int(B::*next_ptr)&gt; struct A {};
8547  A&lt;&amp;B::next&gt; a;
8548classTemplateSpecializationDecl(hasAnyTemplateArgument(
8549    refersToDeclaration(fieldDecl(hasName("next")))))
8550  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
8551    B::next
8552</pre></td></tr>
8553
8554
8555<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>
8556<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
8557
8558Given
8559  template&lt;int T&gt; struct C {};
8560  C&lt;42&gt; c;
8561classTemplateSpecializationDecl(
8562  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
8563  matches the implicit instantiation of C in C&lt;42&gt;.
8564</pre></td></tr>
8565
8566
8567<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>
8568<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
8569
8570Given
8571  template&lt;template &lt;typename&gt; class S&gt; class X {};
8572  template&lt;typename T&gt; class Y {};
8573  X&lt;Y&gt; xi;
8574classTemplateSpecializationDecl(hasAnyTemplateArgument(
8575    refersToTemplate(templateName())))
8576  matches the specialization X&lt;Y&gt;
8577</pre></td></tr>
8578
8579
8580<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>
8581<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
8582
8583Given
8584  struct X {};
8585  template&lt;typename T&gt; struct A {};
8586  A&lt;X&gt; a;
8587classTemplateSpecializationDecl(hasAnyTemplateArgument(
8588    refersToType(class(hasName("X")))))
8589  matches the specialization A&lt;X&gt;
8590</pre></td></tr>
8591
8592
8593<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>
8594<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8595functionDecl that have at least one TemplateArgument matching the given
8596InnerMatcher.
8597
8598Given
8599  template&lt;typename T&gt; class A {};
8600  template&lt;&gt; class A&lt;double&gt; {};
8601  A&lt;int&gt; a;
8602
8603  template&lt;typename T&gt; f() {};
8604  void func() { f&lt;int&gt;(); };
8605
8606classTemplateSpecializationDecl(hasAnyTemplateArgument(
8607    refersToType(asString("int"))))
8608  matches the specialization A&lt;int&gt;
8609
8610functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8611  matches the specialization f&lt;int&gt;
8612</pre></td></tr>
8613
8614
8615<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>
8616<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
8617matches the given matcher.
8618
8619The associated declaration is:
8620- for type nodes, the declaration of the underlying type
8621- for CallExpr, the declaration of the callee
8622- for MemberExpr, the declaration of the referenced member
8623- for CXXConstructExpr, the declaration of the constructor
8624- for CXXNewExpr, the declaration of the operator new
8625- for ObjCIvarExpr, the declaration of the ivar
8626
8627For type nodes, hasDeclaration will generally match the declaration of the
8628sugared type. Given
8629  class X {};
8630  typedef X Y;
8631  Y y;
8632in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8633typedefDecl. A common use case is to match the underlying, desugared type.
8634This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8635  varDecl(hasType(hasUnqualifiedDesugaredType(
8636      recordType(hasDeclaration(decl())))))
8637In this matcher, the decl will match the CXXRecordDecl of class X.
8638
8639Usable 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;,
8640  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;,
8641  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;,
8642  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;,
8643  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;,
8644  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;,
8645  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8646</pre></td></tr>
8647
8648
8649<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>
8650<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8651functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8652
8653Given
8654  template&lt;typename T, typename U&gt; class A {};
8655  A&lt;bool, int&gt; b;
8656  A&lt;int, bool&gt; c;
8657
8658  template&lt;typename T&gt; void f() {}
8659  void func() { f&lt;int&gt;(); };
8660classTemplateSpecializationDecl(hasTemplateArgument(
8661    1, refersToType(asString("int"))))
8662  matches the specialization A&lt;bool, int&gt;
8663
8664functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8665  matches the specialization f&lt;int&gt;
8666</pre></td></tr>
8667
8668
8669<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>
8670<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
8671matches the given matcher.
8672
8673The associated declaration is:
8674- for type nodes, the declaration of the underlying type
8675- for CallExpr, the declaration of the callee
8676- for MemberExpr, the declaration of the referenced member
8677- for CXXConstructExpr, the declaration of the constructor
8678- for CXXNewExpr, the declaration of the operator new
8679- for ObjCIvarExpr, the declaration of the ivar
8680
8681For type nodes, hasDeclaration will generally match the declaration of the
8682sugared type. Given
8683  class X {};
8684  typedef X Y;
8685  Y y;
8686in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8687typedefDecl. A common use case is to match the underlying, desugared type.
8688This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8689  varDecl(hasType(hasUnqualifiedDesugaredType(
8690      recordType(hasDeclaration(decl())))))
8691In this matcher, the decl will match the CXXRecordDecl of class X.
8692
8693Usable 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;,
8694  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;,
8695  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;,
8696  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;,
8697  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;,
8698  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;,
8699  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8700</pre></td></tr>
8701
8702
8703<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>
8704<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
8705QualType-matcher matches.
8706</pre></td></tr>
8707
8708
8709<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>
8710<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
8711matcher.
8712
8713Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8714            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8715            and U (matcher = typedefDecl(hasType(asString("int")))
8716            and friend class X (matcher = friendDecl(hasType("X"))
8717 class X {};
8718 void y(X &amp;x) { x; X z; }
8719 typedef int U;
8720 class Y { friend class X; };
8721</pre></td></tr>
8722
8723
8724<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>
8725<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
8726matches the given matcher.
8727
8728The associated declaration is:
8729- for type nodes, the declaration of the underlying type
8730- for CallExpr, the declaration of the callee
8731- for MemberExpr, the declaration of the referenced member
8732- for CXXConstructExpr, the declaration of the constructor
8733- for CXXNewExpr, the declaration of the operator new
8734- for ObjCIvarExpr, the declaration of the ivar
8735
8736For type nodes, hasDeclaration will generally match the declaration of the
8737sugared type. Given
8738  class X {};
8739  typedef X Y;
8740  Y y;
8741in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8742typedefDecl. A common use case is to match the underlying, desugared type.
8743This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8744  varDecl(hasType(hasUnqualifiedDesugaredType(
8745      recordType(hasDeclaration(decl())))))
8746In this matcher, the decl will match the CXXRecordDecl of class X.
8747
8748Usable 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;,
8749  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;,
8750  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;,
8751  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;,
8752  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;,
8753  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;,
8754  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8755</pre></td></tr>
8756
8757
8758<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>
8759<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
8760type of the matched node.
8761
8762For example, in:
8763  class A {};
8764  using B = A;
8765The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
8766both B and A.
8767</pre></td></tr>
8768
8769
8770<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>
8771<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
8772
8773Given
8774  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
8775unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
8776  matches sizeof(a) and alignof(c)
8777</pre></td></tr>
8778
8779
8780<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>
8781<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
8782
8783Example matches true (matcher = hasUnaryOperand(
8784                                  cxxBoolLiteral(equals(true))))
8785  !true
8786</pre></td></tr>
8787
8788
8789<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>
8790<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
8791given matcher. Implicit object expressions are included; that is, it matches
8792use of implicit `this`.
8793
8794Given
8795  struct X {
8796    int m;
8797    int f(X x) { x.m; return m; }
8798  };
8799memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8800  matches `x.m`, but not `m`; however,
8801memberExpr(hasObjectExpression(hasType(pointsTo(
8802     cxxRecordDecl(hasName("X"))))))
8803  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8804</pre></td></tr>
8805
8806
8807<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>
8808<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
8809matches the given matcher.
8810
8811The associated declaration is:
8812- for type nodes, the declaration of the underlying type
8813- for CallExpr, the declaration of the callee
8814- for MemberExpr, the declaration of the referenced member
8815- for CXXConstructExpr, the declaration of the constructor
8816- for CXXNewExpr, the declaration of the operator new
8817- for ObjCIvarExpr, the declaration of the ivar
8818
8819For type nodes, hasDeclaration will generally match the declaration of the
8820sugared type. Given
8821  class X {};
8822  typedef X Y;
8823  Y y;
8824in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8825typedefDecl. A common use case is to match the underlying, desugared type.
8826This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8827  varDecl(hasType(hasUnqualifiedDesugaredType(
8828      recordType(hasDeclaration(decl())))))
8829In this matcher, the decl will match the CXXRecordDecl of class X.
8830
8831Usable 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;,
8832  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;,
8833  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;,
8834  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;,
8835  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;,
8836  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;,
8837  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8838</pre></td></tr>
8839
8840
8841<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>
8842<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
8843
8844Given
8845  namespace X { void b(); }
8846  using X::b;
8847usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
8848  matches using X::b </pre></td></tr>
8849
8850
8851<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>
8852<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
8853matched by the given matcher.
8854
8855Given
8856  namespace X { int a; void b(); }
8857  using X::a;
8858  using X::b;
8859usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
8860  matches using X::b but not using X::a </pre></td></tr>
8861
8862
8863<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>
8864<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
8865declaration's type.
8866
8867In case of a value declaration (for example a variable declaration),
8868this resolves one layer of indirection. For example, in the value
8869declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8870X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8871declaration of x.
8872
8873Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8874            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8875            and friend class X (matcher = friendDecl(hasType("X"))
8876 class X {};
8877 void y(X &amp;x) { x; X z; }
8878 class Y { friend class X; };
8879
8880Example matches class Derived
8881(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8882class Base {};
8883class Derived : Base {};
8884
8885Usable 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;,
8886Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8887</pre></td></tr>
8888
8889
8890<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>
8891<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
8892matcher.
8893
8894Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8895            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8896            and U (matcher = typedefDecl(hasType(asString("int")))
8897            and friend class X (matcher = friendDecl(hasType("X"))
8898 class X {};
8899 void y(X &amp;x) { x; X z; }
8900 typedef int U;
8901 class Y { friend class X; };
8902</pre></td></tr>
8903
8904
8905<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>
8906<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
8907that matches the given matcher.
8908
8909Example matches x (matcher = varDecl(hasInitializer(callExpr())))
8910  bool y() { return true; }
8911  bool x = y();
8912</pre></td></tr>
8913
8914
8915<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>
8916<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
8917expression.
8918
8919Given
8920  void f(int b) {
8921    int a[b];
8922  }
8923variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
8924  varDecl(hasName("b")))))))
8925  matches "int a[b]"
8926</pre></td></tr>
8927
8928
8929<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>
8930<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
8931
8932
8933<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>
8934<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
8935switch statement or conditional operator.
8936
8937Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8938  if (true) {}
8939</pre></td></tr>
8940
8941<!--END_TRAVERSAL_MATCHERS -->
8942</table>
8943
8944</div>
8945</body>
8946</html>
8947
8948
8949