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