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