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('isConsteval1')"><a name="isConsteval1Anchor">isConsteval</a></td><td></td></tr>
4205<tr><td colspan="4" class="doc" id="isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval
4206statements.
4207
4208Given:
4209  consteval int a();
4210  void b() { if consteval {} }
4211  void c() { if ! consteval {} }
4212  void d() { if ! consteval {} else {} }
4213functionDecl(isConsteval())
4214  matches the declaration of "int a()".
4215ifStmt(isConsteval())
4216  matches the if statement in "void b()", "void c()", "void d()".
4217</pre></td></tr>
4218
4219
4220<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>
4221<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4222       and if constexpr.
4223
4224Given:
4225  constexpr int foo = 42;
4226  constexpr int bar();
4227  void baz() { if constexpr(1 &gt; 0) {} }
4228varDecl(isConstexpr())
4229  matches the declaration of foo.
4230functionDecl(isConstexpr())
4231  matches the declaration of bar.
4232ifStmt(isConstexpr())
4233  matches the if statement in baz.
4234</pre></td></tr>
4235
4236
4237<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>
4238<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4239
4240Given:
4241  class A { ~A(); };
4242  class B { ~B() = default; };
4243functionDecl(isDefaulted())
4244  matches the declaration of ~B, but not ~A.
4245</pre></td></tr>
4246
4247
4248<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>
4249<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4250
4251Example matches A, va, fa
4252  class A {};
4253  class B;  // Doesn't match, as it has no body.
4254  int va;
4255  extern int vb;  // Doesn't match, as it doesn't define the variable.
4256  void fa() {}
4257  void fb();  // Doesn't match, as it has no body.
4258  @interface X
4259  - (void)ma; // Doesn't match, interface is declaration.
4260  @end
4261  @implementation X
4262  - (void)ma {}
4263  @end
4264
4265Usable 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;,
4266  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4267</pre></td></tr>
4268
4269
4270<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>
4271<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4272
4273Given:
4274  void Func();
4275  void DeletedFunc() = delete;
4276functionDecl(isDeleted())
4277  matches the declaration of DeletedFunc, but not Func.
4278</pre></td></tr>
4279
4280
4281<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>
4282<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4283static member variable template instantiations.
4284
4285Given
4286  template&lt;typename T&gt; void A(T t) { }
4287  template&lt;&gt; void A(int N) { }
4288functionDecl(isExplicitTemplateSpecialization())
4289  matches the specialization A&lt;int&gt;().
4290
4291Usable 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;
4292</pre></td></tr>
4293
4294
4295<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>
4296<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4297
4298Given:
4299  extern "C" void f() {}
4300  extern "C" { void g() {} }
4301  void h() {}
4302  extern "C" int x = 1;
4303  extern "C" int y = 2;
4304  int z = 3;
4305functionDecl(isExternC())
4306  matches the declaration of f and g, but not the declaration of h.
4307varDecl(isExternC())
4308  matches the declaration of x and y, but not the declaration of z.
4309</pre></td></tr>
4310
4311
4312<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>
4313<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4314the inline keyword.
4315
4316Given
4317  inline void f();
4318  void g();
4319  namespace n {
4320  inline namespace m {}
4321  }
4322functionDecl(isInline()) will match ::f().
4323namespaceDecl(isInline()) will match n::m.
4324</pre></td></tr>
4325
4326
4327<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>
4328<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4329into an executable program.
4330</pre></td></tr>
4331
4332
4333<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>
4334<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4335
4336Given
4337  void nope();
4338  [[noreturn]] void a();
4339  __attribute__((noreturn)) void b();
4340  struct c { [[noreturn]] c(); };
4341functionDecl(isNoReturn())
4342  matches all of those except
4343  void nope();
4344</pre></td></tr>
4345
4346
4347<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>
4348<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4349
4350Given:
4351  void f();
4352  void g() noexcept;
4353  void h() throw();
4354  void i() throw(int);
4355  void j() noexcept(false);
4356functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4357  match the declarations of g, and h, but not f, i or j.
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('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
4362<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4363class specifier ("static" keyword) written in the source.
4364
4365Given:
4366  static void f() {}
4367  static int i = 0;
4368  extern int j;
4369  int k;
4370functionDecl(isStaticStorageClass())
4371  matches the function declaration f.
4372varDecl(isStaticStorageClass())
4373  matches the variable declaration i.
4374</pre></td></tr>
4375
4376
4377<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>
4378<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4379member variable template instantiations.
4380
4381Given
4382  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4383or
4384  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4385or
4386  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4387cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4388  matches the template instantiation of X&lt;A&gt;.
4389
4390But given
4391  template &lt;typename T&gt;  class X {}; class A {};
4392  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4393cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4394  does not match, as X&lt;A&gt; is an explicit template specialization.
4395
4396Usable 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;
4397</pre></td></tr>
4398
4399
4400<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>
4401<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4402
4403Example matches f, but not g or h. The function i will not match, even when
4404compiled in C mode.
4405  void f(...);
4406  void g(int);
4407  template &lt;typename... Ts&gt; void h(Ts...);
4408  void i();
4409</pre></td></tr>
4410
4411
4412<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>
4413<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4414
4415Given:
4416  void foo() __attribute__((__weakref__("__foo")));
4417  void bar();
4418functionDecl(isWeak())
4419  matches the weak declaration "foo", but not "bar".
4420</pre></td></tr>
4421
4422
4423<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>
4424<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4425specific parameter count.
4426
4427Given
4428  void f(int i) {}
4429  void g(int i, int j) {}
4430  void h(int i, int j);
4431  void j(int i);
4432  void k(int x, int y, int z, ...);
4433functionDecl(parameterCountIs(2))
4434  matches g and h
4435functionProtoType(parameterCountIs(2))
4436  matches g and h
4437functionProtoType(parameterCountIs(3))
4438  matches k
4439</pre></td></tr>
4440
4441
4442<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>
4443<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4444
4445Given:
4446  void f();
4447  void g() noexcept;
4448  void h() noexcept(true);
4449  void i() noexcept(false);
4450  void j() throw();
4451  void k() throw(int);
4452  void l() throw(...);
4453functionDecl(hasDynamicExceptionSpec()) and
4454  functionProtoType(hasDynamicExceptionSpec())
4455  match the declarations of j, k, and l, but not f, g, h, or i.
4456</pre></td></tr>
4457
4458
4459<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>
4460<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4461
4462Given:
4463  void f();
4464  void g() noexcept;
4465  void h() throw();
4466  void i() throw(int);
4467  void j() noexcept(false);
4468functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4469  match the declarations of g, and h, but not f, i or j.
4470</pre></td></tr>
4471
4472
4473<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>
4474<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4475specific parameter count.
4476
4477Given
4478  void f(int i) {}
4479  void g(int i, int j) {}
4480  void h(int i, int j);
4481  void j(int i);
4482  void k(int x, int y, int z, ...);
4483functionDecl(parameterCountIs(2))
4484  matches g and h
4485functionProtoType(parameterCountIs(2))
4486  matches g and h
4487functionProtoType(parameterCountIs(3))
4488  matches k
4489</pre></td></tr>
4490
4491
4492<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConsteval2')"><a name="isConsteval2Anchor">isConsteval</a></td><td></td></tr>
4493<tr><td colspan="4" class="doc" id="isConsteval2"><pre>Matches consteval function declarations and if consteval/if ! consteval
4494statements.
4495
4496Given:
4497  consteval int a();
4498  void b() { if consteval {} }
4499  void c() { if ! consteval {} }
4500  void d() { if ! consteval {} else {} }
4501functionDecl(isConsteval())
4502  matches the declaration of "int a()".
4503ifStmt(isConsteval())
4504  matches the if statement in "void b()", "void c()", "void d()".
4505</pre></td></tr>
4506
4507
4508<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>
4509<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4510       and if constexpr.
4511
4512Given:
4513  constexpr int foo = 42;
4514  constexpr int bar();
4515  void baz() { if constexpr(1 &gt; 0) {} }
4516varDecl(isConstexpr())
4517  matches the declaration of foo.
4518functionDecl(isConstexpr())
4519  matches the declaration of bar.
4520ifStmt(isConstexpr())
4521  matches the if statement in baz.
4522</pre></td></tr>
4523
4524
4525<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>
4526<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4527
4528
4529<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>
4530<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4531
4532Given
4533  f('false, 3.14, 42);
4534characterLiteral(equals(0))
4535  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4536  match false
4537floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4538  match 3.14
4539integerLiteral(equals(42))
4540  matches 42
4541
4542Note that you cannot directly match a negative numeric literal because the
4543minus sign is not part of the literal: It is a unary operator whose operand
4544is the positive numeric literal. Instead, you must use a unaryOperator()
4545matcher to match the minus sign:
4546
4547unaryOperator(hasOperatorName("-"),
4548              hasUnaryOperand(integerLiteral(equals(13))))
4549
4550Usable 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;,
4551           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;
4552</pre></td></tr>
4553
4554
4555<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>
4556<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4557
4558
4559<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>
4560<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4561
4562
4563<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>
4564<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'.
4565
4566Given
4567class C {
4568  int cc;
4569  int f() {
4570    auto l = [this]() { return cc; };
4571    return l();
4572  }
4573};
4574lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4575  matches `[this]() { return cc; }`.
4576</pre></td></tr>
4577
4578
4579<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>
4580<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4581implicit default/copy constructors).
4582</pre></td></tr>
4583
4584
4585<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>
4586<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4587to '.'.
4588
4589Member calls on the implicit this pointer match as called with '-&gt;'.
4590
4591Given
4592  class Y {
4593    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4594    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4595    int a;
4596    static int b;
4597  };
4598  template &lt;class T&gt;
4599  class Z {
4600    void x() { this-&gt;m; }
4601  };
4602memberExpr(isArrow())
4603  matches this-&gt;x, x, y.x, a, this-&gt;b
4604cxxDependentScopeMemberExpr(isArrow())
4605  matches this-&gt;m
4606unresolvedMemberExpr(isArrow())
4607  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4608</pre></td></tr>
4609
4610
4611<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>
4612<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4613
4614This matcher is only provided as a performance optimization of hasName.
4615    hasAnyName(a, b, c)
4616 is equivalent to, but faster than
4617    anyOf(hasName(a), hasName(b), hasName(c))
4618</pre></td></tr>
4619
4620
4621<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>
4622<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4623
4624Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4625void f() {
4626  int x;
4627  static int y;
4628}
4629int z;
4630
4631Example matches f() because it has external formal linkage despite being
4632unique to the translation unit as though it has internal likage
4633(matcher = functionDecl(hasExternalFormalLinkage()))
4634
4635namespace {
4636void f() {}
4637}
4638</pre></td></tr>
4639
4640
4641<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>
4642<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4643
4644Supports specifying enclosing namespaces or classes by prefixing the name
4645with '&lt;enclosing&gt;::'.
4646Does not match typedefs of an underlying type with the given name.
4647
4648Example matches X (Name == "X")
4649  class X;
4650
4651Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4652  namespace a { namespace b { class X; } }
4653</pre></td></tr>
4654
4655
4656<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>
4657<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4658a substring matched by the given RegExp.
4659
4660Supports specifying enclosing namespaces or classes by
4661prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4662of an underlying type with the given name.
4663
4664Example matches X (regexp == "::X")
4665  class X;
4666
4667Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4668  namespace foo { namespace bar { class X; } }
4669
4670If the matcher is used in clang-query, RegexFlags parameter
4671should be passed as a quoted string. e.g: "NoFlags".
4672Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4673</pre></td></tr>
4674
4675
4676<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>
4677<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4678
4679Given
4680  namespace n {
4681  namespace {} // #1
4682  }
4683namespaceDecl(isAnonymous()) will match #1 but not ::n.
4684</pre></td></tr>
4685
4686
4687<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>
4688<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4689the inline keyword.
4690
4691Given
4692  inline void f();
4693  void g();
4694  namespace n {
4695  inline namespace m {}
4696  }
4697functionDecl(isInline()) will match ::f().
4698namespaceDecl(isInline()) will match n::m.
4699</pre></td></tr>
4700
4701
4702<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>
4703<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4704specified.
4705
4706Given
4707
4708  #pragma omp parallel
4709  #pragma omp parallel default(none)
4710  #pragma omp parallel default(shared)
4711  #pragma omp parallel default(firstprivate)
4712
4713``ompDefaultClause(isFirstPrivateKind())`` matches only
4714``default(firstprivate)``.
4715</pre></td></tr>
4716
4717
4718<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>
4719<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4720
4721Given
4722
4723  #pragma omp parallel
4724  #pragma omp parallel default(none)
4725  #pragma omp parallel default(shared)
4726  #pragma omp parallel default(firstprivate)
4727
4728``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4729</pre></td></tr>
4730
4731
4732<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>
4733<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4734
4735Given
4736
4737  #pragma omp parallel
4738  #pragma omp parallel default(none)
4739  #pragma omp parallel default(shared)
4740  #pragma omp parallel default(firstprivate)
4741
4742``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4743</pre></td></tr>
4744
4745
4746<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>
4747<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4748clause kind.
4749
4750Given
4751
4752  #pragma omp parallel
4753  #pragma omp parallel for
4754  #pragma omp          for
4755
4756`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4757``omp parallel`` and ``omp parallel for``.
4758
4759If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4760should be passed as a quoted string. e.g.,
4761``isAllowedToContainClauseKind("OMPC_default").``
4762</pre></td></tr>
4763
4764
4765<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>
4766<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4767i.e., directives that can't have a structured block.
4768
4769Given
4770
4771  #pragma omp parallel
4772  {}
4773  #pragma omp taskyield
4774
4775``ompExecutableDirective(isStandaloneDirective()))`` matches
4776``omp taskyield``.
4777</pre></td></tr>
4778
4779
4780<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>
4781<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4782</pre></td></tr>
4783
4784
4785<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>
4786<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4787</pre></td></tr>
4788
4789
4790<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>
4791<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4792isSameOrDerivedFrom(hasName(...)).
4793</pre></td></tr>
4794
4795
4796<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>
4797<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4798a specific number of arguments (including absent default arguments).
4799
4800Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4801  void f(int x, int y);
4802  f(0, 0);
4803</pre></td></tr>
4804
4805
4806<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>
4807<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4808Selector.getAsString()
4809
4810 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4811 matches both of the expressions below:
4812    [myObj methodA:argA];
4813    [myObj methodB:argB];
4814</pre></td></tr>
4815
4816
4817<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>
4818<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4819
4820objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4821message expression in
4822
4823  UIWebView *webView = ...;
4824  CGRect bodyFrame = webView.frame;
4825  bodyFrame.size.height = self.bodyContentHeight;
4826  webView.frame = bodyFrame;
4827  //     ^---- matches here
4828</pre></td></tr>
4829
4830
4831<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>
4832<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4833
4834Matches only when the selector of the objCMessageExpr is NULL. This may
4835represent an error condition in the tree!
4836</pre></td></tr>
4837
4838
4839<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>
4840<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4841
4842 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4843 matches the outer message expr in the code below, but NOT the message
4844 invocation for self.bodyView.
4845    [self.bodyView loadHTMLString:html baseURL:NULL];
4846</pre></td></tr>
4847
4848
4849<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>
4850<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4851
4852 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4853 matches self.bodyView in the code below, but NOT the outer message
4854 invocation of "loadHTMLString:baseURL:".
4855    [self.bodyView loadHTMLString:html baseURL:NULL];
4856</pre></td></tr>
4857
4858
4859<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>
4860<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4861
4862Example
4863matcher = objcMessageExpr(isClassMessage())
4864matches
4865  [NSString stringWithFormat:@"format"];
4866but not
4867  NSString *x = @"hello";
4868  [x containsString:@"h"];
4869</pre></td></tr>
4870
4871
4872<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>
4873<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4874
4875Example
4876matcher = objcMessageExpr(isInstanceMessage())
4877matches
4878  NSString *x = @"hello";
4879  [x containsString:@"h"];
4880but not
4881  [NSString stringWithFormat:@"format"];
4882</pre></td></tr>
4883
4884
4885<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>
4886<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4887a substring matched by the given RegExp.
4888 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4889 invocation for self.bodyView.
4890    [self.bodyView loadHTMLString:html baseURL:NULL];
4891
4892If the matcher is used in clang-query, RegexFlags parameter
4893should be passed as a quoted string. e.g: "NoFlags".
4894Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4895</pre></td></tr>
4896
4897
4898<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>
4899<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4900
4901 matcher = objCMessageExpr(numSelectorArgs(0));
4902 matches self.bodyView in the code below
4903
4904 matcher = objCMessageExpr(numSelectorArgs(2));
4905 matches the invocation of "loadHTMLString:baseURL:" but not that
4906 of self.bodyView
4907    [self.bodyView loadHTMLString:html baseURL:NULL];
4908</pre></td></tr>
4909
4910
4911<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>
4912<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4913
4914Example
4915matcher = objcMethodDecl(isClassMethod())
4916matches
4917@interface I + (void)foo; @end
4918but not
4919@interface I - (void)bar; @end
4920</pre></td></tr>
4921
4922
4923<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>
4924<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4925
4926Example matches A, va, fa
4927  class A {};
4928  class B;  // Doesn't match, as it has no body.
4929  int va;
4930  extern int vb;  // Doesn't match, as it doesn't define the variable.
4931  void fa() {}
4932  void fb();  // Doesn't match, as it has no body.
4933  @interface X
4934  - (void)ma; // Doesn't match, interface is declaration.
4935  @end
4936  @implementation X
4937  - (void)ma {}
4938  @end
4939
4940Usable 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;,
4941  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4942</pre></td></tr>
4943
4944
4945<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>
4946<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4947
4948Example
4949matcher = objcMethodDecl(isInstanceMethod())
4950matches
4951@interface I - (void)bar; @end
4952but not
4953@interface I + (void)foo; @end
4954</pre></td></tr>
4955
4956
4957<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>
4958<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4959
4960Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4961void x(int val) {}
4962void y(int val = 0) {}
4963
4964Deprecated. Use hasInitializer() instead to be able to
4965match on the contents of the default argument.  For example:
4966
4967void x(int val = 7) {}
4968void y(int val = 42) {}
4969parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4970  matches the parameter of y
4971
4972A matcher such as
4973  parmVarDecl(hasInitializer(anything()))
4974is equivalent to parmVarDecl(hasDefaultArgument()).
4975</pre></td></tr>
4976
4977
4978<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>
4979<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4980list. The parameter list could be that of either a block, function, or
4981objc-method.
4982
4983
4984Given
4985
4986void f(int a, int b, int c) {
4987}
4988
4989``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4990
4991``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4992</pre></td></tr>
4993
4994
4995<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>
4996<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4997
4998Given
4999  class Y { public: void x(); };
5000  void z() { Y* y; y-&gt;x(); }
5001cxxMemberCallExpr(on(hasType(asString("class Y *"))))
5002  matches y-&gt;x()
5003</pre></td></tr>
5004
5005
5006<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>
5007<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
5008
5009Matches a node if it equals the node previously bound to ID.
5010
5011Given
5012  class X { int a; int b; };
5013cxxRecordDecl(
5014    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5015    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5016  matches the class X, as a and b have the same type.
5017
5018Note that when multiple matches are involved via forEach* matchers,
5019equalsBoundNodes acts as a filter.
5020For example:
5021compoundStmt(
5022    forEachDescendant(varDecl().bind("d")),
5023    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5024will trigger a match for each combination of variable declaration
5025and reference to that variable declaration within a compound statement.
5026</pre></td></tr>
5027
5028
5029<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>
5030<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
5031the node, not hidden within a typedef.
5032
5033Given
5034  typedef const int const_int;
5035  const_int i;
5036  int *const j;
5037  int *volatile k;
5038  int m;
5039varDecl(hasType(hasLocalQualifiers())) matches only j and k.
5040i is const-qualified but the qualifier is not local.
5041</pre></td></tr>
5042
5043
5044<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>
5045<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
5046
5047Given
5048  void a(char);
5049  void b(wchar_t);
5050  void c(double);
5051functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
5052matches "a(char)", "b(wchar_t)", but not "c(double)".
5053</pre></td></tr>
5054
5055
5056<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>
5057<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
5058the Objective-C object pointer type, which is different despite being
5059syntactically similar.
5060
5061Given
5062  int *i = nullptr;
5063
5064  @interface Foo
5065  @end
5066  Foo *f;
5067
5068  int j;
5069varDecl(hasType(isAnyPointer()))
5070  matches "int *i" and "Foo *f", but not "int j".
5071</pre></td></tr>
5072
5073
5074<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>
5075<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
5076include "top-level" const.
5077
5078Given
5079  void a(int);
5080  void b(int const);
5081  void c(const int);
5082  void d(const int*);
5083  void e(int const) {};
5084functionDecl(hasAnyParameter(hasType(isConstQualified())))
5085  matches "void b(int const)", "void c(const int)" and
5086  "void e(int const) {}". It does not match d as there
5087  is no top-level const on the parameter type "const int *".
5088</pre></td></tr>
5089
5090
5091<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>
5092<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
5093
5094Given
5095  void a(int);
5096  void b(long);
5097  void c(double);
5098functionDecl(hasAnyParameter(hasType(isInteger())))
5099matches "a(int)", "b(long)", but not "c(double)".
5100</pre></td></tr>
5101
5102
5103<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>
5104<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
5105
5106Given
5107  void a(int);
5108  void b(unsigned long);
5109  void c(double);
5110functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5111matches "a(int)", but not "b(unsigned long)" and "c(double)".
5112</pre></td></tr>
5113
5114
5115<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>
5116<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
5117
5118Given
5119  void a(int);
5120  void b(unsigned long);
5121  void c(double);
5122functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5123matches "b(unsigned long)", but not "a(int)" and "c(double)".
5124</pre></td></tr>
5125
5126
5127<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>
5128<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5129include "top-level" volatile.
5130
5131Given
5132  void a(int);
5133  void b(int volatile);
5134  void c(volatile int);
5135  void d(volatile int*);
5136  void e(int volatile) {};
5137functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5138  matches "void b(int volatile)", "void c(volatile int)" and
5139  "void e(int volatile) {}". It does not match d as there
5140  is no top-level volatile on the parameter type "volatile int *".
5141</pre></td></tr>
5142
5143
5144<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>
5145<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
5146
5147Matches a node if it equals the node previously bound to ID.
5148
5149Given
5150  class X { int a; int b; };
5151cxxRecordDecl(
5152    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5153    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5154  matches the class X, as a and b have the same type.
5155
5156Note that when multiple matches are involved via forEach* matchers,
5157equalsBoundNodes acts as a filter.
5158For example:
5159compoundStmt(
5160    forEachDescendant(varDecl().bind("d")),
5161    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5162will trigger a match for each combination of variable declaration
5163and reference to that variable declaration within a compound statement.
5164</pre></td></tr>
5165
5166
5167<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>
5168<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5169
5170Stmt has pointer identity in the AST.
5171</pre></td></tr>
5172
5173
5174<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>
5175<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5176Does not match if only part of the statement is expanded from that macro or
5177if different parts of the statement are expanded from different
5178appearances of the macro.
5179</pre></td></tr>
5180
5181
5182<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>
5183<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5184partially matching a given regex.
5185
5186Example matches Y but not X
5187    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5188  #include "ASTMatcher.h"
5189  class X {};
5190ASTMatcher.h:
5191  class Y {};
5192
5193Usable 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;
5194
5195If the matcher is used in clang-query, RegexFlags parameter
5196should be passed as a quoted string. e.g: "NoFlags".
5197Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5198</pre></td></tr>
5199
5200
5201<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>
5202<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5203
5204Example matches X but not Y
5205  (matcher = cxxRecordDecl(isExpansionInMainFile())
5206  #include &lt;Y.h&gt;
5207  class X {};
5208Y.h:
5209  class Y {};
5210
5211Usable 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;
5212</pre></td></tr>
5213
5214
5215<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>
5216<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5217
5218Example matches Y but not X
5219    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5220  #include &lt;SystemHeader.h&gt;
5221  class X {};
5222SystemHeader.h:
5223  class Y {};
5224
5225Usable 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;
5226</pre></td></tr>
5227
5228
5229<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>
5230<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5231
5232Given
5233  int j;
5234  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5235  A(0);
5236  A(0U);
5237declStmt(isInTemplateInstantiation())
5238  matches 'int i;' and 'unsigned i'.
5239unless(stmt(isInTemplateInstantiation()))
5240  will NOT match j += 42; as it's shared between the template definition and
5241  instantiation.
5242</pre></td></tr>
5243
5244
5245<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>
5246<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5247
5248Given
5249  int a[42];
5250  int b[2 * 21];
5251  int c[41], d[43];
5252  char *s = "abcd";
5253  wchar_t *ws = L"abcd";
5254  char *w = "a";
5255constantArrayType(hasSize(42))
5256  matches "int a[42]" and "int b[2 * 21]"
5257stringLiteral(hasSize(4))
5258  matches "abcd", L"abcd"
5259</pre></td></tr>
5260
5261
5262<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>
5263<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5264
5265Example matches C, but not S, U or E.
5266  struct S {};
5267  class C {};
5268  union U {};
5269  enum E {};
5270</pre></td></tr>
5271
5272
5273<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>
5274<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5275
5276Example matches A, va, fa
5277  class A {};
5278  class B;  // Doesn't match, as it has no body.
5279  int va;
5280  extern int vb;  // Doesn't match, as it doesn't define the variable.
5281  void fa() {}
5282  void fb();  // Doesn't match, as it has no body.
5283  @interface X
5284  - (void)ma; // Doesn't match, interface is declaration.
5285  @end
5286  @implementation X
5287  - (void)ma {}
5288  @end
5289
5290Usable 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;,
5291  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5292</pre></td></tr>
5293
5294
5295<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>
5296<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5297
5298Example matches E, but not C, S or U.
5299  struct S {};
5300  class C {};
5301  union U {};
5302  enum E {};
5303</pre></td></tr>
5304
5305
5306<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>
5307<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5308
5309Example matches S, but not C, U or E.
5310  struct S {};
5311  class C {};
5312  union U {};
5313  enum E {};
5314</pre></td></tr>
5315
5316
5317<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>
5318<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5319
5320Example matches U, but not C, S or E.
5321  struct S {};
5322  class C {};
5323  union U {};
5324  enum E {};
5325</pre></td></tr>
5326
5327
5328<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>
5329<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5330
5331Note that 'Value' is a string as the template argument's value is
5332an arbitrary precision integer. 'Value' must be euqal to the canonical
5333representation of that integral value in base 10.
5334
5335Given
5336  template&lt;int T&gt; struct C {};
5337  C&lt;42&gt; c;
5338classTemplateSpecializationDecl(
5339  hasAnyTemplateArgument(equalsIntegralValue("42")))
5340  matches the implicit instantiation of C in C&lt;42&gt;.
5341</pre></td></tr>
5342
5343
5344<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>
5345<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5346
5347Given
5348  template&lt;int T&gt; struct C {};
5349  C&lt;42&gt; c;
5350classTemplateSpecializationDecl(
5351  hasAnyTemplateArgument(isIntegral()))
5352  matches the implicit instantiation of C in C&lt;42&gt;
5353  with isIntegral() matching 42.
5354</pre></td></tr>
5355
5356
5357<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>
5358<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5359
5360Given
5361  template&lt;typename T&gt; struct C {};
5362  C&lt;int&gt; c;
5363classTemplateSpecializationDecl(templateArgumentCountIs(1))
5364  matches C&lt;int&gt;.
5365</pre></td></tr>
5366
5367
5368<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>
5369<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5370Does not match if only part of the statement is expanded from that macro or
5371if different parts of the statement are expanded from different
5372appearances of the macro.
5373</pre></td></tr>
5374
5375
5376<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>
5377<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5378partially matching a given regex.
5379
5380Example matches Y but not X
5381    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5382  #include "ASTMatcher.h"
5383  class X {};
5384ASTMatcher.h:
5385  class Y {};
5386
5387Usable 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;
5388
5389If the matcher is used in clang-query, RegexFlags parameter
5390should be passed as a quoted string. e.g: "NoFlags".
5391Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5392</pre></td></tr>
5393
5394
5395<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>
5396<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5397
5398Example matches X but not Y
5399  (matcher = cxxRecordDecl(isExpansionInMainFile())
5400  #include &lt;Y.h&gt;
5401  class X {};
5402Y.h:
5403  class Y {};
5404
5405Usable 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;
5406</pre></td></tr>
5407
5408
5409<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>
5410<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5411
5412Example matches Y but not X
5413    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5414  #include &lt;SystemHeader.h&gt;
5415  class X {};
5416SystemHeader.h:
5417  class Y {};
5418
5419Usable 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;
5420</pre></td></tr>
5421
5422
5423<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>
5424<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5425
5426Given
5427 struct S { bool func(); };
5428functionDecl(returns(booleanType()))
5429  matches "bool func();"
5430</pre></td></tr>
5431
5432
5433<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>
5434<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5435
5436Matches a node if it equals the node previously bound to ID.
5437
5438Given
5439  class X { int a; int b; };
5440cxxRecordDecl(
5441    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5442    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5443  matches the class X, as a and b have the same type.
5444
5445Note that when multiple matches are involved via forEach* matchers,
5446equalsBoundNodes acts as a filter.
5447For example:
5448compoundStmt(
5449    forEachDescendant(varDecl().bind("d")),
5450    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5451will trigger a match for each combination of variable declaration
5452and reference to that variable declaration within a compound statement.
5453</pre></td></tr>
5454
5455
5456<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>
5457<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5458
5459Type has pointer identity in the AST.
5460</pre></td></tr>
5461
5462
5463<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>
5464<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5465
5466Given
5467  int i;
5468  float f;
5469realFloatingPointType()
5470  matches "float f" but not "int i"
5471</pre></td></tr>
5472
5473
5474<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>
5475<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5476
5477Given
5478 struct S { void func(); };
5479functionDecl(returns(voidType()))
5480  matches "void func();"
5481</pre></td></tr>
5482
5483
5484<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>
5485<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5486
5487Given
5488  int x;
5489  int s = sizeof(x) + alignof(x)
5490unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5491  matches sizeof(x)
5492
5493If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5494should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5495</pre></td></tr>
5496
5497
5498<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>
5499<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5500specified names.
5501
5502   hasAnyOperatorName("+", "-")
5503 Is equivalent to
5504   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5505</pre></td></tr>
5506
5507
5508<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>
5509<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5510unary).
5511
5512Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5513  !(a || b)
5514</pre></td></tr>
5515
5516
5517<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>
5518<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5519to '.'.
5520
5521Member calls on the implicit this pointer match as called with '-&gt;'.
5522
5523Given
5524  class Y {
5525    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5526    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5527    int a;
5528    static int b;
5529  };
5530  template &lt;class T&gt;
5531  class Z {
5532    void x() { this-&gt;m; }
5533  };
5534memberExpr(isArrow())
5535  matches this-&gt;x, x, y.x, a, this-&gt;b
5536cxxDependentScopeMemberExpr(isArrow())
5537  matches this-&gt;m
5538unresolvedMemberExpr(isArrow())
5539  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5540</pre></td></tr>
5541
5542
5543<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>
5544<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5545
5546Example matches x, but not y, z, or a.
5547(matcher = varDecl(hasAutomaticStorageDuration())
5548void f() {
5549  int x;
5550  static int y;
5551  thread_local int z;
5552}
5553int a;
5554</pre></td></tr>
5555
5556
5557<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>
5558<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5559
5560Example matches y and z (matcher = varDecl(hasGlobalStorage())
5561void f() {
5562  int x;
5563  static int y;
5564}
5565int z;
5566</pre></td></tr>
5567
5568
5569<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>
5570<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5571non-static local variable.
5572
5573Example matches x (matcher = varDecl(hasLocalStorage())
5574void f() {
5575  int x;
5576  static int y;
5577}
5578int z;
5579</pre></td></tr>
5580
5581
5582<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>
5583<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5584It includes the variable declared at namespace scope and those declared
5585with "static" and "extern" storage class specifiers.
5586
5587void f() {
5588  int x;
5589  static int y;
5590  thread_local int z;
5591}
5592int a;
5593static int b;
5594extern int c;
5595varDecl(hasStaticStorageDuration())
5596  matches the function declaration y, a, b and c.
5597</pre></td></tr>
5598
5599
5600<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>
5601<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5602
5603Example matches z, but not x, z, or a.
5604(matcher = varDecl(hasThreadStorageDuration())
5605void f() {
5606  int x;
5607  static int y;
5608  thread_local int z;
5609}
5610int a;
5611</pre></td></tr>
5612
5613
5614<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>
5615<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5616       and if constexpr.
5617
5618Given:
5619  constexpr int foo = 42;
5620  constexpr int bar();
5621  void baz() { if constexpr(1 &gt; 0) {} }
5622varDecl(isConstexpr())
5623  matches the declaration of foo.
5624functionDecl(isConstexpr())
5625  matches the declaration of bar.
5626ifStmt(isConstexpr())
5627  matches the if statement in baz.
5628</pre></td></tr>
5629
5630
5631<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>
5632<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5633
5634Example matches A, va, fa
5635  class A {};
5636  class B;  // Doesn't match, as it has no body.
5637  int va;
5638  extern int vb;  // Doesn't match, as it doesn't define the variable.
5639  void fa() {}
5640  void fb();  // Doesn't match, as it has no body.
5641  @interface X
5642  - (void)ma; // Doesn't match, interface is declaration.
5643  @end
5644  @implementation X
5645  - (void)ma {}
5646  @end
5647
5648Usable 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;,
5649  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5650</pre></td></tr>
5651
5652
5653<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>
5654<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5655a C++ catch block, or an Objective-C statement.
5656
5657Example matches x (matcher = varDecl(isExceptionVariable())
5658void f(int y) {
5659  try {
5660  } catch (int x) {
5661  }
5662}
5663</pre></td></tr>
5664
5665
5666<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>
5667<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5668static member variable template instantiations.
5669
5670Given
5671  template&lt;typename T&gt; void A(T t) { }
5672  template&lt;&gt; void A(int N) { }
5673functionDecl(isExplicitTemplateSpecialization())
5674  matches the specialization A&lt;int&gt;().
5675
5676Usable 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;
5677</pre></td></tr>
5678
5679
5680<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>
5681<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5682
5683Given:
5684  extern "C" void f() {}
5685  extern "C" { void g() {} }
5686  void h() {}
5687  extern "C" int x = 1;
5688  extern "C" int y = 2;
5689  int z = 3;
5690functionDecl(isExternC())
5691  matches the declaration of f and g, but not the declaration of h.
5692varDecl(isExternC())
5693  matches the declaration of x and y, but not the declaration of z.
5694</pre></td></tr>
5695
5696
5697<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>
5698<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init-
5699capture.
5700
5701Example matches x (matcher = varDecl(isInitCapture()))
5702auto f = [x=3]() { return x; };
5703</pre></td></tr>
5704
5705
5706<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>
5707<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5708
5709Example matches y (matcher = varDecl(isStaticLocal()))
5710void f() {
5711  int x;
5712  static int y;
5713}
5714static int z;
5715</pre></td></tr>
5716
5717
5718<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>
5719<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5720class specifier ("static" keyword) written in the source.
5721
5722Given:
5723  static void f() {}
5724  static int i = 0;
5725  extern int j;
5726  int k;
5727functionDecl(isStaticStorageClass())
5728  matches the function declaration f.
5729varDecl(isStaticStorageClass())
5730  matches the variable declaration i.
5731</pre></td></tr>
5732
5733
5734<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>
5735<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5736member variable template instantiations.
5737
5738Given
5739  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5740or
5741  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5742or
5743  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5744cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5745  matches the template instantiation of X&lt;A&gt;.
5746
5747But given
5748  template &lt;typename T&gt;  class X {}; class A {};
5749  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5750cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5751  does not match, as X&lt;A&gt; is an explicit template specialization.
5752
5753Usable 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;
5754</pre></td></tr>
5755
5756<!--END_NARROWING_MATCHERS -->
5757</table>
5758
5759<!-- ======================================================================= -->
5760<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5761<!-- ======================================================================= -->
5762
5763<p>Traversal matchers specify the relationship to other nodes that are
5764reachable from the current node.</p>
5765
5766<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5767forEachDescendant) which work on all nodes and allow users to write more generic
5768match expressions.</p>
5769
5770<table>
5771<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5772<!-- START_TRAVERSAL_MATCHERS -->
5773
5774<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>
5775<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5776
5777The code
5778  var1 != var2;
5779might be represented in the clang AST as a binaryOperator, a
5780cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5781
5782* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5783  least one is a class type (cxxOperatorCallExpr)
5784* whether the code appears in a template declaration, if at least one of the
5785  vars is a dependent-type (binaryOperator)
5786* whether the code relies on a rewritten binary operator, such as a
5787spaceship operator or an inverted equality operator
5788(cxxRewrittenBinaryOperator)
5789
5790This matcher elides details in places where the matchers for the nodes are
5791compatible.
5792
5793Given
5794  binaryOperation(
5795    hasOperatorName("!="),
5796    hasLHS(expr().bind("lhs")),
5797    hasRHS(expr().bind("rhs"))
5798  )
5799matches each use of "!=" in:
5800  struct S{
5801      bool operator!=(const S&amp;) const;
5802  };
5803
5804  void foo()
5805  {
5806     1 != 2;
5807     S() != S();
5808  }
5809
5810  template&lt;typename T&gt;
5811  void templ()
5812  {
5813     1 != 2;
5814     T() != S();
5815  }
5816  struct HasOpEq
5817  {
5818      bool operator==(const HasOpEq &amp;) const;
5819  };
5820
5821  void inverse()
5822  {
5823      HasOpEq s1;
5824      HasOpEq s2;
5825      if (s1 != s2)
5826          return;
5827  }
5828
5829  struct HasSpaceship
5830  {
5831      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5832  };
5833
5834  void use_spaceship()
5835  {
5836      HasSpaceship s1;
5837      HasSpaceship s2;
5838      if (s1 != s2)
5839          return;
5840  }
5841</pre></td></tr>
5842
5843
5844<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>
5845<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5846
5847Unlike anyOf, eachOf will generate a match result for each
5848matching submatcher.
5849
5850For example, in:
5851  class A { int a; int b; };
5852The matcher:
5853  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5854                       has(fieldDecl(hasName("b")).bind("v"))))
5855will generate two results binding "v", the first of which binds
5856the field declaration of a, the second the field declaration of
5857b.
5858
5859Usable as: Any Matcher
5860</pre></td></tr>
5861
5862
5863<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>
5864<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5865
5866Generates results for each match.
5867
5868For example, in:
5869  class A { class B {}; class C {}; };
5870The matcher:
5871  cxxRecordDecl(hasName("::A"),
5872                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5873will generate results for A, B and C.
5874
5875Usable as: Any Matcher
5876</pre></td></tr>
5877
5878
5879<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5880<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5881provided matcher.
5882
5883Example matches X, A, A::X, B, B::C, B::C::X
5884  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5885  class X {};
5886  class A { class X {}; };  // Matches A, because A::X is a class of name
5887                            // X inside A.
5888  class B { class C { class X {}; }; };
5889
5890DescendantT must be an AST base type.
5891
5892As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5893each result that matches instead of only on the first one.
5894
5895Note: Recursively combined ForEachDescendant can cause many matches:
5896  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5897    forEachDescendant(cxxRecordDecl())
5898  )))
5899will match 10 times (plus injected class name matches) on:
5900  class A { class B { class C { class D { class E {}; }; }; }; };
5901
5902Usable as: Any Matcher
5903</pre></td></tr>
5904
5905
5906<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5907<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5908provided matcher.
5909
5910Example matches X, Y, Y::X, Z::Y, Z::Y::X
5911  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5912  class X {};
5913  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5914                            // inside Y.
5915  class Z { class Y { class X {}; }; };  // Does not match Z.
5916
5917ChildT must be an AST base type.
5918
5919As opposed to 'has', 'forEach' will cause a match for each result that
5920matches instead of only on the first one.
5921
5922Usable as: Any Matcher
5923</pre></td></tr>
5924
5925
5926<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5927<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5928matcher.
5929
5930Given
5931void f() { if (true) { int x = 42; } }
5932void g() { for (;;) { int x = 43; } }
5933expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5934
5935Usable as: Any Matcher
5936</pre></td></tr>
5937
5938
5939<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5940<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5941provided matcher.
5942
5943Example matches X, Y, Z
5944    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5945  class X {};  // Matches X, because X::X is a class of name X inside X.
5946  class Y { class X {}; };
5947  class Z { class Y { class X {}; }; };
5948
5949DescendantT must be an AST base type.
5950
5951Usable as: Any Matcher
5952</pre></td></tr>
5953
5954
5955<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5956<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5957provided matcher.
5958
5959Example matches X, Y
5960  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5961  class X {};  // Matches X, because X::X is a class of name X inside X.
5962  class Y { class X {}; };
5963  class Z { class Y { class X {}; }; };  // Does not match Z.
5964
5965ChildT must be an AST base type.
5966
5967Usable as: Any Matcher
5968Note that has is direct matcher, so it also matches things like implicit
5969casts and paren casts. If you are matching with expr then you should
5970probably consider using ignoringParenImpCasts like:
5971has(ignoringParenImpCasts(expr())).
5972</pre></td></tr>
5973
5974
5975<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5976<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5977matcher.
5978
5979Given
5980void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5981compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5982
5983Usable as: Any Matcher
5984</pre></td></tr>
5985
5986
5987<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>
5988<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5989
5990Because CallExpr and CXXConstructExpr do not share a common
5991base class with API accessing arguments etc, AST Matchers for code
5992which should match both are typically duplicated. This matcher
5993removes the need for duplication.
5994
5995Given code
5996struct ConstructorTakesInt
5997{
5998  ConstructorTakesInt(int i) {}
5999};
6000
6001void callTakesInt(int i)
6002{
6003}
6004
6005void doCall()
6006{
6007  callTakesInt(42);
6008}
6009
6010void doConstruct()
6011{
6012  ConstructorTakesInt cti(42);
6013}
6014
6015The matcher
6016invocation(hasArgument(0, integerLiteral(equals(42))))
6017matches the expression in both doCall and doConstruct
6018</pre></td></tr>
6019
6020
6021<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
6022<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
6023
6024However, optionally will retain any bindings generated by the submatcher.
6025Useful when additional information which may or may not present about a main
6026matching node is desired.
6027
6028For example, in:
6029  class Foo {
6030    int bar;
6031  }
6032The matcher:
6033  cxxRecordDecl(
6034    optionally(has(
6035      fieldDecl(hasName("bar")).bind("var")
6036  ))).bind("record")
6037will produce a result binding for both "record" and "var".
6038The matcher will produce a "record" binding for even if there is no data
6039member named "bar" in that class.
6040
6041Usable as: Any Matcher
6042</pre></td></tr>
6043
6044
6045<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>
6046<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
6047
6048Given
6049  void foo()
6050  {
6051      int i = 3.0;
6052  }
6053The matcher
6054  traverse(TK_IgnoreUnlessSpelledInSource,
6055    varDecl(hasInitializer(floatLiteral().bind("init")))
6056  )
6057matches the variable declaration with "init" bound to the "3.0".
6058</pre></td></tr>
6059
6060
6061<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>
6062<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
6063switch statement or conditional operator.
6064
6065Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6066  if (true) {}
6067</pre></td></tr>
6068
6069
6070<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>
6071<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
6072(binary or ternary).
6073
6074Example matches b
6075  condition ? a : b
6076  condition ?: b
6077</pre></td></tr>
6078
6079
6080<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>
6081<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
6082
6083Example 1 (conditional ternary operator): matches a
6084  condition ? a : b
6085
6086Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6087  condition ?: b
6088</pre></td></tr>
6089
6090
6091<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>
6092<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
6093matches the given matcher.
6094
6095The associated declaration is:
6096- for type nodes, the declaration of the underlying type
6097- for CallExpr, the declaration of the callee
6098- for MemberExpr, the declaration of the referenced member
6099- for CXXConstructExpr, the declaration of the constructor
6100- for CXXNewExpr, the declaration of the operator new
6101- for ObjCIvarExpr, the declaration of the ivar
6102
6103For type nodes, hasDeclaration will generally match the declaration of the
6104sugared type. Given
6105  class X {};
6106  typedef X Y;
6107  Y y;
6108in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6109typedefDecl. A common use case is to match the underlying, desugared type.
6110This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6111  varDecl(hasType(hasUnqualifiedDesugaredType(
6112      recordType(hasDeclaration(decl())))))
6113In this matcher, the decl will match the CXXRecordDecl of class X.
6114
6115Usable 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;,
6116  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;,
6117  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;,
6118  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;,
6119  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;,
6120  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;,
6121  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6122</pre></td></tr>
6123
6124
6125<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>
6126<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
6127
6128Given
6129  int i[5];
6130  void f() { i[1] = 42; }
6131arraySubscriptExpression(hasBase(implicitCastExpr(
6132    hasSourceExpression(declRefExpr()))))
6133  matches i[1] with the declRefExpr() matching i
6134</pre></td></tr>
6135
6136
6137<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>
6138<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
6139
6140Given
6141  int i[5];
6142  void f() { i[1] = 42; }
6143arraySubscriptExpression(hasIndex(integerLiteral()))
6144  matches i[1] with the integerLiteral() matching 1
6145</pre></td></tr>
6146
6147
6148<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>
6149<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
6150
6151Example matches a (matcher = binaryOperator(hasLHS()))
6152  a || b
6153</pre></td></tr>
6154
6155
6156<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>
6157<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
6158
6159Example matches b (matcher = binaryOperator(hasRHS()))
6160  a || b
6161</pre></td></tr>
6162
6163
6164<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>
6165<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
6166type.
6167
6168Given
6169  struct A {};
6170  A a[7];
6171  int b[7];
6172arrayType(hasElementType(builtinType()))
6173  matches "int b[7]"
6174
6175Usable 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;
6176</pre></td></tr>
6177
6178
6179<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>
6180<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6181
6182Given
6183  _Atomic(int) i;
6184  _Atomic(float) f;
6185atomicType(hasValueType(isInteger()))
6186 matches "_Atomic(int) i"
6187
6188Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6189</pre></td></tr>
6190
6191
6192<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>
6193<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6194
6195Note: There is no TypeLoc for the deduced type and thus no
6196getDeducedLoc() matcher.
6197
6198Given
6199  auto a = 1;
6200  auto b = 2.0;
6201autoType(hasDeducedType(isInteger()))
6202  matches "auto a"
6203
6204Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6205</pre></td></tr>
6206
6207
6208<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>
6209<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6210
6211Given
6212  namespace X { void b(); }
6213  using X::b;
6214usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6215  matches using X::b </pre></td></tr>
6216
6217
6218<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>
6219<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6220binary operator matches.
6221</pre></td></tr>
6222
6223
6224<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>
6225<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6226
6227Example matches a (matcher = binaryOperator(hasLHS()))
6228  a || b
6229</pre></td></tr>
6230
6231
6232<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>
6233<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6234
6235Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6236                                             integerLiteral(equals(2)))
6237  1 + 2 // Match
6238  2 + 1 // Match
6239  1 + 1 // No match
6240  2 + 2 // No match
6241</pre></td></tr>
6242
6243
6244<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>
6245<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6246
6247Example matches b (matcher = binaryOperator(hasRHS()))
6248  a || b
6249</pre></td></tr>
6250
6251
6252<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>
6253<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6254
6255For example, in:
6256void foo()
6257{
6258    int arr[3];
6259    auto &amp;[f, s, t] = arr;
6260
6261    f = 42;
6262}
6263The matcher:
6264  bindingDecl(hasName("f"),
6265                forDecomposition(decompositionDecl())
6266matches 'f' in 'auto &amp;[f, s, t]'.
6267</pre></td></tr>
6268
6269
6270<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>
6271<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6272block.
6273
6274Does not match the 'this' parameter of a method.
6275
6276Given
6277  class X { void f(int x, int y, int z) {} };
6278cxxMethodDecl(hasAnyParameter(hasName("y")))
6279  matches f(int x, int y, int z) {}
6280with hasAnyParameter(...)
6281  matching int y
6282
6283For ObjectiveC, given
6284  @interface I - (void) f:(int) y; @end
6285
6286the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6287matches the declaration of method f with hasParameter
6288matching y.
6289
6290For blocks, given
6291  b = ^(int y) { printf("%d", y) };
6292
6293the matcher blockDecl(hasAnyParameter(hasName("y")))
6294matches the declaration of the block b with hasParameter
6295matching y.
6296</pre></td></tr>
6297
6298
6299<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>
6300<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6301declaration or a block.
6302
6303Given
6304  class X { void f(int x) {} };
6305cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6306  matches f(int x) {}
6307with hasParameter(...)
6308  matching int x
6309
6310For ObjectiveC, given
6311  @interface I - (void) f:(int) y; @end
6312
6313the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6314matches the declaration of method f with hasParameter
6315matching y.
6316</pre></td></tr>
6317
6318
6319<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>
6320<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6321
6322Examples:
6323  int x;
6324declaratorDecl(hasTypeLoc(loc(asString("int"))))
6325  matches int x
6326
6327auto x = int(3);
6328cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6329  matches int(3)
6330
6331struct Foo { Foo(int, int); };
6332auto x = Foo(1, 2);
6333cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6334  matches Foo(1, 2)
6335
6336Usable 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;,
6337  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;,
6338  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;,
6339  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6340  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;,
6341  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;,
6342  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;,
6343  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6344</pre></td></tr>
6345
6346
6347<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>
6348<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6349pointee matches a given matcher.
6350
6351Given
6352  int *a;
6353  int const *b;
6354  float const *f;
6355pointerType(pointee(isConstQualified(), isInteger()))
6356  matches "int const *b"
6357
6358Usable 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;,
6359  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;
6360</pre></td></tr>
6361
6362
6363<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>
6364<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6365
6366Examples:
6367  int x;
6368declaratorDecl(hasTypeLoc(loc(asString("int"))))
6369  matches int x
6370
6371auto x = int(3);
6372cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6373  matches int(3)
6374
6375struct Foo { Foo(int, int); };
6376auto x = Foo(1, 2);
6377cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6378  matches Foo(1, 2)
6379
6380Usable 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;,
6381  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;,
6382  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;,
6383  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6384  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;,
6385  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;,
6386  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;,
6387  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6388</pre></td></tr>
6389
6390
6391<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>
6392<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6393declaration's type.
6394
6395In case of a value declaration (for example a variable declaration),
6396this resolves one layer of indirection. For example, in the value
6397declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6398X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6399declaration of x.
6400
6401Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6402            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6403            and friend class X (matcher = friendDecl(hasType("X"))
6404            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6405                                              cxxRecordDecl(hasName("X"))))
6406 class X {};
6407 void y(X &amp;x) { x; X z; }
6408 class Y { friend class X; };
6409 class Z : public virtual X {};
6410
6411Example matches class Derived
6412(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6413class Base {};
6414class Derived : Base {};
6415
6416Usable 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;,
6417Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6418</pre></td></tr>
6419
6420
6421<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>
6422<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6423matcher.
6424
6425Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6426            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6427            and U (matcher = typedefDecl(hasType(asString("int")))
6428            and friend class X (matcher = friendDecl(hasType("X"))
6429            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6430                                              asString("class X")))
6431 class X {};
6432 void y(X &amp;x) { x; X z; }
6433 typedef int U;
6434 class Y { friend class X; };
6435 class Z : public virtual X {};
6436</pre></td></tr>
6437
6438
6439<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>
6440<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6441
6442Given
6443  void f(int i);
6444  int y;
6445  f(y);
6446callExpr(
6447  forEachArgumentWithParam(
6448    declRefExpr(to(varDecl(hasName("y")))),
6449    parmVarDecl(hasType(isInteger()))
6450))
6451  matches f(y);
6452with declRefExpr(...)
6453  matching int y
6454and parmVarDecl(...)
6455  matching int i
6456</pre></td></tr>
6457
6458
6459<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>
6460<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6461CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6462it works on calls through function pointers as well.
6463
6464The difference is, that function pointers do not provide access to a
6465ParmVarDecl, but only the QualType for each argument.
6466
6467Given
6468  void f(int i);
6469  int y;
6470  f(y);
6471  void (*f_ptr)(int) = f;
6472  f_ptr(y);
6473callExpr(
6474  forEachArgumentWithParamType(
6475    declRefExpr(to(varDecl(hasName("y")))),
6476    qualType(isInteger()).bind("type)
6477))
6478  matches f(y) and f_ptr(y)
6479with declRefExpr(...)
6480  matching int y
6481and qualType(...)
6482  matching int
6483</pre></td></tr>
6484
6485
6486<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>
6487<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6488expression, or an ObjC-message-send expression.
6489
6490Given
6491  void x(int, int, int) { int y; x(1, y, 42); }
6492callExpr(hasAnyArgument(declRefExpr()))
6493  matches x(1, y, 42)
6494with hasAnyArgument(...)
6495  matching y
6496
6497For ObjectiveC, given
6498  @interface I - (void) f:(int) y; @end
6499  void foo(I *i) { [i f:12]; }
6500objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6501  matches [i f:12]
6502</pre></td></tr>
6503
6504
6505<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>
6506<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6507call expression.
6508
6509Example matches y in x(y)
6510    (matcher = callExpr(hasArgument(0, declRefExpr())))
6511  void x(int) { int y; x(y); }
6512</pre></td></tr>
6513
6514
6515<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>
6516<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6517matches the given matcher.
6518
6519The associated declaration is:
6520- for type nodes, the declaration of the underlying type
6521- for CallExpr, the declaration of the callee
6522- for MemberExpr, the declaration of the referenced member
6523- for CXXConstructExpr, the declaration of the constructor
6524- for CXXNewExpr, the declaration of the operator new
6525- for ObjCIvarExpr, the declaration of the ivar
6526
6527For type nodes, hasDeclaration will generally match the declaration of the
6528sugared type. Given
6529  class X {};
6530  typedef X Y;
6531  Y y;
6532in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6533typedefDecl. A common use case is to match the underlying, desugared type.
6534This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6535  varDecl(hasType(hasUnqualifiedDesugaredType(
6536      recordType(hasDeclaration(decl())))))
6537In this matcher, the decl will match the CXXRecordDecl of class X.
6538
6539Usable 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;,
6540  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;,
6541  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;,
6542  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;,
6543  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;,
6544  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;,
6545  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6546</pre></td></tr>
6547
6548
6549<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>
6550<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6551
6552Given
6553  class A { A() : i(42), j(42) {} int i; int j; };
6554cxxConstructorDecl(forEachConstructorInitializer(
6555  forField(decl().bind("x"))
6556))
6557  will trigger two matches, binding for 'i' and 'j' respectively.
6558</pre></td></tr>
6559
6560
6561<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>
6562<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6563
6564Given
6565  struct Foo {
6566    Foo() : foo_(1) { }
6567    int foo_;
6568  };
6569cxxRecordDecl(has(cxxConstructorDecl(
6570  hasAnyConstructorInitializer(anything())
6571)))
6572  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6573</pre></td></tr>
6574
6575
6576<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>
6577<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6578
6579Given
6580  struct Foo {
6581    Foo() : foo_(1) { }
6582    int foo_;
6583  };
6584cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6585    forField(hasName("foo_"))))))
6586  matches Foo
6587with forField matching foo_
6588</pre></td></tr>
6589
6590
6591<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>
6592<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6593
6594Examples:
6595  int x;
6596declaratorDecl(hasTypeLoc(loc(asString("int"))))
6597  matches int x
6598
6599auto x = int(3);
6600cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6601  matches int(3)
6602
6603struct Foo { Foo(int, int); };
6604auto x = Foo(1, 2);
6605cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6606  matches Foo(1, 2)
6607
6608Usable 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;,
6609  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;,
6610  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;,
6611  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6612  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;,
6613  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;,
6614  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;,
6615  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6616</pre></td></tr>
6617
6618
6619<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>
6620<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6621
6622Given
6623  struct Foo {
6624    Foo() : foo_(1) { }
6625    int foo_;
6626  };
6627cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6628    withInitializer(integerLiteral(equals(1)))))))
6629  matches Foo
6630with withInitializer matching (1)
6631</pre></td></tr>
6632
6633
6634<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>
6635<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6636given matcher. Implicit object expressions are included; that is, it matches
6637use of implicit `this`.
6638
6639Given
6640  struct X {
6641    int m;
6642    int f(X x) { x.m; return m; }
6643  };
6644memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6645  matches `x.m`, but not `m`; however,
6646memberExpr(hasObjectExpression(hasType(pointsTo(
6647     cxxRecordDecl(hasName("X"))))))
6648  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6649</pre></td></tr>
6650
6651
6652<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>
6653<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6654
6655
6656<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>
6657<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6658
6659Given:
6660 void foo() {
6661   if (int i = foobar(); i &gt; 0) {}
6662   switch (int i = foobar(); i) {}
6663   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6664 }
6665 void bar() {
6666   if (foobar() &gt; 0) {}
6667   switch (foobar()) {}
6668   for (auto&amp; x : get_range()) {}
6669 }
6670ifStmt(hasInitStatement(anything()))
6671  matches the if statement in foo but not in bar.
6672switchStmt(hasInitStatement(anything()))
6673  matches the switch statement in foo but not in bar.
6674cxxForRangeStmt(hasInitStatement(anything()))
6675  matches the range for statement in foo but not in bar.
6676</pre></td></tr>
6677
6678
6679<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>
6680<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6681
6682Example:
6683    forStmt(hasLoopVariable(anything()))
6684matches 'int x' in
6685    for (int x : a) { }
6686</pre></td></tr>
6687
6688
6689<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>
6690<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6691
6692Example:
6693    forStmt(hasRangeInit(anything()))
6694matches 'a' in
6695    for (int x : a) { }
6696</pre></td></tr>
6697
6698
6699<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>
6700<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6701
6702Examples:
6703  int x;
6704declaratorDecl(hasTypeLoc(loc(asString("int"))))
6705  matches int x
6706
6707auto x = int(3);
6708cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6709  matches int(3)
6710
6711struct Foo { Foo(int, int); };
6712auto x = Foo(1, 2);
6713cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6714  matches Foo(1, 2)
6715
6716Usable 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;,
6717  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;,
6718  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;,
6719  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6720  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;,
6721  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;,
6722  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;,
6723  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6724</pre></td></tr>
6725
6726
6727<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>
6728<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6729`on`, matches the argument directly without stripping away anything.
6730
6731Given
6732  class Y { public: void m(); };
6733  Y g();
6734  class X : public Y { void g(); };
6735  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6736cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6737    cxxRecordDecl(hasName("Y")))))
6738  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6739cxxMemberCallExpr(on(callExpr()))
6740  does not match `(g()).m()`, because the parens are not ignored.
6741
6742FIXME: Overload to allow directly matching types?
6743</pre></td></tr>
6744
6745
6746<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>
6747<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6748stripping off any parentheses or implicit casts.
6749
6750Given
6751  class Y { public: void m(); };
6752  Y g();
6753  class X : public Y {};
6754  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6755cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6756  matches `y.m()` and `(g()).m()`.
6757cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6758  matches `x.m()`.
6759cxxMemberCallExpr(on(callExpr()))
6760  matches `(g()).m()`.
6761
6762FIXME: Overload to allow directly matching types?
6763</pre></td></tr>
6764
6765
6766<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>
6767<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6768</pre></td></tr>
6769
6770
6771<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>
6772<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6773matches the InnerMatcher, or is a pointer to a type that matches the
6774InnerMatcher.
6775
6776Given
6777  class Y { public: void m(); };
6778  class X : public Y { void g(); };
6779  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6780cxxMemberCallExpr(thisPointerType(hasDeclaration(
6781    cxxRecordDecl(hasName("Y")))))
6782  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6783cxxMemberCallExpr(thisPointerType(hasDeclaration(
6784    cxxRecordDecl(hasName("X")))))
6785  matches `x.g()`.
6786</pre></td></tr>
6787
6788
6789<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>
6790<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6791produce multiple matches.
6792
6793Given
6794  class A { virtual void f(); };
6795  class B : public A { void f(); };
6796  class C : public B { void f(); };
6797cxxMethodDecl(ofClass(hasName("C")),
6798              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6799  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6800  that B::f is not overridden by C::f).
6801
6802The check can produce multiple matches in case of multiple inheritance, e.g.
6803  class A1 { virtual void f(); };
6804  class A2 { virtual void f(); };
6805  class C : public A1, public A2 { void f(); };
6806cxxMethodDecl(ofClass(hasName("C")),
6807              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6808  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6809  once with "b" binding "A2::f" and "d" binding "C::f".
6810</pre></td></tr>
6811
6812
6813<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>
6814<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6815belongs to.
6816
6817FIXME: Generalize this for other kinds of declarations.
6818FIXME: What other kind of declarations would we need to generalize
6819this to?
6820
6821Example matches A() in the last line
6822    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6823        ofClass(hasName("A"))))))
6824  class A {
6825   public:
6826    A();
6827  };
6828  A a = A();
6829</pre></td></tr>
6830
6831
6832<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>
6833<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6834
6835Given:
6836  MyClass *p1 = new (Storage) MyClass();
6837cxxNewExpr(hasAnyPlacementArg(anything()))
6838  matches the expression 'new (Storage, 16) MyClass()'.
6839</pre></td></tr>
6840
6841
6842<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>
6843<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6844
6845Given:
6846  MyClass *p1 = new MyClass[10];
6847cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6848  matches the expression 'new MyClass[10]'.
6849</pre></td></tr>
6850
6851
6852<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>
6853<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6854matches the given matcher.
6855
6856The associated declaration is:
6857- for type nodes, the declaration of the underlying type
6858- for CallExpr, the declaration of the callee
6859- for MemberExpr, the declaration of the referenced member
6860- for CXXConstructExpr, the declaration of the constructor
6861- for CXXNewExpr, the declaration of the operator new
6862- for ObjCIvarExpr, the declaration of the ivar
6863
6864For type nodes, hasDeclaration will generally match the declaration of the
6865sugared type. Given
6866  class X {};
6867  typedef X Y;
6868  Y y;
6869in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6870typedefDecl. A common use case is to match the underlying, desugared type.
6871This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6872  varDecl(hasType(hasUnqualifiedDesugaredType(
6873      recordType(hasDeclaration(decl())))))
6874In this matcher, the decl will match the CXXRecordDecl of class X.
6875
6876Usable 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;,
6877  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;,
6878  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;,
6879  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;,
6880  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;,
6881  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;,
6882  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6883</pre></td></tr>
6884
6885
6886<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>
6887<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6888
6889Given:
6890  MyClass *p1 = new (Storage, 16) MyClass();
6891cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6892  matches the expression 'new (Storage, 16) MyClass()'.
6893</pre></td></tr>
6894
6895
6896<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>
6897<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6898
6899Examples:
6900  int x;
6901declaratorDecl(hasTypeLoc(loc(asString("int"))))
6902  matches int x
6903
6904auto x = int(3);
6905cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6906  matches int(3)
6907
6908struct Foo { Foo(int, int); };
6909auto x = Foo(1, 2);
6910cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6911  matches Foo(1, 2)
6912
6913Usable 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;,
6914  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;,
6915  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;,
6916  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6917  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;,
6918  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;,
6919  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;,
6920  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6921</pre></td></tr>
6922
6923
6924<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>
6925<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6926binary operator matches.
6927</pre></td></tr>
6928
6929
6930<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>
6931<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6932
6933Example matches a (matcher = binaryOperator(hasLHS()))
6934  a || b
6935</pre></td></tr>
6936
6937
6938<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>
6939<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6940
6941Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6942                                             integerLiteral(equals(2)))
6943  1 + 2 // Match
6944  2 + 1 // Match
6945  1 + 1 // No match
6946  2 + 2 // No match
6947</pre></td></tr>
6948
6949
6950<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>
6951<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6952
6953Example matches b (matcher = binaryOperator(hasRHS()))
6954  a || b
6955</pre></td></tr>
6956
6957
6958<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>
6959<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6960
6961Example matches true (matcher = hasUnaryOperand(
6962                                  cxxBoolLiteral(equals(true))))
6963  !true
6964</pre></td></tr>
6965
6966
6967<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>
6968<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6969
6970Example:
6971matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6972  class Foo;
6973  class Bar : Foo {};
6974  class Baz : Bar {};
6975  class SpecialBase;
6976  class Proxy : SpecialBase {};  // matches Proxy
6977  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6978
6979FIXME: Refactor this and isDerivedFrom to reuse implementation.
6980</pre></td></tr>
6981
6982
6983<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>
6984<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6985
6986Example:
6987matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6988  class Foo;
6989  class Bar : Foo {};
6990  class Baz : Bar {};
6991  class SpecialBase;
6992  class Proxy : SpecialBase {};  // matches Proxy
6993  class IndirectlyDerived : Proxy {};  // doesn't match
6994</pre></td></tr>
6995
6996
6997<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>
6998<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6999
7000Given:
7001  class A { void func(); };
7002  class B { void member(); };
7003
7004cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
7005A but not B.
7006</pre></td></tr>
7007
7008
7009<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>
7010<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
7011matching Base, or Objective-C classes that directly or indirectly
7012subclass a class matching Base.
7013
7014Note that a class is not considered to be derived from itself.
7015
7016Example matches Y, Z, C (Base == hasName("X"))
7017  class X;
7018  class Y : public X {};  // directly derived
7019  class Z : public Y {};  // indirectly derived
7020  typedef X A;
7021  typedef A B;
7022  class C : public B {};  // derived from a typedef of X
7023
7024In the following example, Bar matches isDerivedFrom(hasName("X")):
7025  class Foo;
7026  typedef Foo X;
7027  class Bar : public Foo {};  // derived from a type that X is a typedef of
7028
7029In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7030  @interface NSObject @end
7031  @interface Bar : NSObject @end
7032
7033Usable 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;
7034</pre></td></tr>
7035
7036
7037<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>
7038<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7039matching Base.
7040
7041Note that a class is not considered to be derived from itself.
7042
7043Example matches Y, C (Base == hasName("X"))
7044  class X;
7045  class Y : public X {};  // directly derived
7046  class Z : public Y {};  // indirectly derived
7047  typedef X A;
7048  typedef A B;
7049  class C : public B {};  // derived from a typedef of X
7050
7051In the following example, Bar matches isDerivedFrom(hasName("X")):
7052  class Foo;
7053  typedef Foo X;
7054  class Bar : public Foo {};  // derived from a type that X is a typedef of
7055</pre></td></tr>
7056
7057
7058<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>
7059<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7060match Base.
7061</pre></td></tr>
7062
7063
7064<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>
7065<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
7066binary operator matches.
7067</pre></td></tr>
7068
7069
7070<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>
7071<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
7072
7073Example matches a (matcher = binaryOperator(hasLHS()))
7074  a || b
7075</pre></td></tr>
7076
7077
7078<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>
7079<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
7080
7081Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
7082                                             integerLiteral(equals(2)))
7083  1 + 2 // Match
7084  2 + 1 // Match
7085  1 + 1 // No match
7086  2 + 2 // No match
7087</pre></td></tr>
7088
7089
7090<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>
7091<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7092
7093Example matches b (matcher = binaryOperator(hasRHS()))
7094  a || b
7095</pre></td></tr>
7096
7097
7098<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>
7099<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7100
7101Examples:
7102  int x;
7103declaratorDecl(hasTypeLoc(loc(asString("int"))))
7104  matches int x
7105
7106auto x = int(3);
7107cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7108  matches int(3)
7109
7110struct Foo { Foo(int, int); };
7111auto x = Foo(1, 2);
7112cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7113  matches Foo(1, 2)
7114
7115Usable 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;,
7116  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;,
7117  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;,
7118  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7119  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;,
7120  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;,
7121  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;,
7122  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7123</pre></td></tr>
7124
7125
7126<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>
7127<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7128expression, or an ObjC-message-send expression.
7129
7130Given
7131  void x(int, int, int) { int y; x(1, y, 42); }
7132callExpr(hasAnyArgument(declRefExpr()))
7133  matches x(1, y, 42)
7134with hasAnyArgument(...)
7135  matching y
7136
7137For ObjectiveC, given
7138  @interface I - (void) f:(int) y; @end
7139  void foo(I *i) { [i f:12]; }
7140objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7141  matches [i f:12]
7142</pre></td></tr>
7143
7144
7145<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>
7146<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7147call expression.
7148
7149Example matches y in x(y)
7150    (matcher = callExpr(hasArgument(0, declRefExpr())))
7151  void x(int) { int y; x(y); }
7152</pre></td></tr>
7153
7154
7155<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>
7156<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7157
7158Examples:
7159  int x;
7160declaratorDecl(hasTypeLoc(loc(asString("int"))))
7161  matches int x
7162
7163auto x = int(3);
7164cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7165  matches int(3)
7166
7167struct Foo { Foo(int, int); };
7168auto x = Foo(1, 2);
7169cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7170  matches Foo(1, 2)
7171
7172Usable 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;,
7173  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;,
7174  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;,
7175  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7176  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;,
7177  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;,
7178  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;,
7179  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7180</pre></td></tr>
7181
7182
7183<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>
7184<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7185given matcher.
7186
7187Example matches y.x() (matcher = callExpr(callee(
7188                                   cxxMethodDecl(hasName("x")))))
7189  class Y { public: void x(); };
7190  void z() { Y y; y.x(); }
7191</pre></td></tr>
7192
7193
7194<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>
7195<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7196
7197Given
7198  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
7199  void f() { f(); }
7200callExpr(callee(expr()))
7201  matches this-&gt;x(), x(), y.x(), f()
7202with callee(...)
7203  matching this-&gt;x, x, y.x, f respectively
7204
7205Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7206because this introduces ambiguous overloads with calls to Callee taking a
7207internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7208implemented in terms of implicit casts.
7209</pre></td></tr>
7210
7211
7212<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>
7213<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7214
7215Given
7216  void f(int i);
7217  int y;
7218  f(y);
7219callExpr(
7220  forEachArgumentWithParam(
7221    declRefExpr(to(varDecl(hasName("y")))),
7222    parmVarDecl(hasType(isInteger()))
7223))
7224  matches f(y);
7225with declRefExpr(...)
7226  matching int y
7227and parmVarDecl(...)
7228  matching int i
7229</pre></td></tr>
7230
7231
7232<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>
7233<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7234CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7235it works on calls through function pointers as well.
7236
7237The difference is, that function pointers do not provide access to a
7238ParmVarDecl, but only the QualType for each argument.
7239
7240Given
7241  void f(int i);
7242  int y;
7243  f(y);
7244  void (*f_ptr)(int) = f;
7245  f_ptr(y);
7246callExpr(
7247  forEachArgumentWithParamType(
7248    declRefExpr(to(varDecl(hasName("y")))),
7249    qualType(isInteger()).bind("type)
7250))
7251  matches f(y) and f_ptr(y)
7252with declRefExpr(...)
7253  matching int y
7254and qualType(...)
7255  matching int
7256</pre></td></tr>
7257
7258
7259<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>
7260<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7261expression, or an ObjC-message-send expression.
7262
7263Given
7264  void x(int, int, int) { int y; x(1, y, 42); }
7265callExpr(hasAnyArgument(declRefExpr()))
7266  matches x(1, y, 42)
7267with hasAnyArgument(...)
7268  matching y
7269
7270For ObjectiveC, given
7271  @interface I - (void) f:(int) y; @end
7272  void foo(I *i) { [i f:12]; }
7273objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7274  matches [i f:12]
7275</pre></td></tr>
7276
7277
7278<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>
7279<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7280call expression.
7281
7282Example matches y in x(y)
7283    (matcher = callExpr(hasArgument(0, declRefExpr())))
7284  void x(int) { int y; x(y); }
7285</pre></td></tr>
7286
7287
7288<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>
7289<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7290matches the given matcher.
7291
7292The associated declaration is:
7293- for type nodes, the declaration of the underlying type
7294- for CallExpr, the declaration of the callee
7295- for MemberExpr, the declaration of the referenced member
7296- for CXXConstructExpr, the declaration of the constructor
7297- for CXXNewExpr, the declaration of the operator new
7298- for ObjCIvarExpr, the declaration of the ivar
7299
7300For type nodes, hasDeclaration will generally match the declaration of the
7301sugared type. Given
7302  class X {};
7303  typedef X Y;
7304  Y y;
7305in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7306typedefDecl. A common use case is to match the underlying, desugared type.
7307This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7308  varDecl(hasType(hasUnqualifiedDesugaredType(
7309      recordType(hasDeclaration(decl())))))
7310In this matcher, the decl will match the CXXRecordDecl of class X.
7311
7312Usable 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;,
7313  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;,
7314  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;,
7315  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;,
7316  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;,
7317  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;,
7318  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7319</pre></td></tr>
7320
7321
7322<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>
7323<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7324extension, matches the constant given in the statement.
7325
7326Given
7327  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7328caseStmt(hasCaseConstant(integerLiteral()))
7329  matches "case 1:"
7330</pre></td></tr>
7331
7332
7333<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>
7334<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7335or opaque value's source expression matches the given matcher.
7336
7337Example 1: matches "a string"
7338(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7339class URL { URL(string); };
7340URL url = "a string";
7341
7342Example 2: matches 'b' (matcher =
7343opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7344int a = b ?: 1;
7345</pre></td></tr>
7346
7347
7348<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>
7349<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7350functionDecl that have at least one TemplateArgument matching the given
7351InnerMatcher.
7352
7353Given
7354  template&lt;typename T&gt; class A {};
7355  template&lt;&gt; class A&lt;double&gt; {};
7356  A&lt;int&gt; a;
7357
7358  template&lt;typename T&gt; f() {};
7359  void func() { f&lt;int&gt;(); };
7360
7361classTemplateSpecializationDecl(hasAnyTemplateArgument(
7362    refersToType(asString("int"))))
7363  matches the specialization A&lt;int&gt;
7364
7365functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7366  matches the specialization f&lt;int&gt;
7367</pre></td></tr>
7368
7369
7370<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>
7371<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7372
7373Given
7374  template&lt;typename T&gt; class A {}; #1
7375  template&lt;&gt; class A&lt;int&gt; {}; #2
7376classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7377  matches '#2' with classTemplateDecl() matching the class template
7378  declaration of 'A' at #1.
7379</pre></td></tr>
7380
7381
7382<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>
7383<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7384functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7385
7386Given
7387  template&lt;typename T, typename U&gt; class A {};
7388  A&lt;bool, int&gt; b;
7389  A&lt;int, bool&gt; c;
7390
7391  template&lt;typename T&gt; void f() {}
7392  void func() { f&lt;int&gt;(); };
7393classTemplateSpecializationDecl(hasTemplateArgument(
7394    1, refersToType(asString("int"))))
7395  matches the specialization A&lt;bool, int&gt;
7396
7397functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7398  matches the specialization f&lt;int&gt;
7399</pre></td></tr>
7400
7401
7402<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>
7403<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7404
7405Examples:
7406  int x;
7407declaratorDecl(hasTypeLoc(loc(asString("int"))))
7408  matches int x
7409
7410auto x = int(3);
7411cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7412  matches int(3)
7413
7414struct Foo { Foo(int, int); };
7415auto x = Foo(1, 2);
7416cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7417  matches Foo(1, 2)
7418
7419Usable 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;,
7420  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;,
7421  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;,
7422  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7423  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;,
7424  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;,
7425  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;,
7426  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7427</pre></td></tr>
7428
7429
7430<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>
7431<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7432type.
7433
7434Given
7435  struct A {};
7436  A a[7];
7437  int b[7];
7438arrayType(hasElementType(builtinType()))
7439  matches "int b[7]"
7440
7441Usable 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;
7442</pre></td></tr>
7443
7444
7445<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>
7446<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7447
7448Examples:
7449  int x;
7450declaratorDecl(hasTypeLoc(loc(asString("int"))))
7451  matches int x
7452
7453auto x = int(3);
7454cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7455  matches int(3)
7456
7457struct Foo { Foo(int, int); };
7458auto x = Foo(1, 2);
7459cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7460  matches Foo(1, 2)
7461
7462Usable 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;,
7463  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;,
7464  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;,
7465  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7466  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;,
7467  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;,
7468  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;,
7469  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7470</pre></td></tr>
7471
7472
7473<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>
7474<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7475a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7476
7477Given
7478  { {}; 1+2; }
7479hasAnySubstatement(compoundStmt())
7480  matches '{ {}; 1+2; }'
7481with compoundStmt()
7482  matching '{}'
7483</pre></td></tr>
7484
7485
7486<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>
7487<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7488</pre></td></tr>
7489
7490
7491<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>
7492<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7493matches the given matcher.
7494
7495The associated declaration is:
7496- for type nodes, the declaration of the underlying type
7497- for CallExpr, the declaration of the callee
7498- for MemberExpr, the declaration of the referenced member
7499- for CXXConstructExpr, the declaration of the constructor
7500- for CXXNewExpr, the declaration of the operator new
7501- for ObjCIvarExpr, the declaration of the ivar
7502
7503For type nodes, hasDeclaration will generally match the declaration of the
7504sugared type. Given
7505  class X {};
7506  typedef X Y;
7507  Y y;
7508in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7509typedefDecl. A common use case is to match the underlying, desugared type.
7510This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7511  varDecl(hasType(hasUnqualifiedDesugaredType(
7512      recordType(hasDeclaration(decl())))))
7513In this matcher, the decl will match the CXXRecordDecl of class X.
7514
7515Usable 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;,
7516  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;,
7517  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;,
7518  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;,
7519  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;,
7520  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;,
7521  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7522</pre></td></tr>
7523
7524
7525<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>
7526<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th
7527`TemplateArgumentLoc` matches the given `InnerMatcher`.
7528
7529Given
7530  template&lt;typename T, typename U&gt; class A {};
7531  A&lt;double, int&gt; b;
7532  A&lt;int, double&gt; c;
7533varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
7534  hasTypeLoc(loc(asString("double")))))))
7535  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
7536</pre></td></tr>
7537
7538
7539<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>
7540<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7541specific using shadow declaration.
7542
7543Given
7544  namespace a { void f() {} }
7545  using a::f;
7546  void g() {
7547    f();     // Matches this ..
7548    a::f();  // .. but not this.
7549  }
7550declRefExpr(throughUsingDecl(anything()))
7551  matches f()
7552</pre></td></tr>
7553
7554
7555<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>
7556<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7557specified matcher.
7558
7559Example matches x in if(x)
7560    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7561  bool x;
7562  if (x) {}
7563</pre></td></tr>
7564
7565
7566<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>
7567<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7568
7569Note that this does not work for global declarations because the AST
7570breaks up multiple-declaration DeclStmt's into multiple single-declaration
7571DeclStmt's.
7572Example: Given non-global declarations
7573  int a, b = 0;
7574  int c;
7575  int d = 2, e;
7576declStmt(containsDeclaration(
7577      0, varDecl(hasInitializer(anything()))))
7578  matches only 'int d = 2, e;', and
7579declStmt(containsDeclaration(1, varDecl()))
7580  matches 'int a, b = 0' as well as 'int d = 2, e;'
7581  but 'int c;' is not matched.
7582</pre></td></tr>
7583
7584
7585<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>
7586<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7587
7588Given
7589  int a, b;
7590  int c;
7591declStmt(hasSingleDecl(anything()))
7592  matches 'int c;' but not 'int a, b;'.
7593</pre></td></tr>
7594
7595
7596<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>
7597<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7598
7599Examples:
7600  int x;
7601declaratorDecl(hasTypeLoc(loc(asString("int"))))
7602  matches int x
7603
7604auto x = int(3);
7605cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7606  matches int(3)
7607
7608struct Foo { Foo(int, int); };
7609auto x = Foo(1, 2);
7610cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7611  matches Foo(1, 2)
7612
7613Usable 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;,
7614  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;,
7615  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;,
7616  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7617  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;,
7618  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;,
7619  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;,
7620  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7621</pre></td></tr>
7622
7623
7624<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>
7625<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7626Decl, matches InnerMatcher.
7627
7628Given
7629  namespace N {
7630    namespace M {
7631      class D {};
7632    }
7633  }
7634
7635cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7636declaration of class D.
7637</pre></td></tr>
7638
7639
7640<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>
7641<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7642
7643Given
7644  decltype(1) a = 1;
7645  decltype(2.0) b = 2.0;
7646decltypeType(hasUnderlyingType(isInteger()))
7647  matches the type of "a"
7648
7649Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7650</pre></td></tr>
7651
7652
7653<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>
7654<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7655
7656For example, in:
7657void foo()
7658{
7659    int arr[3];
7660    auto &amp;[f, s, t] = arr;
7661
7662    f = 42;
7663}
7664The matcher:
7665  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7666matches the decomposition decl with 'f' bound to "fBinding".
7667</pre></td></tr>
7668
7669
7670<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>
7671<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7672
7673For example, in:
7674void foo()
7675{
7676    int arr[3];
7677    auto &amp;[f, s, t] = arr;
7678
7679    f = 42;
7680}
7681The matcher:
7682  decompositionDecl(hasBinding(0,
7683  bindingDecl(hasName("f").bind("fBinding"))))
7684matches the decomposition decl with 'f' bound to "fBinding".
7685</pre></td></tr>
7686
7687
7688<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>
7689<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7690
7691
7692<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>
7693<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7694switch statement or conditional operator.
7695
7696Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7697  if (true) {}
7698</pre></td></tr>
7699
7700
7701<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>
7702<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
7703`InnerMatcher`.
7704
7705Given
7706  template &lt;typename T&gt;
7707  class C {};
7708  class C&lt;int&gt; c;
7709
7710  class D {};
7711  class D d;
7712elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
7713  matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
7714</pre></td></tr>
7715
7716
7717<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>
7718<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7719matches InnerMatcher if the qualifier exists.
7720
7721Given
7722  namespace N {
7723    namespace M {
7724      class D {};
7725    }
7726  }
7727  N::M::D d;
7728
7729elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7730matches the type of the variable declaration of d.
7731</pre></td></tr>
7732
7733
7734<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>
7735<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7736
7737Given
7738  namespace N {
7739    namespace M {
7740      class D {};
7741    }
7742  }
7743  N::M::D d;
7744
7745elaboratedType(namesType(recordType(
7746hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7747declaration of d.
7748</pre></td></tr>
7749
7750
7751<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>
7752<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7753matches the given matcher.
7754
7755The associated declaration is:
7756- for type nodes, the declaration of the underlying type
7757- for CallExpr, the declaration of the callee
7758- for MemberExpr, the declaration of the referenced member
7759- for CXXConstructExpr, the declaration of the constructor
7760- for CXXNewExpr, the declaration of the operator new
7761- for ObjCIvarExpr, the declaration of the ivar
7762
7763For type nodes, hasDeclaration will generally match the declaration of the
7764sugared type. Given
7765  class X {};
7766  typedef X Y;
7767  Y y;
7768in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7769typedefDecl. A common use case is to match the underlying, desugared type.
7770This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7771  varDecl(hasType(hasUnqualifiedDesugaredType(
7772      recordType(hasDeclaration(decl())))))
7773In this matcher, the decl will match the CXXRecordDecl of class X.
7774
7775Usable 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;,
7776  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;,
7777  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;,
7778  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;,
7779  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;,
7780  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;,
7781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7782</pre></td></tr>
7783
7784
7785<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>
7786<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7787
7788(Note: Clang's AST refers to other conversions as "casts" too, and calls
7789actual casts "explicit" casts.)
7790</pre></td></tr>
7791
7792
7793<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>
7794<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7795
7796Examples:
7797  int x;
7798declaratorDecl(hasTypeLoc(loc(asString("int"))))
7799  matches int x
7800
7801auto x = int(3);
7802cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7803  matches int(3)
7804
7805struct Foo { Foo(int, int); };
7806auto x = Foo(1, 2);
7807cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7808  matches Foo(1, 2)
7809
7810Usable 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;,
7811  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;,
7812  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;,
7813  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7814  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;,
7815  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;,
7816  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;,
7817  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7818</pre></td></tr>
7819
7820
7821<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>
7822<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7823declaration's type.
7824
7825In case of a value declaration (for example a variable declaration),
7826this resolves one layer of indirection. For example, in the value
7827declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7828X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7829declaration of x.
7830
7831Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7832            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7833            and friend class X (matcher = friendDecl(hasType("X"))
7834            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7835                                              cxxRecordDecl(hasName("X"))))
7836 class X {};
7837 void y(X &amp;x) { x; X z; }
7838 class Y { friend class X; };
7839 class Z : public virtual X {};
7840
7841Example matches class Derived
7842(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7843class Base {};
7844class Derived : Base {};
7845
7846Usable 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;,
7847Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7848</pre></td></tr>
7849
7850
7851<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>
7852<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7853matcher.
7854
7855Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7856            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7857            and U (matcher = typedefDecl(hasType(asString("int")))
7858            and friend class X (matcher = friendDecl(hasType("X"))
7859            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7860                                              asString("class X")))
7861 class X {};
7862 void y(X &amp;x) { x; X z; }
7863 typedef int U;
7864 class Y { friend class X; };
7865 class Z : public virtual X {};
7866</pre></td></tr>
7867
7868
7869<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>
7870<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7871elidable constructor and other corresponding bookkeeping nodes.
7872
7873In C++17, elidable copy constructors are no longer being generated in the
7874AST as it is not permitted by the standard. They are, however, part of the
7875AST in C++14 and earlier. So, a matcher must abstract over these differences
7876to work in all language modes. This matcher skips elidable constructor-call
7877AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7878various implicit nodes inside the constructor calls, all of which will not
7879appear in the C++17 AST.
7880
7881Given
7882
7883struct H {};
7884H G();
7885void f() {
7886  H D = G();
7887}
7888
7889``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7890matches ``H D = G()`` in C++11 through C++17 (and beyond).
7891</pre></td></tr>
7892
7893
7894<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>
7895<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7896are stripped off.
7897
7898Parentheses and explicit casts are not discarded.
7899Given
7900  int arr[5];
7901  int a = 0;
7902  char b = 0;
7903  const int c = a;
7904  int *d = arr;
7905  long e = (long) 0l;
7906The matchers
7907   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7908   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7909would match the declarations for a, b, c, and d, but not e.
7910While
7911   varDecl(hasInitializer(integerLiteral()))
7912   varDecl(hasInitializer(declRefExpr()))
7913only match the declarations for a.
7914</pre></td></tr>
7915
7916
7917<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>
7918<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7919nodes are stripped off.
7920
7921Parentheses and explicit casts are not discarded.
7922Given
7923  class C {};
7924  C a = C();
7925  C b;
7926  C c = b;
7927The matchers
7928   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7929would match the declarations for a, b, and c.
7930While
7931   varDecl(hasInitializer(cxxConstructExpr()))
7932only match the declarations for b and c.
7933</pre></td></tr>
7934
7935
7936<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>
7937<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7938casts are stripped off.
7939
7940Implicit and non-C Style casts are also discarded.
7941Given
7942  int a = 0;
7943  char b = (0);
7944  void* c = reinterpret_cast&lt;char*&gt;(0);
7945  char d = char(0);
7946The matcher
7947   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7948would match the declarations for a, b, c, and d.
7949while
7950   varDecl(hasInitializer(integerLiteral()))
7951only match the declaration for a.
7952</pre></td></tr>
7953
7954
7955<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>
7956<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7957parentheses are stripped off.
7958
7959Explicit casts are not discarded.
7960Given
7961  int arr[5];
7962  int a = 0;
7963  char b = (0);
7964  const int c = a;
7965  int *d = (arr);
7966  long e = ((long) 0l);
7967The matchers
7968   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7969   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7970would match the declarations for a, b, c, and d, but not e.
7971while
7972   varDecl(hasInitializer(integerLiteral()))
7973   varDecl(hasInitializer(declRefExpr()))
7974would only match the declaration for a.
7975</pre></td></tr>
7976
7977
7978<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>
7979<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7980
7981Given
7982  const char* str = ("my-string");
7983The matcher
7984  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7985would match the implicit cast resulting from the assignment.
7986</pre></td></tr>
7987
7988
7989<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>
7990<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7991
7992Given
7993  class C {
7994    int a = 2;
7995    int b = 3;
7996    int c;
7997  };
7998fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7999  matches 'int a;' but not 'int b;'.
8000fieldDecl(hasInClassInitializer(anything()))
8001  matches 'int a;' and 'int b;' but not 'int c;'.
8002</pre></td></tr>
8003
8004
8005<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>
8006<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
8007
8008
8009<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>
8010<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
8011switch statement or conditional operator.
8012
8013Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8014  if (true) {}
8015</pre></td></tr>
8016
8017
8018<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>
8019<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
8020
8021Example:
8022    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
8023matches '++x' in
8024    for (x; x &lt; N; ++x) { }
8025</pre></td></tr>
8026
8027
8028<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>
8029<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
8030
8031Example:
8032    forStmt(hasLoopInit(declStmt()))
8033matches 'int x = 0' in
8034    for (int x = 0; x &lt; N; ++x) { }
8035</pre></td></tr>
8036
8037
8038<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>
8039<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
8040declaration's type.
8041
8042In case of a value declaration (for example a variable declaration),
8043this resolves one layer of indirection. For example, in the value
8044declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8045X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8046declaration of x.
8047
8048Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8049            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8050            and friend class X (matcher = friendDecl(hasType("X"))
8051            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8052                                              cxxRecordDecl(hasName("X"))))
8053 class X {};
8054 void y(X &amp;x) { x; X z; }
8055 class Y { friend class X; };
8056 class Z : public virtual X {};
8057
8058Example matches class Derived
8059(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8060class Base {};
8061class Derived : Base {};
8062
8063Usable 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;,
8064Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8065</pre></td></tr>
8066
8067
8068<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>
8069<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
8070matcher.
8071
8072Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8073            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8074            and U (matcher = typedefDecl(hasType(asString("int")))
8075            and friend class X (matcher = friendDecl(hasType("X"))
8076            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8077                                              asString("class X")))
8078 class X {};
8079 void y(X &amp;x) { x; X z; }
8080 typedef int U;
8081 class Y { friend class X; };
8082 class Z : public virtual X {};
8083</pre></td></tr>
8084
8085
8086<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>
8087<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
8088Note that this matcher matches all the declarations of a function whose
8089body is present in the AST.
8090
8091Given
8092  void f();
8093  void f() {}
8094  void g();
8095functionDecl(hasAnyBody(compoundStmt()))
8096  matches both 'void f();'
8097  and 'void f() {}'
8098with compoundStmt()
8099  matching '{}'
8100  but does not match 'void g();'
8101</pre></td></tr>
8102
8103
8104<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>
8105<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
8106block.
8107
8108Does not match the 'this' parameter of a method.
8109
8110Given
8111  class X { void f(int x, int y, int z) {} };
8112cxxMethodDecl(hasAnyParameter(hasName("y")))
8113  matches f(int x, int y, int z) {}
8114with hasAnyParameter(...)
8115  matching int y
8116
8117For ObjectiveC, given
8118  @interface I - (void) f:(int) y; @end
8119
8120the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8121matches the declaration of method f with hasParameter
8122matching y.
8123
8124For blocks, given
8125  b = ^(int y) { printf("%d", y) };
8126
8127the matcher blockDecl(hasAnyParameter(hasName("y")))
8128matches the declaration of the block b with hasParameter
8129matching y.
8130</pre></td></tr>
8131
8132
8133<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>
8134<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8135functionDecl that have at least one TemplateArgument matching the given
8136InnerMatcher.
8137
8138Given
8139  template&lt;typename T&gt; class A {};
8140  template&lt;&gt; class A&lt;double&gt; {};
8141  A&lt;int&gt; a;
8142
8143  template&lt;typename T&gt; f() {};
8144  void func() { f&lt;int&gt;(); };
8145
8146classTemplateSpecializationDecl(hasAnyTemplateArgument(
8147    refersToType(asString("int"))))
8148  matches the specialization A&lt;int&gt;
8149
8150functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8151  matches the specialization f&lt;int&gt;
8152</pre></td></tr>
8153
8154
8155<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>
8156<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
8157
8158
8159<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>
8160<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
8161declaration.
8162
8163Given
8164  template&lt;bool b&gt;
8165  struct S {
8166    S(int); // #1
8167    explicit S(double); // #2
8168    operator int(); // #3
8169    explicit operator bool(); // #4
8170    explicit(false) S(bool) // # 7
8171    explicit(true) S(char) // # 8
8172    explicit(b) S(S) // # 9
8173  };
8174  S(int) -&gt; S&lt;true&gt; // #5
8175  explicit S(double) -&gt; S&lt;false&gt; // #6
8176cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8177cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8178cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8179</pre></td></tr>
8180
8181
8182<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>
8183<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
8184declaration or a block.
8185
8186Given
8187  class X { void f(int x) {} };
8188cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8189  matches f(int x) {}
8190with hasParameter(...)
8191  matching int x
8192
8193For ObjectiveC, given
8194  @interface I - (void) f:(int) y; @end
8195
8196the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8197matches the declaration of method f with hasParameter
8198matching y.
8199</pre></td></tr>
8200
8201
8202<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>
8203<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`.
8204
8205Given
8206  int f() { return 5; }
8207  void g() {}
8208functionDecl(hasReturnTypeLoc(loc(asString("int"))))
8209  matches the declaration of `f`, but not `g`.
8210</pre></td></tr>
8211
8212
8213<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>
8214<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8215functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8216
8217Given
8218  template&lt;typename T, typename U&gt; class A {};
8219  A&lt;bool, int&gt; b;
8220  A&lt;int, bool&gt; c;
8221
8222  template&lt;typename T&gt; void f() {}
8223  void func() { f&lt;int&gt;(); };
8224classTemplateSpecializationDecl(hasTemplateArgument(
8225    1, refersToType(asString("int"))))
8226  matches the specialization A&lt;bool, int&gt;
8227
8228functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8229  matches the specialization f&lt;int&gt;
8230</pre></td></tr>
8231
8232
8233<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>
8234<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8235
8236Given:
8237  class X { int f() { return 1; } };
8238cxxMethodDecl(returns(asString("int")))
8239  matches int f() { return 1; }
8240</pre></td></tr>
8241
8242
8243<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>
8244<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8245switch statement or conditional operator.
8246
8247Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8248  if (true) {}
8249</pre></td></tr>
8250
8251
8252<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>
8253<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8254
8255Given
8256  if (A* a = GetAPointer()) {}
8257hasConditionVariableStatement(...)
8258  matches 'A* a = GetAPointer()'.
8259</pre></td></tr>
8260
8261
8262<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>
8263<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8264
8265Examples matches the if statement
8266  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8267  if (false) false; else true;
8268</pre></td></tr>
8269
8270
8271<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>
8272<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8273
8274Given:
8275 void foo() {
8276   if (int i = foobar(); i &gt; 0) {}
8277   switch (int i = foobar(); i) {}
8278   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8279 }
8280 void bar() {
8281   if (foobar() &gt; 0) {}
8282   switch (foobar()) {}
8283   for (auto&amp; x : get_range()) {}
8284 }
8285ifStmt(hasInitStatement(anything()))
8286  matches the if statement in foo but not in bar.
8287switchStmt(hasInitStatement(anything()))
8288  matches the switch statement in foo but not in bar.
8289cxxForRangeStmt(hasInitStatement(anything()))
8290  matches the range for statement in foo but not in bar.
8291</pre></td></tr>
8292
8293
8294<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>
8295<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8296
8297Examples matches the if statement
8298  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8299  if (false) true; else false;
8300</pre></td></tr>
8301
8302
8303<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>
8304<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8305matcher.
8306
8307FIXME: Unit test this matcher
8308</pre></td></tr>
8309
8310
8311<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>
8312<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8313
8314Example matches y.
8315    (matcher = initListExpr(hasInit(0, expr())))
8316  int x{y}.
8317</pre></td></tr>
8318
8319
8320<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>
8321<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8322(if expression have it).
8323</pre></td></tr>
8324
8325
8326<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>
8327<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8328matches the given matcher.
8329
8330The associated declaration is:
8331- for type nodes, the declaration of the underlying type
8332- for CallExpr, the declaration of the callee
8333- for MemberExpr, the declaration of the referenced member
8334- for CXXConstructExpr, the declaration of the constructor
8335- for CXXNewExpr, the declaration of the operator new
8336- for ObjCIvarExpr, the declaration of the ivar
8337
8338For type nodes, hasDeclaration will generally match the declaration of the
8339sugared type. Given
8340  class X {};
8341  typedef X Y;
8342  Y y;
8343in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8344typedefDecl. A common use case is to match the underlying, desugared type.
8345This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8346  varDecl(hasType(hasUnqualifiedDesugaredType(
8347      recordType(hasDeclaration(decl())))))
8348In this matcher, the decl will match the CXXRecordDecl of class X.
8349
8350Usable 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;,
8351  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;,
8352  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;,
8353  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;,
8354  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;,
8355  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;,
8356  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8357</pre></td></tr>
8358
8359
8360<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>
8361<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8362matches the given matcher.
8363
8364The associated declaration is:
8365- for type nodes, the declaration of the underlying type
8366- for CallExpr, the declaration of the callee
8367- for MemberExpr, the declaration of the referenced member
8368- for CXXConstructExpr, the declaration of the constructor
8369- for CXXNewExpr, the declaration of the operator new
8370- for ObjCIvarExpr, the declaration of the ivar
8371
8372For type nodes, hasDeclaration will generally match the declaration of the
8373sugared type. Given
8374  class X {};
8375  typedef X Y;
8376  Y y;
8377in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8378typedefDecl. A common use case is to match the underlying, desugared type.
8379This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8380  varDecl(hasType(hasUnqualifiedDesugaredType(
8381      recordType(hasDeclaration(decl())))))
8382In this matcher, the decl will match the CXXRecordDecl of class X.
8383
8384Usable 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;,
8385  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;,
8386  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;,
8387  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;,
8388  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;,
8389  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;,
8390  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8391</pre></td></tr>
8392
8393
8394<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>
8395<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
8396`VarDecl` can be a separate variable that is captured by value or
8397reference, or a synthesized variable if the capture has an initializer.
8398
8399Given
8400  void foo() {
8401    int x;
8402    auto f = [x](){};
8403    auto g = [x = 1](){};
8404  }
8405In the matcher
8406lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))),
8407capturesVar(hasName("x")) matches `x` and `x = 1`.
8408</pre></td></tr>
8409
8410
8411<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>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8412<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression.
8413
8414Given
8415  int main() {
8416    int x, y;
8417    float z;
8418    auto f = [=]() { return x + y + z; };
8419  }
8420lambdaExpr(forEachLambdaCapture(
8421    lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
8422will trigger two matches, binding for 'x' and 'y' respectively.
8423</pre></td></tr>
8424
8425
8426<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8427<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression.
8428
8429Given
8430  void foo() {
8431    int t = 5;
8432    auto f = [=](){ return t; };
8433  }
8434lambdaExpr(hasAnyCapture(lambdaCapture())) and
8435lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t")))))
8436  both match `[=](){ return t; }`.
8437</pre></td></tr>
8438
8439
8440<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>
8441<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8442matches the given matcher.
8443
8444The associated declaration is:
8445- for type nodes, the declaration of the underlying type
8446- for CallExpr, the declaration of the callee
8447- for MemberExpr, the declaration of the referenced member
8448- for CXXConstructExpr, the declaration of the constructor
8449- for CXXNewExpr, the declaration of the operator new
8450- for ObjCIvarExpr, the declaration of the ivar
8451
8452For type nodes, hasDeclaration will generally match the declaration of the
8453sugared type. Given
8454  class X {};
8455  typedef X Y;
8456  Y y;
8457in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8458typedefDecl. A common use case is to match the underlying, desugared type.
8459This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8460  varDecl(hasType(hasUnqualifiedDesugaredType(
8461      recordType(hasDeclaration(decl())))))
8462In this matcher, the decl will match the CXXRecordDecl of class X.
8463
8464Usable 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;,
8465  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;,
8466  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;,
8467  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;,
8468  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;,
8469  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;,
8470  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8471</pre></td></tr>
8472
8473
8474<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>
8475<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8476given matcher. Implicit object expressions are included; that is, it matches
8477use of implicit `this`.
8478
8479Given
8480  struct X {
8481    int m;
8482    int f(X x) { x.m; return m; }
8483  };
8484memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8485  matches `x.m`, but not `m`; however,
8486memberExpr(hasObjectExpression(hasType(pointsTo(
8487     cxxRecordDecl(hasName("X"))))))
8488  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8489</pre></td></tr>
8490
8491
8492<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>
8493<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8494given matcher.
8495
8496Given
8497  struct { int first, second; } first, second;
8498  int i(second.first);
8499  int j(first.second);
8500memberExpr(member(hasName("first")))
8501  matches second.first
8502  but not first.second (because the member name there is "second").
8503</pre></td></tr>
8504
8505
8506<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>
8507<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8508pointee matches a given matcher.
8509
8510Given
8511  int *a;
8512  int const *b;
8513  float const *f;
8514pointerType(pointee(isConstQualified(), isInteger()))
8515  matches "int const *b"
8516
8517Usable 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;,
8518  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;
8519</pre></td></tr>
8520
8521
8522<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>
8523<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8524matcher.
8525
8526Given
8527  namespace N { template&lt;class T&gt; void f(T t); }
8528  template &lt;class T&gt; void g() { using N::f; f(T()); }
8529unresolvedLookupExpr(hasAnyDeclaration(
8530    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8531  matches the use of f in g() .
8532</pre></td></tr>
8533
8534
8535<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>
8536<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8537
8538Given
8539  struct A { struct B { struct C {}; }; };
8540  A::B::C c;
8541nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8542  matches "A::"
8543</pre></td></tr>
8544
8545
8546<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>
8547<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8548NestedNameSpecifier-matcher matches.
8549</pre></td></tr>
8550
8551
8552<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>
8553<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8554given TypeLoc.
8555
8556Given
8557  struct A { struct B { struct C {}; }; };
8558  A::B::C c;
8559nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8560  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8561  matches "A::"
8562</pre></td></tr>
8563
8564
8565<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>
8566<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8567
8568Given
8569  struct A { struct B { struct C {}; }; };
8570  A::B::C c;
8571nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8572  matches "A::"
8573</pre></td></tr>
8574
8575
8576<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>
8577<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8578given namespace matcher.
8579
8580Given
8581  namespace ns { struct A {}; }
8582  ns::A a;
8583nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8584  matches "ns::"
8585</pre></td></tr>
8586
8587
8588<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>
8589<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8590given QualType matcher without qualifiers.
8591
8592Given
8593  struct A { struct B { struct C {}; }; };
8594  A::B::C c;
8595nestedNameSpecifier(specifiesType(
8596  hasDeclaration(cxxRecordDecl(hasName("A")))
8597))
8598  matches "A::"
8599</pre></td></tr>
8600
8601
8602<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>
8603<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8604
8605Given
8606
8607  #pragma omp parallel
8608  #pragma omp parallel default(none)
8609
8610``ompExecutableDirective(hasAnyClause(anything()))`` matches
8611``omp parallel default(none)``.
8612</pre></td></tr>
8613
8614
8615<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>
8616<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8617
8618Prerequisite: the executable directive must not be standalone directive.
8619If it is, it will never match.
8620
8621Given
8622
8623   #pragma omp parallel
8624   ;
8625   #pragma omp parallel
8626   {}
8627
8628``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8629</pre></td></tr>
8630
8631
8632<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>
8633<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8634matching Base, or Objective-C classes that directly or indirectly
8635subclass a class matching Base.
8636
8637Note that a class is not considered to be derived from itself.
8638
8639Example matches Y, Z, C (Base == hasName("X"))
8640  class X;
8641  class Y : public X {};  // directly derived
8642  class Z : public Y {};  // indirectly derived
8643  typedef X A;
8644  typedef A B;
8645  class C : public B {};  // derived from a typedef of X
8646
8647In the following example, Bar matches isDerivedFrom(hasName("X")):
8648  class Foo;
8649  typedef Foo X;
8650  class Bar : public Foo {};  // derived from a type that X is a typedef of
8651
8652In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8653  @interface NSObject @end
8654  @interface Bar : NSObject @end
8655
8656Usable 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;
8657</pre></td></tr>
8658
8659
8660<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>
8661<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8662matching Base.
8663
8664Note that a class is not considered to be derived from itself.
8665
8666Example matches Y, C (Base == hasName("X"))
8667  class X;
8668  class Y : public X {};  // directly derived
8669  class Z : public Y {};  // indirectly derived
8670  typedef X A;
8671  typedef A B;
8672  class C : public B {};  // derived from a typedef of X
8673
8674In the following example, Bar matches isDerivedFrom(hasName("X")):
8675  class Foo;
8676  typedef Foo X;
8677  class Bar : public Foo {};  // derived from a type that X is a typedef of
8678</pre></td></tr>
8679
8680
8681<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>
8682<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8683match Base.
8684</pre></td></tr>
8685
8686
8687<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>
8688<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8689expression, or an ObjC-message-send expression.
8690
8691Given
8692  void x(int, int, int) { int y; x(1, y, 42); }
8693callExpr(hasAnyArgument(declRefExpr()))
8694  matches x(1, y, 42)
8695with hasAnyArgument(...)
8696  matching y
8697
8698For ObjectiveC, given
8699  @interface I - (void) f:(int) y; @end
8700  void foo(I *i) { [i f:12]; }
8701objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8702  matches [i f:12]
8703</pre></td></tr>
8704
8705
8706<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>
8707<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8708call expression.
8709
8710Example matches y in x(y)
8711    (matcher = callExpr(hasArgument(0, declRefExpr())))
8712  void x(int) { int y; x(y); }
8713</pre></td></tr>
8714
8715
8716<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>
8717<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8718and the inner matcher matches on that instance.
8719
8720For example the method call in
8721  NSString *x = @"hello";
8722  [x containsString:@"h"];
8723is matched by
8724objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8725</pre></td></tr>
8726
8727
8728<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>
8729<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8730
8731Example
8732matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8733matches the [webView ...] message invocation.
8734  NSString *webViewJavaScript = ...
8735  UIWebView *webView = ...
8736  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8737</pre></td></tr>
8738
8739
8740<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>
8741<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8742block.
8743
8744Does not match the 'this' parameter of a method.
8745
8746Given
8747  class X { void f(int x, int y, int z) {} };
8748cxxMethodDecl(hasAnyParameter(hasName("y")))
8749  matches f(int x, int y, int z) {}
8750with hasAnyParameter(...)
8751  matching int y
8752
8753For ObjectiveC, given
8754  @interface I - (void) f:(int) y; @end
8755
8756the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8757matches the declaration of method f with hasParameter
8758matching y.
8759
8760For blocks, given
8761  b = ^(int y) { printf("%d", y) };
8762
8763the matcher blockDecl(hasAnyParameter(hasName("y")))
8764matches the declaration of the block b with hasParameter
8765matching y.
8766</pre></td></tr>
8767
8768
8769<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>
8770<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8771declaration or a block.
8772
8773Given
8774  class X { void f(int x) {} };
8775cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8776  matches f(int x) {}
8777with hasParameter(...)
8778  matching int x
8779
8780For ObjectiveC, given
8781  @interface I - (void) f:(int) y; @end
8782
8783the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8784matches the declaration of method f with hasParameter
8785matching y.
8786</pre></td></tr>
8787
8788
8789<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>
8790<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8791
8792Examples:
8793  int x;
8794declaratorDecl(hasTypeLoc(loc(asString("int"))))
8795  matches int x
8796
8797auto x = int(3);
8798cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8799  matches int(3)
8800
8801struct Foo { Foo(int, int); };
8802auto x = Foo(1, 2);
8803cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8804  matches Foo(1, 2)
8805
8806Usable 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;,
8807  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;,
8808  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;,
8809  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8810  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;,
8811  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;,
8812  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;,
8813  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8814</pre></td></tr>
8815
8816
8817<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>
8818<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8819or opaque value's source expression matches the given matcher.
8820
8821Example 1: matches "a string"
8822(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8823class URL { URL(string); };
8824URL url = "a string";
8825
8826Example 2: matches 'b' (matcher =
8827opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8828int a = b ?: 1;
8829</pre></td></tr>
8830
8831
8832<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>
8833<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8834overloads matches the given matcher.
8835
8836Given
8837  template &lt;typename T&gt; void foo(T);
8838  template &lt;typename T&gt; void bar(T);
8839  template &lt;typename T&gt; void baz(T t) {
8840    foo(t);
8841    bar(t);
8842  }
8843unresolvedLookupExpr(hasAnyDeclaration(
8844    functionTemplateDecl(hasName("foo"))))
8845  matches foo in foo(t); but not bar in bar(t);
8846</pre></td></tr>
8847
8848
8849<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>
8850<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8851
8852Given
8853  int (*ptr_to_array)[4];
8854  int (*ptr_to_func)(int);
8855
8856varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8857ptr_to_func but not ptr_to_array.
8858
8859Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8860</pre></td></tr>
8861
8862
8863<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>
8864<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
8865`PointeeMatcher`.
8866
8867Given
8868  int* x;
8869pointerTypeLoc(hasPointeeLoc(loc(asString("int"))))
8870  matches `int*`.
8871</pre></td></tr>
8872
8873
8874<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>
8875<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8876pointee matches a given matcher.
8877
8878Given
8879  int *a;
8880  int const *b;
8881  float const *f;
8882pointerType(pointee(isConstQualified(), isInteger()))
8883  matches "int const *b"
8884
8885Usable 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;,
8886  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;
8887</pre></td></tr>
8888
8889
8890<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>
8891<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8892
8893Given:
8894  typedef int &amp;int_ref;
8895  int a;
8896  int_ref b = a;
8897
8898varDecl(hasType(qualType(referenceType()))))) will not match the
8899declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8900</pre></td></tr>
8901
8902
8903<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>
8904<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8905matches the given matcher.
8906
8907The associated declaration is:
8908- for type nodes, the declaration of the underlying type
8909- for CallExpr, the declaration of the callee
8910- for MemberExpr, the declaration of the referenced member
8911- for CXXConstructExpr, the declaration of the constructor
8912- for CXXNewExpr, the declaration of the operator new
8913- for ObjCIvarExpr, the declaration of the ivar
8914
8915For type nodes, hasDeclaration will generally match the declaration of the
8916sugared type. Given
8917  class X {};
8918  typedef X Y;
8919  Y y;
8920in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8921typedefDecl. A common use case is to match the underlying, desugared type.
8922This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8923  varDecl(hasType(hasUnqualifiedDesugaredType(
8924      recordType(hasDeclaration(decl())))))
8925In this matcher, the decl will match the CXXRecordDecl of class X.
8926
8927Usable 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;,
8928  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;,
8929  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;,
8930  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;,
8931  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;,
8932  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;,
8933  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8934</pre></td></tr>
8935
8936
8937<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>
8938<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8939
8940Given
8941  void (*fp)(void);
8942The matcher
8943  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8944would match the declaration for fp.
8945</pre></td></tr>
8946
8947
8948<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>
8949<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8950</pre></td></tr>
8951
8952
8953<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>
8954<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8955matches the specified matcher.
8956
8957Example matches y-&gt;x()
8958  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8959     cxxRecordDecl(hasName("Y")))))))
8960  class Y { public: void x(); };
8961  void z() { Y *y; y-&gt;x(); }
8962</pre></td></tr>
8963
8964
8965<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>
8966<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8967</pre></td></tr>
8968
8969
8970<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>
8971<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8972type matches the specified matcher.
8973
8974Example matches X &amp;x and const X &amp;y
8975    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8976  class X {
8977    void a(X b) {
8978      X &amp;x = b;
8979      const X &amp;y = b;
8980    }
8981  };
8982</pre></td></tr>
8983
8984
8985<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>
8986<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
8987`InnerMatcher`.
8988
8989Given
8990  int* const x;
8991  const int y;
8992qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
8993  matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
8994</pre></td></tr>
8995
8996
8997<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>
8998<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8999matches the given matcher.
9000
9001The associated declaration is:
9002- for type nodes, the declaration of the underlying type
9003- for CallExpr, the declaration of the callee
9004- for MemberExpr, the declaration of the referenced member
9005- for CXXConstructExpr, the declaration of the constructor
9006- for CXXNewExpr, the declaration of the operator new
9007- for ObjCIvarExpr, the declaration of the ivar
9008
9009For type nodes, hasDeclaration will generally match the declaration of the
9010sugared type. Given
9011  class X {};
9012  typedef X Y;
9013  Y y;
9014in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9015typedefDecl. A common use case is to match the underlying, desugared type.
9016This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9017  varDecl(hasType(hasUnqualifiedDesugaredType(
9018      recordType(hasDeclaration(decl())))))
9019In this matcher, the decl will match the CXXRecordDecl of class X.
9020
9021Usable 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;,
9022  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;,
9023  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;,
9024  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;,
9025  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;,
9026  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;,
9027  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9028</pre></td></tr>
9029
9030
9031<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>
9032<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
9033`ReferentMatcher`.
9034
9035Given
9036  int x = 3;
9037  int&amp; xx = x;
9038referenceTypeLoc(hasReferentLoc(loc(asString("int"))))
9039  matches `int&amp;`.
9040</pre></td></tr>
9041
9042
9043<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>
9044<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
9045pointee matches a given matcher.
9046
9047Given
9048  int *a;
9049  int const *b;
9050  float const *f;
9051pointerType(pointee(isConstQualified(), isInteger()))
9052  matches "int const *b"
9053
9054Usable 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;,
9055  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;
9056</pre></td></tr>
9057
9058
9059<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>
9060<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
9061
9062Given
9063  return a + b;
9064hasReturnValue(binaryOperator())
9065  matches 'return a + b'
9066with binaryOperator()
9067  matching 'a + b'
9068</pre></td></tr>
9069
9070
9071<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>
9072<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
9073a given matcher. Also matches StmtExprs that have CompoundStmt as children.
9074
9075Given
9076  { {}; 1+2; }
9077hasAnySubstatement(compoundStmt())
9078  matches '{ {}; 1+2; }'
9079with compoundStmt()
9080  matching '{}'
9081</pre></td></tr>
9082
9083
9084<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>
9085<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9086alignof.
9087</pre></td></tr>
9088
9089
9090<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>
9091<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
9092belongs to.
9093
9094Given:
9095F&amp; operator=(const F&amp; o) {
9096  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9097  return *this;
9098}
9099returnStmt(forCallable(functionDecl(hasName("operator="))))
9100  matches 'return *this'
9101  but does not match 'return v &gt; 0'
9102
9103Given:
9104-(void) foo {
9105  int x = 1;
9106  dispatch_sync(queue, ^{ int y = 2; });
9107}
9108declStmt(forCallable(objcMethodDecl()))
9109  matches 'int x = 1'
9110  but does not match 'int y = 2'.
9111whereas declStmt(forCallable(blockDecl()))
9112  matches 'int y = 2'
9113  but does not match 'int x = 1'.
9114</pre></td></tr>
9115
9116
9117<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>
9118<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
9119
9120Deprecated. Use forCallable() to correctly handle the situation when
9121the declaration is not a function (but a block or an Objective-C method).
9122forFunction() not only fails to take non-functions into account but also
9123may match the wrong declaration in their presence.
9124
9125Given:
9126F&amp; operator=(const F&amp; o) {
9127  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9128  return *this;
9129}
9130returnStmt(forFunction(hasName("operator=")))
9131  matches 'return *this'
9132  but does not match 'return v &gt; 0'
9133</pre></td></tr>
9134
9135
9136<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>
9137<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9138sizeof.
9139</pre></td></tr>
9140
9141
9142<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>
9143<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
9144type that matches the provided matcher.
9145
9146Given
9147  template &lt;typename T&gt;
9148  double F(T t);
9149  int i;
9150  double j = F(i);
9151
9152substTemplateTypeParmType(hasReplacementType(type())) matches int
9153</pre></td></tr>
9154
9155
9156<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>
9157<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
9158statement. This matcher may produce multiple matches.
9159
9160Given
9161  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9162switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
9163  matches four times, with "c" binding each of "case 1:", "case 2:",
9164"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
9165"switch (1)", "switch (2)" and "switch (2)".
9166</pre></td></tr>
9167
9168
9169<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>
9170<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
9171switch statement or conditional operator.
9172
9173Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9174  if (true) {}
9175</pre></td></tr>
9176
9177
9178<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>
9179<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
9180
9181Given:
9182 void foo() {
9183   if (int i = foobar(); i &gt; 0) {}
9184   switch (int i = foobar(); i) {}
9185   for (auto&amp; a = get_range(); auto&amp; x : a) {}
9186 }
9187 void bar() {
9188   if (foobar() &gt; 0) {}
9189   switch (foobar()) {}
9190   for (auto&amp; x : get_range()) {}
9191 }
9192ifStmt(hasInitStatement(anything()))
9193  matches the if statement in foo but not in bar.
9194switchStmt(hasInitStatement(anything()))
9195  matches the switch statement in foo but not in bar.
9196cxxForRangeStmt(hasInitStatement(anything()))
9197  matches the range for statement in foo but not in bar.
9198</pre></td></tr>
9199
9200
9201<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>
9202<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
9203matches the given matcher.
9204
9205The associated declaration is:
9206- for type nodes, the declaration of the underlying type
9207- for CallExpr, the declaration of the callee
9208- for MemberExpr, the declaration of the referenced member
9209- for CXXConstructExpr, the declaration of the constructor
9210- for CXXNewExpr, the declaration of the operator new
9211- for ObjCIvarExpr, the declaration of the ivar
9212
9213For type nodes, hasDeclaration will generally match the declaration of the
9214sugared type. Given
9215  class X {};
9216  typedef X Y;
9217  Y y;
9218in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9219typedefDecl. A common use case is to match the underlying, desugared type.
9220This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9221  varDecl(hasType(hasUnqualifiedDesugaredType(
9222      recordType(hasDeclaration(decl())))))
9223In this matcher, the decl will match the CXXRecordDecl of class X.
9224
9225Usable 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;,
9226  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;,
9227  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;,
9228  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;,
9229  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;,
9230  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;,
9231  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9232</pre></td></tr>
9233
9234
9235<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>
9236<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
9237
9238Examples:
9239  int x;
9240declaratorDecl(hasTypeLoc(loc(asString("int"))))
9241  matches int x
9242
9243auto x = int(3);
9244cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9245  matches int(3)
9246
9247struct Foo { Foo(int, int); };
9248auto x = Foo(1, 2);
9249cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9250  matches Foo(1, 2)
9251
9252Usable 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;,
9253  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;,
9254  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;,
9255  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9256  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;,
9257  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;,
9258  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;,
9259  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9260</pre></td></tr>
9261
9262
9263<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>
9264<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
9265
9266Given
9267  struct B { int next; };
9268  template&lt;int(B::*next_ptr)&gt; struct A {};
9269  A&lt;&amp;B::next&gt; a;
9270templateSpecializationType(hasAnyTemplateArgument(
9271  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
9272  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9273    B::next
9274</pre></td></tr>
9275
9276
9277<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>
9278<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9279declaration.
9280
9281Given
9282  struct B { int next; };
9283  template&lt;int(B::*next_ptr)&gt; struct A {};
9284  A&lt;&amp;B::next&gt; a;
9285classTemplateSpecializationDecl(hasAnyTemplateArgument(
9286    refersToDeclaration(fieldDecl(hasName("next")))))
9287  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9288    B::next
9289</pre></td></tr>
9290
9291
9292<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>
9293<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9294
9295Given
9296  template&lt;int T&gt; struct C {};
9297  C&lt;42&gt; c;
9298classTemplateSpecializationDecl(
9299  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9300  matches the implicit instantiation of C in C&lt;42&gt;.
9301</pre></td></tr>
9302
9303
9304<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>
9305<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9306
9307Given
9308  template&lt;template &lt;typename&gt; class S&gt; class X {};
9309  template&lt;typename T&gt; class Y {};
9310  X&lt;Y&gt; xi;
9311classTemplateSpecializationDecl(hasAnyTemplateArgument(
9312    refersToTemplate(templateName())))
9313  matches the specialization X&lt;Y&gt;
9314</pre></td></tr>
9315
9316
9317<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>
9318<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9319
9320Given
9321  struct X {};
9322  template&lt;typename T&gt; struct A {};
9323  A&lt;X&gt; a;
9324classTemplateSpecializationDecl(hasAnyTemplateArgument(
9325    refersToType(class(hasName("X")))))
9326  matches the specialization A&lt;X&gt;
9327</pre></td></tr>
9328
9329
9330<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>
9331<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one
9332`TemplateArgumentLoc` matching the given `InnerMatcher`.
9333
9334Given
9335  template&lt;typename T&gt; class A {};
9336  A&lt;int&gt; a;
9337varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
9338  hasTypeLoc(loc(asString("int")))))))
9339  matches `A&lt;int&gt; a`.
9340</pre></td></tr>
9341
9342
9343<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>
9344<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th
9345`TemplateArgumentLoc` matches the given `InnerMatcher`.
9346
9347Given
9348  template&lt;typename T, typename U&gt; class A {};
9349  A&lt;double, int&gt; b;
9350  A&lt;int, double&gt; c;
9351varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
9352  hasTypeLoc(loc(asString("double")))))))
9353  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
9354</pre></td></tr>
9355
9356
9357<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>
9358<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9359functionDecl that have at least one TemplateArgument matching the given
9360InnerMatcher.
9361
9362Given
9363  template&lt;typename T&gt; class A {};
9364  template&lt;&gt; class A&lt;double&gt; {};
9365  A&lt;int&gt; a;
9366
9367  template&lt;typename T&gt; f() {};
9368  void func() { f&lt;int&gt;(); };
9369
9370classTemplateSpecializationDecl(hasAnyTemplateArgument(
9371    refersToType(asString("int"))))
9372  matches the specialization A&lt;int&gt;
9373
9374functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9375  matches the specialization f&lt;int&gt;
9376</pre></td></tr>
9377
9378
9379<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>
9380<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9381matches the given matcher.
9382
9383The associated declaration is:
9384- for type nodes, the declaration of the underlying type
9385- for CallExpr, the declaration of the callee
9386- for MemberExpr, the declaration of the referenced member
9387- for CXXConstructExpr, the declaration of the constructor
9388- for CXXNewExpr, the declaration of the operator new
9389- for ObjCIvarExpr, the declaration of the ivar
9390
9391For type nodes, hasDeclaration will generally match the declaration of the
9392sugared type. Given
9393  class X {};
9394  typedef X Y;
9395  Y y;
9396in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9397typedefDecl. A common use case is to match the underlying, desugared type.
9398This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9399  varDecl(hasType(hasUnqualifiedDesugaredType(
9400      recordType(hasDeclaration(decl())))))
9401In this matcher, the decl will match the CXXRecordDecl of class X.
9402
9403Usable 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;,
9404  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;,
9405  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;,
9406  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;,
9407  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;,
9408  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;,
9409  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9410</pre></td></tr>
9411
9412
9413<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>
9414<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9415functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9416
9417Given
9418  template&lt;typename T, typename U&gt; class A {};
9419  A&lt;bool, int&gt; b;
9420  A&lt;int, bool&gt; c;
9421
9422  template&lt;typename T&gt; void f() {}
9423  void func() { f&lt;int&gt;(); };
9424classTemplateSpecializationDecl(hasTemplateArgument(
9425    1, refersToType(asString("int"))))
9426  matches the specialization A&lt;bool, int&gt;
9427
9428functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9429  matches the specialization f&lt;int&gt;
9430</pre></td></tr>
9431
9432
9433<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>
9434<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9435matches the given matcher.
9436
9437The associated declaration is:
9438- for type nodes, the declaration of the underlying type
9439- for CallExpr, the declaration of the callee
9440- for MemberExpr, the declaration of the referenced member
9441- for CXXConstructExpr, the declaration of the constructor
9442- for CXXNewExpr, the declaration of the operator new
9443- for ObjCIvarExpr, the declaration of the ivar
9444
9445For type nodes, hasDeclaration will generally match the declaration of the
9446sugared type. Given
9447  class X {};
9448  typedef X Y;
9449  Y y;
9450in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9451typedefDecl. A common use case is to match the underlying, desugared type.
9452This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9453  varDecl(hasType(hasUnqualifiedDesugaredType(
9454      recordType(hasDeclaration(decl())))))
9455In this matcher, the decl will match the CXXRecordDecl of class X.
9456
9457Usable 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;,
9458  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;,
9459  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;,
9460  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;,
9461  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;,
9462  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;,
9463  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9464</pre></td></tr>
9465
9466
9467<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>
9468<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9469QualType-matcher matches.
9470</pre></td></tr>
9471
9472
9473<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>
9474<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9475
9476Examples:
9477  int x;
9478declaratorDecl(hasTypeLoc(loc(asString("int"))))
9479  matches int x
9480
9481auto x = int(3);
9482cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9483  matches int(3)
9484
9485struct Foo { Foo(int, int); };
9486auto x = Foo(1, 2);
9487cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9488  matches Foo(1, 2)
9489
9490Usable 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;,
9491  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;,
9492  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;,
9493  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9494  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;,
9495  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;,
9496  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;,
9497  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9498</pre></td></tr>
9499
9500
9501<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>
9502<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9503matcher.
9504
9505Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9506            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9507            and U (matcher = typedefDecl(hasType(asString("int")))
9508            and friend class X (matcher = friendDecl(hasType("X"))
9509            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9510                                              asString("class X")))
9511 class X {};
9512 void y(X &amp;x) { x; X z; }
9513 typedef int U;
9514 class Y { friend class X; };
9515 class Z : public virtual X {};
9516</pre></td></tr>
9517
9518
9519<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>
9520<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9521matches the given matcher.
9522
9523The associated declaration is:
9524- for type nodes, the declaration of the underlying type
9525- for CallExpr, the declaration of the callee
9526- for MemberExpr, the declaration of the referenced member
9527- for CXXConstructExpr, the declaration of the constructor
9528- for CXXNewExpr, the declaration of the operator new
9529- for ObjCIvarExpr, the declaration of the ivar
9530
9531For type nodes, hasDeclaration will generally match the declaration of the
9532sugared type. Given
9533  class X {};
9534  typedef X Y;
9535  Y y;
9536in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9537typedefDecl. A common use case is to match the underlying, desugared type.
9538This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9539  varDecl(hasType(hasUnqualifiedDesugaredType(
9540      recordType(hasDeclaration(decl())))))
9541In this matcher, the decl will match the CXXRecordDecl of class X.
9542
9543Usable 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;,
9544  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;,
9545  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;,
9546  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;,
9547  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;,
9548  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;,
9549  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9550</pre></td></tr>
9551
9552
9553<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>
9554<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9555type of the matched node.
9556
9557For example, in:
9558  class A {};
9559  using B = A;
9560The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9561both B and A.
9562</pre></td></tr>
9563
9564
9565<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>
9566<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9567
9568Given
9569  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9570unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9571  matches sizeof(a) and alignof(c)
9572</pre></td></tr>
9573
9574
9575<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>
9576<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9577
9578Example matches true (matcher = hasUnaryOperand(
9579                                  cxxBoolLiteral(equals(true))))
9580  !true
9581</pre></td></tr>
9582
9583
9584<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>
9585<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9586given matcher. Implicit object expressions are included; that is, it matches
9587use of implicit `this`.
9588
9589Given
9590  struct X {
9591    int m;
9592    int f(X x) { x.m; return m; }
9593  };
9594memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9595  matches `x.m`, but not `m`; however,
9596memberExpr(hasObjectExpression(hasType(pointsTo(
9597     cxxRecordDecl(hasName("X"))))))
9598  matches `m` (aka. `this-&gt;m`), but not `x.m`.
9599</pre></td></tr>
9600
9601
9602<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>
9603<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9604matches the given matcher.
9605
9606The associated declaration is:
9607- for type nodes, the declaration of the underlying type
9608- for CallExpr, the declaration of the callee
9609- for MemberExpr, the declaration of the referenced member
9610- for CXXConstructExpr, the declaration of the constructor
9611- for CXXNewExpr, the declaration of the operator new
9612- for ObjCIvarExpr, the declaration of the ivar
9613
9614For type nodes, hasDeclaration will generally match the declaration of the
9615sugared type. Given
9616  class X {};
9617  typedef X Y;
9618  Y y;
9619in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9620typedefDecl. A common use case is to match the underlying, desugared type.
9621This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9622  varDecl(hasType(hasUnqualifiedDesugaredType(
9623      recordType(hasDeclaration(decl())))))
9624In this matcher, the decl will match the CXXRecordDecl of class X.
9625
9626Usable 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;,
9627  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;,
9628  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;,
9629  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;,
9630  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;,
9631  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;,
9632  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9633</pre></td></tr>
9634
9635
9636<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>
9637<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9638matched by the given matcher.
9639
9640Given
9641  namespace X { int a; void b(); }
9642  using X::a;
9643  using X::b;
9644usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9645  matches using X::b but not using X::a </pre></td></tr>
9646
9647
9648<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>
9649<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9650declaration's type.
9651
9652In case of a value declaration (for example a variable declaration),
9653this resolves one layer of indirection. For example, in the value
9654declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9655X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9656declaration of x.
9657
9658Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9659            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9660            and friend class X (matcher = friendDecl(hasType("X"))
9661            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9662                                              cxxRecordDecl(hasName("X"))))
9663 class X {};
9664 void y(X &amp;x) { x; X z; }
9665 class Y { friend class X; };
9666 class Z : public virtual X {};
9667
9668Example matches class Derived
9669(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9670class Base {};
9671class Derived : Base {};
9672
9673Usable 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;,
9674Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
9675</pre></td></tr>
9676
9677
9678<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>
9679<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9680matcher.
9681
9682Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9683            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9684            and U (matcher = typedefDecl(hasType(asString("int")))
9685            and friend class X (matcher = friendDecl(hasType("X"))
9686            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9687                                              asString("class X")))
9688 class X {};
9689 void y(X &amp;x) { x; X z; }
9690 typedef int U;
9691 class Y { friend class X; };
9692 class Z : public virtual X {};
9693</pre></td></tr>
9694
9695
9696<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>
9697<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9698that matches the given matcher.
9699
9700Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9701  bool y() { return true; }
9702  bool x = y();
9703</pre></td></tr>
9704
9705
9706<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>
9707<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9708expression.
9709
9710Given
9711  void f(int b) {
9712    int a[b];
9713  }
9714variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9715  varDecl(hasName("b")))))))
9716  matches "int a[b]"
9717</pre></td></tr>
9718
9719
9720<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>
9721<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9722
9723
9724<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>
9725<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9726switch statement or conditional operator.
9727
9728Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9729  if (true) {}
9730</pre></td></tr>
9731
9732<!--END_TRAVERSAL_MATCHERS -->
9733</table>
9734
9735</div>
9736</body>
9737</html>
9738
9739
9740