1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20span.mono { font-family: monospace; }
21
22.traverse_compare, .traverse_compare td, .traverse_compare th {
23  border: 1px solid black;
24  border-collapse: collapse;
25}
26</style>
27<script type="text/javascript">
28function toggle(id) {
29  if (!id) return;
30  row = document.getElementById(id);
31  if (row.style.display != 'table-cell')
32    row.style.display = 'table-cell';
33  else
34    row.style.display = 'none';
35}
36</script>
37</head>
38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39
40<!--#include virtual="../menu.html.incl"-->
41
42<div id="content">
43
44<h1>AST Matcher Reference</h1>
45
46<p>This document shows all currently implemented matchers. The matchers are grouped
47by category and node type they match. You can click on matcher names to show the
48matcher's source documentation.</p>
49
50<p>There are three different basic categories of matchers:
51<ul>
52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55</ul>
56</p>
57
58<p>Within each category the matchers are ordered by node type they match on.
59Note that if a matcher can match multiple node types, it will appear
60multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
61find all matchers that can be used to match on Stmt nodes.</p>
62
63<p>The exception to that rule are matchers that can match on any node. Those
64are marked with a * and are listed in the beginning of each category.</p>
65
66<p>Note that the categorization of matchers is a great help when you combine
67them into matcher expressions. You will usually want to form matcher expressions
68that read like english sentences by alternating between node matchers and
69narrowing or traversal matchers, like this:
70<pre>
71recordDecl(hasDescendant(
72    ifStmt(hasTrueExpression(
73        expr(hasDescendant(
74            ifStmt()))))))
75</pre>
76</p>
77
78<!-- ======================================================================= -->
79<h2 id="traverse-mode">Traverse Mode</h2>
80<!-- ======================================================================= -->
81
82<p>The default mode of operation of AST Matchers visits all nodes in the AST,
83even if they are not spelled in the source. This is
84<span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
85that explicitly traverse or ignore implicit nodes, such as parentheses
86surrounding an expression or expressions with cleanups.  These implicit
87nodes are not always obvious from the syntax of the source code, and so this
88mode requires careful consideration and testing to get the desired behavior
89from an AST matcher.
90</p>
91
92<p>In addition, because template instantiations are matched in the default mode,
93transformations can be accidentally made to template declarations. Finally,
94because implicit nodes are matched by default, transformations can be made on
95entirely incorrect places in the code.</p>
96
97<p>For these reasons, it is possible to ignore AST nodes which are not spelled
98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99mode. This is likely to be far less error-prone for users who are not already
100very familiar with where implicit nodes appear in the AST. It is also likely
101to be less error-prone for experienced AST users, as difficult cases do not
102need to be encountered and matcher expressions adjusted for these cases.</p>
103
104<p>In clang-query, the mode can be changed with
105<pre>
106set traversal IgnoreUnlessSpelledInSource
107</pre>
108</p>
109This affects both matchers and AST dump output in results.
110
111<p>When using the C++ API such as in clang-tidy checks, the
112<span class="mono">traverse()</span> matcher is used to set the mode:
113<pre>
114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115  returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116  ), this);
117</pre>
118</p>
119<p>The following table compares the <span class="mono">AsIs</span> mode with
120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121
122<table class="traverse_compare">
123<tr>
124<th></th>
125<th><span class="mono">AsIs</span></th>
126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127</tr>
128<tr>
129  <td>AST dump of <span class="mono">func1</span>:
130<pre>
131struct B {
132  B(int);
133};
134
135B func1() { return 42; }
136</pre>
137
138  </td>
139  <td>
140C++98 dialect:
141<pre>
142FunctionDecl
143`-CompoundStmt
144  `-ReturnStmt
145    `-ExprWithCleanups
146      `-CXXConstructExpr
147        `-MaterializeTemporaryExpr
148          `-ImplicitCastExpr
149            `-ImplicitCastExpr
150              `-CXXConstructExpr
151                `-IntegerLiteral 'int' 42
152</pre>
153C++11, C++14 dialect:
154<pre>
155FunctionDecl
156`-CompoundStmt
157  `-ReturnStmt
158    `-ExprWithCleanups
159      `-CXXConstructExpr
160        `-MaterializeTemporaryExpr
161          `-ImplicitCastExpr
162            `-CXXConstructExpr
163              `-IntegerLiteral 'int' 42
164</pre>
165C++17, C++20 dialect:
166<pre>
167FunctionDecl
168`-CompoundStmt
169  `-ReturnStmt
170    `-ImplicitCastExpr
171      `-CXXConstructExpr
172        `-IntegerLiteral 'int' 42
173</pre>
174</td>
175  <td>
176All dialects:
177    <pre>
178FunctionDecl
179`-CompoundStmt
180  `-ReturnStmt
181    `-IntegerLiteral 'int' 42
182</pre></td>
183</tr>
184
185<tr>
186<td>Matcher for returned <span class="mono">42</span>:
187<pre>
188struct B {
189  B(int);
190};
191
192B func1() { return 42; }
193</pre>
194
195  </td>
196  <td>
197All dialects:
198<pre>
199returnStmt(hasReturnValue(
200    ignoringImplicit(
201        ignoringElidableConstructorCall(
202            ignoringImplicit(
203                cxxConstructExpr(hasArgument(0,
204                    ignoringImplicit(
205                        integerLiteral().bind("returnVal")
206                        )
207                    ))
208                )
209            )
210        )
211    ))
212</pre></td>
213  <td>
214All dialects:
215<pre>
216returnStmt(hasReturnValue(
217    integerLiteral().bind("returnVal")
218))
219</pre></td>
220</tr>
221<tr>
222<td>Match result for
223<pre>implicitCastExpr()</pre>
224given:
225<pre>
226struct B {
227  B(int);
228};
229
230B func1() { return 42; }
231</pre>
232
233</td>
234<td>
235Match found.</td>
236  <td>
237No match.</td>
238</tr>
239<tr>
240  <td>Match result for:
241<pre>
242cxxConstructorDecl(
243  isCopyConstructor()
244  ).bind("prepend_explicit")
245</pre>
246given:
247<pre>
248struct Other {};
249struct Copyable {
250  Other m_o;
251  Copyable();
252};
253</pre>
254</td>
255<td>
256Match found. Insertion produces incorrect output:
257<pre>
258struct Other {};
259struct explicit Copyable {
260  Other m_o;
261  Copyable();
262};
263</pre>
264</td>
265<td>
266No match found. Incorrect replacement not possible.
267</td>
268</tr>
269<tr>
270  <td>Replacement of <span class="mono">begin()</span>
271    with <span class="mono">cbegin()</span>:
272<pre>
273cxxMemberCallExpr(
274  on(ConstContainerExpr),
275  callee(cxxMethodDecl(hasName("begin")))
276  ).bind("replace_with_cbegin")
277</pre>
278given:
279<pre>
280void foo() {
281  const Container c;
282  c.begin();
283
284  for (auto i : c) {
285  }
286}
287</pre>
288</td>
289<td>
2902 matches found. Replacement produces incorrect output:
291<pre>
292void foo() {
293  const Container c;
294  c.cbegin();
295
296  for (auto i :.cbegin() c) {
297  }
298}
299</pre>
300</td>
301<td>
3021 match found. Replacement produces correct output:
303<pre>
304void foo() {
305  const Container c;
306  c.cbegin();
307
308  for (auto i : c) {
309  }
310}
311</pre>
312</td>
313</tr>
314<tr>
315  <td>Replacement of <span class="mono">int</span> member
316    with <span class="mono">safe_int</span>:
317<pre>
318fieldDecl(
319  hasType(asString("int"))
320  ).bind("use_safe_int")
321</pre>
322given:
323<pre>
324struct S {
325  int m_i;
326};
327
328template &lt;typename T&gt; struct TemplStruct {
329  TemplStruct() {}
330  ~TemplStruct() {}
331
332private:
333  T m_t;
334};
335
336void instantiate() { TemplStruct&lt;int&gt; ti; }
337</pre>
338</td>
339<td>
3402 matches found. Replacement produces incorrect output:
341<pre>
342struct S {
343  safe_int m_i;
344};
345
346template &lt;typename T&gt; struct TemplStruct {
347  TemplStruct() {}
348  ~TemplStruct() {}
349
350private:
351  safe_int m_t;
352};
353
354void instantiate() { TemplStruct&lt;int&gt; ti; }
355</pre>
356</td>
357<td>
3581 match found. Replacement produces correct output:
359<pre>
360struct S {
361  safe_int m_i;
362};
363
364template &lt;typename T&gt; struct TemplStruct {
365  TemplStruct() {}
366  ~TemplStruct() {}
367
368private:
369  T m_t;
370};
371
372void instantiate() { TemplStruct&lt;int&gt; ti; }
373</pre>
374</td>
375</tr>
376<tr>
377  <td>Add prefix to member initializer
378<pre>
379cxxCtorInitializer(
380  forField(fieldDecl())
381  ).bind("add_prefix")
382</pre>
383given:
384<pre>
385struct Simple {};
386
387struct Record {
388  Record() : i(42) {}
389private:
390  int i;
391  Simple s;
392};
393</pre>
394</td>
395<td>
3962 matches found. Replacement produces incorrect output:
397<pre>
398struct Simple {};
399
400struct Record {
401  m_Record() : m_i(42) {}
402private:
403  int i;
404  Simple s;
405};
406</pre>
407</td>
408<td>
4091 match found. Replacement produces correct output:
410<pre>
411struct Simple {};
412
413struct Record {
414  Record() : m_i(42) {}
415private:
416  int i;
417  Simple s;
418};
419</pre>
420</td>
421</tr>
422<tr>
423  <td>Ignored default arguments
424<pre>
425callExpr(
426  callee(functionDecl(
427    hasName("hasDefaultArg")
428    )),
429  argumentCountIs(1)
430  ).bind("add_prefix")
431</pre>
432given:
433<pre>
434void hasDefaultArg(int i, int j = 0) {}
435void callDefaultArg() { hasDefaultArg(42); }
436</pre>
437</td>
438<td>
439No match.
440</td>
441<td>
4421 match found.
443</td>
444</tr>
445<tr>
446  <td>Lambda fields
447<pre>
448fieldDecl(
449  hasType(asString("int"))
450  ).bind("make_safe")
451</pre>
452given:
453<pre>
454struct S {
455  int m_i;
456};
457
458void func() {
459  int a = 0;
460  int c = 0;
461
462  auto l = [a, b = c](int d) { int e = d; };
463  l(43);
464}
465</pre>
466</td>
467<td>
4682 matches found. Replacement produces incorrect output:
469<pre>
470struct S {
471  safe_int m_i;
472};
473
474void func() {
475  int a = 0;
476  int c = 0;
477
478  auto l = [safe_a, safe_b = c](int d) { int e = d; };
479  l(43);
480}
481</pre>
482</td>
483<td>
4841 match found. Replacement produces correct output:
485<pre>
486struct S {
487  safe_int m_i;
488};
489
490void func() {
491  int a = 0;
492  int c = 0;
493
494  auto l = [a, b = c](int d) { int e = d; };
495  l(43);
496}
497</pre>
498</td>
499
500</tr>
501
502
503
504
505
506<tr>
507  <td>Rewritten binary operators
508<pre>
509binaryOperator(
510  hasOperatorName("&lt;"),
511  hasRHS(hasDescendant(integerLiteral(equals(0))))
512  )
513</pre>
514given:
515<pre>
516#include &lt;compare&gt;
517
518class HasSpaceship {
519public:
520   int x;
521   bool operator==(const HasSpaceship&) const = default;
522   std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523};
524
525bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526   return a < b;
527}
528</pre>
529</td>
530<td>
5311 match found.
532
533<pre>
534   return a < b;
535          ^~~~~
536</pre>
537
538</td>
539<td>
540No match found.
541</td>
542</tr>
543</table>
544
545<!-- ======================================================================= -->
546<h2 id="decl-matchers">Node Matchers</h2>
547<!-- ======================================================================= -->
548
549<p>Node matchers are at the core of matcher expressions - they specify the type
550of node that is expected. Every match expression starts with a node matcher,
551which can then be further refined with a narrowing or traversal matcher. All
552traversal matchers take node matchers as their arguments.</p>
553
554<p>For convenience, all node matchers take an arbitrary number of arguments
555and implicitly act as allOf matchers.</p>
556
557<p>Node matchers are the only matchers that support the bind("id") call to
558bind the matched node to the given string, to be later retrieved from the
559match callback.</p>
560
561<p>It is important to remember that the arguments to node matchers are
562predicates on the same node, just with additional information about the type.
563This is often useful to make matcher expression more readable by inlining bind
564calls into redundant node matchers inside another node matcher:
565<pre>
566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567// the same node.
568recordDecl(decl().bind("id"), hasName("::MyClass"))
569</pre>
570</p>
571
572<table>
573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574<!-- START_DECL_MATCHERS -->
575
576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;...</td></tr>
577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes.
578Attributes may be attached with a variety of different syntaxes (including
579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
580and ``#pragma``s). They may also be implicit.
581
582Given
583  struct [[nodiscard]] Foo{};
584  void bar(int * __attribute__((nonnull)) );
585  __declspec(noinline) void baz();
586
587  #pragma omp declare simd
588  int min();
589attr()
590  matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line.
591</pre></td></tr>
592
593
594<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;...</td></tr>
595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
596
597Examples matches public virtual B.
598  class B {};
599  class C : public virtual B {};
600</pre></td></tr>
601
602
603<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>
604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
605
606Examples matches i(42).
607  class C {
608    C() : i(42) {}
609    int i;
610  };
611</pre></td></tr>
612
613
614<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
616
617Given
618  class C {
619  public:
620    int a;
621  };
622accessSpecDecl()
623  matches 'public:'
624</pre></td></tr>
625
626
627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;...</td></tr>
628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
629Example matches foo and bar
630(matcher = bindingDecl()
631
632  auto [foo, bar] = std::make_pair{42, 42};
633</pre></td></tr>
634
635
636<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>
637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
638
639Example matches the declaration of the nameless block printing an input
640integer.
641
642  myFunc(^(int p) {
643    printf("%d", p);
644  })
645</pre></td></tr>
646
647
648<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>
649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
650
651Example matches Z
652  template&lt;class T&gt; class Z {};
653</pre></td></tr>
654
655
656<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
658
659Given
660  template&lt;class T1, class T2, int I&gt;
661  class A {};
662
663  template&lt;class T, int I&gt;
664  class A&lt;T, T*, I&gt; {};
665
666  template&lt;&gt;
667  class A&lt;int, int, 1&gt; {};
668classTemplatePartialSpecializationDecl()
669  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
670</pre></td></tr>
671
672
673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
675
676Given
677  template&lt;typename T&gt; class A {};
678  template&lt;&gt; class A&lt;double&gt; {};
679  A&lt;int&gt; a;
680classTemplateSpecializationDecl()
681  matches the specializations A&lt;int&gt; and A&lt;double&gt;
682</pre></td></tr>
683
684
685<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
687
688Example matches Foo::Foo() and Foo::Foo(int)
689  class Foo {
690   public:
691    Foo();
692    Foo(int);
693    int DoSomething();
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('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>
699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
700
701Example matches the operator.
702  class X { operator int() const; };
703</pre></td></tr>
704
705
706<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>
707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
708
709Example matches the deduction guide.
710  template&lt;typename T&gt;
711  class X { X(int) };
712  X(int) -&gt; X&lt;int&gt;;
713</pre></td></tr>
714
715
716<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>
717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
718
719Example matches Foo::~Foo()
720  class Foo {
721   public:
722    virtual ~Foo();
723  };
724</pre></td></tr>
725
726
727<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>
728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
729
730Example matches y
731  class X { void y(); };
732</pre></td></tr>
733
734
735<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>
736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
737
738Example matches X, Z
739  class X;
740  template&lt;class T&gt; class Z {};
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('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>
745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
746
747Examples matches X, C, and the friend declaration inside C;
748  void X();
749  class C {
750    friend X;
751  };
752</pre></td></tr>
753
754
755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
757and non-type template parameter declarations).
758
759Given
760  class X { int y; };
761declaratorDecl()
762  matches int y.
763</pre></td></tr>
764
765
766<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
768
769Examples matches the declaration node with foo and bar, but not
770number.
771(matcher = declStmt(has(decompositionDecl())))
772
773  int number = 42;
774  auto [foo, bar] = std::make_pair{42, 42};
775</pre></td></tr>
776
777
778<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>
779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
780
781Example matches A, B, C
782  enum X {
783    A, B, C
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('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>
789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
790
791Example matches X
792  enum X {
793    A, B, C
794  };
795</pre></td></tr>
796
797
798<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>
799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
800
801Given
802  class X { int m; };
803fieldDecl()
804  matches 'm'.
805</pre></td></tr>
806
807
808<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>
809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
810
811Given
812  class X { friend void foo(); };
813friendDecl()
814  matches 'friend void foo()'.
815</pre></td></tr>
816
817
818<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>
819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
820
821Example matches f
822  void f();
823</pre></td></tr>
824
825
826<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>
827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
828
829Example matches f
830  template&lt;class T&gt; void f(T t) {}
831</pre></td></tr>
832
833
834<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>
835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
836
837Given
838  struct X { struct { int a; }; };
839indirectFieldDecl()
840  matches 'a'.
841</pre></td></tr>
842
843
844<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>
845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
846
847Given
848  goto FOO;
849  FOO: bar();
850labelDecl()
851  matches 'FOO:'
852</pre></td></tr>
853
854
855<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>
856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
857
858Given
859  extern "C" {}
860linkageSpecDecl()
861  matches "extern "C" {}"
862</pre></td></tr>
863
864
865<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
867
868Example matches X, S, the anonymous union type, i, and U;
869  typedef int X;
870  struct S {
871    union {
872      int i;
873    } U;
874  };
875</pre></td></tr>
876
877
878<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>
879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
880
881Given
882  namespace test {}
883  namespace alias = ::test;
884namespaceAliasDecl()
885  matches "namespace alias" but not "namespace test"
886</pre></td></tr>
887
888
889<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>
890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
891
892Given
893  namespace {}
894  namespace test {}
895namespaceDecl()
896  matches "namespace {}" and "namespace test {}"
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('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>
901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
902
903Given
904  template &lt;typename T, int N&gt; struct C {};
905nonTypeTemplateParmDecl()
906  matches 'N', but not 'T'.
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('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>
911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
912
913Example matches Foo (Additions)
914  @interface Foo (Additions)
915  @end
916</pre></td></tr>
917
918
919<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>
920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
921
922Example matches Foo (Additions)
923  @implementation Foo (Additions)
924  @end
925</pre></td></tr>
926
927
928<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>
929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
930
931Example matches Foo
932  @implementation Foo
933  @end
934</pre></td></tr>
935
936
937<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>
938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
939
940Example matches Foo
941  @interface Foo
942  @end
943</pre></td></tr>
944
945
946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
948
949Example matches _enabled
950  @implementation Foo {
951    BOOL _enabled;
952  }
953  @end
954</pre></td></tr>
955
956
957<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
959
960Example matches both declaration and definition of -[Foo method]
961  @interface Foo
962  - (void)method;
963  @end
964
965  @implementation Foo
966  - (void)method {}
967  @end
968</pre></td></tr>
969
970
971<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>
972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
973
974Example matches enabled
975  @interface Foo
976  @property BOOL enabled;
977  @end
978</pre></td></tr>
979
980
981<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>
982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
983
984Example matches FooDelegate
985  @protocol FooDelegate
986  @end
987</pre></td></tr>
988
989
990<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>
991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
992
993Given
994  void f(int x);
995parmVarDecl()
996  matches int x.
997</pre></td></tr>
998
999
1000<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>
1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
1002
1003Example matches X, Z, U, and S
1004  class X;
1005  template&lt;class T&gt; class Z {};
1006  struct S {};
1007  union U {};
1008</pre></td></tr>
1009
1010
1011<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>
1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
1013
1014Example:
1015  staticAssertExpr()
1016matches
1017  static_assert(sizeof(S) == sizeof(int))
1018in
1019  struct S {
1020    int x;
1021  };
1022  static_assert(sizeof(S) == sizeof(int));
1023</pre></td></tr>
1024
1025
1026<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>
1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1028
1029Example matches X, Z, U, S, E
1030  class X;
1031  template&lt;class T&gt; class Z {};
1032  struct S {};
1033  union U {};
1034  enum E {
1035    A, B, C
1036  };
1037</pre></td></tr>
1038
1039
1040<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1042
1043Given
1044  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
1045templateTypeParmDecl()
1046  matches 'Z', but not 'N'.
1047</pre></td></tr>
1048
1049
1050<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1052
1053Given
1054  template &lt;typename T, int N&gt; struct C {};
1055templateTypeParmDecl()
1056  matches 'T', but not 'N'.
1057</pre></td></tr>
1058
1059
1060<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('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>
1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1062
1063Given
1064  int X;
1065  namespace NS {
1066  int Y;
1067  }  // namespace NS
1068decl(hasDeclContext(translationUnitDecl()))
1069  matches "int X", but not "int Y".
1070</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('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>
1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1075
1076Given
1077  typedef int X;
1078  using Y = int;
1079typeAliasDecl()
1080  matches "using Y = int", but not "typedef int X"
1081</pre></td></tr>
1082
1083
1084<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>
1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1086
1087typeAliasTemplateDecl() matches
1088  template &lt;typename T&gt;
1089  using Y = X&lt;T&gt;;
1090</pre></td></tr>
1091
1092
1093<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>
1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1095
1096Given
1097  typedef int X;
1098  using Y = int;
1099typedefDecl()
1100  matches "typedef int X", but not "using Y = int"
1101</pre></td></tr>
1102
1103
1104<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>
1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1106
1107Given
1108  typedef int X;
1109  using Y = int;
1110typedefNameDecl()
1111  matches "typedef int X" and "using Y = int"
1112</pre></td></tr>
1113
1114
1115<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>
1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1117typename.
1118
1119Given
1120  template &lt;typename T&gt;
1121  struct Base { typedef T Foo; };
1122
1123  template&lt;typename T&gt;
1124  struct S : private Base&lt;T&gt; {
1125    using typename Base&lt;T&gt;::Foo;
1126  };
1127unresolvedUsingTypenameDecl()
1128  matches using Base&lt;T&gt;::Foo </pre></td></tr>
1129
1130
1131<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>
1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1133
1134Given
1135  template&lt;typename X&gt;
1136  class C : private X {
1137    using X::x;
1138  };
1139unresolvedUsingValueDecl()
1140  matches using X::x </pre></td></tr>
1141
1142
1143<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>
1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1145
1146Given
1147  namespace X { int x; }
1148  using X::x;
1149usingDecl()
1150  matches using X::x </pre></td></tr>
1151
1152
1153<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>
1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1155
1156Given
1157  namespace X { int x; }
1158  using namespace X;
1159usingDirectiveDecl()
1160  matches using namespace X </pre></td></tr>
1161
1162
1163<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>&gt;...</td></tr>
1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations.
1165
1166Given
1167  namespace X { enum x {...}; }
1168  using enum X::x;
1169usingEnumDecl()
1170  matches using enum X::x </pre></td></tr>
1171
1172
1173<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>
1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1175
1176Example matches A, B, C and F
1177  enum X { A, B, C };
1178  void F();
1179</pre></td></tr>
1180
1181
1182<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>
1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1184
1185Note: this does not match declarations of member variables, which are
1186"field" declarations in Clang parlance.
1187
1188Example matches a
1189  int a;
1190</pre></td></tr>
1191
1192
1193<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('lambdaCapture0')"><a name="lambdaCapture0Anchor">lambdaCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;...</td></tr>
1194<tr><td colspan="4" class="doc" id="lambdaCapture0"><pre>Matches lambda captures.
1195
1196Given
1197  int main() {
1198    int x;
1199    auto f = [x](){};
1200    auto g = [x = 1](){};
1201  }
1202In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`,
1203`lambdaCapture()` matches `x` and `x=1`.
1204</pre></td></tr>
1205
1206
1207<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>
1208<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1209</pre></td></tr>
1210
1211
1212<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>
1213<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1214
1215Given
1216  namespace ns {
1217    struct A { static void f(); };
1218    void A::f() {}
1219    void g() { A::f(); }
1220  }
1221  ns::A a;
1222nestedNameSpecifier()
1223  matches "ns::" and both "A::"
1224</pre></td></tr>
1225
1226
1227<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>
1228<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1229
1230Given
1231
1232  #pragma omp parallel default(none)
1233  #pragma omp parallel default(shared)
1234  #pragma omp parallel default(firstprivate)
1235  #pragma omp parallel
1236
1237``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1238``default(firstprivate)``
1239</pre></td></tr>
1240
1241
1242<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>
1243<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1244</pre></td></tr>
1245
1246
1247<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>
1248<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1249
1250Given
1251  FOO: bar();
1252  void *ptr = &amp;&amp;FOO;
1253  goto *bar;
1254addrLabelExpr()
1255  matches '&amp;&amp;FOO'
1256</pre></td></tr>
1257
1258
1259<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>
1260<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1261
1262Given
1263  int i = a[1];
1264arraySubscriptExpr()
1265  matches "a[1]"
1266</pre></td></tr>
1267
1268
1269<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>
1270<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1271
1272 int i = 100;
1273  __asm("mov al, 2");
1274asmStmt()
1275  matches '__asm("mov al, 2")'
1276</pre></td></tr>
1277
1278
1279<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>
1280<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1281Example matches __atomic_load_n(ptr, 1)
1282  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1283</pre></td></tr>
1284
1285
1286<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>
1287<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1288
1289Given
1290  @autoreleasepool {
1291    int x = 0;
1292  }
1293autoreleasePoolStmt(stmt()) matches the declaration of "x"
1294inside the autorelease pool.
1295</pre></td></tr>
1296
1297
1298<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>
1299<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1300
1301Example matches a ?: b
1302  (a ?: b) + 42;
1303</pre></td></tr>
1304
1305
1306<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>
1307<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1308
1309Example matches a || b
1310  !(a || b)
1311See also the binaryOperation() matcher for more-general matching.
1312</pre></td></tr>
1313
1314
1315<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>
1316<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1317
1318Example: matches "^{}":
1319  void f() { ^{}(); }
1320</pre></td></tr>
1321
1322
1323<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>
1324<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1325
1326Given
1327  while (true) { break; }
1328breakStmt()
1329  matches 'break'
1330</pre></td></tr>
1331
1332
1333<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>
1334<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1335
1336Example: Matches (int) 2.2f in
1337  int i = (int) 2.2f;
1338</pre></td></tr>
1339
1340
1341<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>
1342<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1343
1344Example matches x.y() and y()
1345  X x;
1346  x.y();
1347  y();
1348</pre></td></tr>
1349
1350
1351<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1352<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1353
1354Given
1355  switch(a) { case 42: break; default: break; }
1356caseStmt()
1357  matches 'case 42:'.
1358</pre></td></tr>
1359
1360
1361<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1362<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1363
1364Example: castExpr() matches each of the following:
1365  (int) 3;
1366  const_cast&lt;Expr *&gt;(SubExpr);
1367  char c = 0;
1368but does not match
1369  int i = (0);
1370  int k = 0;
1371</pre></td></tr>
1372
1373
1374<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>
1375<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1376
1377Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1378though.
1379
1380Example matches 'a', L'a'
1381  char ch = 'a';
1382  wchar_t chw = L'a';
1383</pre></td></tr>
1384
1385
1386<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>
1387<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
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('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>&gt;...</td></tr>
1392<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1393
1394Given
1395  co_await 1;
1396coawaitExpr()
1397  matches 'co_await 1'
1398</pre></td></tr>
1399
1400
1401<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>
1402<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1403
1404Example match: {1}, (1, 2)
1405  int array[4] = {1};
1406  vector int myvec = (vector int)(1, 2);
1407</pre></td></tr>
1408
1409
1410<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>
1411<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1412
1413Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1414  for (;;) {{}}
1415</pre></td></tr>
1416
1417
1418<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>
1419<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1420
1421Example matches a ? b : c
1422  (a ? b : c) + 42
1423</pre></td></tr>
1424
1425
1426<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>
1427<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1428
1429Example matches the constant in the case statement:
1430    (matcher = constantExpr())
1431  switch (a) {
1432  case 37: break;
1433  }
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('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>
1438<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1439
1440Given
1441  while (true) { continue; }
1442continueStmt()
1443  matches 'continue'
1444</pre></td></tr>
1445
1446
1447<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>&gt;...</td></tr>
1448<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1449
1450Given
1451  while (true) { co_return; }
1452coreturnStmt()
1453  matches 'co_return'
1454</pre></td></tr>
1455
1456
1457<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>&gt;...</td></tr>
1458<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1459
1460Given
1461  co_yield 1;
1462coyieldExpr()
1463  matches 'co_yield 1'
1464</pre></td></tr>
1465
1466
1467<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>
1468<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1469
1470Example matches,
1471  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
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('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>
1476<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1477
1478Example matches FunctionTakesString(GetStringByValue())
1479    (matcher = cxxBindTemporaryExpr())
1480  FunctionTakesString(GetStringByValue());
1481  FunctionTakesStringByPointer(GetStringPointer());
1482</pre></td></tr>
1483
1484
1485<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>
1486<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1487
1488Example matches true
1489  true
1490</pre></td></tr>
1491
1492
1493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1494<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1495
1496  try {} catch(int i) {}
1497cxxCatchStmt()
1498  matches 'catch(int i)'
1499</pre></td></tr>
1500
1501
1502<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1503<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1504
1505Example: Matches const_cast&lt;int*&gt;(&amp;r) in
1506  int n = 42;
1507  const int &amp;r(n);
1508  int* p = const_cast&lt;int*&gt;(&amp;r);
1509</pre></td></tr>
1510
1511
1512<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1513<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1514
1515Example matches string(ptr, n) and ptr within arguments of f
1516    (matcher = cxxConstructExpr())
1517  void f(const string &amp;a, const string &amp;b);
1518  char *ptr;
1519  int n;
1520  f(string(ptr, n), ptr);
1521</pre></td></tr>
1522
1523
1524<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>
1525<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1526
1527Example matches the CXXDefaultArgExpr placeholder inserted for the
1528    default value of the second parameter in the call expression f(42)
1529    (matcher = cxxDefaultArgExpr())
1530  void f(int x, int y = 0);
1531  f(42);
1532</pre></td></tr>
1533
1534
1535<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>
1536<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1537
1538Given
1539  delete X;
1540cxxDeleteExpr()
1541  matches 'delete X'.
1542</pre></td></tr>
1543
1544
1545<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>
1546<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1547resolved because the base expression or the member name was dependent.
1548
1549Given
1550  template &lt;class T&gt; void f() { T t; t.g(); }
1551cxxDependentScopeMemberExpr()
1552  matches t.g
1553</pre></td></tr>
1554
1555
1556<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>
1557<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1558
1559Example:
1560  cxxDynamicCastExpr()
1561matches
1562  dynamic_cast&lt;D*&gt;(&amp;b);
1563in
1564  struct B { virtual ~B() {} }; struct D : B {};
1565  B b;
1566  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1567</pre></td></tr>
1568
1569
1570<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>
1571<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1572
1573cxxForRangeStmt() matches 'for (auto a : i)'
1574  int i[] =  {1, 2, 3}; for (auto a : i);
1575  for(int j = 0; j &lt; 5; ++j);
1576</pre></td></tr>
1577
1578
1579<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>
1580<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1581
1582Example: Matches Foo(bar);
1583  Foo f = bar;
1584  Foo g = (Foo) bar;
1585  Foo h = Foo(bar);
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('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>
1590<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1591
1592Example matches x.y()
1593  X x;
1594  x.y();
1595</pre></td></tr>
1596
1597
1598<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>
1599<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1600
1601Given
1602  new X;
1603cxxNewExpr()
1604  matches 'new 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('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>
1609<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1610
1611Given
1612  bool a() noexcept;
1613  bool b() noexcept(true);
1614  bool c() noexcept(false);
1615  bool d() noexcept(noexcept(a()));
1616  bool e = noexcept(b()) || noexcept(c());
1617cxxNoexceptExpr()
1618  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1619  doesn't match the noexcept specifier in the declarations a, b, c or d.
1620</pre></td></tr>
1621
1622
1623<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>
1624<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
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('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>
1629<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1630
1631Note that if an operator isn't overloaded, it won't match. Instead, use
1632binaryOperator matcher.
1633Currently it does not match operators such as new delete.
1634FIXME: figure out why these do not match?
1635
1636Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1637    (matcher = cxxOperatorCallExpr())
1638  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1639  ostream &amp;o; int b = 1, c = 1;
1640  o &lt;&lt; b &lt;&lt; c;
1641See also the binaryOperation() matcher for more-general matching of binary
1642uses of this AST node.
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('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>
1647<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1648
1649Either the source expression or the destination type can be matched
1650using has(), but hasDestinationType() is more specific and can be
1651more readable.
1652
1653Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1654  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1655</pre></td></tr>
1656
1657
1658<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;...</td></tr>
1659<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1660
1661Example matches use of "&lt;":
1662  #include &lt;compare&gt;
1663  struct HasSpaceshipMem {
1664    int a;
1665    constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
1666  };
1667  void compare() {
1668    HasSpaceshipMem hs1, hs2;
1669    if (hs1 &lt; hs2)
1670        return;
1671  }
1672See also the binaryOperation() matcher for more-general matching
1673of this AST node.
1674</pre></td></tr>
1675
1676
1677<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>
1678<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1679
1680See also: hasDestinationType
1681See also: reinterpretCast
1682
1683Example:
1684  cxxStaticCastExpr()
1685matches
1686  static_cast&lt;long&gt;(8)
1687in
1688  long eight(static_cast&lt;long&gt;(8));
1689</pre></td></tr>
1690
1691
1692<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>
1693<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1694
1695Given
1696  std::vector&lt;int&gt; a({ 1, 2, 3 });
1697  std::vector&lt;int&gt; b = { 4, 5 };
1698  int c[] = { 6, 7 };
1699  std::pair&lt;int, int&gt; d = { 8, 9 };
1700cxxStdInitializerListExpr()
1701  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1702</pre></td></tr>
1703
1704
1705<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>
1706<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1707
1708Example: Matches Foo(bar, bar)
1709  Foo h = Foo(bar, bar);
1710</pre></td></tr>
1711
1712
1713<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1714<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1715
1716Example matches the implicit this expression in "return i".
1717    (matcher = cxxThisExpr())
1718struct foo {
1719  int i;
1720  int f() { return i; }
1721};
1722</pre></td></tr>
1723
1724
1725<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1726<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1727
1728  try { throw 5; } catch(int i) {}
1729cxxThrowExpr()
1730  matches 'throw 5'
1731</pre></td></tr>
1732
1733
1734<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1735<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1736
1737  try {} catch(int i) {}
1738cxxTryStmt()
1739  matches 'try {}'
1740</pre></td></tr>
1741
1742
1743<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>
1744<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1745
1746Example matches T(t) in return statement of f
1747    (matcher = cxxUnresolvedConstructExpr())
1748  template &lt;typename T&gt;
1749  void f(const T&amp; t) { return T(t); }
1750</pre></td></tr>
1751
1752
1753<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>
1754<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1755
1756Example matches x in if (x)
1757  bool x;
1758  if (x) {}
1759</pre></td></tr>
1760
1761
1762<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>
1763<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1764
1765Given
1766  int a;
1767declStmt()
1768  matches 'int a'.
1769</pre></td></tr>
1770
1771
1772<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1773<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1774
1775Given
1776  switch(a) { case 42: break; default: break; }
1777defaultStmt()
1778  matches 'default:'.
1779</pre></td></tr>
1780
1781
1782<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>&gt;...</td></tr>
1783<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1784</pre></td></tr>
1785
1786
1787<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>
1788<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1789
1790Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1791  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1792</pre></td></tr>
1793
1794
1795<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1796<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1797
1798Given
1799  do {} while (true);
1800doStmt()
1801  matches 'do {} while(true)'
1802</pre></td></tr>
1803
1804
1805<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>
1806<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1807
1808Matches any cast expression written in user code, whether it be a
1809C-style cast, a functional-style cast, or a keyword cast.
1810
1811Does not match implicit conversions.
1812
1813Note: the name "explicitCast" is chosen to match Clang's terminology, as
1814Clang uses the term "cast" to apply to implicit conversions as well as to
1815actual cast expressions.
1816
1817See also: hasDestinationType.
1818
1819Example: matches all five of the casts in
1820  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1821but does not match the implicit conversion in
1822  long ell = 42;
1823</pre></td></tr>
1824
1825
1826<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>
1827<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1828
1829Example matches x()
1830  void f() { x(); }
1831</pre></td></tr>
1832
1833
1834<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>
1835<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1836of the sub-expression's evaluation.
1837
1838Example matches std::string()
1839  const std::string str = std::string();
1840</pre></td></tr>
1841
1842
1843<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>
1844<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1845</pre></td></tr>
1846
1847
1848<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>
1849<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
18501.0, 1.0f, 1.0L and 1e10.
1851
1852Does not match implicit conversions such as
1853  float a = 10;
1854</pre></td></tr>
1855
1856
1857<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1858<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1859
1860Example matches 'for (;;) {}'
1861  for (;;) {}
1862  int i[] =  {1, 2, 3}; for (auto a : i);
1863</pre></td></tr>
1864
1865
1866<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>&gt;...</td></tr>
1867<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1868</pre></td></tr>
1869
1870
1871<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>
1872<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1873</pre></td></tr>
1874
1875
1876<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>
1877<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1878
1879Given
1880  goto FOO;
1881  FOO: bar();
1882gotoStmt()
1883  matches 'goto FOO'
1884</pre></td></tr>
1885
1886
1887<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>
1888<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1889
1890Example matches 'if (x) {}'
1891  if (x) {}
1892</pre></td></tr>
1893
1894
1895<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1896<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1897point literals e.g.: 1i, 1.0i
1898</pre></td></tr>
1899
1900
1901<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>
1902<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1903
1904This matches many different places, including function call return value
1905eliding, as well as any type conversions.
1906</pre></td></tr>
1907
1908
1909<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1910<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1911
1912Given
1913  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1914implicitValueInitExpr()
1915  matches "[0].y" (implicitly)
1916</pre></td></tr>
1917
1918
1919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1920<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1921
1922Given
1923  int a[] = { 1, 2 };
1924  struct B { int x, y; };
1925  B b = { 5, 6 };
1926initListExpr()
1927  matches "{ 1, 2 }" and "{ 5, 6 }"
1928</pre></td></tr>
1929
1930
1931<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>
1932<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
19331, 1L, 0x1 and 1U.
1934
1935Does not match character-encoded integers such as L'a'.
1936</pre></td></tr>
1937
1938
1939<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>
1940<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1941
1942Given
1943  goto FOO;
1944  FOO: bar();
1945labelStmt()
1946  matches 'FOO:'
1947</pre></td></tr>
1948
1949
1950<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>
1951<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1952
1953Example matches [&amp;](){return 5;}
1954  [&amp;](){return 5;}
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('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>
1959<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1960
1961Example: Given
1962  struct T {void func();};
1963  T f();
1964  void g(T);
1965materializeTemporaryExpr() matches 'f()' in these statements
1966  T u(f());
1967  g(f());
1968  f().func();
1969but does not match
1970  f();
1971</pre></td></tr>
1972
1973
1974<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>
1975<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1976
1977Given
1978  class Y {
1979    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1980    int a; static int b;
1981  };
1982memberExpr()
1983  matches this-&gt;x, x, y.x, a, this-&gt;b
1984</pre></td></tr>
1985
1986
1987<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>
1988<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1989
1990  foo();;
1991nullStmt()
1992  matches the second ';'
1993</pre></td></tr>
1994
1995
1996<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>
1997<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1998
1999Example matches @catch
2000  @try {}
2001  @catch (...) {}
2002</pre></td></tr>
2003
2004
2005<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>
2006<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
2007
2008Example matches @finally
2009  @try {}
2010  @finally {}
2011</pre></td></tr>
2012
2013
2014<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>
2015<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
2016
2017Example: matches "a" in "init" method:
2018@implementation A {
2019  NSString *a;
2020}
2021- (void) init {
2022  a = @"hello";
2023}
2024</pre></td></tr>
2025
2026
2027<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>
2028<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
2029
2030The innermost message send invokes the "alloc" class method on the
2031NSString class, while the outermost message send invokes the
2032"initWithString" instance method on the object returned from
2033NSString's "alloc". This matcher should match both message sends.
2034  [[NSString alloc] initWithString:@"Hello"]
2035</pre></td></tr>
2036
2037
2038<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>
2039<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
2040
2041Example matches @throw obj;
2042</pre></td></tr>
2043
2044
2045<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>
2046<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2047
2048Example matches @try
2049  @try {}
2050  @catch (...) {}
2051</pre></td></tr>
2052
2053
2054<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>
2055<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2056
2057Given
2058
2059  #pragma omp parallel
2060  #pragma omp parallel default(none)
2061  #pragma omp taskyield
2062
2063``ompExecutableDirective()`` matches ``omp parallel``,
2064``omp parallel default(none)`` and ``omp taskyield``.
2065</pre></td></tr>
2066
2067
2068<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>
2069<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2070to reference another expressions and can be met
2071in BinaryConditionalOperators, for example.
2072
2073Example matches 'a'
2074  (a ?: c) + 42;
2075</pre></td></tr>
2076
2077
2078<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>
2079<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2080
2081Example matches (foo() + 1)
2082  int foo() { return 1; }
2083  int a = (foo() + 1);
2084</pre></td></tr>
2085
2086
2087<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>
2088<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2089ParenListExprs don't have a predefined type and are used for late parsing.
2090In the final AST, they can be met in template declarations.
2091
2092Given
2093  template&lt;typename T&gt; class X {
2094    void f() {
2095      X x(*this);
2096      int a = 0, b = 1; int i = (a, b);
2097    }
2098  };
2099parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2100has a predefined type and is a ParenExpr, not a ParenListExpr.
2101</pre></td></tr>
2102
2103
2104<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>
2105<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2106
2107Example: Matches __func__
2108  printf("%s", __func__);
2109</pre></td></tr>
2110
2111
2112<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>
2113<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2114
2115Given
2116  return 1;
2117returnStmt()
2118  matches 'return 1'
2119</pre></td></tr>
2120
2121
2122<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>
2123<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2124
2125Given
2126  { ++a; }
2127stmt()
2128  matches both the compound statement '{ ++a; }' and '++a'.
2129</pre></td></tr>
2130
2131
2132<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>
2133<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2134
2135Example match: ({ int X = 4; X; })
2136  int C = ({ int X = 4; X; });
2137</pre></td></tr>
2138
2139
2140<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>
2141<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2142
2143Example matches "abcd", L"abcd"
2144  char *s = "abcd";
2145  wchar_t *ws = L"abcd";
2146</pre></td></tr>
2147
2148
2149<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>
2150<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2151
2152Given
2153  template &lt;int N&gt;
2154  struct A { static const int n = N; };
2155  struct B : public A&lt;42&gt; {};
2156substNonTypeTemplateParmExpr()
2157  matches "N" in the right-hand side of "static const int n = N;"
2158</pre></td></tr>
2159
2160
2161<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>
2162<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2163
2164Given
2165  switch(a) { case 42: break; default: break; }
2166switchCase()
2167  matches 'case 42:' and 'default:'.
2168</pre></td></tr>
2169
2170
2171<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>
2172<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2173
2174Given
2175  switch(a) { case 42: break; default: break; }
2176switchStmt()
2177  matches 'switch(a)'.
2178</pre></td></tr>
2179
2180
2181<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>
2182<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2183
2184Given
2185  Foo x = bar;
2186  int y = sizeof(x) + alignof(x);
2187unaryExprOrTypeTraitExpr()
2188  matches sizeof(x) and alignof(x)
2189</pre></td></tr>
2190
2191
2192<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>
2193<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2194
2195Example matches !a
2196  !a || b
2197</pre></td></tr>
2198
2199
2200<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>
2201<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2202but could not be resolved to a specific declaration.
2203
2204Given
2205  template&lt;typename T&gt;
2206  T foo() { T a; return a; }
2207  template&lt;typename T&gt;
2208  void bar() {
2209    foo&lt;T&gt;();
2210  }
2211unresolvedLookupExpr()
2212  matches foo&lt;T&gt;() </pre></td></tr>
2213
2214
2215<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>
2216<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2217
2218Given
2219  struct X {
2220    template &lt;class T&gt; void f();
2221    void g();
2222  };
2223  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
2224unresolvedMemberExpr()
2225  matches x.f&lt;T&gt;
2226</pre></td></tr>
2227
2228
2229<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>
2230<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2231
2232Example match: "foo"_suffix
2233</pre></td></tr>
2234
2235
2236<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>
2237<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2238
2239Given
2240  while (true) {}
2241whileStmt()
2242  matches 'while (true) {}'.
2243</pre></td></tr>
2244
2245
2246<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>
2247<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2248
2249Given
2250  template &lt;typename T&gt; struct C {};
2251  C&lt;int&gt; c;
2252templateArgumentLoc()
2253  matches 'int' in C&lt;int&gt;.
2254</pre></td></tr>
2255
2256
2257<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>
2258<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2259
2260Given
2261  template &lt;typename T&gt; struct C {};
2262  C&lt;int&gt; c;
2263templateArgument()
2264  matches 'int' in C&lt;int&gt;.
2265</pre></td></tr>
2266
2267
2268<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>
2269<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2270
2271Given
2272  template &lt;typename T&gt; class X { };
2273  X&lt;int&gt; xi;
2274templateName()
2275  matches 'X' in X&lt;int&gt;.
2276</pre></td></tr>
2277
2278
2279<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
2280<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s.
2281
2282Given
2283  struct s {};
2284  struct s ss;
2285elaboratedTypeLoc()
2286  matches the `TypeLoc` of the variable declaration of `ss`.
2287</pre></td></tr>
2288
2289
2290<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
2291<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
2292
2293Given
2294  int* x;
2295pointerTypeLoc()
2296  matches `int*`.
2297</pre></td></tr>
2298
2299
2300<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('qualifiedTypeLoc0')"><a name="qualifiedTypeLoc0Anchor">qualifiedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;...</td></tr>
2301<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST.
2302
2303Given
2304  const int x = 0;
2305qualifiedTypeLoc()
2306  matches `const int`.
2307</pre></td></tr>
2308
2309
2310<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
2311<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s.
2312
2313Given
2314  int x = 3;
2315  int&amp; l = x;
2316  int&amp;&amp; r = 3;
2317referenceTypeLoc()
2318  matches `int&amp;` and `int&amp;&amp;`.
2319</pre></td></tr>
2320
2321
2322<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
2323<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s.
2324
2325Given
2326  template &lt;typename T&gt; class C {};
2327  C&lt;char&gt; var;
2328varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
2329  matches `C&lt;char&gt; var`.
2330</pre></td></tr>
2331
2332
2333<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>
2334<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2335</pre></td></tr>
2336
2337
2338<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2339<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2340
2341Given
2342  int a[] = { 2, 3 };
2343  int b[4];
2344  void f() { int c[a[0]]; }
2345arrayType()
2346  matches "int a[]", "int b[4]" and "int c[a[0]]";
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('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>
2351<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2352
2353Given
2354  _Atomic(int) i;
2355atomicType()
2356  matches "_Atomic(int) i"
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('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>
2361<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2362
2363Given:
2364  auto n = 4;
2365  int v[] = { 2, 3 }
2366  for (auto i : v) { }
2367autoType()
2368  matches "auto n" and "auto i"
2369</pre></td></tr>
2370
2371
2372<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2373<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2374"void (^)(int)".
2375
2376The pointee is always required to be a FunctionType.
2377</pre></td></tr>
2378
2379
2380<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2381<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2382
2383Given
2384  struct A {};
2385  A a;
2386  int b;
2387  float c;
2388  bool d;
2389builtinType()
2390  matches "int b", "float c" and "bool d"
2391</pre></td></tr>
2392
2393
2394<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>
2395<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2396
2397Given
2398  _Complex float f;
2399complexType()
2400  matches "_Complex float 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('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>
2405<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2406
2407Given
2408  void() {
2409    int a[2];
2410    int b[] = { 2, 3 };
2411    int c[b[0]];
2412  }
2413constantArrayType()
2414  matches "int a[2]"
2415</pre></td></tr>
2416
2417
2418<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>
2419<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2420Example matches i[] in declaration of f.
2421    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2422Example matches i[1].
2423    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2424  void f(int i[]) {
2425    i[1] = 0;
2426  }
2427</pre></td></tr>
2428
2429
2430<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>
2431<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
2432
2433Given:
2434  short i = 1;
2435  int j = 42;
2436  decltype(i + j) result = i + j;
2437decltypeType()
2438  matches "decltype(i + j)"
2439</pre></td></tr>
2440
2441
2442<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>
2443<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2444template types.
2445
2446Given
2447  template &lt;typename T&gt;
2448  class C { public: C(T); };
2449
2450  C c(123);
2451deducedTemplateSpecializationType() matches the type in the declaration
2452of the variable c.
2453</pre></td></tr>
2454
2455
2456<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>
2457<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2458
2459Given
2460  template&lt;typename T, int Size&gt;
2461  class array {
2462    T data[Size];
2463  };
2464dependentSizedArrayType
2465  matches "T data[Size]"
2466</pre></td></tr>
2467
2468
2469<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>
2470<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2471qualified name.
2472
2473Given
2474  namespace N {
2475    namespace M {
2476      class D {};
2477    }
2478  }
2479  class C {};
2480
2481  class C c;
2482  N::M::D d;
2483
2484elaboratedType() matches the type of the variable declarations of both
2485c and d.
2486</pre></td></tr>
2487
2488
2489<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>
2490<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2491
2492Given
2493  enum C { Green };
2494  enum class S { Red };
2495
2496  C c;
2497  S s;
2498
2499enumType() matches the type of the variable declarations of both c and
2500s.
2501</pre></td></tr>
2502
2503
2504<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>
2505<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2506
2507Given
2508  int (*f)(int);
2509  void g();
2510functionProtoType()
2511  matches "int (*f)(int)" and the type of "g" in C++ mode.
2512  In C mode, "g" is not matched because it does not contain a prototype.
2513</pre></td></tr>
2514
2515
2516<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>
2517<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2518
2519Given
2520  int (*f)(int);
2521  void g();
2522functionType()
2523  matches "int (*f)(int)" and the type of "g".
2524</pre></td></tr>
2525
2526
2527<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>
2528<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2529
2530Given
2531  int a[] = { 2, 3 };
2532  int b[42];
2533  void f(int c[]) { int d[a[0]]; };
2534incompleteArrayType()
2535  matches "int a[]" and "int c[]"
2536</pre></td></tr>
2537
2538
2539<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>
2540<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2541
2542Example matches S s, but not S&lt;T&gt; s.
2543    (matcher = parmVarDecl(hasType(injectedClassNameType())))
2544  template &lt;typename T&gt; struct S {
2545    void f(S s);
2546    void g(S&lt;T&gt; s);
2547  };
2548</pre></td></tr>
2549
2550
2551<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>
2552<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2553
2554Given:
2555  int *a;
2556  int &amp;b = *a;
2557  int &amp;&amp;c = 1;
2558  auto &amp;d = b;
2559  auto &amp;&amp;e = c;
2560  auto &amp;&amp;f = 2;
2561  int g = 5;
2562
2563lValueReferenceType() matches the types of b, d, and e. e is
2564matched since the type is deduced as int&amp; by reference collapsing rules.
2565</pre></td></tr>
2566
2567
2568<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2569<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2570Given
2571  struct A { int i; }
2572  A::* ptr = A::i;
2573memberPointerType()
2574  matches "A::* ptr"
2575</pre></td></tr>
2576
2577
2578<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>
2579<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2580a pointer type, despite being syntactically similar.
2581
2582Given
2583  int *a;
2584
2585  @interface Foo
2586  @end
2587  Foo *f;
2588pointerType()
2589  matches "Foo *f", but does not match "int *a".
2590</pre></td></tr>
2591
2592
2593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2594<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2595
2596Given
2597  int (*ptr_to_array)[4];
2598  int *array_of_ptrs[4];
2599
2600varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2601array_of_ptrs.
2602</pre></td></tr>
2603
2604
2605<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>
2606<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2607types.
2608
2609Given
2610  int *a;
2611  int &amp;b = *a;
2612  int c = 5;
2613
2614  @interface Foo
2615  @end
2616  Foo *f;
2617pointerType()
2618  matches "int *a", but does not match "Foo *f".
2619</pre></td></tr>
2620
2621
2622<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>
2623<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2624
2625Given:
2626  int *a;
2627  int &amp;b = *a;
2628  int &amp;&amp;c = 1;
2629  auto &amp;d = b;
2630  auto &amp;&amp;e = c;
2631  auto &amp;&amp;f = 2;
2632  int g = 5;
2633
2634rValueReferenceType() matches the types of c and f. e is not
2635matched as it is deduced to int&amp; by reference collapsing rules.
2636</pre></td></tr>
2637
2638
2639<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>
2640<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2641
2642Given
2643  class C {};
2644  struct S {};
2645
2646  C c;
2647  S s;
2648
2649recordType() matches the type of the variable declarations of both c
2650and s.
2651</pre></td></tr>
2652
2653
2654<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>
2655<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2656
2657Given
2658  int *a;
2659  int &amp;b = *a;
2660  int &amp;&amp;c = 1;
2661  auto &amp;d = b;
2662  auto &amp;&amp;e = c;
2663  auto &amp;&amp;f = 2;
2664  int g = 5;
2665
2666referenceType() matches the types of b, c, d, e, and f.
2667</pre></td></tr>
2668
2669
2670<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>
2671<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2672template type parameter.
2673
2674Given
2675  template &lt;typename T&gt;
2676  void F(T t) {
2677    int i = 1 + t;
2678  }
2679
2680substTemplateTypeParmType() matches the type of 't' but not '1'
2681</pre></td></tr>
2682
2683
2684<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>
2685<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2686
2687Given
2688  enum E {};
2689  class C {};
2690
2691  E e;
2692  C c;
2693
2694tagType() matches the type of the variable declarations of both e
2695and c.
2696</pre></td></tr>
2697
2698
2699<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>
2700<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2701
2702Given
2703  template &lt;typename T&gt;
2704  class C { };
2705
2706  template class C&lt;int&gt;;  // A
2707  C&lt;char&gt; var;            // B
2708
2709templateSpecializationType() matches the type of the explicit
2710instantiation in A and the type of the variable declaration in B.
2711</pre></td></tr>
2712
2713
2714<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>
2715<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2716
2717Example matches T, but not int.
2718    (matcher = templateTypeParmType())
2719  template &lt;typename T&gt; void f(int i);
2720</pre></td></tr>
2721
2722
2723<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>
2724<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2725</pre></td></tr>
2726
2727
2728<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>
2729<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2730
2731Given
2732  typedef int X;
2733typedefType()
2734  matches "typedef int X"
2735</pre></td></tr>
2736
2737
2738<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>
2739<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2740
2741Given:
2742  typedef __underlying_type(T) type;
2743unaryTransformType()
2744  matches "__underlying_type(T)"
2745</pre></td></tr>
2746
2747
2748<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>
2749<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2750integer-constant-expression.
2751
2752Given
2753  void f() {
2754    int a[] = { 2, 3 }
2755    int b[42];
2756    int c[a[0]];
2757  }
2758variableArrayType()
2759  matches "int c[a[0]]"
2760</pre></td></tr>
2761
2762<!--END_DECL_MATCHERS -->
2763</table>
2764
2765<!-- ======================================================================= -->
2766<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2767<!-- ======================================================================= -->
2768
2769<p>Narrowing matchers match certain attributes on the current node, thus
2770narrowing down the set of nodes of the current type to match on.</p>
2771
2772<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2773which allow users to create more powerful match expressions.</p>
2774
2775<table>
2776<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2777<!-- START_NARROWING_MATCHERS -->
2778
2779<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>
2780<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2781
2782Usable as: Any Matcher
2783</pre></td></tr>
2784
2785
2786<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>
2787<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2788
2789Usable as: Any Matcher
2790</pre></td></tr>
2791
2792
2793<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2794<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2795
2796Useful when another matcher requires a child matcher, but there's no
2797additional constraint. This will often be used with an explicit conversion
2798to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2799
2800Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2801"int* p" and "void f()" in
2802  int* p;
2803  void f();
2804
2805Usable as: Any Matcher
2806</pre></td></tr>
2807
2808
2809<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2810<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2811
2812Given
2813  if (true);
2814  for (; true; );
2815with the matcher
2816  mapAnyOf(ifStmt, forStmt).with(
2817    hasCondition(cxxBoolLiteralExpr(equals(true)))
2818    ).bind("trueCond")
2819matches the if and the for. It is equivalent to:
2820  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2821  anyOf(
2822    ifStmt(trueCond).bind("trueCond"),
2823    forStmt(trueCond).bind("trueCond")
2824    );
2825
2826The with() chain-call accepts zero or more matchers which are combined
2827as-if with allOf() in each of the node matchers.
2828Usable as: Any Matcher
2829</pre></td></tr>
2830
2831
2832<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2833<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2834
2835Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2836  class X {};
2837  class Y {};
2838
2839Usable as: Any Matcher
2840</pre></td></tr>
2841
2842
2843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('isImplicit1')"><a name="isImplicit1Anchor">isImplicit</a></td><td></td></tr>
2844<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
2845implicit default/copy constructors).
2846</pre></td></tr>
2847
2848
2849<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>
2850<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2851specified names.
2852
2853   hasAnyOperatorName("+", "-")
2854 Is equivalent to
2855   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2856</pre></td></tr>
2857
2858
2859<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>
2860<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2861unary).
2862
2863Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2864  !(a || b)
2865</pre></td></tr>
2866
2867
2868<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>
2869<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2870
2871Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2872  if (a == b)
2873    a += b;
2874
2875Example 2: matches s1 = s2
2876           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2877  struct S { S&amp; operator=(const S&amp;); };
2878  void x() { S s1, s2; s1 = s2; }
2879</pre></td></tr>
2880
2881
2882<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>
2883<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2884
2885Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2886  if (a == b)
2887    a += b;
2888
2889Example 2: matches s1 &lt; s2
2890           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2891  struct S { bool operator&lt;(const S&amp; other); };
2892  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2893</pre></td></tr>
2894
2895
2896<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>
2897<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2898inheritance.
2899
2900Examples:
2901  class C {
2902  public:    int a;
2903  protected: int b;
2904  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2905  };
2906
2907  struct Base {};
2908  struct Derived1 : private Base {}; // matches 'Base'
2909  class Derived2 : Base {}; // matches 'Base'
2910</pre></td></tr>
2911
2912
2913<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>
2914<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2915protected inheritance.
2916
2917Examples:
2918  class C {
2919  public:    int a;
2920  protected: int b; // fieldDecl(isProtected()) matches 'b'
2921  private:   int c;
2922  };
2923
2924  class Base {};
2925  class Derived : protected Base {}; // matches 'Base'
2926</pre></td></tr>
2927
2928
2929<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>
2930<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2931inheritance.
2932
2933Examples:
2934  class C {
2935  public:    int a; // fieldDecl(isPublic()) matches 'a'
2936  protected: int b;
2937  private:   int c;
2938  };
2939
2940  class Base {};
2941  class Derived1 : public Base {}; // matches 'Base'
2942  struct Derived2 : Base {}; // matches 'Base'
2943</pre></td></tr>
2944
2945
2946<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>
2947<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2948virtual inheritance.
2949
2950Example:
2951  class A {
2952   public:
2953    virtual void x(); // matches x
2954  };
2955
2956Example:
2957  class Base {};
2958  class DirectlyDerived : virtual Base {}; // matches Base
2959  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2960
2961Usable 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;
2962</pre></td></tr>
2963
2964
2965<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>
2966<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2967
2968
2969<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>
2970<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2971
2972Given
2973  f('false, 3.14, 42);
2974characterLiteral(equals(0))
2975  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2976  match false
2977floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2978  match 3.14
2979integerLiteral(equals(42))
2980  matches 42
2981
2982Note that you cannot directly match a negative numeric literal because the
2983minus sign is not part of the literal: It is a unary operator whose operand
2984is the positive numeric literal. Instead, you must use a unaryOperator()
2985matcher to match the minus sign:
2986
2987unaryOperator(hasOperatorName("-"),
2988              hasUnaryOperand(integerLiteral(equals(13))))
2989
2990Usable 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;,
2991           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;
2992</pre></td></tr>
2993
2994
2995<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>
2996<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2997
2998
2999<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>
3000<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
3001
3002
3003<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>
3004<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
3005
3006Given
3007  try {
3008    // ...
3009  } catch (int) {
3010    // ...
3011  } catch (...) {
3012    // ...
3013  }
3014cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
3015</pre></td></tr>
3016
3017
3018<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>
3019<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
3020a specific number of arguments (including absent default arguments).
3021
3022Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3023  void f(int x, int y);
3024  f(0, 0);
3025</pre></td></tr>
3026
3027
3028<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>
3029<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
3030</pre></td></tr>
3031
3032
3033<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>
3034<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
3035zero initialization.
3036
3037Given
3038void foo() {
3039  struct point { double x; double y; };
3040  point pt[2] = { { 1.0, 2.0 } };
3041}
3042initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
3043will match the implicit array filler for pt[1].
3044</pre></td></tr>
3045
3046
3047<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>
3048<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
3049
3050Given
3051  struct S {
3052    S(); // #1
3053    S(const S &amp;); // #2
3054    S(S &amp;&amp;); // #3
3055  };
3056cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
3057</pre></td></tr>
3058
3059
3060<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>
3061<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
3062
3063Given
3064  struct S {
3065    S(); // #1
3066    S(const S &amp;); // #2
3067    S(S &amp;&amp;); // #3
3068  };
3069cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
3070</pre></td></tr>
3071
3072
3073<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>
3074<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
3075
3076Given
3077  struct S {
3078    S(); // #1
3079    S(int) {} // #2
3080    S(S &amp;&amp;) : S() {} // #3
3081  };
3082  S::S() : S(0) {} // #4
3083cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
3084#1 or #2.
3085</pre></td></tr>
3086
3087
3088<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>
3089<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
3090that have an explicit specifier if this explicit specifier is resolved to
3091true.
3092
3093Given
3094  template&lt;bool b&gt;
3095  struct S {
3096    S(int); // #1
3097    explicit S(double); // #2
3098    operator int(); // #3
3099    explicit operator bool(); // #4
3100    explicit(false) S(bool) // # 7
3101    explicit(true) S(char) // # 8
3102    explicit(b) S(S) // # 9
3103  };
3104  S(int) -&gt; S&lt;true&gt; // #5
3105  explicit S(double) -&gt; S&lt;false&gt; // #6
3106cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3107cxxConversionDecl(isExplicit()) will match #4, but not #3.
3108cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3109</pre></td></tr>
3110
3111
3112<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isInheritingConstructor0')"><a name="isInheritingConstructor0Anchor">isInheritingConstructor</a></td><td></td></tr>
3113<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr>
3114
3115
3116<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>
3117<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3118
3119Given
3120  struct S {
3121    S(); // #1
3122    S(const S &amp;); // #2
3123    S(S &amp;&amp;); // #3
3124  };
3125cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3126</pre></td></tr>
3127
3128
3129<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>
3130<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3131that have an explicit specifier if this explicit specifier is resolved to
3132true.
3133
3134Given
3135  template&lt;bool b&gt;
3136  struct S {
3137    S(int); // #1
3138    explicit S(double); // #2
3139    operator int(); // #3
3140    explicit operator bool(); // #4
3141    explicit(false) S(bool) // # 7
3142    explicit(true) S(char) // # 8
3143    explicit(b) S(S) // # 9
3144  };
3145  S(int) -&gt; S&lt;true&gt; // #5
3146  explicit S(double) -&gt; S&lt;false&gt; // #6
3147cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3148cxxConversionDecl(isExplicit()) will match #4, but not #3.
3149cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3150</pre></td></tr>
3151
3152
3153<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>
3154<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3155opposed to a member.
3156
3157Given
3158  struct B {};
3159  struct D : B {
3160    int I;
3161    D(int i) : I(i) {}
3162  };
3163  struct E : B {
3164    E() : B() {}
3165  };
3166cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3167  will match E(), but not match D(int).
3168</pre></td></tr>
3169
3170
3171<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>
3172<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3173opposed to a base.
3174
3175Given
3176  struct B {};
3177  struct D : B {
3178    int I;
3179    D(int i) : I(i) {}
3180  };
3181  struct E : B {
3182    E() : B() {}
3183  };
3184cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3185  will match D(int), but not match E().
3186</pre></td></tr>
3187
3188
3189<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>
3190<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3191code (as opposed to implicitly added by the compiler).
3192
3193Given
3194  struct Foo {
3195    Foo() { }
3196    Foo(int) : foo_("A") { }
3197    string foo_;
3198  };
3199cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3200  will match Foo(int), but not Foo()
3201</pre></td></tr>
3202
3203
3204<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>
3205<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3206that have an explicit specifier if this explicit specifier is resolved to
3207true.
3208
3209Given
3210  template&lt;bool b&gt;
3211  struct S {
3212    S(int); // #1
3213    explicit S(double); // #2
3214    operator int(); // #3
3215    explicit operator bool(); // #4
3216    explicit(false) S(bool) // # 7
3217    explicit(true) S(char) // # 8
3218    explicit(b) S(S) // # 9
3219  };
3220  S(int) -&gt; S&lt;true&gt; // #5
3221  explicit S(double) -&gt; S&lt;false&gt; // #6
3222cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3223cxxConversionDecl(isExplicit()) will match #4, but not #3.
3224cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3225</pre></td></tr>
3226
3227
3228<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>
3229<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3230
3231In template declarations, dependent members are not resolved and so can
3232not be matched to particular named declarations.
3233
3234This matcher allows to match on the known name of members.
3235
3236Given
3237  template &lt;typename T&gt;
3238  struct S {
3239      void mem();
3240  };
3241  template &lt;typename T&gt;
3242  void x() {
3243      S&lt;T&gt; s;
3244      s.mem();
3245  }
3246cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3247</pre></td></tr>
3248
3249
3250<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>
3251<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
3252to '.'.
3253
3254Member calls on the implicit this pointer match as called with '-&gt;'.
3255
3256Given
3257  class Y {
3258    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3259    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3260    int a;
3261    static int b;
3262  };
3263  template &lt;class T&gt;
3264  class Z {
3265    void x() { this-&gt;m; }
3266  };
3267memberExpr(isArrow())
3268  matches this-&gt;x, x, y.x, a, this-&gt;b
3269cxxDependentScopeMemberExpr(isArrow())
3270  matches this-&gt;m
3271unresolvedMemberExpr(isArrow())
3272  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3273</pre></td></tr>
3274
3275
3276<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>
3277<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3278node
3279
3280In template declarations, dependent members are not resolved and so can
3281not be matched to particular named declarations.
3282
3283This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3284and CXXMethodDecl nodes.
3285
3286Given
3287  template &lt;typename T&gt;
3288  struct S {
3289      void mem();
3290  };
3291  template &lt;typename T&gt;
3292  void x() {
3293      S&lt;T&gt; s;
3294      s.mem();
3295  }
3296The matcher
3297@code
3298cxxDependentScopeMemberExpr(
3299  hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3300      hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3301          cxxMethodDecl(hasName("mem")).bind("templMem")
3302          )))))
3303      )))),
3304  memberHasSameNameAsBoundNode("templMem")
3305  )
3306@endcode
3307first matches and binds the @c mem member of the @c S template, then
3308compares its name to the usage in @c s.mem() in the @c x function template
3309</pre></td></tr>
3310
3311
3312<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>
3313<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3314
3315Given
3316struct A {
3317  void foo() const;
3318  void bar();
3319};
3320
3321cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3322</pre></td></tr>
3323
3324
3325<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>
3326<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3327operator.
3328
3329Given
3330struct A {
3331  A &amp;operator=(const A &amp;);
3332  A &amp;operator=(A &amp;&amp;);
3333};
3334
3335cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3336the second one.
3337</pre></td></tr>
3338
3339
3340<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>
3341<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3342
3343Given:
3344  class A final {};
3345
3346  struct B {
3347    virtual void f();
3348  };
3349
3350  struct C : B {
3351    void f() final;
3352  };
3353matches A and C::f, but not B, C, or B::f
3354</pre></td></tr>
3355
3356
3357<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>
3358<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3359operator.
3360
3361Given
3362struct A {
3363  A &amp;operator=(const A &amp;);
3364  A &amp;operator=(A &amp;&amp;);
3365};
3366
3367cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3368the first one.
3369</pre></td></tr>
3370
3371
3372<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>
3373<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3374
3375Given
3376  class A {
3377   public:
3378    virtual void x();
3379  };
3380  class B : public A {
3381   public:
3382    virtual void x();
3383  };
3384  matches B::x
3385</pre></td></tr>
3386
3387
3388<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>
3389<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3390
3391Given
3392  class A {
3393   public:
3394    virtual void x() = 0;
3395  };
3396  matches A::x
3397</pre></td></tr>
3398
3399
3400<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>
3401<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3402
3403Given
3404  struct S {
3405    S(); // #1
3406    S(const S &amp;) = default; // #2
3407    S(S &amp;&amp;) = delete; // #3
3408  };
3409cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3410</pre></td></tr>
3411
3412
3413<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>
3414<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3415virtual inheritance.
3416
3417Example:
3418  class A {
3419   public:
3420    virtual void x(); // matches x
3421  };
3422
3423Example:
3424  class Base {};
3425  class DirectlyDerived : virtual Base {}; // matches Base
3426  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3427
3428Usable 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;
3429</pre></td></tr>
3430
3431
3432<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>
3433<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3434
3435Given
3436  class A {
3437   public:
3438    virtual void x();
3439  };
3440  class B : public A {
3441   public:
3442    void x();
3443  };
3444  matches A::x but not B::x
3445</pre></td></tr>
3446
3447
3448<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>
3449<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3450
3451Given:
3452  MyClass *p1 = new MyClass[10];
3453cxxNewExpr(isArray())
3454  matches the expression 'new MyClass[10]'.
3455</pre></td></tr>
3456
3457
3458<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3459<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3460specified names.
3461
3462   hasAnyOperatorName("+", "-")
3463 Is equivalent to
3464   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3465</pre></td></tr>
3466
3467
3468<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>
3469<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3470
3471Matches overloaded operator names specified in strings without the
3472"operator" prefix: e.g. "&lt;&lt;".
3473
3474  hasAnyOverloadedOperatorName("+", "-")
3475Is equivalent to
3476  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3477</pre></td></tr>
3478
3479
3480<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3481<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3482unary).
3483
3484Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3485  !(a || b)
3486</pre></td></tr>
3487
3488
3489<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>
3490<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3491
3492Matches overloaded operator names specified in strings without the
3493"operator" prefix: e.g. "&lt;&lt;".
3494
3495Given:
3496  class A { int operator*(); };
3497  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3498  A a;
3499  a &lt;&lt; a;   // &lt;-- This matches
3500
3501cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3502specified line and
3503cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3504matches the declaration of A.
3505
3506Usable 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;
3507</pre></td></tr>
3508
3509
3510<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>
3511<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3512
3513Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3514  if (a == b)
3515    a += b;
3516
3517Example 2: matches s1 = s2
3518           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3519  struct S { S&amp; operator=(const S&amp;); };
3520  void x() { S s1, s2; s1 = s2; }
3521</pre></td></tr>
3522
3523
3524<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>
3525<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3526
3527Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3528  if (a == b)
3529    a += b;
3530
3531Example 2: matches s1 &lt; s2
3532           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3533  struct S { bool operator&lt;(const S&amp; other); };
3534  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3535</pre></td></tr>
3536
3537
3538<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>
3539<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3540
3541Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3542class x {};
3543class y;
3544</pre></td></tr>
3545
3546
3547<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>
3548<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3549</pre></td></tr>
3550
3551
3552<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>
3553<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3554</pre></td></tr>
3555
3556
3557<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>
3558<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3559static member variable template instantiations.
3560
3561Given
3562  template&lt;typename T&gt; void A(T t) { }
3563  template&lt;&gt; void A(int N) { }
3564functionDecl(isExplicitTemplateSpecialization())
3565  matches the specialization A&lt;int&gt;().
3566
3567Usable 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;
3568</pre></td></tr>
3569
3570
3571<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>
3572<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3573
3574Given:
3575  class A final {};
3576
3577  struct B {
3578    virtual void f();
3579  };
3580
3581  struct C : B {
3582    void f() final;
3583  };
3584matches A and C::f, but not B, C, or B::f
3585</pre></td></tr>
3586
3587
3588<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>
3589<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3590
3591Given:
3592  auto x = []{};
3593
3594cxxRecordDecl(isLambda()) matches the implicit class declaration of
3595decltype(x)
3596</pre></td></tr>
3597
3598
3599<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>
3600<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3601isSameOrDerivedFrom(hasName(...)).
3602</pre></td></tr>
3603
3604
3605<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>
3606<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3607member variable template instantiations.
3608
3609Given
3610  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3611or
3612  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3613or
3614  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3615cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3616  matches the template instantiation of X&lt;A&gt;.
3617
3618But given
3619  template &lt;typename T&gt;  class X {}; class A {};
3620  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3621cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3622  does not match, as X&lt;A&gt; is an explicit template specialization.
3623
3624Usable 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;
3625</pre></td></tr>
3626
3627
3628<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3629<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3630specified names.
3631
3632   hasAnyOperatorName("+", "-")
3633 Is equivalent to
3634   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3635</pre></td></tr>
3636
3637
3638<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3639<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3640unary).
3641
3642Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3643  !(a || b)
3644</pre></td></tr>
3645
3646
3647<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr>
3648<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3649
3650Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3651  if (a == b)
3652    a += b;
3653
3654Example 2: matches s1 = s2
3655           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3656  struct S { S&amp; operator=(const S&amp;); };
3657  void x() { S s1, s2; s1 = s2; }
3658</pre></td></tr>
3659
3660
3661<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
3662<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3663
3664Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3665  if (a == b)
3666    a += b;
3667
3668Example 2: matches s1 &lt; s2
3669           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3670  struct S { bool operator&lt;(const S&amp; other); };
3671  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3672</pre></td></tr>
3673
3674
3675<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>
3676<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3677a specific number of arguments (including absent default arguments).
3678
3679Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3680  void f(int x, int y);
3681  f(0, 0);
3682</pre></td></tr>
3683
3684
3685<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>
3686<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3687a specific number of arguments (including absent default arguments).
3688
3689Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3690  void f(int x, int y);
3691  f(0, 0);
3692</pre></td></tr>
3693
3694
3695<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>
3696<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3697
3698Example matches y(x) but not y(42) or NS::y(x).
3699  namespace NS {
3700    struct X {};
3701    void y(X);
3702  }
3703
3704  void y(...);
3705
3706  void test() {
3707    NS::X x;
3708    y(x); // Matches
3709    NS::y(x); // Doesn't match
3710    y(42); // Doesn't match
3711    using NS::y;
3712    y(x); // Found by both unqualified lookup and ADL, doesn't match
3713   }
3714</pre></td></tr>
3715
3716
3717<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>
3718<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3719
3720Example: matches the implicit cast around 0
3721(matcher = castExpr(hasCastKind(CK_NullToPointer)))
3722  int *p = 0;
3723
3724If the matcher is use from clang-query, CastKind parameter
3725should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3726</pre></td></tr>
3727
3728
3729<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>
3730<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3731
3732
3733<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>
3734<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3735
3736Given
3737  f('false, 3.14, 42);
3738characterLiteral(equals(0))
3739  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3740  match false
3741floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3742  match 3.14
3743integerLiteral(equals(42))
3744  matches 42
3745
3746Note that you cannot directly match a negative numeric literal because the
3747minus sign is not part of the literal: It is a unary operator whose operand
3748is the positive numeric literal. Instead, you must use a unaryOperator()
3749matcher to match the minus sign:
3750
3751unaryOperator(hasOperatorName("-"),
3752              hasUnaryOperand(integerLiteral(equals(13))))
3753
3754Usable 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;,
3755           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;
3756</pre></td></tr>
3757
3758
3759<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>
3760<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3761
3762
3763<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>
3764<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3765
3766
3767<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>
3768<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3769
3770Given
3771  template&lt;typename T&gt; struct C {};
3772  C&lt;int&gt; c;
3773classTemplateSpecializationDecl(templateArgumentCountIs(1))
3774  matches C&lt;int&gt;.
3775</pre></td></tr>
3776
3777
3778<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>
3779<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3780child statements.
3781
3782Example: Given
3783  { for (;;) {} }
3784compoundStmt(statementCountIs(0)))
3785  matches '{}'
3786  but does not match the outer compound statement.
3787</pre></td></tr>
3788
3789
3790<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>
3791<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3792
3793Given
3794  int a[42];
3795  int b[2 * 21];
3796  int c[41], d[43];
3797  char *s = "abcd";
3798  wchar_t *ws = L"abcd";
3799  char *w = "a";
3800constantArrayType(hasSize(42))
3801  matches "int a[42]" and "int b[2 * 21]"
3802stringLiteral(hasSize(4))
3803  matches "abcd", L"abcd"
3804</pre></td></tr>
3805
3806
3807<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>
3808<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3809declarations.
3810
3811Example: Given
3812  int a, b;
3813  int c;
3814  int d = 2, e;
3815declCountIs(2)
3816  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3817</pre></td></tr>
3818
3819
3820<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>
3821<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3822
3823Matches a node if it equals the node previously bound to ID.
3824
3825Given
3826  class X { int a; int b; };
3827cxxRecordDecl(
3828    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3829    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3830  matches the class X, as a and b have the same type.
3831
3832Note that when multiple matches are involved via forEach* matchers,
3833equalsBoundNodes acts as a filter.
3834For example:
3835compoundStmt(
3836    forEachDescendant(varDecl().bind("d")),
3837    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3838will trigger a match for each combination of variable declaration
3839and reference to that variable declaration within a compound statement.
3840</pre></td></tr>
3841
3842
3843<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>
3844<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3845
3846Decl has pointer identity in the AST.
3847</pre></td></tr>
3848
3849
3850<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>
3851<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3852
3853Given
3854  __attribute__((device)) void f() { ... }
3855decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3856f. If the matcher is used from clang-query, attr::Kind parameter should be
3857passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3858</pre></td></tr>
3859
3860
3861<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>
3862<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3863Does not match if only part of the statement is expanded from that macro or
3864if different parts of the statement are expanded from different
3865appearances of the macro.
3866</pre></td></tr>
3867
3868
3869<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>
3870<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3871partially matching a given regex.
3872
3873Example matches Y but not X
3874    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3875  #include "ASTMatcher.h"
3876  class X {};
3877ASTMatcher.h:
3878  class Y {};
3879
3880Usable 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;
3881
3882If the matcher is used in clang-query, RegexFlags parameter
3883should be passed as a quoted string. e.g: "NoFlags".
3884Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3885</pre></td></tr>
3886
3887
3888<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>
3889<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3890
3891Example matches X but not Y
3892  (matcher = cxxRecordDecl(isExpansionInMainFile())
3893  #include &lt;Y.h&gt;
3894  class X {};
3895Y.h:
3896  class Y {};
3897
3898Usable 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;
3899</pre></td></tr>
3900
3901
3902<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>
3903<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3904
3905Example matches Y but not X
3906    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3907  #include &lt;SystemHeader.h&gt;
3908  class X {};
3909SystemHeader.h:
3910  class Y {};
3911
3912Usable 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;
3913</pre></td></tr>
3914
3915
3916<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>
3917<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
3918implicit default/copy constructors).
3919</pre></td></tr>
3920
3921
3922<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>
3923<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3924
3925Given
3926  class vector {};
3927  namespace foo {
3928    class vector {};
3929    namespace std {
3930      class vector {};
3931    }
3932  }
3933  namespace std {
3934    inline namespace __1 {
3935      class vector {}; // #1
3936      namespace experimental {
3937        class vector {};
3938      }
3939    }
3940  }
3941cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3942</pre></td></tr>
3943
3944
3945<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>
3946<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3947template instantiations.
3948
3949Given
3950  template&lt;typename T&gt; void A(T t) { T i; }
3951  A(0);
3952  A(0U);
3953functionDecl(isInstantiated())
3954  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3955</pre></td></tr>
3956
3957
3958<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>
3959<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3960inheritance.
3961
3962Examples:
3963  class C {
3964  public:    int a;
3965  protected: int b;
3966  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3967  };
3968
3969  struct Base {};
3970  struct Derived1 : private Base {}; // matches 'Base'
3971  class Derived2 : Base {}; // matches 'Base'
3972</pre></td></tr>
3973
3974
3975<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>
3976<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3977protected inheritance.
3978
3979Examples:
3980  class C {
3981  public:    int a;
3982  protected: int b; // fieldDecl(isProtected()) matches 'b'
3983  private:   int c;
3984  };
3985
3986  class Base {};
3987  class Derived : protected Base {}; // matches 'Base'
3988</pre></td></tr>
3989
3990
3991<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>
3992<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3993inheritance.
3994
3995Examples:
3996  class C {
3997  public:    int a; // fieldDecl(isPublic()) matches 'a'
3998  protected: int b;
3999  private:   int c;
4000  };
4001
4002  class Base {};
4003  class Derived1 : public Base {}; // matches 'Base'
4004  struct Derived2 : Base {}; // matches 'Base'
4005</pre></td></tr>
4006
4007
4008<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>
4009<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
4010a specific number of designators.
4011
4012Example: Given
4013  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
4014  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
4015designatorCountIs(2)
4016  matches '{ [2].y = 1.0, [0].x = 1.0 }',
4017  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
4018</pre></td></tr>
4019
4020
4021<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>
4022<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
4023
4024Example matches Y (matcher = enumDecl(isScoped()))
4025enum X {};
4026enum class Y {};
4027</pre></td></tr>
4028
4029
4030<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>
4031<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
4032neither type- nor value-dependent.
4033
4034In the following example, the expression sizeof(sizeof(T() + T()))
4035is instantiation-dependent (since it involves a template parameter T),
4036but is neither type- nor value-dependent, since the type of the inner
4037sizeof is known (std::size_t) and therefore the size of the outer
4038sizeof is known.
4039  template&lt;typename T&gt;
4040  void f(T x, T y) { sizeof(sizeof(T() + T()); }
4041expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
4042</pre></td></tr>
4043
4044
4045<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>
4046<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
4047is not yet instantiated.
4048
4049For example, the expressions "x" and "x + y" are type-dependent in
4050the following code, but "y" is not type-dependent:
4051  template&lt;typename T&gt;
4052  void add(T x, int y) {
4053    x + y;
4054  }
4055expr(isTypeDependent()) matches x + y
4056</pre></td></tr>
4057
4058
4059<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>
4060<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
4061non-type template parameter.
4062
4063For example, the array bound of "Chars" in the following example is
4064value-dependent.
4065  template&lt;int Size&gt; int f() { return Size; }
4066expr(isValueDependent()) matches return Size
4067</pre></td></tr>
4068
4069
4070<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>
4071<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4072GNU's __null, C++11's nullptr, or C's NULL macro.
4073
4074Given:
4075  void *v1 = NULL;
4076  void *v2 = nullptr;
4077  void *v3 = __null; // GNU extension
4078  char *cp = (char *)0;
4079  int *ip = 0;
4080  int i = 0;
4081expr(nullPointerConstant())
4082  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4083  initializer for i.
4084</pre></td></tr>
4085
4086
4087<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>
4088<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
4089bit width.
4090
4091Given
4092  class C {
4093    int a : 2;
4094    int b : 4;
4095    int c : 2;
4096  };
4097fieldDecl(hasBitWidth(2))
4098  matches 'int a;' and 'int c;' but not 'int b;'.
4099</pre></td></tr>
4100
4101
4102<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>
4103<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
4104
4105Given
4106  class C {
4107    int a : 2;
4108    int b;
4109  };
4110fieldDecl(isBitField())
4111  matches 'int a;' but not 'int b;'.
4112</pre></td></tr>
4113
4114
4115<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>
4116<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4117
4118Given
4119  f('false, 3.14, 42);
4120characterLiteral(equals(0))
4121  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4122  match false
4123floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4124  match 3.14
4125integerLiteral(equals(42))
4126  matches 42
4127
4128Note that you cannot directly match a negative numeric literal because the
4129minus sign is not part of the literal: It is a unary operator whose operand
4130is the positive numeric literal. Instead, you must use a unaryOperator()
4131matcher to match the minus sign:
4132
4133unaryOperator(hasOperatorName("-"),
4134              hasUnaryOperand(integerLiteral(equals(13))))
4135
4136Usable 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;,
4137           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;
4138</pre></td></tr>
4139
4140
4141<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>
4142<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4143
4144
4145<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>
4146<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4147
4148Matches overloaded operator names specified in strings without the
4149"operator" prefix: e.g. "&lt;&lt;".
4150
4151  hasAnyOverloadedOperatorName("+", "-")
4152Is equivalent to
4153  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4154</pre></td></tr>
4155
4156
4157<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>
4158<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4159
4160Given:
4161  void f();
4162  void g() noexcept;
4163  void h() noexcept(true);
4164  void i() noexcept(false);
4165  void j() throw();
4166  void k() throw(int);
4167  void l() throw(...);
4168functionDecl(hasDynamicExceptionSpec()) and
4169  functionProtoType(hasDynamicExceptionSpec())
4170  match the declarations of j, k, and l, but not f, g, h, or i.
4171</pre></td></tr>
4172
4173
4174<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>
4175<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4176
4177Matches overloaded operator names specified in strings without the
4178"operator" prefix: e.g. "&lt;&lt;".
4179
4180Given:
4181  class A { int operator*(); };
4182  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
4183  A a;
4184  a &lt;&lt; a;   // &lt;-- This matches
4185
4186cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
4187specified line and
4188cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4189matches the declaration of A.
4190
4191Usable 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;
4192</pre></td></tr>
4193
4194
4195<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>
4196<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4197
4198Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4199int X() {}
4200auto Y() -&gt; int {}
4201</pre></td></tr>
4202
4203
4204<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>
4205<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4206       and if constexpr.
4207
4208Given:
4209  constexpr int foo = 42;
4210  constexpr int bar();
4211  void baz() { if constexpr(1 &gt; 0) {} }
4212varDecl(isConstexpr())
4213  matches the declaration of foo.
4214functionDecl(isConstexpr())
4215  matches the declaration of bar.
4216ifStmt(isConstexpr())
4217  matches the if statement in baz.
4218</pre></td></tr>
4219
4220
4221<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>
4222<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4223
4224Given:
4225  class A { ~A(); };
4226  class B { ~B() = default; };
4227functionDecl(isDefaulted())
4228  matches the declaration of ~B, but not ~A.
4229</pre></td></tr>
4230
4231
4232<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>
4233<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4234
4235Example matches A, va, fa
4236  class A {};
4237  class B;  // Doesn't match, as it has no body.
4238  int va;
4239  extern int vb;  // Doesn't match, as it doesn't define the variable.
4240  void fa() {}
4241  void fb();  // Doesn't match, as it has no body.
4242  @interface X
4243  - (void)ma; // Doesn't match, interface is declaration.
4244  @end
4245  @implementation X
4246  - (void)ma {}
4247  @end
4248
4249Usable 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;,
4250  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4251</pre></td></tr>
4252
4253
4254<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>
4255<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4256
4257Given:
4258  void Func();
4259  void DeletedFunc() = delete;
4260functionDecl(isDeleted())
4261  matches the declaration of DeletedFunc, but not Func.
4262</pre></td></tr>
4263
4264
4265<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>
4266<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4267static member variable template instantiations.
4268
4269Given
4270  template&lt;typename T&gt; void A(T t) { }
4271  template&lt;&gt; void A(int N) { }
4272functionDecl(isExplicitTemplateSpecialization())
4273  matches the specialization A&lt;int&gt;().
4274
4275Usable 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;
4276</pre></td></tr>
4277
4278
4279<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>
4280<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4281
4282Given:
4283  extern "C" void f() {}
4284  extern "C" { void g() {} }
4285  void h() {}
4286  extern "C" int x = 1;
4287  extern "C" int y = 2;
4288  int z = 3;
4289functionDecl(isExternC())
4290  matches the declaration of f and g, but not the declaration of h.
4291varDecl(isExternC())
4292  matches the declaration of x and y, but not the declaration of z.
4293</pre></td></tr>
4294
4295
4296<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>
4297<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4298the inline keyword.
4299
4300Given
4301  inline void f();
4302  void g();
4303  namespace n {
4304  inline namespace m {}
4305  }
4306functionDecl(isInline()) will match ::f().
4307namespaceDecl(isInline()) will match n::m.
4308</pre></td></tr>
4309
4310
4311<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>
4312<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4313into an executable program.
4314</pre></td></tr>
4315
4316
4317<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>
4318<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4319
4320Given
4321  void nope();
4322  [[noreturn]] void a();
4323  __attribute__((noreturn)) void b();
4324  struct c { [[noreturn]] c(); };
4325functionDecl(isNoReturn())
4326  matches all of those except
4327  void nope();
4328</pre></td></tr>
4329
4330
4331<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>
4332<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4333
4334Given:
4335  void f();
4336  void g() noexcept;
4337  void h() throw();
4338  void i() throw(int);
4339  void j() noexcept(false);
4340functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4341  match the declarations of g, and h, but not f, i or j.
4342</pre></td></tr>
4343
4344
4345<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>
4346<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4347class specifier ("static" keyword) written in the source.
4348
4349Given:
4350  static void f() {}
4351  static int i = 0;
4352  extern int j;
4353  int k;
4354functionDecl(isStaticStorageClass())
4355  matches the function declaration f.
4356varDecl(isStaticStorageClass())
4357  matches the variable declaration i.
4358</pre></td></tr>
4359
4360
4361<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>
4362<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4363member variable template instantiations.
4364
4365Given
4366  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4367or
4368  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4369or
4370  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4371cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4372  matches the template instantiation of X&lt;A&gt;.
4373
4374But given
4375  template &lt;typename T&gt;  class X {}; class A {};
4376  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4377cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4378  does not match, as X&lt;A&gt; is an explicit template specialization.
4379
4380Usable 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;
4381</pre></td></tr>
4382
4383
4384<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>
4385<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4386
4387Example matches f, but not g or h. The function i will not match, even when
4388compiled in C mode.
4389  void f(...);
4390  void g(int);
4391  template &lt;typename... Ts&gt; void h(Ts...);
4392  void i();
4393</pre></td></tr>
4394
4395
4396<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>
4397<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4398
4399Given:
4400  void foo() __attribute__((__weakref__("__foo")));
4401  void bar();
4402functionDecl(isWeak())
4403  matches the weak declaration "foo", but not "bar".
4404</pre></td></tr>
4405
4406
4407<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>
4408<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4409specific parameter count.
4410
4411Given
4412  void f(int i) {}
4413  void g(int i, int j) {}
4414  void h(int i, int j);
4415  void j(int i);
4416  void k(int x, int y, int z, ...);
4417functionDecl(parameterCountIs(2))
4418  matches g and h
4419functionProtoType(parameterCountIs(2))
4420  matches g and h
4421functionProtoType(parameterCountIs(3))
4422  matches k
4423</pre></td></tr>
4424
4425
4426<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>
4427<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4428
4429Given:
4430  void f();
4431  void g() noexcept;
4432  void h() noexcept(true);
4433  void i() noexcept(false);
4434  void j() throw();
4435  void k() throw(int);
4436  void l() throw(...);
4437functionDecl(hasDynamicExceptionSpec()) and
4438  functionProtoType(hasDynamicExceptionSpec())
4439  match the declarations of j, k, and l, but not f, g, h, or i.
4440</pre></td></tr>
4441
4442
4443<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>
4444<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4445
4446Given:
4447  void f();
4448  void g() noexcept;
4449  void h() throw();
4450  void i() throw(int);
4451  void j() noexcept(false);
4452functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4453  match the declarations of g, and h, but not f, i or j.
4454</pre></td></tr>
4455
4456
4457<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>
4458<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4459specific parameter count.
4460
4461Given
4462  void f(int i) {}
4463  void g(int i, int j) {}
4464  void h(int i, int j);
4465  void j(int i);
4466  void k(int x, int y, int z, ...);
4467functionDecl(parameterCountIs(2))
4468  matches g and h
4469functionProtoType(parameterCountIs(2))
4470  matches g and h
4471functionProtoType(parameterCountIs(3))
4472  matches k
4473</pre></td></tr>
4474
4475
4476<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>
4477<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4478       and if constexpr.
4479
4480Given:
4481  constexpr int foo = 42;
4482  constexpr int bar();
4483  void baz() { if constexpr(1 &gt; 0) {} }
4484varDecl(isConstexpr())
4485  matches the declaration of foo.
4486functionDecl(isConstexpr())
4487  matches the declaration of bar.
4488ifStmt(isConstexpr())
4489  matches the if statement in baz.
4490</pre></td></tr>
4491
4492
4493<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>
4494<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4495
4496
4497<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>
4498<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4499
4500Given
4501  f('false, 3.14, 42);
4502characterLiteral(equals(0))
4503  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4504  match false
4505floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4506  match 3.14
4507integerLiteral(equals(42))
4508  matches 42
4509
4510Note that you cannot directly match a negative numeric literal because the
4511minus sign is not part of the literal: It is a unary operator whose operand
4512is the positive numeric literal. Instead, you must use a unaryOperator()
4513matcher to match the minus sign:
4514
4515unaryOperator(hasOperatorName("-"),
4516              hasUnaryOperand(integerLiteral(equals(13))))
4517
4518Usable 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;,
4519           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;
4520</pre></td></tr>
4521
4522
4523<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>
4524<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4525
4526
4527<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>
4528<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4529
4530
4531<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('capturesThis0')"><a name="capturesThis0Anchor">capturesThis</a></td><td></td></tr>
4532<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'.
4533
4534Given
4535class C {
4536  int cc;
4537  int f() {
4538    auto l = [this]() { return cc; };
4539    return l();
4540  }
4541};
4542lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4543  matches `[this]() { return cc; }`.
4544</pre></td></tr>
4545
4546
4547<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('isImplicit2')"><a name="isImplicit2Anchor">isImplicit</a></td><td></td></tr>
4548<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4549implicit default/copy constructors).
4550</pre></td></tr>
4551
4552
4553<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('forEachLambdaCapture0')"><a name="forEachLambdaCapture0Anchor">forEachLambdaCapture</a></td><td>LambdaCaptureMatcher InnerMatcher</td></tr>
4554<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression.
4555
4556Given
4557  int main() {
4558    int x, y;
4559    float z;
4560    auto f = [=]() { return x + y + z; };
4561  }
4562lambdaExpr(forEachLambdaCapture(
4563    lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
4564will trigger two matches, binding for 'x' and 'y' respectively.
4565</pre></td></tr>
4566
4567
4568<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>LambdaCaptureMatcher InnerMatcher</td></tr>
4569<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression.
4570
4571Given
4572  void foo() {
4573    int t = 5;
4574    auto f = [=](){ return t; };
4575  }
4576lambdaExpr(hasAnyCapture(lambdaCapture())) and
4577lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t")))))
4578  both match `[=](){ return t; }`.
4579</pre></td></tr>
4580
4581
4582<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>
4583<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4584to '.'.
4585
4586Member calls on the implicit this pointer match as called with '-&gt;'.
4587
4588Given
4589  class Y {
4590    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4591    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4592    int a;
4593    static int b;
4594  };
4595  template &lt;class T&gt;
4596  class Z {
4597    void x() { this-&gt;m; }
4598  };
4599memberExpr(isArrow())
4600  matches this-&gt;x, x, y.x, a, this-&gt;b
4601cxxDependentScopeMemberExpr(isArrow())
4602  matches this-&gt;m
4603unresolvedMemberExpr(isArrow())
4604  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4605</pre></td></tr>
4606
4607
4608<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>
4609<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4610
4611This matcher is only provided as a performance optimization of hasName.
4612    hasAnyName(a, b, c)
4613 is equivalent to, but faster than
4614    anyOf(hasName(a), hasName(b), hasName(c))
4615</pre></td></tr>
4616
4617
4618<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>
4619<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4620
4621Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4622void f() {
4623  int x;
4624  static int y;
4625}
4626int z;
4627
4628Example matches f() because it has external formal linkage despite being
4629unique to the translation unit as though it has internal likage
4630(matcher = functionDecl(hasExternalFormalLinkage()))
4631
4632namespace {
4633void f() {}
4634}
4635</pre></td></tr>
4636
4637
4638<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>
4639<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4640
4641Supports specifying enclosing namespaces or classes by prefixing the name
4642with '&lt;enclosing&gt;::'.
4643Does not match typedefs of an underlying type with the given name.
4644
4645Example matches X (Name == "X")
4646  class X;
4647
4648Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4649  namespace a { namespace b { class X; } }
4650</pre></td></tr>
4651
4652
4653<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>
4654<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4655a substring matched by the given RegExp.
4656
4657Supports specifying enclosing namespaces or classes by
4658prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4659of an underlying type with the given name.
4660
4661Example matches X (regexp == "::X")
4662  class X;
4663
4664Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4665  namespace foo { namespace bar { class X; } }
4666
4667If the matcher is used in clang-query, RegexFlags parameter
4668should be passed as a quoted string. e.g: "NoFlags".
4669Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4670</pre></td></tr>
4671
4672
4673<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>
4674<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4675
4676Given
4677  namespace n {
4678  namespace {} // #1
4679  }
4680namespaceDecl(isAnonymous()) will match #1 but not ::n.
4681</pre></td></tr>
4682
4683
4684<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>
4685<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4686the inline keyword.
4687
4688Given
4689  inline void f();
4690  void g();
4691  namespace n {
4692  inline namespace m {}
4693  }
4694functionDecl(isInline()) will match ::f().
4695namespaceDecl(isInline()) will match n::m.
4696</pre></td></tr>
4697
4698
4699<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>
4700<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4701specified.
4702
4703Given
4704
4705  #pragma omp parallel
4706  #pragma omp parallel default(none)
4707  #pragma omp parallel default(shared)
4708  #pragma omp parallel default(firstprivate)
4709
4710``ompDefaultClause(isFirstPrivateKind())`` matches only
4711``default(firstprivate)``.
4712</pre></td></tr>
4713
4714
4715<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>
4716<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4717
4718Given
4719
4720  #pragma omp parallel
4721  #pragma omp parallel default(none)
4722  #pragma omp parallel default(shared)
4723  #pragma omp parallel default(firstprivate)
4724
4725``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4726</pre></td></tr>
4727
4728
4729<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>
4730<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4731
4732Given
4733
4734  #pragma omp parallel
4735  #pragma omp parallel default(none)
4736  #pragma omp parallel default(shared)
4737  #pragma omp parallel default(firstprivate)
4738
4739``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4740</pre></td></tr>
4741
4742
4743<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>
4744<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4745clause kind.
4746
4747Given
4748
4749  #pragma omp parallel
4750  #pragma omp parallel for
4751  #pragma omp          for
4752
4753`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4754``omp parallel`` and ``omp parallel for``.
4755
4756If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4757should be passed as a quoted string. e.g.,
4758``isAllowedToContainClauseKind("OMPC_default").``
4759</pre></td></tr>
4760
4761
4762<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>
4763<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4764i.e., directives that can't have a structured block.
4765
4766Given
4767
4768  #pragma omp parallel
4769  {}
4770  #pragma omp taskyield
4771
4772``ompExecutableDirective(isStandaloneDirective()))`` matches
4773``omp taskyield``.
4774</pre></td></tr>
4775
4776
4777<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>
4778<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4779</pre></td></tr>
4780
4781
4782<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>
4783<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4784</pre></td></tr>
4785
4786
4787<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>
4788<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4789isSameOrDerivedFrom(hasName(...)).
4790</pre></td></tr>
4791
4792
4793<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>
4794<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4795a specific number of arguments (including absent default arguments).
4796
4797Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4798  void f(int x, int y);
4799  f(0, 0);
4800</pre></td></tr>
4801
4802
4803<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>
4804<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4805Selector.getAsString()
4806
4807 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4808 matches both of the expressions below:
4809    [myObj methodA:argA];
4810    [myObj methodB:argB];
4811</pre></td></tr>
4812
4813
4814<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>
4815<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4816
4817objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4818message expression in
4819
4820  UIWebView *webView = ...;
4821  CGRect bodyFrame = webView.frame;
4822  bodyFrame.size.height = self.bodyContentHeight;
4823  webView.frame = bodyFrame;
4824  //     ^---- matches here
4825</pre></td></tr>
4826
4827
4828<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>
4829<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4830
4831Matches only when the selector of the objCMessageExpr is NULL. This may
4832represent an error condition in the tree!
4833</pre></td></tr>
4834
4835
4836<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>
4837<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4838
4839 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4840 matches the outer message expr in the code below, but NOT the message
4841 invocation for self.bodyView.
4842    [self.bodyView loadHTMLString:html baseURL:NULL];
4843</pre></td></tr>
4844
4845
4846<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>
4847<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4848
4849 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4850 matches self.bodyView in the code below, but NOT the outer message
4851 invocation of "loadHTMLString:baseURL:".
4852    [self.bodyView loadHTMLString:html baseURL:NULL];
4853</pre></td></tr>
4854
4855
4856<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>
4857<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4858
4859Example
4860matcher = objcMessageExpr(isClassMessage())
4861matches
4862  [NSString stringWithFormat:@"format"];
4863but not
4864  NSString *x = @"hello";
4865  [x containsString:@"h"];
4866</pre></td></tr>
4867
4868
4869<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>
4870<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4871
4872Example
4873matcher = objcMessageExpr(isInstanceMessage())
4874matches
4875  NSString *x = @"hello";
4876  [x containsString:@"h"];
4877but not
4878  [NSString stringWithFormat:@"format"];
4879</pre></td></tr>
4880
4881
4882<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>
4883<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4884a substring matched by the given RegExp.
4885 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4886 invocation for self.bodyView.
4887    [self.bodyView loadHTMLString:html baseURL:NULL];
4888
4889If the matcher is used in clang-query, RegexFlags parameter
4890should be passed as a quoted string. e.g: "NoFlags".
4891Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4892</pre></td></tr>
4893
4894
4895<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>
4896<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4897
4898 matcher = objCMessageExpr(numSelectorArgs(0));
4899 matches self.bodyView in the code below
4900
4901 matcher = objCMessageExpr(numSelectorArgs(2));
4902 matches the invocation of "loadHTMLString:baseURL:" but not that
4903 of self.bodyView
4904    [self.bodyView loadHTMLString:html baseURL:NULL];
4905</pre></td></tr>
4906
4907
4908<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>
4909<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4910
4911Example
4912matcher = objcMethodDecl(isClassMethod())
4913matches
4914@interface I + (void)foo; @end
4915but not
4916@interface I - (void)bar; @end
4917</pre></td></tr>
4918
4919
4920<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>
4921<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4922
4923Example matches A, va, fa
4924  class A {};
4925  class B;  // Doesn't match, as it has no body.
4926  int va;
4927  extern int vb;  // Doesn't match, as it doesn't define the variable.
4928  void fa() {}
4929  void fb();  // Doesn't match, as it has no body.
4930  @interface X
4931  - (void)ma; // Doesn't match, interface is declaration.
4932  @end
4933  @implementation X
4934  - (void)ma {}
4935  @end
4936
4937Usable 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;,
4938  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4939</pre></td></tr>
4940
4941
4942<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>
4943<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4944
4945Example
4946matcher = objcMethodDecl(isInstanceMethod())
4947matches
4948@interface I - (void)bar; @end
4949but not
4950@interface I + (void)foo; @end
4951</pre></td></tr>
4952
4953
4954<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>
4955<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4956
4957Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4958void x(int val) {}
4959void y(int val = 0) {}
4960
4961Deprecated. Use hasInitializer() instead to be able to
4962match on the contents of the default argument.  For example:
4963
4964void x(int val = 7) {}
4965void y(int val = 42) {}
4966parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4967  matches the parameter of y
4968
4969A matcher such as
4970  parmVarDecl(hasInitializer(anything()))
4971is equivalent to parmVarDecl(hasDefaultArgument()).
4972</pre></td></tr>
4973
4974
4975<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>
4976<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4977list. The parameter list could be that of either a block, function, or
4978objc-method.
4979
4980
4981Given
4982
4983void f(int a, int b, int c) {
4984}
4985
4986``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4987
4988``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4989</pre></td></tr>
4990
4991
4992<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>
4993<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4994
4995Given
4996  class Y { public: void x(); };
4997  void z() { Y* y; y-&gt;x(); }
4998cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4999  matches y-&gt;x()
5000</pre></td></tr>
5001
5002
5003<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>
5004<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
5005
5006Matches a node if it equals the node previously bound to ID.
5007
5008Given
5009  class X { int a; int b; };
5010cxxRecordDecl(
5011    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5012    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5013  matches the class X, as a and b have the same type.
5014
5015Note that when multiple matches are involved via forEach* matchers,
5016equalsBoundNodes acts as a filter.
5017For example:
5018compoundStmt(
5019    forEachDescendant(varDecl().bind("d")),
5020    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5021will trigger a match for each combination of variable declaration
5022and reference to that variable declaration within a compound statement.
5023</pre></td></tr>
5024
5025
5026<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>
5027<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
5028the node, not hidden within a typedef.
5029
5030Given
5031  typedef const int const_int;
5032  const_int i;
5033  int *const j;
5034  int *volatile k;
5035  int m;
5036varDecl(hasType(hasLocalQualifiers())) matches only j and k.
5037i is const-qualified but the qualifier is not local.
5038</pre></td></tr>
5039
5040
5041<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>
5042<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
5043
5044Given
5045  void a(char);
5046  void b(wchar_t);
5047  void c(double);
5048functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
5049matches "a(char)", "b(wchar_t)", but not "c(double)".
5050</pre></td></tr>
5051
5052
5053<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>
5054<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
5055the Objective-C object pointer type, which is different despite being
5056syntactically similar.
5057
5058Given
5059  int *i = nullptr;
5060
5061  @interface Foo
5062  @end
5063  Foo *f;
5064
5065  int j;
5066varDecl(hasType(isAnyPointer()))
5067  matches "int *i" and "Foo *f", but not "int j".
5068</pre></td></tr>
5069
5070
5071<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>
5072<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
5073include "top-level" const.
5074
5075Given
5076  void a(int);
5077  void b(int const);
5078  void c(const int);
5079  void d(const int*);
5080  void e(int const) {};
5081functionDecl(hasAnyParameter(hasType(isConstQualified())))
5082  matches "void b(int const)", "void c(const int)" and
5083  "void e(int const) {}". It does not match d as there
5084  is no top-level const on the parameter type "const int *".
5085</pre></td></tr>
5086
5087
5088<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>
5089<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
5090
5091Given
5092  void a(int);
5093  void b(long);
5094  void c(double);
5095functionDecl(hasAnyParameter(hasType(isInteger())))
5096matches "a(int)", "b(long)", but not "c(double)".
5097</pre></td></tr>
5098
5099
5100<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>
5101<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
5102
5103Given
5104  void a(int);
5105  void b(unsigned long);
5106  void c(double);
5107functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5108matches "a(int)", but not "b(unsigned long)" and "c(double)".
5109</pre></td></tr>
5110
5111
5112<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>
5113<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
5114
5115Given
5116  void a(int);
5117  void b(unsigned long);
5118  void c(double);
5119functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5120matches "b(unsigned long)", but not "a(int)" and "c(double)".
5121</pre></td></tr>
5122
5123
5124<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>
5125<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5126include "top-level" volatile.
5127
5128Given
5129  void a(int);
5130  void b(int volatile);
5131  void c(volatile int);
5132  void d(volatile int*);
5133  void e(int volatile) {};
5134functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5135  matches "void b(int volatile)", "void c(volatile int)" and
5136  "void e(int volatile) {}". It does not match d as there
5137  is no top-level volatile on the parameter type "volatile int *".
5138</pre></td></tr>
5139
5140
5141<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>
5142<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
5143
5144Matches a node if it equals the node previously bound to ID.
5145
5146Given
5147  class X { int a; int b; };
5148cxxRecordDecl(
5149    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5150    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5151  matches the class X, as a and b have the same type.
5152
5153Note that when multiple matches are involved via forEach* matchers,
5154equalsBoundNodes acts as a filter.
5155For example:
5156compoundStmt(
5157    forEachDescendant(varDecl().bind("d")),
5158    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5159will trigger a match for each combination of variable declaration
5160and reference to that variable declaration within a compound statement.
5161</pre></td></tr>
5162
5163
5164<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>
5165<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5166
5167Stmt has pointer identity in the AST.
5168</pre></td></tr>
5169
5170
5171<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>
5172<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5173Does not match if only part of the statement is expanded from that macro or
5174if different parts of the statement are expanded from different
5175appearances of the macro.
5176</pre></td></tr>
5177
5178
5179<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>
5180<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5181partially matching a given regex.
5182
5183Example matches Y but not X
5184    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5185  #include "ASTMatcher.h"
5186  class X {};
5187ASTMatcher.h:
5188  class Y {};
5189
5190Usable 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;
5191
5192If the matcher is used in clang-query, RegexFlags parameter
5193should be passed as a quoted string. e.g: "NoFlags".
5194Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5195</pre></td></tr>
5196
5197
5198<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>
5199<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5200
5201Example matches X but not Y
5202  (matcher = cxxRecordDecl(isExpansionInMainFile())
5203  #include &lt;Y.h&gt;
5204  class X {};
5205Y.h:
5206  class Y {};
5207
5208Usable 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;
5209</pre></td></tr>
5210
5211
5212<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>
5213<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5214
5215Example matches Y but not X
5216    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5217  #include &lt;SystemHeader.h&gt;
5218  class X {};
5219SystemHeader.h:
5220  class Y {};
5221
5222Usable 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;
5223</pre></td></tr>
5224
5225
5226<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>
5227<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5228
5229Given
5230  int j;
5231  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5232  A(0);
5233  A(0U);
5234declStmt(isInTemplateInstantiation())
5235  matches 'int i;' and 'unsigned i'.
5236unless(stmt(isInTemplateInstantiation()))
5237  will NOT match j += 42; as it's shared between the template definition and
5238  instantiation.
5239</pre></td></tr>
5240
5241
5242<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>
5243<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5244
5245Given
5246  int a[42];
5247  int b[2 * 21];
5248  int c[41], d[43];
5249  char *s = "abcd";
5250  wchar_t *ws = L"abcd";
5251  char *w = "a";
5252constantArrayType(hasSize(42))
5253  matches "int a[42]" and "int b[2 * 21]"
5254stringLiteral(hasSize(4))
5255  matches "abcd", L"abcd"
5256</pre></td></tr>
5257
5258
5259<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>
5260<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5261
5262Example matches C, but not S, U or E.
5263  struct S {};
5264  class C {};
5265  union U {};
5266  enum E {};
5267</pre></td></tr>
5268
5269
5270<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>
5271<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5272
5273Example matches A, va, fa
5274  class A {};
5275  class B;  // Doesn't match, as it has no body.
5276  int va;
5277  extern int vb;  // Doesn't match, as it doesn't define the variable.
5278  void fa() {}
5279  void fb();  // Doesn't match, as it has no body.
5280  @interface X
5281  - (void)ma; // Doesn't match, interface is declaration.
5282  @end
5283  @implementation X
5284  - (void)ma {}
5285  @end
5286
5287Usable 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;,
5288  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5289</pre></td></tr>
5290
5291
5292<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>
5293<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5294
5295Example matches E, but not C, S or U.
5296  struct S {};
5297  class C {};
5298  union U {};
5299  enum E {};
5300</pre></td></tr>
5301
5302
5303<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>
5304<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5305
5306Example matches S, but not C, U or E.
5307  struct S {};
5308  class C {};
5309  union U {};
5310  enum E {};
5311</pre></td></tr>
5312
5313
5314<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>
5315<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5316
5317Example matches U, but not C, S or E.
5318  struct S {};
5319  class C {};
5320  union U {};
5321  enum E {};
5322</pre></td></tr>
5323
5324
5325<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>
5326<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5327
5328Note that 'Value' is a string as the template argument's value is
5329an arbitrary precision integer. 'Value' must be euqal to the canonical
5330representation of that integral value in base 10.
5331
5332Given
5333  template&lt;int T&gt; struct C {};
5334  C&lt;42&gt; c;
5335classTemplateSpecializationDecl(
5336  hasAnyTemplateArgument(equalsIntegralValue("42")))
5337  matches the implicit instantiation of C in C&lt;42&gt;.
5338</pre></td></tr>
5339
5340
5341<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>
5342<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5343
5344Given
5345  template&lt;int T&gt; struct C {};
5346  C&lt;42&gt; c;
5347classTemplateSpecializationDecl(
5348  hasAnyTemplateArgument(isIntegral()))
5349  matches the implicit instantiation of C in C&lt;42&gt;
5350  with isIntegral() matching 42.
5351</pre></td></tr>
5352
5353
5354<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>
5355<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5356
5357Given
5358  template&lt;typename T&gt; struct C {};
5359  C&lt;int&gt; c;
5360classTemplateSpecializationDecl(templateArgumentCountIs(1))
5361  matches C&lt;int&gt;.
5362</pre></td></tr>
5363
5364
5365<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>
5366<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5367Does not match if only part of the statement is expanded from that macro or
5368if different parts of the statement are expanded from different
5369appearances of the macro.
5370</pre></td></tr>
5371
5372
5373<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>
5374<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5375partially matching a given regex.
5376
5377Example matches Y but not X
5378    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5379  #include "ASTMatcher.h"
5380  class X {};
5381ASTMatcher.h:
5382  class Y {};
5383
5384Usable 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;
5385
5386If the matcher is used in clang-query, RegexFlags parameter
5387should be passed as a quoted string. e.g: "NoFlags".
5388Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5389</pre></td></tr>
5390
5391
5392<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>
5393<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5394
5395Example matches X but not Y
5396  (matcher = cxxRecordDecl(isExpansionInMainFile())
5397  #include &lt;Y.h&gt;
5398  class X {};
5399Y.h:
5400  class Y {};
5401
5402Usable 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;
5403</pre></td></tr>
5404
5405
5406<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>
5407<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5408
5409Example matches Y but not X
5410    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5411  #include &lt;SystemHeader.h&gt;
5412  class X {};
5413SystemHeader.h:
5414  class Y {};
5415
5416Usable 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;
5417</pre></td></tr>
5418
5419
5420<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>
5421<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5422
5423Given
5424 struct S { bool func(); };
5425functionDecl(returns(booleanType()))
5426  matches "bool func();"
5427</pre></td></tr>
5428
5429
5430<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>
5431<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5432
5433Matches a node if it equals the node previously bound to ID.
5434
5435Given
5436  class X { int a; int b; };
5437cxxRecordDecl(
5438    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5439    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5440  matches the class X, as a and b have the same type.
5441
5442Note that when multiple matches are involved via forEach* matchers,
5443equalsBoundNodes acts as a filter.
5444For example:
5445compoundStmt(
5446    forEachDescendant(varDecl().bind("d")),
5447    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5448will trigger a match for each combination of variable declaration
5449and reference to that variable declaration within a compound statement.
5450</pre></td></tr>
5451
5452
5453<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>
5454<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5455
5456Type has pointer identity in the AST.
5457</pre></td></tr>
5458
5459
5460<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>
5461<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5462
5463Given
5464  int i;
5465  float f;
5466realFloatingPointType()
5467  matches "float f" but not "int i"
5468</pre></td></tr>
5469
5470
5471<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>
5472<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5473
5474Given
5475 struct S { void func(); };
5476functionDecl(returns(voidType()))
5477  matches "void func();"
5478</pre></td></tr>
5479
5480
5481<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>
5482<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5483
5484Given
5485  int x;
5486  int s = sizeof(x) + alignof(x)
5487unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5488  matches sizeof(x)
5489
5490If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5491should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5492</pre></td></tr>
5493
5494
5495<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
5496<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5497specified names.
5498
5499   hasAnyOperatorName("+", "-")
5500 Is equivalent to
5501   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5502</pre></td></tr>
5503
5504
5505<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
5506<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5507unary).
5508
5509Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5510  !(a || b)
5511</pre></td></tr>
5512
5513
5514<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>
5515<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5516to '.'.
5517
5518Member calls on the implicit this pointer match as called with '-&gt;'.
5519
5520Given
5521  class Y {
5522    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5523    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5524    int a;
5525    static int b;
5526  };
5527  template &lt;class T&gt;
5528  class Z {
5529    void x() { this-&gt;m; }
5530  };
5531memberExpr(isArrow())
5532  matches this-&gt;x, x, y.x, a, this-&gt;b
5533cxxDependentScopeMemberExpr(isArrow())
5534  matches this-&gt;m
5535unresolvedMemberExpr(isArrow())
5536  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5537</pre></td></tr>
5538
5539
5540<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>
5541<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5542
5543Example matches x, but not y, z, or a.
5544(matcher = varDecl(hasAutomaticStorageDuration())
5545void f() {
5546  int x;
5547  static int y;
5548  thread_local int z;
5549}
5550int a;
5551</pre></td></tr>
5552
5553
5554<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>
5555<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5556
5557Example matches y and z (matcher = varDecl(hasGlobalStorage())
5558void f() {
5559  int x;
5560  static int y;
5561}
5562int z;
5563</pre></td></tr>
5564
5565
5566<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>
5567<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5568non-static local variable.
5569
5570Example matches x (matcher = varDecl(hasLocalStorage())
5571void f() {
5572  int x;
5573  static int y;
5574}
5575int z;
5576</pre></td></tr>
5577
5578
5579<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>
5580<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5581It includes the variable declared at namespace scope and those declared
5582with "static" and "extern" storage class specifiers.
5583
5584void f() {
5585  int x;
5586  static int y;
5587  thread_local int z;
5588}
5589int a;
5590static int b;
5591extern int c;
5592varDecl(hasStaticStorageDuration())
5593  matches the function declaration y, a, b and c.
5594</pre></td></tr>
5595
5596
5597<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>
5598<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5599
5600Example matches z, but not x, z, or a.
5601(matcher = varDecl(hasThreadStorageDuration())
5602void f() {
5603  int x;
5604  static int y;
5605  thread_local int z;
5606}
5607int a;
5608</pre></td></tr>
5609
5610
5611<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>
5612<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5613       and if constexpr.
5614
5615Given:
5616  constexpr int foo = 42;
5617  constexpr int bar();
5618  void baz() { if constexpr(1 &gt; 0) {} }
5619varDecl(isConstexpr())
5620  matches the declaration of foo.
5621functionDecl(isConstexpr())
5622  matches the declaration of bar.
5623ifStmt(isConstexpr())
5624  matches the if statement in baz.
5625</pre></td></tr>
5626
5627
5628<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>
5629<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5630
5631Example matches A, va, fa
5632  class A {};
5633  class B;  // Doesn't match, as it has no body.
5634  int va;
5635  extern int vb;  // Doesn't match, as it doesn't define the variable.
5636  void fa() {}
5637  void fb();  // Doesn't match, as it has no body.
5638  @interface X
5639  - (void)ma; // Doesn't match, interface is declaration.
5640  @end
5641  @implementation X
5642  - (void)ma {}
5643  @end
5644
5645Usable 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;,
5646  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5647</pre></td></tr>
5648
5649
5650<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>
5651<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5652a C++ catch block, or an Objective-C statement.
5653
5654Example matches x (matcher = varDecl(isExceptionVariable())
5655void f(int y) {
5656  try {
5657  } catch (int x) {
5658  }
5659}
5660</pre></td></tr>
5661
5662
5663<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>
5664<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5665static member variable template instantiations.
5666
5667Given
5668  template&lt;typename T&gt; void A(T t) { }
5669  template&lt;&gt; void A(int N) { }
5670functionDecl(isExplicitTemplateSpecialization())
5671  matches the specialization A&lt;int&gt;().
5672
5673Usable 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;
5674</pre></td></tr>
5675
5676
5677<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>
5678<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5679
5680Given:
5681  extern "C" void f() {}
5682  extern "C" { void g() {} }
5683  void h() {}
5684  extern "C" int x = 1;
5685  extern "C" int y = 2;
5686  int z = 3;
5687functionDecl(isExternC())
5688  matches the declaration of f and g, but not the declaration of h.
5689varDecl(isExternC())
5690  matches the declaration of x and y, but not the declaration of z.
5691</pre></td></tr>
5692
5693
5694<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isInitCapture0')"><a name="isInitCapture0Anchor">isInitCapture</a></td><td></td></tr>
5695<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init-
5696capture.
5697
5698Example matches x (matcher = varDecl(isInitCapture()))
5699auto f = [x=3]() { return x; };
5700</pre></td></tr>
5701
5702
5703<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>
5704<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5705
5706Example matches y (matcher = varDecl(isStaticLocal()))
5707void f() {
5708  int x;
5709  static int y;
5710}
5711static int z;
5712</pre></td></tr>
5713
5714
5715<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>
5716<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5717class specifier ("static" keyword) written in the source.
5718
5719Given:
5720  static void f() {}
5721  static int i = 0;
5722  extern int j;
5723  int k;
5724functionDecl(isStaticStorageClass())
5725  matches the function declaration f.
5726varDecl(isStaticStorageClass())
5727  matches the variable declaration i.
5728</pre></td></tr>
5729
5730
5731<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>
5732<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5733member variable template instantiations.
5734
5735Given
5736  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5737or
5738  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5739or
5740  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5741cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5742  matches the template instantiation of X&lt;A&gt;.
5743
5744But given
5745  template &lt;typename T&gt;  class X {}; class A {};
5746  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5747cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5748  does not match, as X&lt;A&gt; is an explicit template specialization.
5749
5750Usable 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;
5751</pre></td></tr>
5752
5753<!--END_NARROWING_MATCHERS -->
5754</table>
5755
5756<!-- ======================================================================= -->
5757<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5758<!-- ======================================================================= -->
5759
5760<p>Traversal matchers specify the relationship to other nodes that are
5761reachable from the current node.</p>
5762
5763<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5764forEachDescendant) which work on all nodes and allow users to write more generic
5765match expressions.</p>
5766
5767<table>
5768<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5769<!-- START_TRAVERSAL_MATCHERS -->
5770
5771<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('binaryOperation0')"><a name="binaryOperation0Anchor">binaryOperation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
5772<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5773
5774The code
5775  var1 != var2;
5776might be represented in the clang AST as a binaryOperator, a
5777cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5778
5779* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5780  least one is a class type (cxxOperatorCallExpr)
5781* whether the code appears in a template declaration, if at least one of the
5782  vars is a dependent-type (binaryOperator)
5783* whether the code relies on a rewritten binary operator, such as a
5784spaceship operator or an inverted equality operator
5785(cxxRewrittenBinaryOperator)
5786
5787This matcher elides details in places where the matchers for the nodes are
5788compatible.
5789
5790Given
5791  binaryOperation(
5792    hasOperatorName("!="),
5793    hasLHS(expr().bind("lhs")),
5794    hasRHS(expr().bind("rhs"))
5795  )
5796matches each use of "!=" in:
5797  struct S{
5798      bool operator!=(const S&amp;) const;
5799  };
5800
5801  void foo()
5802  {
5803     1 != 2;
5804     S() != S();
5805  }
5806
5807  template&lt;typename T&gt;
5808  void templ()
5809  {
5810     1 != 2;
5811     T() != S();
5812  }
5813  struct HasOpEq
5814  {
5815      bool operator==(const HasOpEq &amp;) const;
5816  };
5817
5818  void inverse()
5819  {
5820      HasOpEq s1;
5821      HasOpEq s2;
5822      if (s1 != s2)
5823          return;
5824  }
5825
5826  struct HasSpaceship
5827  {
5828      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5829  };
5830
5831  void use_spaceship()
5832  {
5833      HasSpaceship s1;
5834      HasSpaceship s2;
5835      if (s1 != s2)
5836          return;
5837  }
5838</pre></td></tr>
5839
5840
5841<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>
5842<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5843
5844Unlike anyOf, eachOf will generate a match result for each
5845matching submatcher.
5846
5847For example, in:
5848  class A { int a; int b; };
5849The matcher:
5850  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5851                       has(fieldDecl(hasName("b")).bind("v"))))
5852will generate two results binding "v", the first of which binds
5853the field declaration of a, the second the field declaration of
5854b.
5855
5856Usable as: Any Matcher
5857</pre></td></tr>
5858
5859
5860<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>
5861<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5862
5863Generates results for each match.
5864
5865For example, in:
5866  class A { class B {}; class C {}; };
5867The matcher:
5868  cxxRecordDecl(hasName("::A"),
5869                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5870will generate results for A, B and C.
5871
5872Usable as: Any Matcher
5873</pre></td></tr>
5874
5875
5876<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5877<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5878provided matcher.
5879
5880Example matches X, A, A::X, B, B::C, B::C::X
5881  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5882  class X {};
5883  class A { class X {}; };  // Matches A, because A::X is a class of name
5884                            // X inside A.
5885  class B { class C { class X {}; }; };
5886
5887DescendantT must be an AST base type.
5888
5889As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5890each result that matches instead of only on the first one.
5891
5892Note: Recursively combined ForEachDescendant can cause many matches:
5893  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5894    forEachDescendant(cxxRecordDecl())
5895  )))
5896will match 10 times (plus injected class name matches) on:
5897  class A { class B { class C { class D { class E {}; }; }; }; };
5898
5899Usable as: Any Matcher
5900</pre></td></tr>
5901
5902
5903<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5904<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5905provided matcher.
5906
5907Example matches X, Y, Y::X, Z::Y, Z::Y::X
5908  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5909  class X {};
5910  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5911                            // inside Y.
5912  class Z { class Y { class X {}; }; };  // Does not match Z.
5913
5914ChildT must be an AST base type.
5915
5916As opposed to 'has', 'forEach' will cause a match for each result that
5917matches instead of only on the first one.
5918
5919Usable as: Any Matcher
5920</pre></td></tr>
5921
5922
5923<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5924<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5925matcher.
5926
5927Given
5928void f() { if (true) { int x = 42; } }
5929void g() { for (;;) { int x = 43; } }
5930expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5931
5932Usable as: Any Matcher
5933</pre></td></tr>
5934
5935
5936<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5937<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5938provided matcher.
5939
5940Example matches X, Y, Z
5941    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5942  class X {};  // Matches X, because X::X is a class of name X inside X.
5943  class Y { class X {}; };
5944  class Z { class Y { class X {}; }; };
5945
5946DescendantT must be an AST base type.
5947
5948Usable as: Any Matcher
5949</pre></td></tr>
5950
5951
5952<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5953<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5954provided matcher.
5955
5956Example matches X, Y
5957  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5958  class X {};  // Matches X, because X::X is a class of name X inside X.
5959  class Y { class X {}; };
5960  class Z { class Y { class X {}; }; };  // Does not match Z.
5961
5962ChildT must be an AST base type.
5963
5964Usable as: Any Matcher
5965Note that has is direct matcher, so it also matches things like implicit
5966casts and paren casts. If you are matching with expr then you should
5967probably consider using ignoringParenImpCasts like:
5968has(ignoringParenImpCasts(expr())).
5969</pre></td></tr>
5970
5971
5972<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5973<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5974matcher.
5975
5976Given
5977void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5978compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5979
5980Usable as: Any Matcher
5981</pre></td></tr>
5982
5983
5984<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher&lt;*&gt;...Matcher&lt;*&gt;</td></tr>
5985<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5986
5987Because CallExpr and CXXConstructExpr do not share a common
5988base class with API accessing arguments etc, AST Matchers for code
5989which should match both are typically duplicated. This matcher
5990removes the need for duplication.
5991
5992Given code
5993struct ConstructorTakesInt
5994{
5995  ConstructorTakesInt(int i) {}
5996};
5997
5998void callTakesInt(int i)
5999{
6000}
6001
6002void doCall()
6003{
6004  callTakesInt(42);
6005}
6006
6007void doConstruct()
6008{
6009  ConstructorTakesInt cti(42);
6010}
6011
6012The matcher
6013invocation(hasArgument(0, integerLiteral(equals(42))))
6014matches the expression in both doCall and doConstruct
6015</pre></td></tr>
6016
6017
6018<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
6019<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
6020
6021However, optionally will retain any bindings generated by the submatcher.
6022Useful when additional information which may or may not present about a main
6023matching node is desired.
6024
6025For example, in:
6026  class Foo {
6027    int bar;
6028  }
6029The matcher:
6030  cxxRecordDecl(
6031    optionally(has(
6032      fieldDecl(hasName("bar")).bind("var")
6033  ))).bind("record")
6034will produce a result binding for both "record" and "var".
6035The matcher will produce a "record" binding for even if there is no data
6036member named "bar" in that class.
6037
6038Usable as: Any Matcher
6039</pre></td></tr>
6040
6041
6042<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>
6043<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
6044
6045Given
6046  void foo()
6047  {
6048      int i = 3.0;
6049  }
6050The matcher
6051  traverse(TK_IgnoreUnlessSpelledInSource,
6052    varDecl(hasInitializer(floatLiteral().bind("init")))
6053  )
6054matches the variable declaration with "init" bound to the "3.0".
6055</pre></td></tr>
6056
6057
6058<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>
6059<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
6060switch statement or conditional operator.
6061
6062Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6063  if (true) {}
6064</pre></td></tr>
6065
6066
6067<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>
6068<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
6069(binary or ternary).
6070
6071Example matches b
6072  condition ? a : b
6073  condition ?: b
6074</pre></td></tr>
6075
6076
6077<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>
6078<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
6079
6080Example 1 (conditional ternary operator): matches a
6081  condition ? a : b
6082
6083Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6084  condition ?: b
6085</pre></td></tr>
6086
6087
6088<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>
6089<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
6090matches the given matcher.
6091
6092The associated declaration is:
6093- for type nodes, the declaration of the underlying type
6094- for CallExpr, the declaration of the callee
6095- for MemberExpr, the declaration of the referenced member
6096- for CXXConstructExpr, the declaration of the constructor
6097- for CXXNewExpr, the declaration of the operator new
6098- for ObjCIvarExpr, the declaration of the ivar
6099
6100For type nodes, hasDeclaration will generally match the declaration of the
6101sugared type. Given
6102  class X {};
6103  typedef X Y;
6104  Y y;
6105in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6106typedefDecl. A common use case is to match the underlying, desugared type.
6107This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6108  varDecl(hasType(hasUnqualifiedDesugaredType(
6109      recordType(hasDeclaration(decl())))))
6110In this matcher, the decl will match the CXXRecordDecl of class X.
6111
6112Usable 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;,
6113  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;,
6114  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;,
6115  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;,
6116  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;,
6117  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;,
6118  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6119</pre></td></tr>
6120
6121
6122<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>
6123<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
6124
6125Given
6126  int i[5];
6127  void f() { i[1] = 42; }
6128arraySubscriptExpression(hasBase(implicitCastExpr(
6129    hasSourceExpression(declRefExpr()))))
6130  matches i[1] with the declRefExpr() matching i
6131</pre></td></tr>
6132
6133
6134<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>
6135<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
6136
6137Given
6138  int i[5];
6139  void f() { i[1] = 42; }
6140arraySubscriptExpression(hasIndex(integerLiteral()))
6141  matches i[1] with the integerLiteral() matching 1
6142</pre></td></tr>
6143
6144
6145<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS3')"><a name="hasLHS3Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6146<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
6147
6148Example matches a (matcher = binaryOperator(hasLHS()))
6149  a || b
6150</pre></td></tr>
6151
6152
6153<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS3')"><a name="hasRHS3Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6154<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
6155
6156Example matches b (matcher = binaryOperator(hasRHS()))
6157  a || b
6158</pre></td></tr>
6159
6160
6161<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>
6162<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
6163type.
6164
6165Given
6166  struct A {};
6167  A a[7];
6168  int b[7];
6169arrayType(hasElementType(builtinType()))
6170  matches "int b[7]"
6171
6172Usable 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;
6173</pre></td></tr>
6174
6175
6176<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>
6177<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6178
6179Given
6180  _Atomic(int) i;
6181  _Atomic(float) f;
6182atomicType(hasValueType(isInteger()))
6183 matches "_Atomic(int) i"
6184
6185Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6186</pre></td></tr>
6187
6188
6189<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>
6190<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6191
6192Note: There is no TypeLoc for the deduced type and thus no
6193getDeducedLoc() matcher.
6194
6195Given
6196  auto a = 1;
6197  auto b = 2.0;
6198autoType(hasDeducedType(isInteger()))
6199  matches "auto a"
6200
6201Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6202</pre></td></tr>
6203
6204
6205<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BaseUsingDecl.html">BaseUsingDecl</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>
6206<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6207
6208Given
6209  namespace X { void b(); }
6210  using X::b;
6211usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6212  matches using X::b </pre></td></tr>
6213
6214
6215<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>
6216<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6217binary operator matches.
6218</pre></td></tr>
6219
6220
6221<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>
6222<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6223
6224Example matches a (matcher = binaryOperator(hasLHS()))
6225  a || b
6226</pre></td></tr>
6227
6228
6229<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>
6230<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6231
6232Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6233                                             integerLiteral(equals(2)))
6234  1 + 2 // Match
6235  2 + 1 // Match
6236  1 + 1 // No match
6237  2 + 2 // No match
6238</pre></td></tr>
6239
6240
6241<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>
6242<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6243
6244Example matches b (matcher = binaryOperator(hasRHS()))
6245  a || b
6246</pre></td></tr>
6247
6248
6249<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;</td><td class="name" onclick="toggle('forDecomposition0')"><a name="forDecomposition0Anchor">forDecomposition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
6250<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6251
6252For example, in:
6253void foo()
6254{
6255    int arr[3];
6256    auto &amp;[f, s, t] = arr;
6257
6258    f = 42;
6259}
6260The matcher:
6261  bindingDecl(hasName("f"),
6262                forDecomposition(decompositionDecl())
6263matches 'f' in 'auto &amp;[f, s, t]'.
6264</pre></td></tr>
6265
6266
6267<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>
6268<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6269block.
6270
6271Does not match the 'this' parameter of a method.
6272
6273Given
6274  class X { void f(int x, int y, int z) {} };
6275cxxMethodDecl(hasAnyParameter(hasName("y")))
6276  matches f(int x, int y, int z) {}
6277with hasAnyParameter(...)
6278  matching int y
6279
6280For ObjectiveC, given
6281  @interface I - (void) f:(int) y; @end
6282
6283the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6284matches the declaration of method f with hasParameter
6285matching y.
6286
6287For blocks, given
6288  b = ^(int y) { printf("%d", y) };
6289
6290the matcher blockDecl(hasAnyParameter(hasName("y")))
6291matches the declaration of the block b with hasParameter
6292matching y.
6293</pre></td></tr>
6294
6295
6296<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>
6297<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6298declaration or a block.
6299
6300Given
6301  class X { void f(int x) {} };
6302cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6303  matches f(int x) {}
6304with hasParameter(...)
6305  matching int x
6306
6307For ObjectiveC, given
6308  @interface I - (void) f:(int) y; @end
6309
6310the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6311matches the declaration of method f with hasParameter
6312matching y.
6313</pre></td></tr>
6314
6315
6316<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</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>
6317<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6318
6319Examples:
6320  int x;
6321declaratorDecl(hasTypeLoc(loc(asString("int"))))
6322  matches int x
6323
6324auto x = int(3);
6325cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6326  matches int(3)
6327
6328struct Foo { Foo(int, int); };
6329auto x = Foo(1, 2);
6330cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6331  matches Foo(1, 2)
6332
6333Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6334  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6335  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6336  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6337  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6338  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6339  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6340  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6341</pre></td></tr>
6342
6343
6344<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>
6345<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6346pointee matches a given matcher.
6347
6348Given
6349  int *a;
6350  int const *b;
6351  float const *f;
6352pointerType(pointee(isConstQualified(), isInteger()))
6353  matches "int const *b"
6354
6355Usable 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;,
6356  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;
6357</pre></td></tr>
6358
6359
6360<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc1')"><a name="hasTypeLoc1Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6361<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6362
6363Examples:
6364  int x;
6365declaratorDecl(hasTypeLoc(loc(asString("int"))))
6366  matches int x
6367
6368auto x = int(3);
6369cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6370  matches int(3)
6371
6372struct Foo { Foo(int, int); };
6373auto x = Foo(1, 2);
6374cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6375  matches Foo(1, 2)
6376
6377Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6378  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6379  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6380  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6381  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6382  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6383  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6384  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6385</pre></td></tr>
6386
6387
6388<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasType8')"><a name="hasType8Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
6389<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6390declaration's type.
6391
6392In case of a value declaration (for example a variable declaration),
6393this resolves one layer of indirection. For example, in the value
6394declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6395X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6396declaration of x.
6397
6398Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6399            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6400            and friend class X (matcher = friendDecl(hasType("X"))
6401            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6402                                              cxxRecordDecl(hasName("X"))))
6403 class X {};
6404 void y(X &amp;x) { x; X z; }
6405 class Y { friend class X; };
6406 class Z : public virtual X {};
6407
6408Example matches class Derived
6409(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6410class Base {};
6411class Derived : Base {};
6412
6413Usable 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;,
6414Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6415</pre></td></tr>
6416
6417
6418<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</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_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
6419<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6420matcher.
6421
6422Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6423            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6424            and U (matcher = typedefDecl(hasType(asString("int")))
6425            and friend class X (matcher = friendDecl(hasType("X"))
6426            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6427                                              asString("class X")))
6428 class X {};
6429 void y(X &amp;x) { x; X z; }
6430 typedef int U;
6431 class Y { friend class X; };
6432 class Z : public virtual X {};
6433</pre></td></tr>
6434
6435
6436<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>
6437<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6438
6439Given
6440  void f(int i);
6441  int y;
6442  f(y);
6443callExpr(
6444  forEachArgumentWithParam(
6445    declRefExpr(to(varDecl(hasName("y")))),
6446    parmVarDecl(hasType(isInteger()))
6447))
6448  matches f(y);
6449with declRefExpr(...)
6450  matching int y
6451and parmVarDecl(...)
6452  matching int i
6453</pre></td></tr>
6454
6455
6456<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>
6457<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6458CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6459it works on calls through function pointers as well.
6460
6461The difference is, that function pointers do not provide access to a
6462ParmVarDecl, but only the QualType for each argument.
6463
6464Given
6465  void f(int i);
6466  int y;
6467  f(y);
6468  void (*f_ptr)(int) = f;
6469  f_ptr(y);
6470callExpr(
6471  forEachArgumentWithParamType(
6472    declRefExpr(to(varDecl(hasName("y")))),
6473    qualType(isInteger()).bind("type)
6474))
6475  matches f(y) and f_ptr(y)
6476with declRefExpr(...)
6477  matching int y
6478and qualType(...)
6479  matching int
6480</pre></td></tr>
6481
6482
6483<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>
6484<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6485expression, or an ObjC-message-send expression.
6486
6487Given
6488  void x(int, int, int) { int y; x(1, y, 42); }
6489callExpr(hasAnyArgument(declRefExpr()))
6490  matches x(1, y, 42)
6491with hasAnyArgument(...)
6492  matching y
6493
6494For ObjectiveC, given
6495  @interface I - (void) f:(int) y; @end
6496  void foo(I *i) { [i f:12]; }
6497objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6498  matches [i f:12]
6499</pre></td></tr>
6500
6501
6502<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>
6503<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6504call expression.
6505
6506Example matches y in x(y)
6507    (matcher = callExpr(hasArgument(0, declRefExpr())))
6508  void x(int) { int y; x(y); }
6509</pre></td></tr>
6510
6511
6512<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>
6513<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6514matches the given matcher.
6515
6516The associated declaration is:
6517- for type nodes, the declaration of the underlying type
6518- for CallExpr, the declaration of the callee
6519- for MemberExpr, the declaration of the referenced member
6520- for CXXConstructExpr, the declaration of the constructor
6521- for CXXNewExpr, the declaration of the operator new
6522- for ObjCIvarExpr, the declaration of the ivar
6523
6524For type nodes, hasDeclaration will generally match the declaration of the
6525sugared type. Given
6526  class X {};
6527  typedef X Y;
6528  Y y;
6529in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6530typedefDecl. A common use case is to match the underlying, desugared type.
6531This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6532  varDecl(hasType(hasUnqualifiedDesugaredType(
6533      recordType(hasDeclaration(decl())))))
6534In this matcher, the decl will match the CXXRecordDecl of class X.
6535
6536Usable 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;,
6537  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;,
6538  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;,
6539  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;,
6540  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;,
6541  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;,
6542  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6543</pre></td></tr>
6544
6545
6546<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>
6547<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6548
6549Given
6550  class A { A() : i(42), j(42) {} int i; int j; };
6551cxxConstructorDecl(forEachConstructorInitializer(
6552  forField(decl().bind("x"))
6553))
6554  will trigger two matches, binding for 'i' and 'j' respectively.
6555</pre></td></tr>
6556
6557
6558<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>
6559<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6560
6561Given
6562  struct Foo {
6563    Foo() : foo_(1) { }
6564    int foo_;
6565  };
6566cxxRecordDecl(has(cxxConstructorDecl(
6567  hasAnyConstructorInitializer(anything())
6568)))
6569  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6570</pre></td></tr>
6571
6572
6573<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>
6574<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6575
6576Given
6577  struct Foo {
6578    Foo() : foo_(1) { }
6579    int foo_;
6580  };
6581cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6582    forField(hasName("foo_"))))))
6583  matches Foo
6584with forField matching foo_
6585</pre></td></tr>
6586
6587
6588<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc2')"><a name="hasTypeLoc2Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6589<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6590
6591Examples:
6592  int x;
6593declaratorDecl(hasTypeLoc(loc(asString("int"))))
6594  matches int x
6595
6596auto x = int(3);
6597cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6598  matches int(3)
6599
6600struct Foo { Foo(int, int); };
6601auto x = Foo(1, 2);
6602cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6603  matches Foo(1, 2)
6604
6605Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6606  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6607  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6608  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6609  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6610  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6611  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6612  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6613</pre></td></tr>
6614
6615
6616<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>
6617<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6618
6619Given
6620  struct Foo {
6621    Foo() : foo_(1) { }
6622    int foo_;
6623  };
6624cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6625    withInitializer(integerLiteral(equals(1)))))))
6626  matches Foo
6627with withInitializer matching (1)
6628</pre></td></tr>
6629
6630
6631<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>
6632<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6633given matcher. Implicit object expressions are included; that is, it matches
6634use of implicit `this`.
6635
6636Given
6637  struct X {
6638    int m;
6639    int f(X x) { x.m; return m; }
6640  };
6641memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6642  matches `x.m`, but not `m`; however,
6643memberExpr(hasObjectExpression(hasType(pointsTo(
6644     cxxRecordDecl(hasName("X"))))))
6645  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6646</pre></td></tr>
6647
6648
6649<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>
6650<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6651
6652
6653<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>
6654<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6655
6656Given:
6657 void foo() {
6658   if (int i = foobar(); i &gt; 0) {}
6659   switch (int i = foobar(); i) {}
6660   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6661 }
6662 void bar() {
6663   if (foobar() &gt; 0) {}
6664   switch (foobar()) {}
6665   for (auto&amp; x : get_range()) {}
6666 }
6667ifStmt(hasInitStatement(anything()))
6668  matches the if statement in foo but not in bar.
6669switchStmt(hasInitStatement(anything()))
6670  matches the switch statement in foo but not in bar.
6671cxxForRangeStmt(hasInitStatement(anything()))
6672  matches the range for statement in foo but not in bar.
6673</pre></td></tr>
6674
6675
6676<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>
6677<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6678
6679Example:
6680    forStmt(hasLoopVariable(anything()))
6681matches 'int x' in
6682    for (int x : a) { }
6683</pre></td></tr>
6684
6685
6686<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>
6687<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6688
6689Example:
6690    forStmt(hasRangeInit(anything()))
6691matches 'a' in
6692    for (int x : a) { }
6693</pre></td></tr>
6694
6695
6696<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc3')"><a name="hasTypeLoc3Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6697<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6698
6699Examples:
6700  int x;
6701declaratorDecl(hasTypeLoc(loc(asString("int"))))
6702  matches int x
6703
6704auto x = int(3);
6705cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6706  matches int(3)
6707
6708struct Foo { Foo(int, int); };
6709auto x = Foo(1, 2);
6710cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6711  matches Foo(1, 2)
6712
6713Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6714  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6715  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6716  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6717  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6718  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6719  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6720  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6721</pre></td></tr>
6722
6723
6724<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>
6725<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6726`on`, matches the argument directly without stripping away anything.
6727
6728Given
6729  class Y { public: void m(); };
6730  Y g();
6731  class X : public Y { void g(); };
6732  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6733cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6734    cxxRecordDecl(hasName("Y")))))
6735  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6736cxxMemberCallExpr(on(callExpr()))
6737  does not match `(g()).m()`, because the parens are not ignored.
6738
6739FIXME: Overload to allow directly matching types?
6740</pre></td></tr>
6741
6742
6743<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>
6744<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6745stripping off any parentheses or implicit casts.
6746
6747Given
6748  class Y { public: void m(); };
6749  Y g();
6750  class X : public Y {};
6751  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6752cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6753  matches `y.m()` and `(g()).m()`.
6754cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6755  matches `x.m()`.
6756cxxMemberCallExpr(on(callExpr()))
6757  matches `(g()).m()`.
6758
6759FIXME: Overload to allow directly matching types?
6760</pre></td></tr>
6761
6762
6763<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>
6764<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6765</pre></td></tr>
6766
6767
6768<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>
6769<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6770matches the InnerMatcher, or is a pointer to a type that matches the
6771InnerMatcher.
6772
6773Given
6774  class Y { public: void m(); };
6775  class X : public Y { void g(); };
6776  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6777cxxMemberCallExpr(thisPointerType(hasDeclaration(
6778    cxxRecordDecl(hasName("Y")))))
6779  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6780cxxMemberCallExpr(thisPointerType(hasDeclaration(
6781    cxxRecordDecl(hasName("X")))))
6782  matches `x.g()`.
6783</pre></td></tr>
6784
6785
6786<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>
6787<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6788produce multiple matches.
6789
6790Given
6791  class A { virtual void f(); };
6792  class B : public A { void f(); };
6793  class C : public B { void f(); };
6794cxxMethodDecl(ofClass(hasName("C")),
6795              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6796  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6797  that B::f is not overridden by C::f).
6798
6799The check can produce multiple matches in case of multiple inheritance, e.g.
6800  class A1 { virtual void f(); };
6801  class A2 { virtual void f(); };
6802  class C : public A1, public A2 { void f(); };
6803cxxMethodDecl(ofClass(hasName("C")),
6804              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6805  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6806  once with "b" binding "A2::f" and "d" binding "C::f".
6807</pre></td></tr>
6808
6809
6810<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>
6811<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6812belongs to.
6813
6814FIXME: Generalize this for other kinds of declarations.
6815FIXME: What other kind of declarations would we need to generalize
6816this to?
6817
6818Example matches A() in the last line
6819    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6820        ofClass(hasName("A"))))))
6821  class A {
6822   public:
6823    A();
6824  };
6825  A a = A();
6826</pre></td></tr>
6827
6828
6829<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>
6830<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6831
6832Given:
6833  MyClass *p1 = new (Storage) MyClass();
6834cxxNewExpr(hasAnyPlacementArg(anything()))
6835  matches the expression 'new (Storage, 16) MyClass()'.
6836</pre></td></tr>
6837
6838
6839<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>
6840<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6841
6842Given:
6843  MyClass *p1 = new MyClass[10];
6844cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6845  matches the expression 'new MyClass[10]'.
6846</pre></td></tr>
6847
6848
6849<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>
6850<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6851matches the given matcher.
6852
6853The associated declaration is:
6854- for type nodes, the declaration of the underlying type
6855- for CallExpr, the declaration of the callee
6856- for MemberExpr, the declaration of the referenced member
6857- for CXXConstructExpr, the declaration of the constructor
6858- for CXXNewExpr, the declaration of the operator new
6859- for ObjCIvarExpr, the declaration of the ivar
6860
6861For type nodes, hasDeclaration will generally match the declaration of the
6862sugared type. Given
6863  class X {};
6864  typedef X Y;
6865  Y y;
6866in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6867typedefDecl. A common use case is to match the underlying, desugared type.
6868This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6869  varDecl(hasType(hasUnqualifiedDesugaredType(
6870      recordType(hasDeclaration(decl())))))
6871In this matcher, the decl will match the CXXRecordDecl of class X.
6872
6873Usable 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;,
6874  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;,
6875  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;,
6876  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;,
6877  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;,
6878  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;,
6879  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6880</pre></td></tr>
6881
6882
6883<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>
6884<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6885
6886Given:
6887  MyClass *p1 = new (Storage, 16) MyClass();
6888cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6889  matches the expression 'new (Storage, 16) MyClass()'.
6890</pre></td></tr>
6891
6892
6893<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc4')"><a name="hasTypeLoc4Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
6894<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6895
6896Examples:
6897  int x;
6898declaratorDecl(hasTypeLoc(loc(asString("int"))))
6899  matches int x
6900
6901auto x = int(3);
6902cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6903  matches int(3)
6904
6905struct Foo { Foo(int, int); };
6906auto x = Foo(1, 2);
6907cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6908  matches Foo(1, 2)
6909
6910Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
6911  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
6912  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
6913  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6914  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
6915  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
6916  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
6917  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6918</pre></td></tr>
6919
6920
6921<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand1')"><a name="hasEitherOperand1Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6922<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6923binary operator matches.
6924</pre></td></tr>
6925
6926
6927<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6928<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6929
6930Example matches a (matcher = binaryOperator(hasLHS()))
6931  a || b
6932</pre></td></tr>
6933
6934
6935<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperands1')"><a name="hasOperands1Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
6936<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6937
6938Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6939                                             integerLiteral(equals(2)))
6940  1 + 2 // Match
6941  2 + 1 // Match
6942  1 + 1 // No match
6943  2 + 2 // No match
6944</pre></td></tr>
6945
6946
6947<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6948<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6949
6950Example matches b (matcher = binaryOperator(hasRHS()))
6951  a || b
6952</pre></td></tr>
6953
6954
6955<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand1')"><a name="hasUnaryOperand1Anchor">hasUnaryOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6956<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6957
6958Example matches true (matcher = hasUnaryOperand(
6959                                  cxxBoolLiteral(equals(true))))
6960  !true
6961</pre></td></tr>
6962
6963
6964<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>
6965<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6966
6967Example:
6968matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6969  class Foo;
6970  class Bar : Foo {};
6971  class Baz : Bar {};
6972  class SpecialBase;
6973  class Proxy : SpecialBase {};  // matches Proxy
6974  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6975
6976FIXME: Refactor this and isDerivedFrom to reuse implementation.
6977</pre></td></tr>
6978
6979
6980<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>
6981<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6982
6983Example:
6984matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6985  class Foo;
6986  class Bar : Foo {};
6987  class Baz : Bar {};
6988  class SpecialBase;
6989  class Proxy : SpecialBase {};  // matches Proxy
6990  class IndirectlyDerived : Proxy {};  // doesn't match
6991</pre></td></tr>
6992
6993
6994<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>
6995<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6996
6997Given:
6998  class A { void func(); };
6999  class B { void member(); };
7000
7001cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
7002A but not B.
7003</pre></td></tr>
7004
7005
7006<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>
7007<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
7008matching Base, or Objective-C classes that directly or indirectly
7009subclass a class matching Base.
7010
7011Note that a class is not considered to be derived from itself.
7012
7013Example matches Y, Z, C (Base == hasName("X"))
7014  class X;
7015  class Y : public X {};  // directly derived
7016  class Z : public Y {};  // indirectly derived
7017  typedef X A;
7018  typedef A B;
7019  class C : public B {};  // derived from a typedef of X
7020
7021In the following example, Bar matches isDerivedFrom(hasName("X")):
7022  class Foo;
7023  typedef Foo X;
7024  class Bar : public Foo {};  // derived from a type that X is a typedef of
7025
7026In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7027  @interface NSObject @end
7028  @interface Bar : NSObject @end
7029
7030Usable 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;
7031</pre></td></tr>
7032
7033
7034<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>
7035<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7036matching Base.
7037
7038Note that a class is not considered to be derived from itself.
7039
7040Example matches Y, C (Base == hasName("X"))
7041  class X;
7042  class Y : public X {};  // directly derived
7043  class Z : public Y {};  // indirectly derived
7044  typedef X A;
7045  typedef A B;
7046  class C : public B {};  // derived from a typedef of X
7047
7048In the following example, Bar matches isDerivedFrom(hasName("X")):
7049  class Foo;
7050  typedef Foo X;
7051  class Bar : public Foo {};  // derived from a type that X is a typedef of
7052</pre></td></tr>
7053
7054
7055<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>
7056<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7057match Base.
7058</pre></td></tr>
7059
7060
7061<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand2')"><a name="hasEitherOperand2Anchor">hasEitherOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7062<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
7063binary operator matches.
7064</pre></td></tr>
7065
7066
7067<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasLHS2')"><a name="hasLHS2Anchor">hasLHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7068<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
7069
7070Example matches a (matcher = binaryOperator(hasLHS()))
7071  a || b
7072</pre></td></tr>
7073
7074
7075<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperands2')"><a name="hasOperands2Anchor">hasOperands</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher1, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; Matcher2</td></tr>
7076<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
7077
7078Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
7079                                             integerLiteral(equals(2)))
7080  1 + 2 // Match
7081  2 + 1 // Match
7082  1 + 1 // No match
7083  2 + 2 // No match
7084</pre></td></tr>
7085
7086
7087<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasRHS2')"><a name="hasRHS2Anchor">hasRHS</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
7088<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7089
7090Example matches b (matcher = binaryOperator(hasRHS()))
7091  a || b
7092</pre></td></tr>
7093
7094
7095<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc5')"><a name="hasTypeLoc5Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7096<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7097
7098Examples:
7099  int x;
7100declaratorDecl(hasTypeLoc(loc(asString("int"))))
7101  matches int x
7102
7103auto x = int(3);
7104cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7105  matches int(3)
7106
7107struct Foo { Foo(int, int); };
7108auto x = Foo(1, 2);
7109cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7110  matches Foo(1, 2)
7111
7112Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7113  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7114  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7115  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7116  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7117  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7118  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7119  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7120</pre></td></tr>
7121
7122
7123<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>
7124<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7125expression, or an ObjC-message-send expression.
7126
7127Given
7128  void x(int, int, int) { int y; x(1, y, 42); }
7129callExpr(hasAnyArgument(declRefExpr()))
7130  matches x(1, y, 42)
7131with hasAnyArgument(...)
7132  matching y
7133
7134For ObjectiveC, given
7135  @interface I - (void) f:(int) y; @end
7136  void foo(I *i) { [i f:12]; }
7137objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7138  matches [i f:12]
7139</pre></td></tr>
7140
7141
7142<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>
7143<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7144call expression.
7145
7146Example matches y in x(y)
7147    (matcher = callExpr(hasArgument(0, declRefExpr())))
7148  void x(int) { int y; x(y); }
7149</pre></td></tr>
7150
7151
7152<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc6')"><a name="hasTypeLoc6Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7153<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7154
7155Examples:
7156  int x;
7157declaratorDecl(hasTypeLoc(loc(asString("int"))))
7158  matches int x
7159
7160auto x = int(3);
7161cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7162  matches int(3)
7163
7164struct Foo { Foo(int, int); };
7165auto x = Foo(1, 2);
7166cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7167  matches Foo(1, 2)
7168
7169Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7170  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7171  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7172  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7173  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7174  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7175  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7176  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7177</pre></td></tr>
7178
7179
7180<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>
7181<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7182given matcher.
7183
7184Example matches y.x() (matcher = callExpr(callee(
7185                                   cxxMethodDecl(hasName("x")))))
7186  class Y { public: void x(); };
7187  void z() { Y y; y.x(); }
7188</pre></td></tr>
7189
7190
7191<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>
7192<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7193
7194Given
7195  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
7196  void f() { f(); }
7197callExpr(callee(expr()))
7198  matches this-&gt;x(), x(), y.x(), f()
7199with callee(...)
7200  matching this-&gt;x, x, y.x, f respectively
7201
7202Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7203because this introduces ambiguous overloads with calls to Callee taking a
7204internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7205implemented in terms of implicit casts.
7206</pre></td></tr>
7207
7208
7209<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>
7210<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7211
7212Given
7213  void f(int i);
7214  int y;
7215  f(y);
7216callExpr(
7217  forEachArgumentWithParam(
7218    declRefExpr(to(varDecl(hasName("y")))),
7219    parmVarDecl(hasType(isInteger()))
7220))
7221  matches f(y);
7222with declRefExpr(...)
7223  matching int y
7224and parmVarDecl(...)
7225  matching int i
7226</pre></td></tr>
7227
7228
7229<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>
7230<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7231CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7232it works on calls through function pointers as well.
7233
7234The difference is, that function pointers do not provide access to a
7235ParmVarDecl, but only the QualType for each argument.
7236
7237Given
7238  void f(int i);
7239  int y;
7240  f(y);
7241  void (*f_ptr)(int) = f;
7242  f_ptr(y);
7243callExpr(
7244  forEachArgumentWithParamType(
7245    declRefExpr(to(varDecl(hasName("y")))),
7246    qualType(isInteger()).bind("type)
7247))
7248  matches f(y) and f_ptr(y)
7249with declRefExpr(...)
7250  matching int y
7251and qualType(...)
7252  matching int
7253</pre></td></tr>
7254
7255
7256<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>
7257<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7258expression, or an ObjC-message-send expression.
7259
7260Given
7261  void x(int, int, int) { int y; x(1, y, 42); }
7262callExpr(hasAnyArgument(declRefExpr()))
7263  matches x(1, y, 42)
7264with hasAnyArgument(...)
7265  matching y
7266
7267For ObjectiveC, given
7268  @interface I - (void) f:(int) y; @end
7269  void foo(I *i) { [i f:12]; }
7270objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7271  matches [i f:12]
7272</pre></td></tr>
7273
7274
7275<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>
7276<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7277call expression.
7278
7279Example matches y in x(y)
7280    (matcher = callExpr(hasArgument(0, declRefExpr())))
7281  void x(int) { int y; x(y); }
7282</pre></td></tr>
7283
7284
7285<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>
7286<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7287matches the given matcher.
7288
7289The associated declaration is:
7290- for type nodes, the declaration of the underlying type
7291- for CallExpr, the declaration of the callee
7292- for MemberExpr, the declaration of the referenced member
7293- for CXXConstructExpr, the declaration of the constructor
7294- for CXXNewExpr, the declaration of the operator new
7295- for ObjCIvarExpr, the declaration of the ivar
7296
7297For type nodes, hasDeclaration will generally match the declaration of the
7298sugared type. Given
7299  class X {};
7300  typedef X Y;
7301  Y y;
7302in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7303typedefDecl. A common use case is to match the underlying, desugared type.
7304This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7305  varDecl(hasType(hasUnqualifiedDesugaredType(
7306      recordType(hasDeclaration(decl())))))
7307In this matcher, the decl will match the CXXRecordDecl of class X.
7308
7309Usable 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;,
7310  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;,
7311  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;,
7312  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;,
7313  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;,
7314  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;,
7315  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7316</pre></td></tr>
7317
7318
7319<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>
7320<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7321extension, matches the constant given in the statement.
7322
7323Given
7324  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7325caseStmt(hasCaseConstant(integerLiteral()))
7326  matches "case 1:"
7327</pre></td></tr>
7328
7329
7330<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>
7331<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7332or opaque value's source expression matches the given matcher.
7333
7334Example 1: matches "a string"
7335(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7336class URL { URL(string); };
7337URL url = "a string";
7338
7339Example 2: matches 'b' (matcher =
7340opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7341int a = b ?: 1;
7342</pre></td></tr>
7343
7344
7345<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>
7346<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7347functionDecl that have at least one TemplateArgument matching the given
7348InnerMatcher.
7349
7350Given
7351  template&lt;typename T&gt; class A {};
7352  template&lt;&gt; class A&lt;double&gt; {};
7353  A&lt;int&gt; a;
7354
7355  template&lt;typename T&gt; f() {};
7356  void func() { f&lt;int&gt;(); };
7357
7358classTemplateSpecializationDecl(hasAnyTemplateArgument(
7359    refersToType(asString("int"))))
7360  matches the specialization A&lt;int&gt;
7361
7362functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7363  matches the specialization f&lt;int&gt;
7364</pre></td></tr>
7365
7366
7367<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>
7368<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7369
7370Given
7371  template&lt;typename T&gt; class A {}; #1
7372  template&lt;&gt; class A&lt;int&gt; {}; #2
7373classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7374  matches '#2' with classTemplateDecl() matching the class template
7375  declaration of 'A' at #1.
7376</pre></td></tr>
7377
7378
7379<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>
7380<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7381functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7382
7383Given
7384  template&lt;typename T, typename U&gt; class A {};
7385  A&lt;bool, int&gt; b;
7386  A&lt;int, bool&gt; c;
7387
7388  template&lt;typename T&gt; void f() {}
7389  void func() { f&lt;int&gt;(); };
7390classTemplateSpecializationDecl(hasTemplateArgument(
7391    1, refersToType(asString("int"))))
7392  matches the specialization A&lt;bool, int&gt;
7393
7394functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7395  matches the specialization f&lt;int&gt;
7396</pre></td></tr>
7397
7398
7399<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc7')"><a name="hasTypeLoc7Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7400<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7401
7402Examples:
7403  int x;
7404declaratorDecl(hasTypeLoc(loc(asString("int"))))
7405  matches int x
7406
7407auto x = int(3);
7408cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7409  matches int(3)
7410
7411struct Foo { Foo(int, int); };
7412auto x = Foo(1, 2);
7413cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7414  matches Foo(1, 2)
7415
7416Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7417  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7418  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7419  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7420  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7421  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7422  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7423  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7424</pre></td></tr>
7425
7426
7427<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>
7428<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7429type.
7430
7431Given
7432  struct A {};
7433  A a[7];
7434  int b[7];
7435arrayType(hasElementType(builtinType()))
7436  matches "int b[7]"
7437
7438Usable 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;
7439</pre></td></tr>
7440
7441
7442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc8')"><a name="hasTypeLoc8Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7443<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7444
7445Examples:
7446  int x;
7447declaratorDecl(hasTypeLoc(loc(asString("int"))))
7448  matches int x
7449
7450auto x = int(3);
7451cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7452  matches int(3)
7453
7454struct Foo { Foo(int, int); };
7455auto x = Foo(1, 2);
7456cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7457  matches Foo(1, 2)
7458
7459Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7460  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7461  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7462  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7463  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7464  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7465  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7466  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7467</pre></td></tr>
7468
7469
7470<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>
7471<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7472a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7473
7474Given
7475  { {}; 1+2; }
7476hasAnySubstatement(compoundStmt())
7477  matches '{ {}; 1+2; }'
7478with compoundStmt()
7479  matching '{}'
7480</pre></td></tr>
7481
7482
7483<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>
7484<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7485</pre></td></tr>
7486
7487
7488<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>
7489<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7490matches the given matcher.
7491
7492The associated declaration is:
7493- for type nodes, the declaration of the underlying type
7494- for CallExpr, the declaration of the callee
7495- for MemberExpr, the declaration of the referenced member
7496- for CXXConstructExpr, the declaration of the constructor
7497- for CXXNewExpr, the declaration of the operator new
7498- for ObjCIvarExpr, the declaration of the ivar
7499
7500For type nodes, hasDeclaration will generally match the declaration of the
7501sugared type. Given
7502  class X {};
7503  typedef X Y;
7504  Y y;
7505in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7506typedefDecl. A common use case is to match the underlying, desugared type.
7507This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7508  varDecl(hasType(hasUnqualifiedDesugaredType(
7509      recordType(hasDeclaration(decl())))))
7510In this matcher, the decl will match the CXXRecordDecl of class X.
7511
7512Usable 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;,
7513  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;,
7514  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;,
7515  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;,
7516  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;,
7517  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;,
7518  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7519</pre></td></tr>
7520
7521
7522<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgumentLoc0')"><a name="hasTemplateArgumentLoc0Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
7523<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th
7524`TemplateArgumentLoc` matches the given `InnerMatcher`.
7525
7526Given
7527  template&lt;typename T, typename U&gt; class A {};
7528  A&lt;double, int&gt; b;
7529  A&lt;int, double&gt; c;
7530varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
7531  hasTypeLoc(loc(asString("double")))))))
7532  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
7533</pre></td></tr>
7534
7535
7536<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>
7537<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7538specific using shadow declaration.
7539
7540Given
7541  namespace a { void f() {} }
7542  using a::f;
7543  void g() {
7544    f();     // Matches this ..
7545    a::f();  // .. but not this.
7546  }
7547declRefExpr(throughUsingDecl(anything()))
7548  matches f()
7549</pre></td></tr>
7550
7551
7552<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>
7553<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7554specified matcher.
7555
7556Example matches x in if(x)
7557    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7558  bool x;
7559  if (x) {}
7560</pre></td></tr>
7561
7562
7563<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>
7564<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7565
7566Note that this does not work for global declarations because the AST
7567breaks up multiple-declaration DeclStmt's into multiple single-declaration
7568DeclStmt's.
7569Example: Given non-global declarations
7570  int a, b = 0;
7571  int c;
7572  int d = 2, e;
7573declStmt(containsDeclaration(
7574      0, varDecl(hasInitializer(anything()))))
7575  matches only 'int d = 2, e;', and
7576declStmt(containsDeclaration(1, varDecl()))
7577  matches 'int a, b = 0' as well as 'int d = 2, e;'
7578  but 'int c;' is not matched.
7579</pre></td></tr>
7580
7581
7582<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>
7583<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7584
7585Given
7586  int a, b;
7587  int c;
7588declStmt(hasSingleDecl(anything()))
7589  matches 'int c;' but not 'int a, b;'.
7590</pre></td></tr>
7591
7592
7593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc9')"><a name="hasTypeLoc9Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7594<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7595
7596Examples:
7597  int x;
7598declaratorDecl(hasTypeLoc(loc(asString("int"))))
7599  matches int x
7600
7601auto x = int(3);
7602cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7603  matches int(3)
7604
7605struct Foo { Foo(int, int); };
7606auto x = Foo(1, 2);
7607cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7608  matches Foo(1, 2)
7609
7610Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7611  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7612  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7613  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7614  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7615  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7616  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7617  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7618</pre></td></tr>
7619
7620
7621<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>
7622<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7623Decl, matches InnerMatcher.
7624
7625Given
7626  namespace N {
7627    namespace M {
7628      class D {};
7629    }
7630  }
7631
7632cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7633declaration of class D.
7634</pre></td></tr>
7635
7636
7637<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>
7638<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7639
7640Given
7641  decltype(1) a = 1;
7642  decltype(2.0) b = 2.0;
7643decltypeType(hasUnderlyingType(isInteger()))
7644  matches the type of "a"
7645
7646Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7647</pre></td></tr>
7648
7649
7650<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBinding0')"><a name="hasAnyBinding0Anchor">hasAnyBinding</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt; InnerMatcher</td></tr>
7651<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7652
7653For example, in:
7654void foo()
7655{
7656    int arr[3];
7657    auto &amp;[f, s, t] = arr;
7658
7659    f = 42;
7660}
7661The matcher:
7662  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7663matches the decomposition decl with 'f' bound to "fBinding".
7664</pre></td></tr>
7665
7666
7667<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBinding0')"><a name="hasBinding0Anchor">hasBinding</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt; InnerMatcher</td></tr>
7668<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7669
7670For example, in:
7671void foo()
7672{
7673    int arr[3];
7674    auto &amp;[f, s, t] = arr;
7675
7676    f = 42;
7677}
7678The matcher:
7679  decompositionDecl(hasBinding(0,
7680  bindingDecl(hasName("f").bind("fBinding"))))
7681matches the decomposition decl with 'f' bound to "fBinding".
7682</pre></td></tr>
7683
7684
7685<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>
7686<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7687
7688
7689<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>
7690<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7691switch statement or conditional operator.
7692
7693Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7694  if (true) {}
7695</pre></td></tr>
7696
7697
7698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasNamedTypeLoc0')"><a name="hasNamedTypeLoc0Anchor">hasNamedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
7699<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
7700`InnerMatcher`.
7701
7702Given
7703  template &lt;typename T&gt;
7704  class C {};
7705  class C&lt;int&gt; c;
7706
7707  class D {};
7708  class D d;
7709elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
7710  matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
7711</pre></td></tr>
7712
7713
7714<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>
7715<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7716matches InnerMatcher if the qualifier exists.
7717
7718Given
7719  namespace N {
7720    namespace M {
7721      class D {};
7722    }
7723  }
7724  N::M::D d;
7725
7726elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7727matches the type of the variable declaration of d.
7728</pre></td></tr>
7729
7730
7731<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>
7732<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7733
7734Given
7735  namespace N {
7736    namespace M {
7737      class D {};
7738    }
7739  }
7740  N::M::D d;
7741
7742elaboratedType(namesType(recordType(
7743hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7744declaration of d.
7745</pre></td></tr>
7746
7747
7748<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>
7749<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7750matches the given matcher.
7751
7752The associated declaration is:
7753- for type nodes, the declaration of the underlying type
7754- for CallExpr, the declaration of the callee
7755- for MemberExpr, the declaration of the referenced member
7756- for CXXConstructExpr, the declaration of the constructor
7757- for CXXNewExpr, the declaration of the operator new
7758- for ObjCIvarExpr, the declaration of the ivar
7759
7760For type nodes, hasDeclaration will generally match the declaration of the
7761sugared type. Given
7762  class X {};
7763  typedef X Y;
7764  Y y;
7765in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7766typedefDecl. A common use case is to match the underlying, desugared type.
7767This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7768  varDecl(hasType(hasUnqualifiedDesugaredType(
7769      recordType(hasDeclaration(decl())))))
7770In this matcher, the decl will match the CXXRecordDecl of class X.
7771
7772Usable 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;,
7773  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;,
7774  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;,
7775  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;,
7776  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;,
7777  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;,
7778  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7779</pre></td></tr>
7780
7781
7782<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>
7783<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7784
7785(Note: Clang's AST refers to other conversions as "casts" too, and calls
7786actual casts "explicit" casts.)
7787</pre></td></tr>
7788
7789
7790<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc10')"><a name="hasTypeLoc10Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
7791<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7792
7793Examples:
7794  int x;
7795declaratorDecl(hasTypeLoc(loc(asString("int"))))
7796  matches int x
7797
7798auto x = int(3);
7799cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7800  matches int(3)
7801
7802struct Foo { Foo(int, int); };
7803auto x = Foo(1, 2);
7804cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7805  matches Foo(1, 2)
7806
7807Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
7808  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
7809  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
7810  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7811  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
7812  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
7813  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
7814  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7815</pre></td></tr>
7816
7817
7818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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>
7819<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7820declaration's type.
7821
7822In case of a value declaration (for example a variable declaration),
7823this resolves one layer of indirection. For example, in the value
7824declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7825X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7826declaration of x.
7827
7828Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7829            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7830            and friend class X (matcher = friendDecl(hasType("X"))
7831            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7832                                              cxxRecordDecl(hasName("X"))))
7833 class X {};
7834 void y(X &amp;x) { x; X z; }
7835 class Y { friend class X; };
7836 class Z : public virtual X {};
7837
7838Example matches class Derived
7839(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7840class Base {};
7841class Derived : Base {};
7842
7843Usable 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;,
7844Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7845</pre></td></tr>
7846
7847
7848<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>
7849<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7850matcher.
7851
7852Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7853            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7854            and U (matcher = typedefDecl(hasType(asString("int")))
7855            and friend class X (matcher = friendDecl(hasType("X"))
7856            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7857                                              asString("class X")))
7858 class X {};
7859 void y(X &amp;x) { x; X z; }
7860 typedef int U;
7861 class Y { friend class X; };
7862 class Z : public virtual X {};
7863</pre></td></tr>
7864
7865
7866<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>
7867<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7868elidable constructor and other corresponding bookkeeping nodes.
7869
7870In C++17, elidable copy constructors are no longer being generated in the
7871AST as it is not permitted by the standard. They are, however, part of the
7872AST in C++14 and earlier. So, a matcher must abstract over these differences
7873to work in all language modes. This matcher skips elidable constructor-call
7874AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7875various implicit nodes inside the constructor calls, all of which will not
7876appear in the C++17 AST.
7877
7878Given
7879
7880struct H {};
7881H G();
7882void f() {
7883  H D = G();
7884}
7885
7886``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7887matches ``H D = G()`` in C++11 through C++17 (and beyond).
7888</pre></td></tr>
7889
7890
7891<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>
7892<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7893are stripped off.
7894
7895Parentheses and explicit casts are not discarded.
7896Given
7897  int arr[5];
7898  int a = 0;
7899  char b = 0;
7900  const int c = a;
7901  int *d = arr;
7902  long e = (long) 0l;
7903The matchers
7904   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7905   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7906would match the declarations for a, b, c, and d, but not e.
7907While
7908   varDecl(hasInitializer(integerLiteral()))
7909   varDecl(hasInitializer(declRefExpr()))
7910only match the declarations for a.
7911</pre></td></tr>
7912
7913
7914<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>
7915<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7916nodes are stripped off.
7917
7918Parentheses and explicit casts are not discarded.
7919Given
7920  class C {};
7921  C a = C();
7922  C b;
7923  C c = b;
7924The matchers
7925   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7926would match the declarations for a, b, and c.
7927While
7928   varDecl(hasInitializer(cxxConstructExpr()))
7929only match the declarations for b and c.
7930</pre></td></tr>
7931
7932
7933<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>
7934<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7935casts are stripped off.
7936
7937Implicit and non-C Style casts are also discarded.
7938Given
7939  int a = 0;
7940  char b = (0);
7941  void* c = reinterpret_cast&lt;char*&gt;(0);
7942  char d = char(0);
7943The matcher
7944   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7945would match the declarations for a, b, c, and d.
7946while
7947   varDecl(hasInitializer(integerLiteral()))
7948only match the declaration for a.
7949</pre></td></tr>
7950
7951
7952<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>
7953<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7954parentheses are stripped off.
7955
7956Explicit casts are not discarded.
7957Given
7958  int arr[5];
7959  int a = 0;
7960  char b = (0);
7961  const int c = a;
7962  int *d = (arr);
7963  long e = ((long) 0l);
7964The matchers
7965   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7966   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7967would match the declarations for a, b, c, and d, but not e.
7968while
7969   varDecl(hasInitializer(integerLiteral()))
7970   varDecl(hasInitializer(declRefExpr()))
7971would only match the declaration for a.
7972</pre></td></tr>
7973
7974
7975<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>
7976<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7977
7978Given
7979  const char* str = ("my-string");
7980The matcher
7981  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7982would match the implicit cast resulting from the assignment.
7983</pre></td></tr>
7984
7985
7986<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>
7987<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7988
7989Given
7990  class C {
7991    int a = 2;
7992    int b = 3;
7993    int c;
7994  };
7995fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7996  matches 'int a;' but not 'int b;'.
7997fieldDecl(hasInClassInitializer(anything()))
7998  matches 'int a;' and 'int b;' but not 'int c;'.
7999</pre></td></tr>
8000
8001
8002<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>
8003<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
8004
8005
8006<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>
8007<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
8008switch statement or conditional operator.
8009
8010Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8011  if (true) {}
8012</pre></td></tr>
8013
8014
8015<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>
8016<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
8017
8018Example:
8019    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
8020matches '++x' in
8021    for (x; x &lt; N; ++x) { }
8022</pre></td></tr>
8023
8024
8025<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>
8026<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
8027
8028Example:
8029    forStmt(hasLoopInit(declStmt()))
8030matches 'int x = 0' in
8031    for (int x = 0; x &lt; N; ++x) { }
8032</pre></td></tr>
8033
8034
8035<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</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>
8036<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
8037declaration's type.
8038
8039In case of a value declaration (for example a variable declaration),
8040this resolves one layer of indirection. For example, in the value
8041declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8042X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8043declaration of x.
8044
8045Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8046            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8047            and friend class X (matcher = friendDecl(hasType("X"))
8048            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8049                                              cxxRecordDecl(hasName("X"))))
8050 class X {};
8051 void y(X &amp;x) { x; X z; }
8052 class Y { friend class X; };
8053 class Z : public virtual X {};
8054
8055Example matches class Derived
8056(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8057class Base {};
8058class Derived : Base {};
8059
8060Usable 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;,
8061Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8062</pre></td></tr>
8063
8064
8065<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>
8066<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
8067matcher.
8068
8069Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8070            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8071            and U (matcher = typedefDecl(hasType(asString("int")))
8072            and friend class X (matcher = friendDecl(hasType("X"))
8073            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8074                                              asString("class X")))
8075 class X {};
8076 void y(X &amp;x) { x; X z; }
8077 typedef int U;
8078 class Y { friend class X; };
8079 class Z : public virtual X {};
8080</pre></td></tr>
8081
8082
8083<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>
8084<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
8085Note that this matcher matches all the declarations of a function whose
8086body is present in the AST.
8087
8088Given
8089  void f();
8090  void f() {}
8091  void g();
8092functionDecl(hasAnyBody(compoundStmt()))
8093  matches both 'void f();'
8094  and 'void f() {}'
8095with compoundStmt()
8096  matching '{}'
8097  but does not match 'void g();'
8098</pre></td></tr>
8099
8100
8101<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>
8102<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
8103block.
8104
8105Does not match the 'this' parameter of a method.
8106
8107Given
8108  class X { void f(int x, int y, int z) {} };
8109cxxMethodDecl(hasAnyParameter(hasName("y")))
8110  matches f(int x, int y, int z) {}
8111with hasAnyParameter(...)
8112  matching int y
8113
8114For ObjectiveC, given
8115  @interface I - (void) f:(int) y; @end
8116
8117the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8118matches the declaration of method f with hasParameter
8119matching y.
8120
8121For blocks, given
8122  b = ^(int y) { printf("%d", y) };
8123
8124the matcher blockDecl(hasAnyParameter(hasName("y")))
8125matches the declaration of the block b with hasParameter
8126matching y.
8127</pre></td></tr>
8128
8129
8130<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>
8131<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8132functionDecl that have at least one TemplateArgument matching the given
8133InnerMatcher.
8134
8135Given
8136  template&lt;typename T&gt; class A {};
8137  template&lt;&gt; class A&lt;double&gt; {};
8138  A&lt;int&gt; a;
8139
8140  template&lt;typename T&gt; f() {};
8141  void func() { f&lt;int&gt;(); };
8142
8143classTemplateSpecializationDecl(hasAnyTemplateArgument(
8144    refersToType(asString("int"))))
8145  matches the specialization A&lt;int&gt;
8146
8147functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8148  matches the specialization f&lt;int&gt;
8149</pre></td></tr>
8150
8151
8152<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>
8153<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
8154
8155
8156<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>
8157<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
8158declaration.
8159
8160Given
8161  template&lt;bool b&gt;
8162  struct S {
8163    S(int); // #1
8164    explicit S(double); // #2
8165    operator int(); // #3
8166    explicit operator bool(); // #4
8167    explicit(false) S(bool) // # 7
8168    explicit(true) S(char) // # 8
8169    explicit(b) S(S) // # 9
8170  };
8171  S(int) -&gt; S&lt;true&gt; // #5
8172  explicit S(double) -&gt; S&lt;false&gt; // #6
8173cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8174cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8175cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8176</pre></td></tr>
8177
8178
8179<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>
8180<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
8181declaration or a block.
8182
8183Given
8184  class X { void f(int x) {} };
8185cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8186  matches f(int x) {}
8187with hasParameter(...)
8188  matching int x
8189
8190For ObjectiveC, given
8191  @interface I - (void) f:(int) y; @end
8192
8193the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8194matches the declaration of method f with hasParameter
8195matching y.
8196</pre></td></tr>
8197
8198
8199<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasReturnTypeLoc0')"><a name="hasReturnTypeLoc0Anchor">hasReturnTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; ReturnMatcher</td></tr>
8200<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`.
8201
8202Given
8203  int f() { return 5; }
8204  void g() {}
8205functionDecl(hasReturnTypeLoc(loc(asString("int"))))
8206  matches the declaration of `f`, but not `g`.
8207</pre></td></tr>
8208
8209
8210<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>
8211<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8212functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8213
8214Given
8215  template&lt;typename T, typename U&gt; class A {};
8216  A&lt;bool, int&gt; b;
8217  A&lt;int, bool&gt; c;
8218
8219  template&lt;typename T&gt; void f() {}
8220  void func() { f&lt;int&gt;(); };
8221classTemplateSpecializationDecl(hasTemplateArgument(
8222    1, refersToType(asString("int"))))
8223  matches the specialization A&lt;bool, int&gt;
8224
8225functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8226  matches the specialization f&lt;int&gt;
8227</pre></td></tr>
8228
8229
8230<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>
8231<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8232
8233Given:
8234  class X { int f() { return 1; } };
8235cxxMethodDecl(returns(asString("int")))
8236  matches int f() { return 1; }
8237</pre></td></tr>
8238
8239
8240<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>
8241<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8242switch statement or conditional operator.
8243
8244Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8245  if (true) {}
8246</pre></td></tr>
8247
8248
8249<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>
8250<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8251
8252Given
8253  if (A* a = GetAPointer()) {}
8254hasConditionVariableStatement(...)
8255  matches 'A* a = GetAPointer()'.
8256</pre></td></tr>
8257
8258
8259<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>
8260<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8261
8262Examples matches the if statement
8263  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8264  if (false) false; else true;
8265</pre></td></tr>
8266
8267
8268<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>
8269<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8270
8271Given:
8272 void foo() {
8273   if (int i = foobar(); i &gt; 0) {}
8274   switch (int i = foobar(); i) {}
8275   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8276 }
8277 void bar() {
8278   if (foobar() &gt; 0) {}
8279   switch (foobar()) {}
8280   for (auto&amp; x : get_range()) {}
8281 }
8282ifStmt(hasInitStatement(anything()))
8283  matches the if statement in foo but not in bar.
8284switchStmt(hasInitStatement(anything()))
8285  matches the switch statement in foo but not in bar.
8286cxxForRangeStmt(hasInitStatement(anything()))
8287  matches the range for statement in foo but not in bar.
8288</pre></td></tr>
8289
8290
8291<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>
8292<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8293
8294Examples matches the if statement
8295  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8296  if (false) true; else false;
8297</pre></td></tr>
8298
8299
8300<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>
8301<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8302matcher.
8303
8304FIXME: Unit test this matcher
8305</pre></td></tr>
8306
8307
8308<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>
8309<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8310
8311Example matches y.
8312    (matcher = initListExpr(hasInit(0, expr())))
8313  int x{y}.
8314</pre></td></tr>
8315
8316
8317<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>
8318<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8319(if expression have it).
8320</pre></td></tr>
8321
8322
8323<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>
8324<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8325matches the given matcher.
8326
8327The associated declaration is:
8328- for type nodes, the declaration of the underlying type
8329- for CallExpr, the declaration of the callee
8330- for MemberExpr, the declaration of the referenced member
8331- for CXXConstructExpr, the declaration of the constructor
8332- for CXXNewExpr, the declaration of the operator new
8333- for ObjCIvarExpr, the declaration of the ivar
8334
8335For type nodes, hasDeclaration will generally match the declaration of the
8336sugared type. Given
8337  class X {};
8338  typedef X Y;
8339  Y y;
8340in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8341typedefDecl. A common use case is to match the underlying, desugared type.
8342This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8343  varDecl(hasType(hasUnqualifiedDesugaredType(
8344      recordType(hasDeclaration(decl())))))
8345In this matcher, the decl will match the CXXRecordDecl of class X.
8346
8347Usable 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;,
8348  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;,
8349  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;,
8350  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;,
8351  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;,
8352  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;,
8353  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8354</pre></td></tr>
8355
8356
8357<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>
8358<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8359matches the given matcher.
8360
8361The associated declaration is:
8362- for type nodes, the declaration of the underlying type
8363- for CallExpr, the declaration of the callee
8364- for MemberExpr, the declaration of the referenced member
8365- for CXXConstructExpr, the declaration of the constructor
8366- for CXXNewExpr, the declaration of the operator new
8367- for ObjCIvarExpr, the declaration of the ivar
8368
8369For type nodes, hasDeclaration will generally match the declaration of the
8370sugared type. Given
8371  class X {};
8372  typedef X Y;
8373  Y y;
8374in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8375typedefDecl. A common use case is to match the underlying, desugared type.
8376This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8377  varDecl(hasType(hasUnqualifiedDesugaredType(
8378      recordType(hasDeclaration(decl())))))
8379In this matcher, the decl will match the CXXRecordDecl of class X.
8380
8381Usable 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;,
8382  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;,
8383  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;,
8384  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;,
8385  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;,
8386  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;,
8387  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8388</pre></td></tr>
8389
8390
8391<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('capturesVar0')"><a name="capturesVar0Anchor">capturesVar</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
8392<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
8393`VarDecl` can be a separate variable that is captured by value or
8394reference, or a synthesized variable if the capture has an initializer.
8395
8396Given
8397  void foo() {
8398    int x;
8399    auto f = [x](){};
8400    auto g = [x = 1](){};
8401  }
8402In the matcher
8403lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))),
8404capturesVar(hasName("x")) matches `x` and `x = 1`.
8405</pre></td></tr>
8406
8407
8408<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>
8409<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8410matches the given matcher.
8411
8412The associated declaration is:
8413- for type nodes, the declaration of the underlying type
8414- for CallExpr, the declaration of the callee
8415- for MemberExpr, the declaration of the referenced member
8416- for CXXConstructExpr, the declaration of the constructor
8417- for CXXNewExpr, the declaration of the operator new
8418- for ObjCIvarExpr, the declaration of the ivar
8419
8420For type nodes, hasDeclaration will generally match the declaration of the
8421sugared type. Given
8422  class X {};
8423  typedef X Y;
8424  Y y;
8425in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8426typedefDecl. A common use case is to match the underlying, desugared type.
8427This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8428  varDecl(hasType(hasUnqualifiedDesugaredType(
8429      recordType(hasDeclaration(decl())))))
8430In this matcher, the decl will match the CXXRecordDecl of class X.
8431
8432Usable 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;,
8433  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;,
8434  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;,
8435  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;,
8436  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;,
8437  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;,
8438  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8439</pre></td></tr>
8440
8441
8442<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>
8443<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8444given matcher. Implicit object expressions are included; that is, it matches
8445use of implicit `this`.
8446
8447Given
8448  struct X {
8449    int m;
8450    int f(X x) { x.m; return m; }
8451  };
8452memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8453  matches `x.m`, but not `m`; however,
8454memberExpr(hasObjectExpression(hasType(pointsTo(
8455     cxxRecordDecl(hasName("X"))))))
8456  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8457</pre></td></tr>
8458
8459
8460<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>
8461<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8462given matcher.
8463
8464Given
8465  struct { int first, second; } first, second;
8466  int i(second.first);
8467  int j(first.second);
8468memberExpr(member(hasName("first")))
8469  matches second.first
8470  but not first.second (because the member name there is "second").
8471</pre></td></tr>
8472
8473
8474<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>
8475<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8476pointee matches a given matcher.
8477
8478Given
8479  int *a;
8480  int const *b;
8481  float const *f;
8482pointerType(pointee(isConstQualified(), isInteger()))
8483  matches "int const *b"
8484
8485Usable 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;,
8486  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;
8487</pre></td></tr>
8488
8489
8490<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>
8491<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8492matcher.
8493
8494Given
8495  namespace N { template&lt;class T&gt; void f(T t); }
8496  template &lt;class T&gt; void g() { using N::f; f(T()); }
8497unresolvedLookupExpr(hasAnyDeclaration(
8498    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8499  matches the use of f in g() .
8500</pre></td></tr>
8501
8502
8503<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>
8504<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8505
8506Given
8507  struct A { struct B { struct C {}; }; };
8508  A::B::C c;
8509nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8510  matches "A::"
8511</pre></td></tr>
8512
8513
8514<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>
8515<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8516NestedNameSpecifier-matcher matches.
8517</pre></td></tr>
8518
8519
8520<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>
8521<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8522given TypeLoc.
8523
8524Given
8525  struct A { struct B { struct C {}; }; };
8526  A::B::C c;
8527nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8528  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8529  matches "A::"
8530</pre></td></tr>
8531
8532
8533<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>
8534<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8535
8536Given
8537  struct A { struct B { struct C {}; }; };
8538  A::B::C c;
8539nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8540  matches "A::"
8541</pre></td></tr>
8542
8543
8544<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>
8545<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8546given namespace matcher.
8547
8548Given
8549  namespace ns { struct A {}; }
8550  ns::A a;
8551nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8552  matches "ns::"
8553</pre></td></tr>
8554
8555
8556<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>
8557<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8558given QualType matcher without qualifiers.
8559
8560Given
8561  struct A { struct B { struct C {}; }; };
8562  A::B::C c;
8563nestedNameSpecifier(specifiesType(
8564  hasDeclaration(cxxRecordDecl(hasName("A")))
8565))
8566  matches "A::"
8567</pre></td></tr>
8568
8569
8570<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>
8571<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8572
8573Given
8574
8575  #pragma omp parallel
8576  #pragma omp parallel default(none)
8577
8578``ompExecutableDirective(hasAnyClause(anything()))`` matches
8579``omp parallel default(none)``.
8580</pre></td></tr>
8581
8582
8583<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>
8584<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8585
8586Prerequisite: the executable directive must not be standalone directive.
8587If it is, it will never match.
8588
8589Given
8590
8591   #pragma omp parallel
8592   ;
8593   #pragma omp parallel
8594   {}
8595
8596``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8597</pre></td></tr>
8598
8599
8600<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>
8601<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8602matching Base, or Objective-C classes that directly or indirectly
8603subclass a class matching Base.
8604
8605Note that a class is not considered to be derived from itself.
8606
8607Example matches Y, Z, C (Base == hasName("X"))
8608  class X;
8609  class Y : public X {};  // directly derived
8610  class Z : public Y {};  // indirectly derived
8611  typedef X A;
8612  typedef A B;
8613  class C : public B {};  // derived from a typedef of X
8614
8615In the following example, Bar matches isDerivedFrom(hasName("X")):
8616  class Foo;
8617  typedef Foo X;
8618  class Bar : public Foo {};  // derived from a type that X is a typedef of
8619
8620In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8621  @interface NSObject @end
8622  @interface Bar : NSObject @end
8623
8624Usable 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;
8625</pre></td></tr>
8626
8627
8628<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>
8629<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8630matching Base.
8631
8632Note that a class is not considered to be derived from itself.
8633
8634Example matches Y, C (Base == hasName("X"))
8635  class X;
8636  class Y : public X {};  // directly derived
8637  class Z : public Y {};  // indirectly derived
8638  typedef X A;
8639  typedef A B;
8640  class C : public B {};  // derived from a typedef of X
8641
8642In the following example, Bar matches isDerivedFrom(hasName("X")):
8643  class Foo;
8644  typedef Foo X;
8645  class Bar : public Foo {};  // derived from a type that X is a typedef of
8646</pre></td></tr>
8647
8648
8649<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>
8650<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8651match Base.
8652</pre></td></tr>
8653
8654
8655<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>
8656<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8657expression, or an ObjC-message-send expression.
8658
8659Given
8660  void x(int, int, int) { int y; x(1, y, 42); }
8661callExpr(hasAnyArgument(declRefExpr()))
8662  matches x(1, y, 42)
8663with hasAnyArgument(...)
8664  matching y
8665
8666For ObjectiveC, given
8667  @interface I - (void) f:(int) y; @end
8668  void foo(I *i) { [i f:12]; }
8669objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8670  matches [i f:12]
8671</pre></td></tr>
8672
8673
8674<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>
8675<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8676call expression.
8677
8678Example matches y in x(y)
8679    (matcher = callExpr(hasArgument(0, declRefExpr())))
8680  void x(int) { int y; x(y); }
8681</pre></td></tr>
8682
8683
8684<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>
8685<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8686and the inner matcher matches on that instance.
8687
8688For example the method call in
8689  NSString *x = @"hello";
8690  [x containsString:@"h"];
8691is matched by
8692objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8693</pre></td></tr>
8694
8695
8696<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>
8697<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8698
8699Example
8700matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8701matches the [webView ...] message invocation.
8702  NSString *webViewJavaScript = ...
8703  UIWebView *webView = ...
8704  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8705</pre></td></tr>
8706
8707
8708<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>
8709<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8710block.
8711
8712Does not match the 'this' parameter of a method.
8713
8714Given
8715  class X { void f(int x, int y, int z) {} };
8716cxxMethodDecl(hasAnyParameter(hasName("y")))
8717  matches f(int x, int y, int z) {}
8718with hasAnyParameter(...)
8719  matching int y
8720
8721For ObjectiveC, given
8722  @interface I - (void) f:(int) y; @end
8723
8724the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8725matches the declaration of method f with hasParameter
8726matching y.
8727
8728For blocks, given
8729  b = ^(int y) { printf("%d", y) };
8730
8731the matcher blockDecl(hasAnyParameter(hasName("y")))
8732matches the declaration of the block b with hasParameter
8733matching y.
8734</pre></td></tr>
8735
8736
8737<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>
8738<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8739declaration or a block.
8740
8741Given
8742  class X { void f(int x) {} };
8743cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8744  matches f(int x) {}
8745with hasParameter(...)
8746  matching int x
8747
8748For ObjectiveC, given
8749  @interface I - (void) f:(int) y; @end
8750
8751the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8752matches the declaration of method f with hasParameter
8753matching y.
8754</pre></td></tr>
8755
8756
8757<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
8758<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8759
8760Examples:
8761  int x;
8762declaratorDecl(hasTypeLoc(loc(asString("int"))))
8763  matches int x
8764
8765auto x = int(3);
8766cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8767  matches int(3)
8768
8769struct Foo { Foo(int, int); };
8770auto x = Foo(1, 2);
8771cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8772  matches Foo(1, 2)
8773
8774Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
8775  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
8776  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
8777  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8778  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
8779  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
8780  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
8781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8782</pre></td></tr>
8783
8784
8785<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>
8786<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8787or opaque value's source expression matches the given matcher.
8788
8789Example 1: matches "a string"
8790(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8791class URL { URL(string); };
8792URL url = "a string";
8793
8794Example 2: matches 'b' (matcher =
8795opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8796int a = b ?: 1;
8797</pre></td></tr>
8798
8799
8800<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>
8801<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8802overloads matches the given matcher.
8803
8804Given
8805  template &lt;typename T&gt; void foo(T);
8806  template &lt;typename T&gt; void bar(T);
8807  template &lt;typename T&gt; void baz(T t) {
8808    foo(t);
8809    bar(t);
8810  }
8811unresolvedLookupExpr(hasAnyDeclaration(
8812    functionTemplateDecl(hasName("foo"))))
8813  matches foo in foo(t); but not bar in bar(t);
8814</pre></td></tr>
8815
8816
8817<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>
8818<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8819
8820Given
8821  int (*ptr_to_array)[4];
8822  int (*ptr_to_func)(int);
8823
8824varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8825ptr_to_func but not ptr_to_array.
8826
8827Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8828</pre></td></tr>
8829
8830
8831<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasPointeeLoc0')"><a name="hasPointeeLoc0Anchor">hasPointeeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; PointeeMatcher</td></tr>
8832<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
8833`PointeeMatcher`.
8834
8835Given
8836  int* x;
8837pointerTypeLoc(hasPointeeLoc(loc(asString("int"))))
8838  matches `int*`.
8839</pre></td></tr>
8840
8841
8842<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>
8843<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8844pointee matches a given matcher.
8845
8846Given
8847  int *a;
8848  int const *b;
8849  float const *f;
8850pointerType(pointee(isConstQualified(), isInteger()))
8851  matches "int const *b"
8852
8853Usable 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;,
8854  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;
8855</pre></td></tr>
8856
8857
8858<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>
8859<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8860
8861Given:
8862  typedef int &amp;int_ref;
8863  int a;
8864  int_ref b = a;
8865
8866varDecl(hasType(qualType(referenceType()))))) will not match the
8867declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8868</pre></td></tr>
8869
8870
8871<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>
8872<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8873matches the given matcher.
8874
8875The associated declaration is:
8876- for type nodes, the declaration of the underlying type
8877- for CallExpr, the declaration of the callee
8878- for MemberExpr, the declaration of the referenced member
8879- for CXXConstructExpr, the declaration of the constructor
8880- for CXXNewExpr, the declaration of the operator new
8881- for ObjCIvarExpr, the declaration of the ivar
8882
8883For type nodes, hasDeclaration will generally match the declaration of the
8884sugared type. Given
8885  class X {};
8886  typedef X Y;
8887  Y y;
8888in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8889typedefDecl. A common use case is to match the underlying, desugared type.
8890This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8891  varDecl(hasType(hasUnqualifiedDesugaredType(
8892      recordType(hasDeclaration(decl())))))
8893In this matcher, the decl will match the CXXRecordDecl of class X.
8894
8895Usable 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;,
8896  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;,
8897  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;,
8898  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;,
8899  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;,
8900  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;,
8901  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8902</pre></td></tr>
8903
8904
8905<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>
8906<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8907
8908Given
8909  void (*fp)(void);
8910The matcher
8911  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8912would match the declaration for fp.
8913</pre></td></tr>
8914
8915
8916<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>
8917<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8918</pre></td></tr>
8919
8920
8921<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>
8922<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8923matches the specified matcher.
8924
8925Example matches y-&gt;x()
8926  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8927     cxxRecordDecl(hasName("Y")))))))
8928  class Y { public: void x(); };
8929  void z() { Y *y; y-&gt;x(); }
8930</pre></td></tr>
8931
8932
8933<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>
8934<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8935</pre></td></tr>
8936
8937
8938<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>
8939<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8940type matches the specified matcher.
8941
8942Example matches X &amp;x and const X &amp;y
8943    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8944  class X {
8945    void a(X b) {
8946      X &amp;x = b;
8947      const X &amp;y = b;
8948    }
8949  };
8950</pre></td></tr>
8951
8952
8953<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedLoc0')"><a name="hasUnqualifiedLoc0Anchor">hasUnqualifiedLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
8954<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
8955`InnerMatcher`.
8956
8957Given
8958  int* const x;
8959  const int y;
8960qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
8961  matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
8962</pre></td></tr>
8963
8964
8965<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>
8966<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8967matches the given matcher.
8968
8969The associated declaration is:
8970- for type nodes, the declaration of the underlying type
8971- for CallExpr, the declaration of the callee
8972- for MemberExpr, the declaration of the referenced member
8973- for CXXConstructExpr, the declaration of the constructor
8974- for CXXNewExpr, the declaration of the operator new
8975- for ObjCIvarExpr, the declaration of the ivar
8976
8977For type nodes, hasDeclaration will generally match the declaration of the
8978sugared type. Given
8979  class X {};
8980  typedef X Y;
8981  Y y;
8982in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8983typedefDecl. A common use case is to match the underlying, desugared type.
8984This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8985  varDecl(hasType(hasUnqualifiedDesugaredType(
8986      recordType(hasDeclaration(decl())))))
8987In this matcher, the decl will match the CXXRecordDecl of class X.
8988
8989Usable 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;,
8990  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;,
8991  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;,
8992  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;,
8993  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;,
8994  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;,
8995  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8996</pre></td></tr>
8997
8998
8999<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasReferentLoc0')"><a name="hasReferentLoc0Anchor">hasReferentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; ReferentMatcher</td></tr>
9000<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
9001`ReferentMatcher`.
9002
9003Given
9004  int x = 3;
9005  int&amp; xx = x;
9006referenceTypeLoc(hasReferentLoc(loc(asString("int"))))
9007  matches `int&amp;`.
9008</pre></td></tr>
9009
9010
9011<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>
9012<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
9013pointee matches a given matcher.
9014
9015Given
9016  int *a;
9017  int const *b;
9018  float const *f;
9019pointerType(pointee(isConstQualified(), isInteger()))
9020  matches "int const *b"
9021
9022Usable 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;,
9023  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;
9024</pre></td></tr>
9025
9026
9027<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>
9028<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
9029
9030Given
9031  return a + b;
9032hasReturnValue(binaryOperator())
9033  matches 'return a + b'
9034with binaryOperator()
9035  matching 'a + b'
9036</pre></td></tr>
9037
9038
9039<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>
9040<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
9041a given matcher. Also matches StmtExprs that have CompoundStmt as children.
9042
9043Given
9044  { {}; 1+2; }
9045hasAnySubstatement(compoundStmt())
9046  matches '{ {}; 1+2; }'
9047with compoundStmt()
9048  matching '{}'
9049</pre></td></tr>
9050
9051
9052<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>
9053<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9054alignof.
9055</pre></td></tr>
9056
9057
9058<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
9059<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
9060belongs to.
9061
9062Given:
9063F&amp; operator=(const F&amp; o) {
9064  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9065  return *this;
9066}
9067returnStmt(forCallable(functionDecl(hasName("operator="))))
9068  matches 'return *this'
9069  but does not match 'return v &gt; 0'
9070
9071Given:
9072-(void) foo {
9073  int x = 1;
9074  dispatch_sync(queue, ^{ int y = 2; });
9075}
9076declStmt(forCallable(objcMethodDecl()))
9077  matches 'int x = 1'
9078  but does not match 'int y = 2'.
9079whereas declStmt(forCallable(blockDecl()))
9080  matches 'int y = 2'
9081  but does not match 'int x = 1'.
9082</pre></td></tr>
9083
9084
9085<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>
9086<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
9087
9088Deprecated. Use forCallable() to correctly handle the situation when
9089the declaration is not a function (but a block or an Objective-C method).
9090forFunction() not only fails to take non-functions into account but also
9091may match the wrong declaration in their presence.
9092
9093Given:
9094F&amp; operator=(const F&amp; o) {
9095  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9096  return *this;
9097}
9098returnStmt(forFunction(hasName("operator=")))
9099  matches 'return *this'
9100  but does not match 'return v &gt; 0'
9101</pre></td></tr>
9102
9103
9104<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>
9105<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9106sizeof.
9107</pre></td></tr>
9108
9109
9110<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>
9111<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
9112type that matches the provided matcher.
9113
9114Given
9115  template &lt;typename T&gt;
9116  double F(T t);
9117  int i;
9118  double j = F(i);
9119
9120substTemplateTypeParmType(hasReplacementType(type())) matches int
9121</pre></td></tr>
9122
9123
9124<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>
9125<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
9126statement. This matcher may produce multiple matches.
9127
9128Given
9129  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9130switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
9131  matches four times, with "c" binding each of "case 1:", "case 2:",
9132"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
9133"switch (1)", "switch (2)" and "switch (2)".
9134</pre></td></tr>
9135
9136
9137<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>
9138<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
9139switch statement or conditional operator.
9140
9141Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9142  if (true) {}
9143</pre></td></tr>
9144
9145
9146<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>
9147<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
9148
9149Given:
9150 void foo() {
9151   if (int i = foobar(); i &gt; 0) {}
9152   switch (int i = foobar(); i) {}
9153   for (auto&amp; a = get_range(); auto&amp; x : a) {}
9154 }
9155 void bar() {
9156   if (foobar() &gt; 0) {}
9157   switch (foobar()) {}
9158   for (auto&amp; x : get_range()) {}
9159 }
9160ifStmt(hasInitStatement(anything()))
9161  matches the if statement in foo but not in bar.
9162switchStmt(hasInitStatement(anything()))
9163  matches the switch statement in foo but not in bar.
9164cxxForRangeStmt(hasInitStatement(anything()))
9165  matches the range for statement in foo but not in bar.
9166</pre></td></tr>
9167
9168
9169<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>
9170<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
9171matches the given matcher.
9172
9173The associated declaration is:
9174- for type nodes, the declaration of the underlying type
9175- for CallExpr, the declaration of the callee
9176- for MemberExpr, the declaration of the referenced member
9177- for CXXConstructExpr, the declaration of the constructor
9178- for CXXNewExpr, the declaration of the operator new
9179- for ObjCIvarExpr, the declaration of the ivar
9180
9181For type nodes, hasDeclaration will generally match the declaration of the
9182sugared type. Given
9183  class X {};
9184  typedef X Y;
9185  Y y;
9186in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9187typedefDecl. A common use case is to match the underlying, desugared type.
9188This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9189  varDecl(hasType(hasUnqualifiedDesugaredType(
9190      recordType(hasDeclaration(decl())))))
9191In this matcher, the decl will match the CXXRecordDecl of class X.
9192
9193Usable 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;,
9194  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;,
9195  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;,
9196  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;,
9197  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;,
9198  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;,
9199  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9200</pre></td></tr>
9201
9202
9203<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
9204<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
9205
9206Examples:
9207  int x;
9208declaratorDecl(hasTypeLoc(loc(asString("int"))))
9209  matches int x
9210
9211auto x = int(3);
9212cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9213  matches int(3)
9214
9215struct Foo { Foo(int, int); };
9216auto x = Foo(1, 2);
9217cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9218  matches Foo(1, 2)
9219
9220Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
9221  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
9222  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
9223  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9224  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
9225  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
9226  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
9227  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9228</pre></td></tr>
9229
9230
9231<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>
9232<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
9233
9234Given
9235  struct B { int next; };
9236  template&lt;int(B::*next_ptr)&gt; struct A {};
9237  A&lt;&amp;B::next&gt; a;
9238templateSpecializationType(hasAnyTemplateArgument(
9239  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
9240  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9241    B::next
9242</pre></td></tr>
9243
9244
9245<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>
9246<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9247declaration.
9248
9249Given
9250  struct B { int next; };
9251  template&lt;int(B::*next_ptr)&gt; struct A {};
9252  A&lt;&amp;B::next&gt; a;
9253classTemplateSpecializationDecl(hasAnyTemplateArgument(
9254    refersToDeclaration(fieldDecl(hasName("next")))))
9255  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9256    B::next
9257</pre></td></tr>
9258
9259
9260<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>
9261<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9262
9263Given
9264  template&lt;int T&gt; struct C {};
9265  C&lt;42&gt; c;
9266classTemplateSpecializationDecl(
9267  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9268  matches the implicit instantiation of C in C&lt;42&gt;.
9269</pre></td></tr>
9270
9271
9272<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>
9273<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9274
9275Given
9276  template&lt;template &lt;typename&gt; class S&gt; class X {};
9277  template&lt;typename T&gt; class Y {};
9278  X&lt;Y&gt; xi;
9279classTemplateSpecializationDecl(hasAnyTemplateArgument(
9280    refersToTemplate(templateName())))
9281  matches the specialization X&lt;Y&gt;
9282</pre></td></tr>
9283
9284
9285<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>
9286<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9287
9288Given
9289  struct X {};
9290  template&lt;typename T&gt; struct A {};
9291  A&lt;X&gt; a;
9292classTemplateSpecializationDecl(hasAnyTemplateArgument(
9293    refersToType(class(hasName("X")))))
9294  matches the specialization A&lt;X&gt;
9295</pre></td></tr>
9296
9297
9298<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgumentLoc0')"><a name="hasAnyTemplateArgumentLoc0Anchor">hasAnyTemplateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9299<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one
9300`TemplateArgumentLoc` matching the given `InnerMatcher`.
9301
9302Given
9303  template&lt;typename T&gt; class A {};
9304  A&lt;int&gt; a;
9305varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
9306  hasTypeLoc(loc(asString("int")))))))
9307  matches `A&lt;int&gt; a`.
9308</pre></td></tr>
9309
9310
9311<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgumentLoc1')"><a name="hasTemplateArgumentLoc1Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9312<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th
9313`TemplateArgumentLoc` matches the given `InnerMatcher`.
9314
9315Given
9316  template&lt;typename T, typename U&gt; class A {};
9317  A&lt;double, int&gt; b;
9318  A&lt;int, double&gt; c;
9319varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
9320  hasTypeLoc(loc(asString("double")))))))
9321  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
9322</pre></td></tr>
9323
9324
9325<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>
9326<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9327functionDecl that have at least one TemplateArgument matching the given
9328InnerMatcher.
9329
9330Given
9331  template&lt;typename T&gt; class A {};
9332  template&lt;&gt; class A&lt;double&gt; {};
9333  A&lt;int&gt; a;
9334
9335  template&lt;typename T&gt; f() {};
9336  void func() { f&lt;int&gt;(); };
9337
9338classTemplateSpecializationDecl(hasAnyTemplateArgument(
9339    refersToType(asString("int"))))
9340  matches the specialization A&lt;int&gt;
9341
9342functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9343  matches the specialization f&lt;int&gt;
9344</pre></td></tr>
9345
9346
9347<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>
9348<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9349matches the given matcher.
9350
9351The associated declaration is:
9352- for type nodes, the declaration of the underlying type
9353- for CallExpr, the declaration of the callee
9354- for MemberExpr, the declaration of the referenced member
9355- for CXXConstructExpr, the declaration of the constructor
9356- for CXXNewExpr, the declaration of the operator new
9357- for ObjCIvarExpr, the declaration of the ivar
9358
9359For type nodes, hasDeclaration will generally match the declaration of the
9360sugared type. Given
9361  class X {};
9362  typedef X Y;
9363  Y y;
9364in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9365typedefDecl. A common use case is to match the underlying, desugared type.
9366This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9367  varDecl(hasType(hasUnqualifiedDesugaredType(
9368      recordType(hasDeclaration(decl())))))
9369In this matcher, the decl will match the CXXRecordDecl of class X.
9370
9371Usable 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;,
9372  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;,
9373  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;,
9374  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;,
9375  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;,
9376  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;,
9377  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9378</pre></td></tr>
9379
9380
9381<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>
9382<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9383functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9384
9385Given
9386  template&lt;typename T, typename U&gt; class A {};
9387  A&lt;bool, int&gt; b;
9388  A&lt;int, bool&gt; c;
9389
9390  template&lt;typename T&gt; void f() {}
9391  void func() { f&lt;int&gt;(); };
9392classTemplateSpecializationDecl(hasTemplateArgument(
9393    1, refersToType(asString("int"))))
9394  matches the specialization A&lt;bool, int&gt;
9395
9396functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9397  matches the specialization f&lt;int&gt;
9398</pre></td></tr>
9399
9400
9401<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>
9402<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9403matches the given matcher.
9404
9405The associated declaration is:
9406- for type nodes, the declaration of the underlying type
9407- for CallExpr, the declaration of the callee
9408- for MemberExpr, the declaration of the referenced member
9409- for CXXConstructExpr, the declaration of the constructor
9410- for CXXNewExpr, the declaration of the operator new
9411- for ObjCIvarExpr, the declaration of the ivar
9412
9413For type nodes, hasDeclaration will generally match the declaration of the
9414sugared type. Given
9415  class X {};
9416  typedef X Y;
9417  Y y;
9418in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9419typedefDecl. A common use case is to match the underlying, desugared type.
9420This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9421  varDecl(hasType(hasUnqualifiedDesugaredType(
9422      recordType(hasDeclaration(decl())))))
9423In this matcher, the decl will match the CXXRecordDecl of class X.
9424
9425Usable 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;,
9426  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;,
9427  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;,
9428  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;,
9429  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;,
9430  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;,
9431  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9432</pre></td></tr>
9433
9434
9435<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>
9436<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9437QualType-matcher matches.
9438</pre></td></tr>
9439
9440
9441<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
9442<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9443
9444Examples:
9445  int x;
9446declaratorDecl(hasTypeLoc(loc(asString("int"))))
9447  matches int x
9448
9449auto x = int(3);
9450cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9451  matches int(3)
9452
9453struct Foo { Foo(int, int); };
9454auto x = Foo(1, 2);
9455cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9456  matches Foo(1, 2)
9457
9458Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
9459  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
9460  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_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
9461  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9462  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
9463  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
9464  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
9465  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9466</pre></td></tr>
9467
9468
9469<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>
9470<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9471matcher.
9472
9473Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9474            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9475            and U (matcher = typedefDecl(hasType(asString("int")))
9476            and friend class X (matcher = friendDecl(hasType("X"))
9477            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9478                                              asString("class X")))
9479 class X {};
9480 void y(X &amp;x) { x; X z; }
9481 typedef int U;
9482 class Y { friend class X; };
9483 class Z : public virtual X {};
9484</pre></td></tr>
9485
9486
9487<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>
9488<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9489matches the given matcher.
9490
9491The associated declaration is:
9492- for type nodes, the declaration of the underlying type
9493- for CallExpr, the declaration of the callee
9494- for MemberExpr, the declaration of the referenced member
9495- for CXXConstructExpr, the declaration of the constructor
9496- for CXXNewExpr, the declaration of the operator new
9497- for ObjCIvarExpr, the declaration of the ivar
9498
9499For type nodes, hasDeclaration will generally match the declaration of the
9500sugared type. Given
9501  class X {};
9502  typedef X Y;
9503  Y y;
9504in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9505typedefDecl. A common use case is to match the underlying, desugared type.
9506This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9507  varDecl(hasType(hasUnqualifiedDesugaredType(
9508      recordType(hasDeclaration(decl())))))
9509In this matcher, the decl will match the CXXRecordDecl of class X.
9510
9511Usable 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;,
9512  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;,
9513  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;,
9514  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;,
9515  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;,
9516  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;,
9517  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9518</pre></td></tr>
9519
9520
9521<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>
9522<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9523type of the matched node.
9524
9525For example, in:
9526  class A {};
9527  using B = A;
9528The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9529both B and A.
9530</pre></td></tr>
9531
9532
9533<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>
9534<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9535
9536Given
9537  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9538unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9539  matches sizeof(a) and alignof(c)
9540</pre></td></tr>
9541
9542
9543<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>
9544<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9545
9546Example matches true (matcher = hasUnaryOperand(
9547                                  cxxBoolLiteral(equals(true))))
9548  !true
9549</pre></td></tr>
9550
9551
9552<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>
9553<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9554given matcher. Implicit object expressions are included; that is, it matches
9555use of implicit `this`.
9556
9557Given
9558  struct X {
9559    int m;
9560    int f(X x) { x.m; return m; }
9561  };
9562memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9563  matches `x.m`, but not `m`; however,
9564memberExpr(hasObjectExpression(hasType(pointsTo(
9565     cxxRecordDecl(hasName("X"))))))
9566  matches `m` (aka. `this-&gt;m`), but not `x.m`.
9567</pre></td></tr>
9568
9569
9570<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>
9571<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9572matches the given matcher.
9573
9574The associated declaration is:
9575- for type nodes, the declaration of the underlying type
9576- for CallExpr, the declaration of the callee
9577- for MemberExpr, the declaration of the referenced member
9578- for CXXConstructExpr, the declaration of the constructor
9579- for CXXNewExpr, the declaration of the operator new
9580- for ObjCIvarExpr, the declaration of the ivar
9581
9582For type nodes, hasDeclaration will generally match the declaration of the
9583sugared type. Given
9584  class X {};
9585  typedef X Y;
9586  Y y;
9587in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9588typedefDecl. A common use case is to match the underlying, desugared type.
9589This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9590  varDecl(hasType(hasUnqualifiedDesugaredType(
9591      recordType(hasDeclaration(decl())))))
9592In this matcher, the decl will match the CXXRecordDecl of class X.
9593
9594Usable 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;,
9595  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;,
9596  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;,
9597  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;,
9598  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;,
9599  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;,
9600  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9601</pre></td></tr>
9602
9603
9604<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>
9605<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9606matched by the given matcher.
9607
9608Given
9609  namespace X { int a; void b(); }
9610  using X::a;
9611  using X::b;
9612usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9613  matches using X::b but not using X::a </pre></td></tr>
9614
9615
9616<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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>
9617<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9618declaration's type.
9619
9620In case of a value declaration (for example a variable declaration),
9621this resolves one layer of indirection. For example, in the value
9622declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9623X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9624declaration of x.
9625
9626Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9627            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9628            and friend class X (matcher = friendDecl(hasType("X"))
9629            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9630                                              cxxRecordDecl(hasName("X"))))
9631 class X {};
9632 void y(X &amp;x) { x; X z; }
9633 class Y { friend class X; };
9634 class Z : public virtual X {};
9635
9636Example matches class Derived
9637(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9638class Base {};
9639class Derived : Base {};
9640
9641Usable 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;,
9642Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
9643</pre></td></tr>
9644
9645
9646<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>
9647<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9648matcher.
9649
9650Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9651            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9652            and U (matcher = typedefDecl(hasType(asString("int")))
9653            and friend class X (matcher = friendDecl(hasType("X"))
9654            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9655                                              asString("class X")))
9656 class X {};
9657 void y(X &amp;x) { x; X z; }
9658 typedef int U;
9659 class Y { friend class X; };
9660 class Z : public virtual X {};
9661</pre></td></tr>
9662
9663
9664<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>
9665<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9666that matches the given matcher.
9667
9668Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9669  bool y() { return true; }
9670  bool x = y();
9671</pre></td></tr>
9672
9673
9674<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>
9675<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9676expression.
9677
9678Given
9679  void f(int b) {
9680    int a[b];
9681  }
9682variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9683  varDecl(hasName("b")))))))
9684  matches "int a[b]"
9685</pre></td></tr>
9686
9687
9688<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>
9689<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9690
9691
9692<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>
9693<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9694switch statement or conditional operator.
9695
9696Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9697  if (true) {}
9698</pre></td></tr>
9699
9700<!--END_TRAVERSAL_MATCHERS -->
9701</table>
9702
9703</div>
9704</body>
9705</html>
9706
9707
9708