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