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