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('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
5617<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5618
5619Unlike anyOf, eachOf will generate a match result for each
5620matching submatcher.
5621
5622For example, in:
5623  class A { int a; int b; };
5624The matcher:
5625  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5626                       has(fieldDecl(hasName("b")).bind("v"))))
5627will generate two results binding "v", the first of which binds
5628the field declaration of a, the second the field declaration of
5629b.
5630
5631Usable as: Any Matcher
5632</pre></td></tr>
5633
5634
5635<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>
5636<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5637
5638Generates results for each match.
5639
5640For example, in:
5641  class A { class B {}; class C {}; };
5642The matcher:
5643  cxxRecordDecl(hasName("::A"),
5644                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5645will generate results for A, B and C.
5646
5647Usable as: Any Matcher
5648</pre></td></tr>
5649
5650
5651<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5652<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5653provided matcher.
5654
5655Example matches X, A, A::X, B, B::C, B::C::X
5656  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5657  class X {};
5658  class A { class X {}; };  // Matches A, because A::X is a class of name
5659                            // X inside A.
5660  class B { class C { class X {}; }; };
5661
5662DescendantT must be an AST base type.
5663
5664As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5665each result that matches instead of only on the first one.
5666
5667Note: Recursively combined ForEachDescendant can cause many matches:
5668  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5669    forEachDescendant(cxxRecordDecl())
5670  )))
5671will match 10 times (plus injected class name matches) on:
5672  class A { class B { class C { class D { class E {}; }; }; }; };
5673
5674Usable as: Any Matcher
5675</pre></td></tr>
5676
5677
5678<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5679<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5680provided matcher.
5681
5682Example matches X, Y, Y::X, Z::Y, Z::Y::X
5683  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5684  class X {};
5685  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5686                            // inside Y.
5687  class Z { class Y { class X {}; }; };  // Does not match Z.
5688
5689ChildT must be an AST base type.
5690
5691As opposed to 'has', 'forEach' will cause a match for each result that
5692matches instead of only on the first one.
5693
5694Usable as: Any Matcher
5695</pre></td></tr>
5696
5697
5698<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5699<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5700matcher.
5701
5702Given
5703void f() { if (true) { int x = 42; } }
5704void g() { for (;;) { int x = 43; } }
5705expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5706
5707Usable as: Any Matcher
5708</pre></td></tr>
5709
5710
5711<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5712<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5713provided matcher.
5714
5715Example matches X, Y, Z
5716    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5717  class X {};  // Matches X, because X::X is a class of name X inside X.
5718  class Y { class X {}; };
5719  class Z { class Y { class X {}; }; };
5720
5721DescendantT must be an AST base type.
5722
5723Usable as: Any Matcher
5724</pre></td></tr>
5725
5726
5727<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5728<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5729provided matcher.
5730
5731Example matches X, Y
5732  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5733  class X {};  // Matches X, because X::X is a class of name X inside X.
5734  class Y { class X {}; };
5735  class Z { class Y { class X {}; }; };  // Does not match Z.
5736
5737ChildT must be an AST base type.
5738
5739Usable as: Any Matcher
5740Note that has is direct matcher, so it also matches things like implicit
5741casts and paren casts. If you are matching with expr then you should
5742probably consider using ignoringParenImpCasts like:
5743has(ignoringParenImpCasts(expr())).
5744</pre></td></tr>
5745
5746
5747<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5748<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5749matcher.
5750
5751Given
5752void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5753compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5754
5755Usable as: Any Matcher
5756</pre></td></tr>
5757
5758
5759<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
5760<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5761
5762However, optionally will retain any bindings generated by the submatcher.
5763Useful when additional information which may or may not present about a main
5764matching node is desired.
5765
5766For example, in:
5767  class Foo {
5768    int bar;
5769  }
5770The matcher:
5771  cxxRecordDecl(
5772    optionally(has(
5773      fieldDecl(hasName("bar")).bind("var")
5774  ))).bind("record")
5775will produce a result binding for both "record" and "var".
5776The matcher will produce a "record" binding for even if there is no data
5777member named "bar" in that class.
5778
5779Usable as: Any Matcher
5780</pre></td></tr>
5781
5782
5783<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>
5784<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5785
5786Given
5787  void foo()
5788  {
5789      int i = 3.0;
5790  }
5791The matcher
5792  traverse(TK_IgnoreUnlessSpelledInSource,
5793    varDecl(hasInitializer(floatLiteral().bind("init")))
5794  )
5795matches the variable declaration with "init" bound to the "3.0".
5796</pre></td></tr>
5797
5798
5799<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>
5800<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5801switch statement or conditional operator.
5802
5803Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5804  if (true) {}
5805</pre></td></tr>
5806
5807
5808<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>
5809<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5810(binary or ternary).
5811
5812Example matches b
5813  condition ? a : b
5814  condition ?: b
5815</pre></td></tr>
5816
5817
5818<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>
5819<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5820
5821Example 1 (conditional ternary operator): matches a
5822  condition ? a : b
5823
5824Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5825  condition ?: b
5826</pre></td></tr>
5827
5828
5829<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>
5830<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5831matches the given matcher.
5832
5833The associated declaration is:
5834- for type nodes, the declaration of the underlying type
5835- for CallExpr, the declaration of the callee
5836- for MemberExpr, the declaration of the referenced member
5837- for CXXConstructExpr, the declaration of the constructor
5838- for CXXNewExpr, the declaration of the operator new
5839- for ObjCIvarExpr, the declaration of the ivar
5840
5841For type nodes, hasDeclaration will generally match the declaration of the
5842sugared type. Given
5843  class X {};
5844  typedef X Y;
5845  Y y;
5846in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5847typedefDecl. A common use case is to match the underlying, desugared type.
5848This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5849  varDecl(hasType(hasUnqualifiedDesugaredType(
5850      recordType(hasDeclaration(decl())))))
5851In this matcher, the decl will match the CXXRecordDecl of class X.
5852
5853Usable 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;,
5854  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;,
5855  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;,
5856  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;,
5857  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;,
5858  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;,
5859  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5860</pre></td></tr>
5861
5862
5863<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>
5864<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5865
5866Given
5867  int i[5];
5868  void f() { i[1] = 42; }
5869arraySubscriptExpression(hasBase(implicitCastExpr(
5870    hasSourceExpression(declRefExpr()))))
5871  matches i[1] with the declRefExpr() matching i
5872</pre></td></tr>
5873
5874
5875<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>
5876<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5877
5878Given
5879  int i[5];
5880  void f() { i[1] = 42; }
5881arraySubscriptExpression(hasIndex(integerLiteral()))
5882  matches i[1] with the integerLiteral() matching 1
5883</pre></td></tr>
5884
5885
5886<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>
5887<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
5888
5889Example matches a (matcher = binaryOperator(hasLHS()))
5890  a || b
5891</pre></td></tr>
5892
5893
5894<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>
5895<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
5896
5897Example matches b (matcher = binaryOperator(hasRHS()))
5898  a || b
5899</pre></td></tr>
5900
5901
5902<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>
5903<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5904type.
5905
5906Given
5907  struct A {};
5908  A a[7];
5909  int b[7];
5910arrayType(hasElementType(builtinType()))
5911  matches "int b[7]"
5912
5913Usable 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;
5914</pre></td></tr>
5915
5916
5917<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>
5918<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
5919
5920Given
5921  _Atomic(int) i;
5922  _Atomic(float) f;
5923atomicType(hasValueType(isInteger()))
5924 matches "_Atomic(int) i"
5925
5926Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
5927</pre></td></tr>
5928
5929
5930<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>
5931<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
5932
5933Note: There is no TypeLoc for the deduced type and thus no
5934getDeducedLoc() matcher.
5935
5936Given
5937  auto a = 1;
5938  auto b = 2.0;
5939autoType(hasDeducedType(isInteger()))
5940  matches "auto a"
5941
5942Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
5943</pre></td></tr>
5944
5945
5946<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>
5947<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
5948binary operator matches.
5949</pre></td></tr>
5950
5951
5952<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>
5953<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
5954
5955Example matches a (matcher = binaryOperator(hasLHS()))
5956  a || b
5957</pre></td></tr>
5958
5959
5960<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>
5961<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
5962
5963Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
5964                                             integerLiteral(equals(2)))
5965  1 + 2 // Match
5966  2 + 1 // Match
5967  1 + 1 // No match
5968  2 + 2 // No match
5969</pre></td></tr>
5970
5971
5972<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>
5973<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
5974
5975Example matches b (matcher = binaryOperator(hasRHS()))
5976  a || b
5977</pre></td></tr>
5978
5979
5980<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>
5981<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
5982block.
5983
5984Does not match the 'this' parameter of a method.
5985
5986Given
5987  class X { void f(int x, int y, int z) {} };
5988cxxMethodDecl(hasAnyParameter(hasName("y")))
5989  matches f(int x, int y, int z) {}
5990with hasAnyParameter(...)
5991  matching int y
5992
5993For ObjectiveC, given
5994  @interface I - (void) f:(int) y; @end
5995
5996the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5997matches the declaration of method f with hasParameter
5998matching y.
5999
6000For blocks, given
6001  b = ^(int y) { printf("%d", y) };
6002
6003the matcher blockDecl(hasAnyParameter(hasName("y")))
6004matches the declaration of the block b with hasParameter
6005matching y.
6006</pre></td></tr>
6007
6008
6009<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>
6010<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6011declaration or a block.
6012
6013Given
6014  class X { void f(int x) {} };
6015cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6016  matches f(int x) {}
6017with hasParameter(...)
6018  matching int x
6019
6020For ObjectiveC, given
6021  @interface I - (void) f:(int) y; @end
6022
6023the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6024matches the declaration of method f with hasParameter
6025matching y.
6026</pre></td></tr>
6027
6028
6029<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>
6030<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6031pointee matches a given matcher.
6032
6033Given
6034  int *a;
6035  int const *b;
6036  float const *f;
6037pointerType(pointee(isConstQualified(), isInteger()))
6038  matches "int const *b"
6039
6040Usable 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;,
6041  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;
6042</pre></td></tr>
6043
6044
6045<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>
6046<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
6047declaration's type.
6048
6049In case of a value declaration (for example a variable declaration),
6050this resolves one layer of indirection. For example, in the value
6051declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6052X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6053declaration of x.
6054
6055Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6056            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6057            and friend class X (matcher = friendDecl(hasType("X"))
6058 class X {};
6059 void y(X &amp;x) { x; X z; }
6060 class Y { friend class X; };
6061
6062Example matches class Derived
6063(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6064class Base {};
6065class Derived : Base {};
6066
6067Usable 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;,
6068Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6069</pre></td></tr>
6070
6071
6072<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>
6073<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6074
6075Given
6076  void f(int i);
6077  int y;
6078  f(y);
6079callExpr(
6080  forEachArgumentWithParam(
6081    declRefExpr(to(varDecl(hasName("y")))),
6082    parmVarDecl(hasType(isInteger()))
6083))
6084  matches f(y);
6085with declRefExpr(...)
6086  matching int y
6087and parmVarDecl(...)
6088  matching int i
6089</pre></td></tr>
6090
6091
6092<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>
6093<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6094CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6095it works on calls through function pointers as well.
6096
6097The difference is, that function pointers do not provide access to a
6098ParmVarDecl, but only the QualType for each argument.
6099
6100Given
6101  void f(int i);
6102  int y;
6103  f(y);
6104  void (*f_ptr)(int) = f;
6105  f_ptr(y);
6106callExpr(
6107  forEachArgumentWithParamType(
6108    declRefExpr(to(varDecl(hasName("y")))),
6109    qualType(isInteger()).bind("type)
6110))
6111  matches f(y) and f_ptr(y)
6112with declRefExpr(...)
6113  matching int y
6114and qualType(...)
6115  matching int
6116</pre></td></tr>
6117
6118
6119<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>
6120<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6121expression, or an ObjC-message-send expression.
6122
6123Given
6124  void x(int, int, int) { int y; x(1, y, 42); }
6125callExpr(hasAnyArgument(declRefExpr()))
6126  matches x(1, y, 42)
6127with hasAnyArgument(...)
6128  matching y
6129
6130For ObjectiveC, given
6131  @interface I - (void) f:(int) y; @end
6132  void foo(I *i) { [i f:12]; }
6133objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6134  matches [i f:12]
6135</pre></td></tr>
6136
6137
6138<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>
6139<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6140call expression.
6141
6142Example matches y in x(y)
6143    (matcher = callExpr(hasArgument(0, declRefExpr())))
6144  void x(int) { int y; x(y); }
6145</pre></td></tr>
6146
6147
6148<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>
6149<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6150matches the given matcher.
6151
6152The associated declaration is:
6153- for type nodes, the declaration of the underlying type
6154- for CallExpr, the declaration of the callee
6155- for MemberExpr, the declaration of the referenced member
6156- for CXXConstructExpr, the declaration of the constructor
6157- for CXXNewExpr, the declaration of the operator new
6158- for ObjCIvarExpr, the declaration of the ivar
6159
6160For type nodes, hasDeclaration will generally match the declaration of the
6161sugared type. Given
6162  class X {};
6163  typedef X Y;
6164  Y y;
6165in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6166typedefDecl. A common use case is to match the underlying, desugared type.
6167This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6168  varDecl(hasType(hasUnqualifiedDesugaredType(
6169      recordType(hasDeclaration(decl())))))
6170In this matcher, the decl will match the CXXRecordDecl of class X.
6171
6172Usable 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;,
6173  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;,
6174  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;,
6175  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;,
6176  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;,
6177  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;,
6178  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6179</pre></td></tr>
6180
6181
6182<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>
6183<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6184
6185Given
6186  class A { A() : i(42), j(42) {} int i; int j; };
6187cxxConstructorDecl(forEachConstructorInitializer(
6188  forField(decl().bind("x"))
6189))
6190  will trigger two matches, binding for 'i' and 'j' respectively.
6191</pre></td></tr>
6192
6193
6194<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>
6195<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6196
6197Given
6198  struct Foo {
6199    Foo() : foo_(1) { }
6200    int foo_;
6201  };
6202cxxRecordDecl(has(cxxConstructorDecl(
6203  hasAnyConstructorInitializer(anything())
6204)))
6205  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6206</pre></td></tr>
6207
6208
6209<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>
6210<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6211
6212Given
6213  struct Foo {
6214    Foo() : foo_(1) { }
6215    int foo_;
6216  };
6217cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6218    forField(hasName("foo_"))))))
6219  matches Foo
6220with forField matching foo_
6221</pre></td></tr>
6222
6223
6224<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>
6225<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6226
6227Given
6228  struct Foo {
6229    Foo() : foo_(1) { }
6230    int foo_;
6231  };
6232cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6233    withInitializer(integerLiteral(equals(1)))))))
6234  matches Foo
6235with withInitializer matching (1)
6236</pre></td></tr>
6237
6238
6239<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>
6240<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6241given matcher. Implicit object expressions are included; that is, it matches
6242use of implicit `this`.
6243
6244Given
6245  struct X {
6246    int m;
6247    int f(X x) { x.m; return m; }
6248  };
6249memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6250  matches `x.m`, but not `m`; however,
6251memberExpr(hasObjectExpression(hasType(pointsTo(
6252     cxxRecordDecl(hasName("X"))))))
6253  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6254</pre></td></tr>
6255
6256
6257<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>
6258<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6259
6260
6261<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>
6262<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6263
6264Given:
6265 void foo() {
6266   if (int i = foobar(); i &gt; 0) {}
6267   switch (int i = foobar(); i) {}
6268   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6269 }
6270 void bar() {
6271   if (foobar() &gt; 0) {}
6272   switch (foobar()) {}
6273   for (auto&amp; x : get_range()) {}
6274 }
6275ifStmt(hasInitStatement(anything()))
6276  matches the if statement in foo but not in bar.
6277switchStmt(hasInitStatement(anything()))
6278  matches the switch statement in foo but not in bar.
6279cxxForRangeStmt(hasInitStatement(anything()))
6280  matches the range for statement in foo but not in bar.
6281</pre></td></tr>
6282
6283
6284<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>
6285<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6286
6287Example:
6288    forStmt(hasLoopVariable(anything()))
6289matches 'int x' in
6290    for (int x : a) { }
6291</pre></td></tr>
6292
6293
6294<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>
6295<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6296
6297Example:
6298    forStmt(hasRangeInit(anything()))
6299matches 'a' in
6300    for (int x : a) { }
6301</pre></td></tr>
6302
6303
6304<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>
6305<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6306`on`, matches the argument directly without stripping away anything.
6307
6308Given
6309  class Y { public: void m(); };
6310  Y g();
6311  class X : public Y { void g(); };
6312  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6313cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6314    cxxRecordDecl(hasName("Y")))))
6315  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6316cxxMemberCallExpr(on(callExpr()))
6317  does not match `(g()).m()`, because the parens are not ignored.
6318
6319FIXME: Overload to allow directly matching types?
6320</pre></td></tr>
6321
6322
6323<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>
6324<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6325stripping off any parentheses or implicit casts.
6326
6327Given
6328  class Y { public: void m(); };
6329  Y g();
6330  class X : public Y {};
6331  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6332cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6333  matches `y.m()` and `(g()).m()`.
6334cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6335  matches `x.m()`.
6336cxxMemberCallExpr(on(callExpr()))
6337  matches `(g()).m()`.
6338
6339FIXME: Overload to allow directly matching types?
6340</pre></td></tr>
6341
6342
6343<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>
6344<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6345</pre></td></tr>
6346
6347
6348<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>
6349<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6350matches the InnerMatcher, or is a pointer to a type that matches the
6351InnerMatcher.
6352
6353Given
6354  class Y { public: void m(); };
6355  class X : public Y { void g(); };
6356  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6357cxxMemberCallExpr(thisPointerType(hasDeclaration(
6358    cxxRecordDecl(hasName("Y")))))
6359  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6360cxxMemberCallExpr(thisPointerType(hasDeclaration(
6361    cxxRecordDecl(hasName("X")))))
6362  matches `x.g()`.
6363</pre></td></tr>
6364
6365
6366<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>
6367<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6368produce multiple matches.
6369
6370Given
6371  class A { virtual void f(); };
6372  class B : public A { void f(); };
6373  class C : public B { void f(); };
6374cxxMethodDecl(ofClass(hasName("C")),
6375              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6376  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6377  that B::f is not overridden by C::f).
6378
6379The check can produce multiple matches in case of multiple inheritance, e.g.
6380  class A1 { virtual void f(); };
6381  class A2 { virtual void f(); };
6382  class C : public A1, public A2 { void f(); };
6383cxxMethodDecl(ofClass(hasName("C")),
6384              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6385  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6386  once with "b" binding "A2::f" and "d" binding "C::f".
6387</pre></td></tr>
6388
6389
6390<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>
6391<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6392belongs to.
6393
6394FIXME: Generalize this for other kinds of declarations.
6395FIXME: What other kind of declarations would we need to generalize
6396this to?
6397
6398Example matches A() in the last line
6399    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6400        ofClass(hasName("A"))))))
6401  class A {
6402   public:
6403    A();
6404  };
6405  A a = A();
6406</pre></td></tr>
6407
6408
6409<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>
6410<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6411
6412Given:
6413  MyClass *p1 = new (Storage) MyClass();
6414cxxNewExpr(hasAnyPlacementArg(anything()))
6415  matches the expression 'new (Storage, 16) MyClass()'.
6416</pre></td></tr>
6417
6418
6419<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>
6420<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6421
6422Given:
6423  MyClass *p1 = new MyClass[10];
6424cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6425  matches the expression 'new MyClass[10]'.
6426</pre></td></tr>
6427
6428
6429<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>
6430<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6431matches the given matcher.
6432
6433The associated declaration is:
6434- for type nodes, the declaration of the underlying type
6435- for CallExpr, the declaration of the callee
6436- for MemberExpr, the declaration of the referenced member
6437- for CXXConstructExpr, the declaration of the constructor
6438- for CXXNewExpr, the declaration of the operator new
6439- for ObjCIvarExpr, the declaration of the ivar
6440
6441For type nodes, hasDeclaration will generally match the declaration of the
6442sugared type. Given
6443  class X {};
6444  typedef X Y;
6445  Y y;
6446in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6447typedefDecl. A common use case is to match the underlying, desugared type.
6448This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6449  varDecl(hasType(hasUnqualifiedDesugaredType(
6450      recordType(hasDeclaration(decl())))))
6451In this matcher, the decl will match the CXXRecordDecl of class X.
6452
6453Usable 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;,
6454  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;,
6455  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;,
6456  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;,
6457  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;,
6458  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;,
6459  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
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('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>
6464<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6465
6466Given:
6467  MyClass *p1 = new (Storage, 16) MyClass();
6468cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6469  matches the expression 'new (Storage, 16) MyClass()'.
6470</pre></td></tr>
6471
6472
6473<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>
6474<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6475binary operator matches.
6476</pre></td></tr>
6477
6478
6479<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>
6480<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6481
6482Example matches a (matcher = binaryOperator(hasLHS()))
6483  a || b
6484</pre></td></tr>
6485
6486
6487<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>
6488<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6489
6490Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6491                                             integerLiteral(equals(2)))
6492  1 + 2 // Match
6493  2 + 1 // Match
6494  1 + 1 // No match
6495  2 + 2 // No match
6496</pre></td></tr>
6497
6498
6499<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>
6500<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6501
6502Example matches b (matcher = binaryOperator(hasRHS()))
6503  a || b
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('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>
6508<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6509
6510Example matches true (matcher = hasUnaryOperand(
6511                                  cxxBoolLiteral(equals(true))))
6512  !true
6513</pre></td></tr>
6514
6515
6516<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>
6517<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6518
6519Example:
6520matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6521  class Foo;
6522  class Bar : Foo {};
6523  class Baz : Bar {};
6524  class SpecialBase;
6525  class Proxy : SpecialBase {};  // matches Proxy
6526  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6527
6528FIXME: Refactor this and isDerivedFrom to reuse implementation.
6529</pre></td></tr>
6530
6531
6532<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>
6533<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6534
6535Example:
6536matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6537  class Foo;
6538  class Bar : Foo {};
6539  class Baz : Bar {};
6540  class SpecialBase;
6541  class Proxy : SpecialBase {};  // matches Proxy
6542  class IndirectlyDerived : Proxy {};  // doesn't match
6543</pre></td></tr>
6544
6545
6546<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>
6547<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6548
6549Given:
6550  class A { void func(); };
6551  class B { void member(); };
6552
6553cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
6554A but not B.
6555</pre></td></tr>
6556
6557
6558<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>
6559<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
6560matching Base, or Objective-C classes that directly or indirectly
6561subclass a class matching Base.
6562
6563Note that a class is not considered to be derived from itself.
6564
6565Example matches Y, Z, C (Base == hasName("X"))
6566  class X;
6567  class Y : public X {};  // directly derived
6568  class Z : public Y {};  // indirectly derived
6569  typedef X A;
6570  typedef A B;
6571  class C : public B {};  // derived from a typedef of X
6572
6573In the following example, Bar matches isDerivedFrom(hasName("X")):
6574  class Foo;
6575  typedef Foo X;
6576  class Bar : public Foo {};  // derived from a type that X is a typedef of
6577
6578In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6579  @interface NSObject @end
6580  @interface Bar : NSObject @end
6581
6582Usable 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;
6583</pre></td></tr>
6584
6585
6586<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>
6587<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6588matching Base.
6589
6590Note that a class is not considered to be derived from itself.
6591
6592Example matches Y, C (Base == hasName("X"))
6593  class X;
6594  class Y : public X {};  // directly derived
6595  class Z : public Y {};  // indirectly derived
6596  typedef X A;
6597  typedef A B;
6598  class C : public B {};  // derived from a typedef of X
6599
6600In the following example, Bar matches isDerivedFrom(hasName("X")):
6601  class Foo;
6602  typedef Foo X;
6603  class Bar : public Foo {};  // derived from a type that X is a typedef of
6604</pre></td></tr>
6605
6606
6607<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('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>
6608<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6609match Base.
6610</pre></td></tr>
6611
6612
6613<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>
6614<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
6615binary operator matches.
6616</pre></td></tr>
6617
6618
6619<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>
6620<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
6621
6622Example matches a (matcher = binaryOperator(hasLHS()))
6623  a || b
6624</pre></td></tr>
6625
6626
6627<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>
6628<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
6629
6630Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6631                                             integerLiteral(equals(2)))
6632  1 + 2 // Match
6633  2 + 1 // Match
6634  1 + 1 // No match
6635  2 + 2 // No match
6636</pre></td></tr>
6637
6638
6639<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>
6640<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
6641
6642Example matches b (matcher = binaryOperator(hasRHS()))
6643  a || b
6644</pre></td></tr>
6645
6646
6647<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>
6648<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
6649expression, or an ObjC-message-send expression.
6650
6651Given
6652  void x(int, int, int) { int y; x(1, y, 42); }
6653callExpr(hasAnyArgument(declRefExpr()))
6654  matches x(1, y, 42)
6655with hasAnyArgument(...)
6656  matching y
6657
6658For ObjectiveC, given
6659  @interface I - (void) f:(int) y; @end
6660  void foo(I *i) { [i f:12]; }
6661objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6662  matches [i f:12]
6663</pre></td></tr>
6664
6665
6666<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>
6667<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6668call expression.
6669
6670Example matches y in x(y)
6671    (matcher = callExpr(hasArgument(0, declRefExpr())))
6672  void x(int) { int y; x(y); }
6673</pre></td></tr>
6674
6675
6676<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>
6677<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
6678given matcher.
6679
6680Example matches y.x() (matcher = callExpr(callee(
6681                                   cxxMethodDecl(hasName("x")))))
6682  class Y { public: void x(); };
6683  void z() { Y y; y.x(); }
6684</pre></td></tr>
6685
6686
6687<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>
6688<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
6689
6690Given
6691  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
6692  void f() { f(); }
6693callExpr(callee(expr()))
6694  matches this-&gt;x(), x(), y.x(), f()
6695with callee(...)
6696  matching this-&gt;x, x, y.x, f respectively
6697
6698Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
6699because this introduces ambiguous overloads with calls to Callee taking a
6700internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
6701implemented in terms of implicit casts.
6702</pre></td></tr>
6703
6704
6705<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>
6706<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
6707
6708Given
6709  void f(int i);
6710  int y;
6711  f(y);
6712callExpr(
6713  forEachArgumentWithParam(
6714    declRefExpr(to(varDecl(hasName("y")))),
6715    parmVarDecl(hasType(isInteger()))
6716))
6717  matches f(y);
6718with declRefExpr(...)
6719  matching int y
6720and parmVarDecl(...)
6721  matching int i
6722</pre></td></tr>
6723
6724
6725<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>
6726<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
6727CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6728it works on calls through function pointers as well.
6729
6730The difference is, that function pointers do not provide access to a
6731ParmVarDecl, but only the QualType for each argument.
6732
6733Given
6734  void f(int i);
6735  int y;
6736  f(y);
6737  void (*f_ptr)(int) = f;
6738  f_ptr(y);
6739callExpr(
6740  forEachArgumentWithParamType(
6741    declRefExpr(to(varDecl(hasName("y")))),
6742    qualType(isInteger()).bind("type)
6743))
6744  matches f(y) and f_ptr(y)
6745with declRefExpr(...)
6746  matching int y
6747and qualType(...)
6748  matching int
6749</pre></td></tr>
6750
6751
6752<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>
6753<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
6754expression, or an ObjC-message-send expression.
6755
6756Given
6757  void x(int, int, int) { int y; x(1, y, 42); }
6758callExpr(hasAnyArgument(declRefExpr()))
6759  matches x(1, y, 42)
6760with hasAnyArgument(...)
6761  matching y
6762
6763For ObjectiveC, given
6764  @interface I - (void) f:(int) y; @end
6765  void foo(I *i) { [i f:12]; }
6766objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6767  matches [i f:12]
6768</pre></td></tr>
6769
6770
6771<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>
6772<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
6773call expression.
6774
6775Example matches y in x(y)
6776    (matcher = callExpr(hasArgument(0, declRefExpr())))
6777  void x(int) { int y; x(y); }
6778</pre></td></tr>
6779
6780
6781<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>
6782<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
6783matches the given matcher.
6784
6785The associated declaration is:
6786- for type nodes, the declaration of the underlying type
6787- for CallExpr, the declaration of the callee
6788- for MemberExpr, the declaration of the referenced member
6789- for CXXConstructExpr, the declaration of the constructor
6790- for CXXNewExpr, the declaration of the operator new
6791- for ObjCIvarExpr, the declaration of the ivar
6792
6793For type nodes, hasDeclaration will generally match the declaration of the
6794sugared type. Given
6795  class X {};
6796  typedef X Y;
6797  Y y;
6798in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6799typedefDecl. A common use case is to match the underlying, desugared type.
6800This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6801  varDecl(hasType(hasUnqualifiedDesugaredType(
6802      recordType(hasDeclaration(decl())))))
6803In this matcher, the decl will match the CXXRecordDecl of class X.
6804
6805Usable 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;,
6806  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;,
6807  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;,
6808  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;,
6809  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;,
6810  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;,
6811  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6812</pre></td></tr>
6813
6814
6815<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>
6816<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
6817extension, matches the constant given in the statement.
6818
6819Given
6820  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
6821caseStmt(hasCaseConstant(integerLiteral()))
6822  matches "case 1:"
6823</pre></td></tr>
6824
6825
6826<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>
6827<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
6828or opaque value's source expression matches the given matcher.
6829
6830Example 1: matches "a string"
6831(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6832class URL { URL(string); };
6833URL url = "a string";
6834
6835Example 2: matches 'b' (matcher =
6836opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6837int a = b ?: 1;
6838</pre></td></tr>
6839
6840
6841<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>
6842<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6843functionDecl that have at least one TemplateArgument matching the given
6844InnerMatcher.
6845
6846Given
6847  template&lt;typename T&gt; class A {};
6848  template&lt;&gt; class A&lt;double&gt; {};
6849  A&lt;int&gt; a;
6850
6851  template&lt;typename T&gt; f() {};
6852  void func() { f&lt;int&gt;(); };
6853
6854classTemplateSpecializationDecl(hasAnyTemplateArgument(
6855    refersToType(asString("int"))))
6856  matches the specialization A&lt;int&gt;
6857
6858functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6859  matches the specialization f&lt;int&gt;
6860</pre></td></tr>
6861
6862
6863<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>
6864<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
6865
6866Given
6867  template&lt;typename T&gt; class A {}; #1
6868  template&lt;&gt; class A&lt;int&gt; {}; #2
6869classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
6870  matches '#2' with classTemplateDecl() matching the class template
6871  declaration of 'A' at #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('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>
6876<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6877functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6878
6879Given
6880  template&lt;typename T, typename U&gt; class A {};
6881  A&lt;bool, int&gt; b;
6882  A&lt;int, bool&gt; c;
6883
6884  template&lt;typename T&gt; void f() {}
6885  void func() { f&lt;int&gt;(); };
6886classTemplateSpecializationDecl(hasTemplateArgument(
6887    1, refersToType(asString("int"))))
6888  matches the specialization A&lt;bool, int&gt;
6889
6890functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6891  matches the specialization f&lt;int&gt;
6892</pre></td></tr>
6893
6894
6895<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>
6896<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
6897type.
6898
6899Given
6900  struct A {};
6901  A a[7];
6902  int b[7];
6903arrayType(hasElementType(builtinType()))
6904  matches "int b[7]"
6905
6906Usable 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;
6907</pre></td></tr>
6908
6909
6910<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>
6911<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
6912a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6913
6914Given
6915  { {}; 1+2; }
6916hasAnySubstatement(compoundStmt())
6917  matches '{ {}; 1+2; }'
6918with compoundStmt()
6919  matching '{}'
6920</pre></td></tr>
6921
6922
6923<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>
6924<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
6925</pre></td></tr>
6926
6927
6928<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>
6929<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
6930matches the given matcher.
6931
6932The associated declaration is:
6933- for type nodes, the declaration of the underlying type
6934- for CallExpr, the declaration of the callee
6935- for MemberExpr, the declaration of the referenced member
6936- for CXXConstructExpr, the declaration of the constructor
6937- for CXXNewExpr, the declaration of the operator new
6938- for ObjCIvarExpr, the declaration of the ivar
6939
6940For type nodes, hasDeclaration will generally match the declaration of the
6941sugared type. Given
6942  class X {};
6943  typedef X Y;
6944  Y y;
6945in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6946typedefDecl. A common use case is to match the underlying, desugared type.
6947This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6948  varDecl(hasType(hasUnqualifiedDesugaredType(
6949      recordType(hasDeclaration(decl())))))
6950In this matcher, the decl will match the CXXRecordDecl of class X.
6951
6952Usable 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;,
6953  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;,
6954  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;,
6955  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;,
6956  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;,
6957  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;,
6958  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
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('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>
6963<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
6964specific using shadow declaration.
6965
6966Given
6967  namespace a { void f() {} }
6968  using a::f;
6969  void g() {
6970    f();     // Matches this ..
6971    a::f();  // .. but not this.
6972  }
6973declRefExpr(throughUsingDecl(anything()))
6974  matches f()
6975</pre></td></tr>
6976
6977
6978<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>
6979<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
6980specified matcher.
6981
6982Example matches x in if(x)
6983    (matcher = declRefExpr(to(varDecl(hasName("x")))))
6984  bool x;
6985  if (x) {}
6986</pre></td></tr>
6987
6988
6989<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>
6990<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
6991
6992Note that this does not work for global declarations because the AST
6993breaks up multiple-declaration DeclStmt's into multiple single-declaration
6994DeclStmt's.
6995Example: Given non-global declarations
6996  int a, b = 0;
6997  int c;
6998  int d = 2, e;
6999declStmt(containsDeclaration(
7000      0, varDecl(hasInitializer(anything()))))
7001  matches only 'int d = 2, e;', and
7002declStmt(containsDeclaration(1, varDecl()))
7003  matches 'int a, b = 0' as well as 'int d = 2, e;'
7004  but 'int c;' is not matched.
7005</pre></td></tr>
7006
7007
7008<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>
7009<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7010
7011Given
7012  int a, b;
7013  int c;
7014declStmt(hasSingleDecl(anything()))
7015  matches 'int c;' but not 'int a, b;'.
7016</pre></td></tr>
7017
7018
7019<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>
7020<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
7021the inner matcher.
7022
7023Given
7024  int x;
7025declaratorDecl(hasTypeLoc(loc(asString("int"))))
7026  matches int x
7027</pre></td></tr>
7028
7029
7030<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>
7031<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7032Decl, matches InnerMatcher.
7033
7034Given
7035  namespace N {
7036    namespace M {
7037      class D {};
7038    }
7039  }
7040
7041cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7042declaration of class D.
7043</pre></td></tr>
7044
7045
7046<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>
7047<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7048
7049Given
7050  decltype(1) a = 1;
7051  decltype(2.0) b = 2.0;
7052decltypeType(hasUnderlyingType(isInteger()))
7053  matches the type of "a"
7054
7055Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7056</pre></td></tr>
7057
7058
7059<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>
7060<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7061
7062
7063<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>
7064<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7065switch statement or conditional operator.
7066
7067Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7068  if (true) {}
7069</pre></td></tr>
7070
7071
7072<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>
7073<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7074matches InnerMatcher if the qualifier exists.
7075
7076Given
7077  namespace N {
7078    namespace M {
7079      class D {};
7080    }
7081  }
7082  N::M::D d;
7083
7084elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7085matches the type of the variable declaration of d.
7086</pre></td></tr>
7087
7088
7089<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>
7090<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7091
7092Given
7093  namespace N {
7094    namespace M {
7095      class D {};
7096    }
7097  }
7098  N::M::D d;
7099
7100elaboratedType(namesType(recordType(
7101hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7102declaration of d.
7103</pre></td></tr>
7104
7105
7106<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>
7107<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7108matches the given matcher.
7109
7110The associated declaration is:
7111- for type nodes, the declaration of the underlying type
7112- for CallExpr, the declaration of the callee
7113- for MemberExpr, the declaration of the referenced member
7114- for CXXConstructExpr, the declaration of the constructor
7115- for CXXNewExpr, the declaration of the operator new
7116- for ObjCIvarExpr, the declaration of the ivar
7117
7118For type nodes, hasDeclaration will generally match the declaration of the
7119sugared type. Given
7120  class X {};
7121  typedef X Y;
7122  Y y;
7123in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7124typedefDecl. A common use case is to match the underlying, desugared type.
7125This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7126  varDecl(hasType(hasUnqualifiedDesugaredType(
7127      recordType(hasDeclaration(decl())))))
7128In this matcher, the decl will match the CXXRecordDecl of class X.
7129
7130Usable 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;,
7131  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;,
7132  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;,
7133  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;,
7134  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;,
7135  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;,
7136  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7137</pre></td></tr>
7138
7139
7140<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>
7141<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7142
7143(Note: Clang's AST refers to other conversions as "casts" too, and calls
7144actual casts "explicit" casts.)
7145</pre></td></tr>
7146
7147
7148<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>
7149<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
7150declaration's type.
7151
7152In case of a value declaration (for example a variable declaration),
7153this resolves one layer of indirection. For example, in the value
7154declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7155X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7156declaration of x.
7157
7158Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7159            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7160            and friend class X (matcher = friendDecl(hasType("X"))
7161 class X {};
7162 void y(X &amp;x) { x; X z; }
7163 class Y { friend class X; };
7164
7165Example matches class Derived
7166(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7167class Base {};
7168class Derived : Base {};
7169
7170Usable 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;,
7171Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7172</pre></td></tr>
7173
7174
7175<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>
7176<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7177matcher.
7178
7179Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7180            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7181            and U (matcher = typedefDecl(hasType(asString("int")))
7182            and friend class X (matcher = friendDecl(hasType("X"))
7183 class X {};
7184 void y(X &amp;x) { x; X z; }
7185 typedef int U;
7186 class Y { friend class X; };
7187</pre></td></tr>
7188
7189
7190<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>
7191<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7192elidable constructor and other corresponding bookkeeping nodes.
7193
7194In C++17, elidable copy constructors are no longer being generated in the
7195AST as it is not permitted by the standard. They are, however, part of the
7196AST in C++14 and earlier. So, a matcher must abstract over these differences
7197to work in all language modes. This matcher skips elidable constructor-call
7198AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7199various implicit nodes inside the constructor calls, all of which will not
7200appear in the C++17 AST.
7201
7202Given
7203
7204struct H {};
7205H G();
7206void f() {
7207  H D = G();
7208}
7209
7210``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7211matches ``H D = G()`` in C++11 through C++17 (and beyond).
7212</pre></td></tr>
7213
7214
7215<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>
7216<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7217are stripped off.
7218
7219Parentheses and explicit casts are not discarded.
7220Given
7221  int arr[5];
7222  int a = 0;
7223  char b = 0;
7224  const int c = a;
7225  int *d = arr;
7226  long e = (long) 0l;
7227The matchers
7228   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7229   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7230would match the declarations for a, b, c, and d, but not e.
7231While
7232   varDecl(hasInitializer(integerLiteral()))
7233   varDecl(hasInitializer(declRefExpr()))
7234only match the declarations for b, c, and d.
7235</pre></td></tr>
7236
7237
7238<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>
7239<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7240nodes are stripped off.
7241
7242Parentheses and explicit casts are not discarded.
7243Given
7244  class C {};
7245  C a = C();
7246  C b;
7247  C c = b;
7248The matchers
7249   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7250would match the declarations for a, b, and c.
7251While
7252   varDecl(hasInitializer(cxxConstructExpr()))
7253only match the declarations for b and c.
7254</pre></td></tr>
7255
7256
7257<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>
7258<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7259casts are stripped off.
7260
7261Implicit and non-C Style casts are also discarded.
7262Given
7263  int a = 0;
7264  char b = (0);
7265  void* c = reinterpret_cast&lt;char*&gt;(0);
7266  char d = char(0);
7267The matcher
7268   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7269would match the declarations for a, b, c, and d.
7270while
7271   varDecl(hasInitializer(integerLiteral()))
7272only match the declaration for a.
7273</pre></td></tr>
7274
7275
7276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('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>
7277<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7278parentheses are stripped off.
7279
7280Explicit casts are not discarded.
7281Given
7282  int arr[5];
7283  int a = 0;
7284  char b = (0);
7285  const int c = a;
7286  int *d = (arr);
7287  long e = ((long) 0l);
7288The matchers
7289   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7290   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7291would match the declarations for a, b, c, and d, but not e.
7292while
7293   varDecl(hasInitializer(integerLiteral()))
7294   varDecl(hasInitializer(declRefExpr()))
7295would only match the declaration for a.
7296</pre></td></tr>
7297
7298
7299<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>
7300<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7301
7302Given
7303  const char* str = ("my-string");
7304The matcher
7305  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7306would match the implicit cast resulting from the assignment.
7307</pre></td></tr>
7308
7309
7310<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>
7311<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7312
7313Given
7314  class C {
7315    int a = 2;
7316    int b = 3;
7317    int c;
7318  };
7319fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7320  matches 'int a;' but not 'int b;'.
7321fieldDecl(hasInClassInitializer(anything()))
7322  matches 'int a;' and 'int b;' but not 'int c;'.
7323</pre></td></tr>
7324
7325
7326<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>
7327<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7328
7329
7330<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>
7331<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7332switch statement or conditional operator.
7333
7334Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7335  if (true) {}
7336</pre></td></tr>
7337
7338
7339<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>
7340<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7341
7342Example:
7343    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7344matches '++x' in
7345    for (x; x &lt; N; ++x) { }
7346</pre></td></tr>
7347
7348
7349<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>
7350<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7351
7352Example:
7353    forStmt(hasLoopInit(declStmt()))
7354matches 'int x = 0' in
7355    for (int x = 0; x &lt; N; ++x) { }
7356</pre></td></tr>
7357
7358
7359<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>
7360<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7361declaration's type.
7362
7363In case of a value declaration (for example a variable declaration),
7364this resolves one layer of indirection. For example, in the value
7365declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7366X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7367declaration of x.
7368
7369Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7370            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7371            and friend class X (matcher = friendDecl(hasType("X"))
7372 class X {};
7373 void y(X &amp;x) { x; X z; }
7374 class Y { friend class X; };
7375
7376Example matches class Derived
7377(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7378class Base {};
7379class Derived : Base {};
7380
7381Usable 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;,
7382Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7383</pre></td></tr>
7384
7385
7386<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>
7387<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
7388matcher.
7389
7390Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7391            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7392            and U (matcher = typedefDecl(hasType(asString("int")))
7393            and friend class X (matcher = friendDecl(hasType("X"))
7394 class X {};
7395 void y(X &amp;x) { x; X z; }
7396 typedef int U;
7397 class Y { friend class X; };
7398</pre></td></tr>
7399
7400
7401<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>
7402<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
7403Note that this matcher matches all the declarations of a function whose
7404body is present in the AST.
7405
7406Given
7407  void f();
7408  void f() {}
7409  void g();
7410hasAnyBody(functionDecl())
7411  matches both 'void f();'
7412  and 'void f() {}'
7413with compoundStmt()
7414  matching '{}'
7415  but does not match 'void g();'
7416</pre></td></tr>
7417
7418
7419<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>
7420<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
7421block.
7422
7423Does not match the 'this' parameter of a method.
7424
7425Given
7426  class X { void f(int x, int y, int z) {} };
7427cxxMethodDecl(hasAnyParameter(hasName("y")))
7428  matches f(int x, int y, int z) {}
7429with hasAnyParameter(...)
7430  matching int y
7431
7432For ObjectiveC, given
7433  @interface I - (void) f:(int) y; @end
7434
7435the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7436matches the declaration of method f with hasParameter
7437matching y.
7438
7439For blocks, given
7440  b = ^(int y) { printf("%d", y) };
7441
7442the matcher blockDecl(hasAnyParameter(hasName("y")))
7443matches the declaration of the block b with hasParameter
7444matching y.
7445</pre></td></tr>
7446
7447
7448<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>
7449<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7450functionDecl that have at least one TemplateArgument matching the given
7451InnerMatcher.
7452
7453Given
7454  template&lt;typename T&gt; class A {};
7455  template&lt;&gt; class A&lt;double&gt; {};
7456  A&lt;int&gt; a;
7457
7458  template&lt;typename T&gt; f() {};
7459  void func() { f&lt;int&gt;(); };
7460
7461classTemplateSpecializationDecl(hasAnyTemplateArgument(
7462    refersToType(asString("int"))))
7463  matches the specialization A&lt;int&gt;
7464
7465functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7466  matches the specialization f&lt;int&gt;
7467</pre></td></tr>
7468
7469
7470<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>
7471<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
7472
7473
7474<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>
7475<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
7476declaration.
7477
7478Given
7479  template&lt;bool b&gt;
7480  struct S {
7481    S(int); // #1
7482    explicit S(double); // #2
7483    operator int(); // #3
7484    explicit operator bool(); // #4
7485    explicit(false) S(bool) // # 7
7486    explicit(true) S(char) // # 8
7487    explicit(b) S(S) // # 9
7488  };
7489  S(int) -&gt; S&lt;true&gt; // #5
7490  explicit S(double) -&gt; S&lt;false&gt; // #6
7491cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
7492cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
7493cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
7494</pre></td></tr>
7495
7496
7497<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>
7498<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
7499declaration or a block.
7500
7501Given
7502  class X { void f(int x) {} };
7503cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7504  matches f(int x) {}
7505with hasParameter(...)
7506  matching int x
7507
7508For ObjectiveC, given
7509  @interface I - (void) f:(int) y; @end
7510
7511the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7512matches the declaration of method f with hasParameter
7513matching y.
7514</pre></td></tr>
7515
7516
7517<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>
7518<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7519functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7520
7521Given
7522  template&lt;typename T, typename U&gt; class A {};
7523  A&lt;bool, int&gt; b;
7524  A&lt;int, bool&gt; c;
7525
7526  template&lt;typename T&gt; void f() {}
7527  void func() { f&lt;int&gt;(); };
7528classTemplateSpecializationDecl(hasTemplateArgument(
7529    1, refersToType(asString("int"))))
7530  matches the specialization A&lt;bool, int&gt;
7531
7532functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7533  matches the specialization f&lt;int&gt;
7534</pre></td></tr>
7535
7536
7537<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>
7538<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
7539
7540Given:
7541  class X { int f() { return 1; } };
7542cxxMethodDecl(returns(asString("int")))
7543  matches int f() { return 1; }
7544</pre></td></tr>
7545
7546
7547<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>
7548<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
7549switch statement or conditional operator.
7550
7551Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7552  if (true) {}
7553</pre></td></tr>
7554
7555
7556<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>
7557<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
7558
7559Given
7560  if (A* a = GetAPointer()) {}
7561hasConditionVariableStatement(...)
7562  matches 'A* a = GetAPointer()'.
7563</pre></td></tr>
7564
7565
7566<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>
7567<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
7568
7569Examples matches the if statement
7570  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
7571  if (false) false; else true;
7572</pre></td></tr>
7573
7574
7575<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>
7576<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
7577
7578Given:
7579 void foo() {
7580   if (int i = foobar(); i &gt; 0) {}
7581   switch (int i = foobar(); i) {}
7582   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7583 }
7584 void bar() {
7585   if (foobar() &gt; 0) {}
7586   switch (foobar()) {}
7587   for (auto&amp; x : get_range()) {}
7588 }
7589ifStmt(hasInitStatement(anything()))
7590  matches the if statement in foo but not in bar.
7591switchStmt(hasInitStatement(anything()))
7592  matches the switch statement in foo but not in bar.
7593cxxForRangeStmt(hasInitStatement(anything()))
7594  matches the range for statement in foo but not in bar.
7595</pre></td></tr>
7596
7597
7598<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>
7599<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
7600
7601Examples matches the if statement
7602  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
7603  if (false) true; else false;
7604</pre></td></tr>
7605
7606
7607<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>
7608<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
7609matcher.
7610
7611FIXME: Unit test this matcher
7612</pre></td></tr>
7613
7614
7615<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>
7616<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
7617
7618Example matches y.
7619    (matcher = initListExpr(hasInit(0, expr())))
7620  int x{y}.
7621</pre></td></tr>
7622
7623
7624<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>
7625<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
7626(if expression have it).
7627</pre></td></tr>
7628
7629
7630<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>
7631<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
7632matches the given matcher.
7633
7634The associated declaration is:
7635- for type nodes, the declaration of the underlying type
7636- for CallExpr, the declaration of the callee
7637- for MemberExpr, the declaration of the referenced member
7638- for CXXConstructExpr, the declaration of the constructor
7639- for CXXNewExpr, the declaration of the operator new
7640- for ObjCIvarExpr, the declaration of the ivar
7641
7642For type nodes, hasDeclaration will generally match the declaration of the
7643sugared type. Given
7644  class X {};
7645  typedef X Y;
7646  Y y;
7647in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7648typedefDecl. A common use case is to match the underlying, desugared type.
7649This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7650  varDecl(hasType(hasUnqualifiedDesugaredType(
7651      recordType(hasDeclaration(decl())))))
7652In this matcher, the decl will match the CXXRecordDecl of class X.
7653
7654Usable 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;,
7655  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;,
7656  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;,
7657  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;,
7658  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;,
7659  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;,
7660  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7661</pre></td></tr>
7662
7663
7664<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>
7665<tr><td colspan="4" class="doc" id="hasDeclaration8"><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_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>
7699<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
7700
7701Given
7702  struct foo {
7703    void bar() {
7704      auto f = [this](){};
7705    }
7706  }
7707lambdaExpr(hasAnyCapture(cxxThisExpr()))
7708  matches [this](){};
7709</pre></td></tr>
7710
7711
7712<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>
7713<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
7714
7715Given
7716  void foo() {
7717    int x;
7718    auto f = [x](){};
7719  }
7720lambdaExpr(hasAnyCapture(anything()))
7721  matches [x](){};
7722</pre></td></tr>
7723
7724
7725<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>
7726<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
7727matches the given matcher.
7728
7729The associated declaration is:
7730- for type nodes, the declaration of the underlying type
7731- for CallExpr, the declaration of the callee
7732- for MemberExpr, the declaration of the referenced member
7733- for CXXConstructExpr, the declaration of the constructor
7734- for CXXNewExpr, the declaration of the operator new
7735- for ObjCIvarExpr, the declaration of the ivar
7736
7737For type nodes, hasDeclaration will generally match the declaration of the
7738sugared type. Given
7739  class X {};
7740  typedef X Y;
7741  Y y;
7742in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7743typedefDecl. A common use case is to match the underlying, desugared type.
7744This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7745  varDecl(hasType(hasUnqualifiedDesugaredType(
7746      recordType(hasDeclaration(decl())))))
7747In this matcher, the decl will match the CXXRecordDecl of class X.
7748
7749Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
7750  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
7751  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
7752  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
7753  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
7754  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
7755  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7756</pre></td></tr>
7757
7758
7759<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
7760<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
7761given matcher. Implicit object expressions are included; that is, it matches
7762use of implicit `this`.
7763
7764Given
7765  struct X {
7766    int m;
7767    int f(X x) { x.m; return m; }
7768  };
7769memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7770  matches `x.m`, but not `m`; however,
7771memberExpr(hasObjectExpression(hasType(pointsTo(
7772     cxxRecordDecl(hasName("X"))))))
7773  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7774</pre></td></tr>
7775
7776
7777<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>
7778<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
7779given matcher.
7780
7781Given
7782  struct { int first, second; } first, second;
7783  int i(second.first);
7784  int j(first.second);
7785memberExpr(member(hasName("first")))
7786  matches second.first
7787  but not first.second (because the member name there is "second").
7788</pre></td></tr>
7789
7790
7791<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>
7792<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
7793pointee matches a given matcher.
7794
7795Given
7796  int *a;
7797  int const *b;
7798  float const *f;
7799pointerType(pointee(isConstQualified(), isInteger()))
7800  matches "int const *b"
7801
7802Usable 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;,
7803  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;
7804</pre></td></tr>
7805
7806
7807<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>
7808<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
7809matcher.
7810
7811Given
7812  namespace N { template&lt;class T&gt; void f(T t); }
7813  template &lt;class T&gt; void g() { using N::f; f(T()); }
7814unresolvedLookupExpr(hasAnyDeclaration(
7815    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
7816  matches the use of f in g() .
7817</pre></td></tr>
7818
7819
7820<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>
7821<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
7822
7823Given
7824  struct A { struct B { struct C {}; }; };
7825  A::B::C c;
7826nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
7827  matches "A::"
7828</pre></td></tr>
7829
7830
7831<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>
7832<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7833NestedNameSpecifier-matcher matches.
7834</pre></td></tr>
7835
7836
7837<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>
7838<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
7839given TypeLoc.
7840
7841Given
7842  struct A { struct B { struct C {}; }; };
7843  A::B::C c;
7844nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
7845  hasDeclaration(cxxRecordDecl(hasName("A")))))))
7846  matches "A::"
7847</pre></td></tr>
7848
7849
7850<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>
7851<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
7852
7853Given
7854  struct A { struct B { struct C {}; }; };
7855  A::B::C c;
7856nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
7857  matches "A::"
7858</pre></td></tr>
7859
7860
7861<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>
7862<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
7863given namespace matcher.
7864
7865Given
7866  namespace ns { struct A {}; }
7867  ns::A a;
7868nestedNameSpecifier(specifiesNamespace(hasName("ns")))
7869  matches "ns::"
7870</pre></td></tr>
7871
7872
7873<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>
7874<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
7875given QualType matcher without qualifiers.
7876
7877Given
7878  struct A { struct B { struct C {}; }; };
7879  A::B::C c;
7880nestedNameSpecifier(specifiesType(
7881  hasDeclaration(cxxRecordDecl(hasName("A")))
7882))
7883  matches "A::"
7884</pre></td></tr>
7885
7886
7887<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>
7888<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
7889
7890Given
7891
7892  #pragma omp parallel
7893  #pragma omp parallel default(none)
7894
7895``ompExecutableDirective(hasAnyClause(anything()))`` matches
7896``omp parallel default(none)``.
7897</pre></td></tr>
7898
7899
7900<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>
7901<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
7902
7903Prerequisite: the executable directive must not be standalone directive.
7904If it is, it will never match.
7905
7906Given
7907
7908   #pragma omp parallel
7909   ;
7910   #pragma omp parallel
7911   {}
7912
7913``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
7914</pre></td></tr>
7915
7916
7917<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>
7918<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
7919matching Base, or Objective-C classes that directly or indirectly
7920subclass a class matching Base.
7921
7922Note that a class is not considered to be derived from itself.
7923
7924Example matches Y, Z, C (Base == hasName("X"))
7925  class X;
7926  class Y : public X {};  // directly derived
7927  class Z : public Y {};  // indirectly derived
7928  typedef X A;
7929  typedef A B;
7930  class C : public B {};  // derived from a typedef of X
7931
7932In the following example, Bar matches isDerivedFrom(hasName("X")):
7933  class Foo;
7934  typedef Foo X;
7935  class Bar : public Foo {};  // derived from a type that X is a typedef of
7936
7937In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7938  @interface NSObject @end
7939  @interface Bar : NSObject @end
7940
7941Usable 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;
7942</pre></td></tr>
7943
7944
7945<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>
7946<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7947matching Base.
7948
7949Note that a class is not considered to be derived from itself.
7950
7951Example matches Y, C (Base == hasName("X"))
7952  class X;
7953  class Y : public X {};  // directly derived
7954  class Z : public Y {};  // indirectly derived
7955  typedef X A;
7956  typedef A B;
7957  class C : public B {};  // derived from a typedef of X
7958
7959In the following example, Bar matches isDerivedFrom(hasName("X")):
7960  class Foo;
7961  typedef Foo X;
7962  class Bar : public Foo {};  // derived from a type that X is a typedef of
7963</pre></td></tr>
7964
7965
7966<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>
7967<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7968match Base.
7969</pre></td></tr>
7970
7971
7972<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>
7973<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
7974expression, or an ObjC-message-send expression.
7975
7976Given
7977  void x(int, int, int) { int y; x(1, y, 42); }
7978callExpr(hasAnyArgument(declRefExpr()))
7979  matches x(1, y, 42)
7980with hasAnyArgument(...)
7981  matching y
7982
7983For ObjectiveC, given
7984  @interface I - (void) f:(int) y; @end
7985  void foo(I *i) { [i f:12]; }
7986objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7987  matches [i f:12]
7988</pre></td></tr>
7989
7990
7991<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>
7992<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
7993call expression.
7994
7995Example matches y in x(y)
7996    (matcher = callExpr(hasArgument(0, declRefExpr())))
7997  void x(int) { int y; x(y); }
7998</pre></td></tr>
7999
8000
8001<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>
8002<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8003and the inner matcher matches on that instance.
8004
8005For example the method call in
8006  NSString *x = @"hello";
8007  [x containsString:@"h"];
8008is matched by
8009objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8010</pre></td></tr>
8011
8012
8013<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>
8014<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8015
8016Example
8017matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8018matches the [webView ...] message invocation.
8019  NSString *webViewJavaScript = ...
8020  UIWebView *webView = ...
8021  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8022</pre></td></tr>
8023
8024
8025<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>
8026<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8027block.
8028
8029Does not match the 'this' parameter of a method.
8030
8031Given
8032  class X { void f(int x, int y, int z) {} };
8033cxxMethodDecl(hasAnyParameter(hasName("y")))
8034  matches f(int x, int y, int z) {}
8035with hasAnyParameter(...)
8036  matching int y
8037
8038For ObjectiveC, given
8039  @interface I - (void) f:(int) y; @end
8040
8041the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8042matches the declaration of method f with hasParameter
8043matching y.
8044
8045For blocks, given
8046  b = ^(int y) { printf("%d", y) };
8047
8048the matcher blockDecl(hasAnyParameter(hasName("y")))
8049matches the declaration of the block b with hasParameter
8050matching y.
8051</pre></td></tr>
8052
8053
8054<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>
8055<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8056declaration or a block.
8057
8058Given
8059  class X { void f(int x) {} };
8060cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8061  matches f(int x) {}
8062with hasParameter(...)
8063  matching int x
8064
8065For ObjectiveC, given
8066  @interface I - (void) f:(int) y; @end
8067
8068the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8069matches the declaration of method f with hasParameter
8070matching y.
8071</pre></td></tr>
8072
8073
8074<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>
8075<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8076or opaque value's source expression matches the given matcher.
8077
8078Example 1: matches "a string"
8079(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8080class URL { URL(string); };
8081URL url = "a string";
8082
8083Example 2: matches 'b' (matcher =
8084opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8085int a = b ?: 1;
8086</pre></td></tr>
8087
8088
8089<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>
8090<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8091overloads matches the given matcher.
8092
8093Given
8094  template &lt;typename T&gt; void foo(T);
8095  template &lt;typename T&gt; void bar(T);
8096  template &lt;typename T&gt; void baz(T t) {
8097    foo(t);
8098    bar(t);
8099  }
8100unresolvedLookupExpr(hasAnyDeclaration(
8101    functionTemplateDecl(hasName("foo"))))
8102  matches foo in foo(t); but not bar in bar(t);
8103</pre></td></tr>
8104
8105
8106<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>
8107<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8108
8109Given
8110  int (*ptr_to_array)[4];
8111  int (*ptr_to_func)(int);
8112
8113varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8114ptr_to_func but not ptr_to_array.
8115
8116Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8117</pre></td></tr>
8118
8119
8120<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>
8121<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8122pointee matches a given matcher.
8123
8124Given
8125  int *a;
8126  int const *b;
8127  float const *f;
8128pointerType(pointee(isConstQualified(), isInteger()))
8129  matches "int const *b"
8130
8131Usable 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;,
8132  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;
8133</pre></td></tr>
8134
8135
8136<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>
8137<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8138
8139Given:
8140  typedef int &amp;int_ref;
8141  int a;
8142  int_ref b = a;
8143
8144varDecl(hasType(qualType(referenceType()))))) will not match the
8145declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8146</pre></td></tr>
8147
8148
8149<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>
8150<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8151matches the given matcher.
8152
8153The associated declaration is:
8154- for type nodes, the declaration of the underlying type
8155- for CallExpr, the declaration of the callee
8156- for MemberExpr, the declaration of the referenced member
8157- for CXXConstructExpr, the declaration of the constructor
8158- for CXXNewExpr, the declaration of the operator new
8159- for ObjCIvarExpr, the declaration of the ivar
8160
8161For type nodes, hasDeclaration will generally match the declaration of the
8162sugared type. Given
8163  class X {};
8164  typedef X Y;
8165  Y y;
8166in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8167typedefDecl. A common use case is to match the underlying, desugared type.
8168This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8169  varDecl(hasType(hasUnqualifiedDesugaredType(
8170      recordType(hasDeclaration(decl())))))
8171In this matcher, the decl will match the CXXRecordDecl of class X.
8172
8173Usable 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;,
8174  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;,
8175  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;,
8176  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;,
8177  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;,
8178  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;,
8179  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
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('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>
8184<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8185
8186Given
8187  void (*fp)(void);
8188The matcher
8189  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8190would match the declaration for fp.
8191</pre></td></tr>
8192
8193
8194<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>
8195<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8196</pre></td></tr>
8197
8198
8199<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>
8200<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8201matches the specified matcher.
8202
8203Example matches y-&gt;x()
8204  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8205     cxxRecordDecl(hasName("Y")))))))
8206  class Y { public: void x(); };
8207  void z() { Y *y; y-&gt;x(); }
8208</pre></td></tr>
8209
8210
8211<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>
8212<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8213</pre></td></tr>
8214
8215
8216<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>
8217<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8218type matches the specified matcher.
8219
8220Example matches X &amp;x and const X &amp;y
8221    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8222  class X {
8223    void a(X b) {
8224      X &amp;x = b;
8225      const X &amp;y = b;
8226    }
8227  };
8228</pre></td></tr>
8229
8230
8231<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>
8232<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8233matches the given matcher.
8234
8235The associated declaration is:
8236- for type nodes, the declaration of the underlying type
8237- for CallExpr, the declaration of the callee
8238- for MemberExpr, the declaration of the referenced member
8239- for CXXConstructExpr, the declaration of the constructor
8240- for CXXNewExpr, the declaration of the operator new
8241- for ObjCIvarExpr, the declaration of the ivar
8242
8243For type nodes, hasDeclaration will generally match the declaration of the
8244sugared type. Given
8245  class X {};
8246  typedef X Y;
8247  Y y;
8248in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8249typedefDecl. A common use case is to match the underlying, desugared type.
8250This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8251  varDecl(hasType(hasUnqualifiedDesugaredType(
8252      recordType(hasDeclaration(decl())))))
8253In this matcher, the decl will match the CXXRecordDecl of class X.
8254
8255Usable 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;,
8256  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;,
8257  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;,
8258  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;,
8259  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;,
8260  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;,
8261  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8262</pre></td></tr>
8263
8264
8265<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>
8266<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
8267pointee matches a given matcher.
8268
8269Given
8270  int *a;
8271  int const *b;
8272  float const *f;
8273pointerType(pointee(isConstQualified(), isInteger()))
8274  matches "int const *b"
8275
8276Usable 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;,
8277  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;
8278</pre></td></tr>
8279
8280
8281<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>
8282<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
8283
8284Given
8285  return a + b;
8286hasReturnValue(binaryOperator())
8287  matches 'return a + b'
8288with binaryOperator()
8289  matching 'a + b'
8290</pre></td></tr>
8291
8292
8293<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>
8294<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
8295a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8296
8297Given
8298  { {}; 1+2; }
8299hasAnySubstatement(compoundStmt())
8300  matches '{ {}; 1+2; }'
8301with compoundStmt()
8302  matching '{}'
8303</pre></td></tr>
8304
8305
8306<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>
8307<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8308alignof.
8309</pre></td></tr>
8310
8311
8312<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>
8313<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
8314
8315Given:
8316F&amp; operator=(const F&amp; o) {
8317  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
8318  return *this;
8319}
8320returnStmt(forFunction(hasName("operator=")))
8321  matches 'return *this'
8322  but does not match 'return v &gt; 0'
8323</pre></td></tr>
8324
8325
8326<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>
8327<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8328sizeof.
8329</pre></td></tr>
8330
8331
8332<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>
8333<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
8334type that matches the provided matcher.
8335
8336Given
8337  template &lt;typename T&gt;
8338  double F(T t);
8339  int i;
8340  double j = F(i);
8341
8342substTemplateTypeParmType(hasReplacementType(type())) matches int
8343</pre></td></tr>
8344
8345
8346<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>
8347<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
8348statement. This matcher may produce multiple matches.
8349
8350Given
8351  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
8352switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
8353  matches four times, with "c" binding each of "case 1:", "case 2:",
8354"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
8355"switch (1)", "switch (2)" and "switch (2)".
8356</pre></td></tr>
8357
8358
8359<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>
8360<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
8361switch statement or conditional operator.
8362
8363Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8364  if (true) {}
8365</pre></td></tr>
8366
8367
8368<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>
8369<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
8370
8371Given:
8372 void foo() {
8373   if (int i = foobar(); i &gt; 0) {}
8374   switch (int i = foobar(); i) {}
8375   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8376 }
8377 void bar() {
8378   if (foobar() &gt; 0) {}
8379   switch (foobar()) {}
8380   for (auto&amp; x : get_range()) {}
8381 }
8382ifStmt(hasInitStatement(anything()))
8383  matches the if statement in foo but not in bar.
8384switchStmt(hasInitStatement(anything()))
8385  matches the switch statement in foo but not in bar.
8386cxxForRangeStmt(hasInitStatement(anything()))
8387  matches the range for statement in foo but not in bar.
8388</pre></td></tr>
8389
8390
8391<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>
8392<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
8393matches the given matcher.
8394
8395The associated declaration is:
8396- for type nodes, the declaration of the underlying type
8397- for CallExpr, the declaration of the callee
8398- for MemberExpr, the declaration of the referenced member
8399- for CXXConstructExpr, the declaration of the constructor
8400- for CXXNewExpr, the declaration of the operator new
8401- for ObjCIvarExpr, the declaration of the ivar
8402
8403For type nodes, hasDeclaration will generally match the declaration of the
8404sugared type. Given
8405  class X {};
8406  typedef X Y;
8407  Y y;
8408in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8409typedefDecl. A common use case is to match the underlying, desugared type.
8410This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8411  varDecl(hasType(hasUnqualifiedDesugaredType(
8412      recordType(hasDeclaration(decl())))))
8413In this matcher, the decl will match the CXXRecordDecl of class X.
8414
8415Usable 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;,
8416  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;,
8417  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;,
8418  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;,
8419  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;,
8420  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;,
8421  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8422</pre></td></tr>
8423
8424
8425<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>
8426<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
8427
8428Given
8429  struct B { int next; };
8430  template&lt;int(B::*next_ptr)&gt; struct A {};
8431  A&lt;&amp;B::next&gt; a;
8432templateSpecializationType(hasAnyTemplateArgument(
8433  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
8434  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
8435    B::next
8436</pre></td></tr>
8437
8438
8439<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>
8440<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
8441declaration.
8442
8443Given
8444  struct B { int next; };
8445  template&lt;int(B::*next_ptr)&gt; struct A {};
8446  A&lt;&amp;B::next&gt; a;
8447classTemplateSpecializationDecl(hasAnyTemplateArgument(
8448    refersToDeclaration(fieldDecl(hasName("next")))))
8449  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
8450    B::next
8451</pre></td></tr>
8452
8453
8454<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>
8455<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
8456
8457Given
8458  template&lt;int T&gt; struct C {};
8459  C&lt;42&gt; c;
8460classTemplateSpecializationDecl(
8461  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
8462  matches the implicit instantiation of C in C&lt;42&gt;.
8463</pre></td></tr>
8464
8465
8466<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>
8467<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
8468
8469Given
8470  template&lt;template &lt;typename&gt; class S&gt; class X {};
8471  template&lt;typename T&gt; class Y {};
8472  X&lt;Y&gt; xi;
8473classTemplateSpecializationDecl(hasAnyTemplateArgument(
8474    refersToTemplate(templateName())))
8475  matches the specialization X&lt;Y&gt;
8476</pre></td></tr>
8477
8478
8479<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>
8480<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
8481
8482Given
8483  struct X {};
8484  template&lt;typename T&gt; struct A {};
8485  A&lt;X&gt; a;
8486classTemplateSpecializationDecl(hasAnyTemplateArgument(
8487    refersToType(class(hasName("X")))))
8488  matches the specialization A&lt;X&gt;
8489</pre></td></tr>
8490
8491
8492<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>
8493<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8494functionDecl that have at least one TemplateArgument matching the given
8495InnerMatcher.
8496
8497Given
8498  template&lt;typename T&gt; class A {};
8499  template&lt;&gt; class A&lt;double&gt; {};
8500  A&lt;int&gt; a;
8501
8502  template&lt;typename T&gt; f() {};
8503  void func() { f&lt;int&gt;(); };
8504
8505classTemplateSpecializationDecl(hasAnyTemplateArgument(
8506    refersToType(asString("int"))))
8507  matches the specialization A&lt;int&gt;
8508
8509functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8510  matches the specialization f&lt;int&gt;
8511</pre></td></tr>
8512
8513
8514<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>
8515<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
8516matches the given matcher.
8517
8518The associated declaration is:
8519- for type nodes, the declaration of the underlying type
8520- for CallExpr, the declaration of the callee
8521- for MemberExpr, the declaration of the referenced member
8522- for CXXConstructExpr, the declaration of the constructor
8523- for CXXNewExpr, the declaration of the operator new
8524- for ObjCIvarExpr, the declaration of the ivar
8525
8526For type nodes, hasDeclaration will generally match the declaration of the
8527sugared type. Given
8528  class X {};
8529  typedef X Y;
8530  Y y;
8531in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8532typedefDecl. A common use case is to match the underlying, desugared type.
8533This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8534  varDecl(hasType(hasUnqualifiedDesugaredType(
8535      recordType(hasDeclaration(decl())))))
8536In this matcher, the decl will match the CXXRecordDecl of class X.
8537
8538Usable 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;,
8539  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;,
8540  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;,
8541  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;,
8542  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;,
8543  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;,
8544  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&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('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>
8549<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8550functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8551
8552Given
8553  template&lt;typename T, typename U&gt; class A {};
8554  A&lt;bool, int&gt; b;
8555  A&lt;int, bool&gt; c;
8556
8557  template&lt;typename T&gt; void f() {}
8558  void func() { f&lt;int&gt;(); };
8559classTemplateSpecializationDecl(hasTemplateArgument(
8560    1, refersToType(asString("int"))))
8561  matches the specialization A&lt;bool, int&gt;
8562
8563functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8564  matches the specialization f&lt;int&gt;
8565</pre></td></tr>
8566
8567
8568<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>
8569<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
8570matches the given matcher.
8571
8572The associated declaration is:
8573- for type nodes, the declaration of the underlying type
8574- for CallExpr, the declaration of the callee
8575- for MemberExpr, the declaration of the referenced member
8576- for CXXConstructExpr, the declaration of the constructor
8577- for CXXNewExpr, the declaration of the operator new
8578- for ObjCIvarExpr, the declaration of the ivar
8579
8580For type nodes, hasDeclaration will generally match the declaration of the
8581sugared type. Given
8582  class X {};
8583  typedef X Y;
8584  Y y;
8585in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8586typedefDecl. A common use case is to match the underlying, desugared type.
8587This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8588  varDecl(hasType(hasUnqualifiedDesugaredType(
8589      recordType(hasDeclaration(decl())))))
8590In this matcher, the decl will match the CXXRecordDecl of class X.
8591
8592Usable 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;,
8593  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;,
8594  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;,
8595  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;,
8596  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;,
8597  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;,
8598  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8599</pre></td></tr>
8600
8601
8602<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>
8603<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
8604QualType-matcher matches.
8605</pre></td></tr>
8606
8607
8608<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>
8609<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
8610matcher.
8611
8612Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8613            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8614            and U (matcher = typedefDecl(hasType(asString("int")))
8615            and friend class X (matcher = friendDecl(hasType("X"))
8616 class X {};
8617 void y(X &amp;x) { x; X z; }
8618 typedef int U;
8619 class Y { friend class X; };
8620</pre></td></tr>
8621
8622
8623<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>
8624<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
8625matches the given matcher.
8626
8627The associated declaration is:
8628- for type nodes, the declaration of the underlying type
8629- for CallExpr, the declaration of the callee
8630- for MemberExpr, the declaration of the referenced member
8631- for CXXConstructExpr, the declaration of the constructor
8632- for CXXNewExpr, the declaration of the operator new
8633- for ObjCIvarExpr, the declaration of the ivar
8634
8635For type nodes, hasDeclaration will generally match the declaration of the
8636sugared type. Given
8637  class X {};
8638  typedef X Y;
8639  Y y;
8640in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8641typedefDecl. A common use case is to match the underlying, desugared type.
8642This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8643  varDecl(hasType(hasUnqualifiedDesugaredType(
8644      recordType(hasDeclaration(decl())))))
8645In this matcher, the decl will match the CXXRecordDecl of class X.
8646
8647Usable 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;,
8648  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;,
8649  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;,
8650  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;,
8651  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;,
8652  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;,
8653  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8654</pre></td></tr>
8655
8656
8657<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>
8658<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
8659type of the matched node.
8660
8661For example, in:
8662  class A {};
8663  using B = A;
8664The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
8665both B and A.
8666</pre></td></tr>
8667
8668
8669<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>
8670<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
8671
8672Given
8673  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
8674unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
8675  matches sizeof(a) and alignof(c)
8676</pre></td></tr>
8677
8678
8679<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>
8680<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
8681
8682Example matches true (matcher = hasUnaryOperand(
8683                                  cxxBoolLiteral(equals(true))))
8684  !true
8685</pre></td></tr>
8686
8687
8688<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>
8689<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
8690given matcher. Implicit object expressions are included; that is, it matches
8691use of implicit `this`.
8692
8693Given
8694  struct X {
8695    int m;
8696    int f(X x) { x.m; return m; }
8697  };
8698memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8699  matches `x.m`, but not `m`; however,
8700memberExpr(hasObjectExpression(hasType(pointsTo(
8701     cxxRecordDecl(hasName("X"))))))
8702  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8703</pre></td></tr>
8704
8705
8706<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>
8707<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
8708matches the given matcher.
8709
8710The associated declaration is:
8711- for type nodes, the declaration of the underlying type
8712- for CallExpr, the declaration of the callee
8713- for MemberExpr, the declaration of the referenced member
8714- for CXXConstructExpr, the declaration of the constructor
8715- for CXXNewExpr, the declaration of the operator new
8716- for ObjCIvarExpr, the declaration of the ivar
8717
8718For type nodes, hasDeclaration will generally match the declaration of the
8719sugared type. Given
8720  class X {};
8721  typedef X Y;
8722  Y y;
8723in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8724typedefDecl. A common use case is to match the underlying, desugared type.
8725This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8726  varDecl(hasType(hasUnqualifiedDesugaredType(
8727      recordType(hasDeclaration(decl())))))
8728In this matcher, the decl will match the CXXRecordDecl of class X.
8729
8730Usable 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;,
8731  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;,
8732  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;,
8733  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;,
8734  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;,
8735  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;,
8736  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8737</pre></td></tr>
8738
8739
8740<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>
8741<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
8742
8743Given
8744  namespace X { void b(); }
8745  using X::b;
8746usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
8747  matches using X::b </pre></td></tr>
8748
8749
8750<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>
8751<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
8752matched by the given matcher.
8753
8754Given
8755  namespace X { int a; void b(); }
8756  using X::a;
8757  using X::b;
8758usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
8759  matches using X::b but not using X::a </pre></td></tr>
8760
8761
8762<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>
8763<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
8764declaration's type.
8765
8766In case of a value declaration (for example a variable declaration),
8767this resolves one layer of indirection. For example, in the value
8768declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8769X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8770declaration of x.
8771
8772Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8773            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8774            and friend class X (matcher = friendDecl(hasType("X"))
8775 class X {};
8776 void y(X &amp;x) { x; X z; }
8777 class Y { friend class X; };
8778
8779Example matches class Derived
8780(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8781class Base {};
8782class Derived : Base {};
8783
8784Usable 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;,
8785Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8786</pre></td></tr>
8787
8788
8789<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>
8790<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
8791matcher.
8792
8793Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8794            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8795            and U (matcher = typedefDecl(hasType(asString("int")))
8796            and friend class X (matcher = friendDecl(hasType("X"))
8797 class X {};
8798 void y(X &amp;x) { x; X z; }
8799 typedef int U;
8800 class Y { friend class X; };
8801</pre></td></tr>
8802
8803
8804<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>
8805<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
8806that matches the given matcher.
8807
8808Example matches x (matcher = varDecl(hasInitializer(callExpr())))
8809  bool y() { return true; }
8810  bool x = y();
8811</pre></td></tr>
8812
8813
8814<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>
8815<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
8816expression.
8817
8818Given
8819  void f(int b) {
8820    int a[b];
8821  }
8822variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
8823  varDecl(hasName("b")))))))
8824  matches "int a[b]"
8825</pre></td></tr>
8826
8827
8828<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>
8829<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
8830
8831
8832<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>
8833<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
8834switch statement or conditional operator.
8835
8836Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8837  if (true) {}
8838</pre></td></tr>
8839
8840<!--END_TRAVERSAL_MATCHERS -->
8841</table>
8842
8843</div>
8844</body>
8845</html>
8846
8847
8848