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