1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20span.mono { font-family: monospace; }
21
22.traverse_compare, .traverse_compare td, .traverse_compare th {
23  border: 1px solid black;
24  border-collapse: collapse;
25}
26</style>
27<script type="text/javascript">
28function toggle(id) {
29  if (!id) return;
30  row = document.getElementById(id);
31  if (row.style.display != 'table-cell')
32    row.style.display = 'table-cell';
33  else
34    row.style.display = 'none';
35}
36</script>
37</head>
38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39
40<!--#include virtual="../menu.html.incl"-->
41
42<div id="content">
43
44<h1>AST Matcher Reference</h1>
45
46<p>This document shows all currently implemented matchers. The matchers are grouped
47by category and node type they match. You can click on matcher names to show the
48matcher's source documentation.</p>
49
50<p>There are three different basic categories of matchers:
51<ul>
52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55</ul>
56</p>
57
58<p>Within each category the matchers are ordered by node type they match on.
59Note that if a matcher can match multiple node types, it will appear
60multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
61find all matchers that can be used to match on Stmt nodes.</p>
62
63<p>The exception to that rule are matchers that can match on any node. Those
64are marked with a * and are listed in the beginning of each category.</p>
65
66<p>Note that the categorization of matchers is a great help when you combine
67them into matcher expressions. You will usually want to form matcher expressions
68that read like english sentences by alternating between node matchers and
69narrowing or traversal matchers, like this:
70<pre>
71recordDecl(hasDescendant(
72    ifStmt(hasTrueExpression(
73        expr(hasDescendant(
74            ifStmt()))))))
75</pre>
76</p>
77
78<!-- ======================================================================= -->
79<h2 id="traverse-mode">Traverse Mode</h2>
80<!-- ======================================================================= -->
81
82<p>The default mode of operation of AST Matchers visits all nodes in the AST,
83even if they are not spelled in the source. This is
84<span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
85that explicitly traverse or ignore implicit nodes, such as parentheses
86surrounding an expression or expressions with cleanups.  These implicit
87nodes are not always obvious from the syntax of the source code, and so this
88mode requires careful consideration and testing to get the desired behavior
89from an AST matcher.
90</p>
91
92<p>In addition, because template instantiations are matched in the default mode,
93transformations can be accidentally made to template declarations. Finally,
94because implicit nodes are matched by default, transformations can be made on
95entirely incorrect places in the code.</p>
96
97<p>For these reasons, it is possible to ignore AST nodes which are not spelled
98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99mode. This is likely to be far less error-prone for users who are not already
100very familiar with where implicit nodes appear in the AST. It is also likely
101to be less error-prone for experienced AST users, as difficult cases do not
102need to be encountered and matcher expressions adjusted for these cases.</p>
103
104<p>In clang-query, the mode can be changed with
105<pre>
106set traversal IgnoreUnlessSpelledInSource
107</pre>
108</p>
109This affects both matchers and AST dump output in results.
110
111<p>When using the C++ API such as in clang-tidy checks, the
112<span class="mono">traverse()</span> matcher is used to set the mode:
113<pre>
114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115  returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116  ), this);
117</pre>
118</p>
119<p>The following table compares the <span class="mono">AsIs</span> mode with
120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121
122<table class="traverse_compare">
123<tr>
124<th></th>
125<th><span class="mono">AsIs</span></th>
126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127</tr>
128<tr>
129  <td>AST dump of <span class="mono">func1</span>:
130<pre>
131struct B {
132  B(int);
133};
134
135B func1() { return 42; }
136</pre>
137
138  </td>
139  <td>
140C++98 dialect:
141<pre>
142FunctionDecl
143`-CompoundStmt
144  `-ReturnStmt
145    `-ExprWithCleanups
146      `-CXXConstructExpr
147        `-MaterializeTemporaryExpr
148          `-ImplicitCastExpr
149            `-ImplicitCastExpr
150              `-CXXConstructExpr
151                `-IntegerLiteral 'int' 42
152</pre>
153C++11, C++14 dialect:
154<pre>
155FunctionDecl
156`-CompoundStmt
157  `-ReturnStmt
158    `-ExprWithCleanups
159      `-CXXConstructExpr
160        `-MaterializeTemporaryExpr
161          `-ImplicitCastExpr
162            `-CXXConstructExpr
163              `-IntegerLiteral 'int' 42
164</pre>
165C++17, C++20 dialect:
166<pre>
167FunctionDecl
168`-CompoundStmt
169  `-ReturnStmt
170    `-ImplicitCastExpr
171      `-CXXConstructExpr
172        `-IntegerLiteral 'int' 42
173</pre>
174</td>
175  <td>
176All dialects:
177    <pre>
178FunctionDecl
179`-CompoundStmt
180  `-ReturnStmt
181    `-IntegerLiteral 'int' 42
182</pre></td>
183</tr>
184
185<tr>
186<td>Matcher for returned <span class="mono">42</span>:
187<pre>
188struct B {
189  B(int);
190};
191
192B func1() { return 42; }
193</pre>
194
195  </td>
196  <td>
197All dialects:
198<pre>
199returnStmt(hasReturnValue(
200    ignoringImplicit(
201        ignoringElidableConstructorCall(
202            ignoringImplicit(
203                cxxConstructExpr(hasArgument(0,
204                    ignoringImplicit(
205                        integerLiteral().bind("returnVal")
206                        )
207                    ))
208                )
209            )
210        )
211    ))
212</pre></td>
213  <td>
214All dialects:
215<pre>
216returnStmt(hasReturnValue(
217    integerLiteral().bind("returnVal")
218))
219</pre></td>
220</tr>
221<tr>
222<td>Match result for
223<pre>implicitCastExpr()</pre>
224given:
225<pre>
226struct B {
227  B(int);
228};
229
230B func1() { return 42; }
231</pre>
232
233</td>
234<td>
235Match found.</td>
236  <td>
237No match.</td>
238</tr>
239<tr>
240  <td>Match result for:
241<pre>
242cxxConstructorDecl(
243  isCopyConstructor()
244  ).bind("prepend_explicit")
245</pre>
246given:
247<pre>
248struct Other {};
249struct Copyable {
250  Other m_o;
251  Copyable();
252};
253</pre>
254</td>
255<td>
256Match found. Insertion produces incorrect output:
257<pre>
258struct Other {};
259struct explicit Copyable {
260  Other m_o;
261  Copyable();
262};
263</pre>
264</td>
265<td>
266No match found. Incorrect replacement not possible.
267</td>
268</tr>
269<tr>
270  <td>Replacement of <span class="mono">begin()</span>
271    with <span class="mono">cbegin()</span>:
272<pre>
273cxxMemberCallExpr(
274  on(ConstContainerExpr),
275  callee(cxxMethodDecl(hasName("begin")))
276  ).bind("replace_with_cbegin")
277</pre>
278given:
279<pre>
280void foo() {
281  const Container c;
282  c.begin();
283
284  for (auto i : c) {
285  }
286}
287</pre>
288</td>
289<td>
2902 matches found. Replacement produces incorrect output:
291<pre>
292void foo() {
293  const Container c;
294  c.cbegin();
295
296  for (auto i :.cbegin() c) {
297  }
298}
299</pre>
300</td>
301<td>
3021 match found. Replacement produces correct output:
303<pre>
304void foo() {
305  const Container c;
306  c.cbegin();
307
308  for (auto i : c) {
309  }
310}
311</pre>
312</td>
313</tr>
314<tr>
315  <td>Replacement of <span class="mono">int</span> member
316    with <span class="mono">safe_int</span>:
317<pre>
318fieldDecl(
319  hasType(asString("int"))
320  ).bind("use_safe_int")
321</pre>
322given:
323<pre>
324struct S {
325  int m_i;
326};
327
328template &lt;typename T&gt; struct TemplStruct {
329  TemplStruct() {}
330  ~TemplStruct() {}
331
332private:
333  T m_t;
334};
335
336void instantiate() { TemplStruct&lt;int&gt; ti; }
337</pre>
338</td>
339<td>
3402 matches found. Replacement produces incorrect output:
341<pre>
342struct S {
343  safe_int m_i;
344};
345
346template &lt;typename T&gt; struct TemplStruct {
347  TemplStruct() {}
348  ~TemplStruct() {}
349
350private:
351  safe_int m_t;
352};
353
354void instantiate() { TemplStruct&lt;int&gt; ti; }
355</pre>
356</td>
357<td>
3581 match found. Replacement produces correct output:
359<pre>
360struct S {
361  safe_int m_i;
362};
363
364template &lt;typename T&gt; struct TemplStruct {
365  TemplStruct() {}
366  ~TemplStruct() {}
367
368private:
369  T m_t;
370};
371
372void instantiate() { TemplStruct&lt;int&gt; ti; }
373</pre>
374</td>
375</tr>
376<tr>
377  <td>Add prefix to member initializer
378<pre>
379cxxCtorInitializer(
380  forField(fieldDecl())
381  ).bind("add_prefix")
382</pre>
383given:
384<pre>
385struct Simple {};
386
387struct Record {
388  Record() : i(42) {}
389private:
390  int i;
391  Simple s;
392};
393</pre>
394</td>
395<td>
3962 matches found. Replacement produces incorrect output:
397<pre>
398struct Simple {};
399
400struct Record {
401  m_Record() : m_i(42) {}
402private:
403  int i;
404  Simple s;
405};
406</pre>
407</td>
408<td>
4091 match found. Replacement produces correct output:
410<pre>
411struct Simple {};
412
413struct Record {
414  Record() : m_i(42) {}
415private:
416  int i;
417  Simple s;
418};
419</pre>
420</td>
421</tr>
422<tr>
423  <td>Ignored default arguments
424<pre>
425callExpr(
426  callee(functionDecl(
427    hasName("hasDefaultArg")
428    )),
429  argumentCountIs(1)
430  ).bind("add_prefix")
431</pre>
432given:
433<pre>
434void hasDefaultArg(int i, int j = 0) {}
435void callDefaultArg() { hasDefaultArg(42); }
436</pre>
437</td>
438<td>
439No match.
440</td>
441<td>
4421 match found.
443</td>
444</tr>
445<tr>
446  <td>Lambda fields
447<pre>
448fieldDecl(
449  hasType(asString("int"))
450  ).bind("make_safe")
451</pre>
452given:
453<pre>
454struct S {
455  int m_i;
456};
457
458void func() {
459  int a = 0;
460  int c = 0;
461
462  auto l = [a, b = c](int d) { int e = d; };
463  l(43);
464}
465</pre>
466</td>
467<td>
4682 matches found. Replacement produces incorrect output:
469<pre>
470struct S {
471  safe_int m_i;
472};
473
474void func() {
475  int a = 0;
476  int c = 0;
477
478  auto l = [safe_a, safe_b = c](int d) { int e = d; };
479  l(43);
480}
481</pre>
482</td>
483<td>
4841 match found. Replacement produces correct output:
485<pre>
486struct S {
487  safe_int m_i;
488};
489
490void func() {
491  int a = 0;
492  int c = 0;
493
494  auto l = [a, b = c](int d) { int e = d; };
495  l(43);
496}
497</pre>
498</td>
499
500</tr>
501
502
503
504
505
506<tr>
507  <td>Rewritten binary operators
508<pre>
509binaryOperator(
510  hasOperatorName("&lt;"),
511  hasRHS(hasDescendant(integerLiteral(equals(0))))
512  )
513</pre>
514given:
515<pre>
516#include &lt;compare&gt;
517
518class HasSpaceship {
519public:
520   int x;
521   bool operator==(const HasSpaceship&) const = default;
522   std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523};
524
525bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526   return a < b;
527}
528</pre>
529</td>
530<td>
5311 match found.
532
533<pre>
534   return a < b;
535          ^~~~~
536</pre>
537
538</td>
539<td>
540No match found.
541</td>
542</tr>
543</table>
544
545<!-- ======================================================================= -->
546<h2 id="decl-matchers">Node Matchers</h2>
547<!-- ======================================================================= -->
548
549<p>Node matchers are at the core of matcher expressions - they specify the type
550of node that is expected. Every match expression starts with a node matcher,
551which can then be further refined with a narrowing or traversal matcher. All
552traversal matchers take node matchers as their arguments.</p>
553
554<p>For convenience, all node matchers take an arbitrary number of arguments
555and implicitly act as allOf matchers.</p>
556
557<p>Node matchers are the only matchers that support the bind("id") call to
558bind the matched node to the given string, to be later retrieved from the
559match callback.</p>
560
561<p>It is important to remember that the arguments to node matchers are
562predicates on the same node, just with additional information about the type.
563This is often useful to make matcher expression more readable by inlining bind
564calls into redundant node matchers inside another node matcher:
565<pre>
566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567// the same node.
568recordDecl(decl().bind("id"), hasName("::MyClass"))
569</pre>
570</p>
571
572<table>
573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574<!-- START_DECL_MATCHERS -->
575
576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;...</td></tr>
577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes.
578Attributes may be attached with a variety of different syntaxes (including
579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
580and ``#pragma``s). They may also be implicit.
581
582Given
583  struct [[nodiscard]] Foo{};
584  void bar(int * __attribute__((nonnull)) );
585  __declspec(noinline) void baz();
586
587  #pragma omp declare simd
588  int min();
589attr()
590  matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line.
591</pre></td></tr>
592
593
594<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;...</td></tr>
595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
596
597Examples matches public virtual B.
598  class B {};
599  class C : public virtual B {};
600</pre></td></tr>
601
602
603<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
605
606Examples matches i(42).
607  class C {
608    C() : i(42) {}
609    int i;
610  };
611</pre></td></tr>
612
613
614<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
616
617Given
618  class C {
619  public:
620    int a;
621  };
622accessSpecDecl()
623  matches 'public:'
624</pre></td></tr>
625
626
627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;...</td></tr>
628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
629Example matches foo and bar
630(matcher = bindingDecl()
631
632  auto [foo, bar] = std::make_pair{42, 42};
633</pre></td></tr>
634
635
636<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
638
639Example matches the declaration of the nameless block printing an input
640integer.
641
642  myFunc(^(int p) {
643    printf("%d", p);
644  })
645</pre></td></tr>
646
647
648<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
650
651Example matches Z
652  template&lt;class T&gt; class Z {};
653</pre></td></tr>
654
655
656<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
658
659Given
660  template&lt;class T1, class T2, int I&gt;
661  class A {};
662
663  template&lt;class T, int I&gt;
664  class A&lt;T, T*, I&gt; {};
665
666  template&lt;&gt;
667  class A&lt;int, int, 1&gt; {};
668classTemplatePartialSpecializationDecl()
669  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
670</pre></td></tr>
671
672
673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
675
676Given
677  template&lt;typename T&gt; class A {};
678  template&lt;&gt; class A&lt;double&gt; {};
679  A&lt;int&gt; a;
680classTemplateSpecializationDecl()
681  matches the specializations A&lt;int&gt; and A&lt;double&gt;
682</pre></td></tr>
683
684
685<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
687
688Example matches Foo::Foo() and Foo::Foo(int)
689  class Foo {
690   public:
691    Foo();
692    Foo(int);
693    int DoSomething();
694  };
695</pre></td></tr>
696
697
698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
700
701Example matches the operator.
702  class X { operator int() const; };
703</pre></td></tr>
704
705
706<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
708
709Example matches the deduction guide.
710  template&lt;typename T&gt;
711  class X { X(int) };
712  X(int) -&gt; X&lt;int&gt;;
713</pre></td></tr>
714
715
716<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
718
719Example matches Foo::~Foo()
720  class Foo {
721   public:
722    virtual ~Foo();
723  };
724</pre></td></tr>
725
726
727<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
729
730Example matches y
731  class X { void y(); };
732</pre></td></tr>
733
734
735<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
737
738Example matches X, Z
739  class X;
740  template&lt;class T&gt; class Z {};
741</pre></td></tr>
742
743
744<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
746
747Examples matches X, C, and the friend declaration inside C;
748  void X();
749  class C {
750    friend X;
751  };
752</pre></td></tr>
753
754
755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
757and non-type template parameter declarations).
758
759Given
760  class X { int y; };
761declaratorDecl()
762  matches int y.
763</pre></td></tr>
764
765
766<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
768
769Examples matches the declaration node with foo and bar, but not
770number.
771(matcher = declStmt(has(decompositionDecl())))
772
773  int number = 42;
774  auto [foo, bar] = std::make_pair{42, 42};
775</pre></td></tr>
776
777
778<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
780
781Example matches A, B, C
782  enum X {
783    A, B, C
784  };
785</pre></td></tr>
786
787
788<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
790
791Example matches X
792  enum X {
793    A, B, C
794  };
795</pre></td></tr>
796
797
798<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
800
801Given
802  class X { int m; };
803fieldDecl()
804  matches 'm'.
805</pre></td></tr>
806
807
808<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
810
811Given
812  class X { friend void foo(); };
813friendDecl()
814  matches 'friend void foo()'.
815</pre></td></tr>
816
817
818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
820
821Example matches f
822  void f();
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
828
829Example matches f
830  template&lt;class T&gt; void f(T t) {}
831</pre></td></tr>
832
833
834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
836
837Given
838  struct X { struct { int a; }; };
839indirectFieldDecl()
840  matches 'a'.
841</pre></td></tr>
842
843
844<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
846
847Given
848  goto FOO;
849  FOO: bar();
850labelDecl()
851  matches 'FOO:'
852</pre></td></tr>
853
854
855<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
857
858Given
859  extern "C" {}
860linkageSpecDecl()
861  matches "extern "C" {}"
862</pre></td></tr>
863
864
865<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
867
868Example matches X, S, the anonymous union type, i, and U;
869  typedef int X;
870  struct S {
871    union {
872      int i;
873    } U;
874  };
875</pre></td></tr>
876
877
878<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
880
881Given
882  namespace test {}
883  namespace alias = ::test;
884namespaceAliasDecl()
885  matches "namespace alias" but not "namespace test"
886</pre></td></tr>
887
888
889<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
891
892Given
893  namespace {}
894  namespace test {}
895namespaceDecl()
896  matches "namespace {}" and "namespace test {}"
897</pre></td></tr>
898
899
900<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
902
903Given
904  template &lt;typename T, int N&gt; struct C {};
905nonTypeTemplateParmDecl()
906  matches 'N', but not 'T'.
907</pre></td></tr>
908
909
910<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
912
913Example matches Foo (Additions)
914  @interface Foo (Additions)
915  @end
916</pre></td></tr>
917
918
919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
921
922Example matches Foo (Additions)
923  @implementation Foo (Additions)
924  @end
925</pre></td></tr>
926
927
928<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
930
931Example matches Foo
932  @implementation Foo
933  @end
934</pre></td></tr>
935
936
937<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
939
940Example matches Foo
941  @interface Foo
942  @end
943</pre></td></tr>
944
945
946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
948
949Example matches _enabled
950  @implementation Foo {
951    BOOL _enabled;
952  }
953  @end
954</pre></td></tr>
955
956
957<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
959
960Example matches both declaration and definition of -[Foo method]
961  @interface Foo
962  - (void)method;
963  @end
964
965  @implementation Foo
966  - (void)method {}
967  @end
968</pre></td></tr>
969
970
971<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
973
974Example matches enabled
975  @interface Foo
976  @property BOOL enabled;
977  @end
978</pre></td></tr>
979
980
981<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
983
984Example matches FooDelegate
985  @protocol FooDelegate
986  @end
987</pre></td></tr>
988
989
990<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
992
993Given
994  void f(int x);
995parmVarDecl()
996  matches int x.
997</pre></td></tr>
998
999
1000<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
1002
1003Example matches X, Z, U, and S
1004  class X;
1005  template&lt;class T&gt; class Z {};
1006  struct S {};
1007  union U {};
1008</pre></td></tr>
1009
1010
1011<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
1013
1014Example:
1015  staticAssertExpr()
1016matches
1017  static_assert(sizeof(S) == sizeof(int))
1018in
1019  struct S {
1020    int x;
1021  };
1022  static_assert(sizeof(S) == sizeof(int));
1023</pre></td></tr>
1024
1025
1026<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1028
1029Example matches X, Z, U, S, E
1030  class X;
1031  template&lt;class T&gt; class Z {};
1032  struct S {};
1033  union U {};
1034  enum E {
1035    A, B, C
1036  };
1037</pre></td></tr>
1038
1039
1040<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1042
1043Given
1044  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
1045templateTypeParmDecl()
1046  matches 'Z', but not 'N'.
1047</pre></td></tr>
1048
1049
1050<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1052
1053Given
1054  template &lt;typename T, int N&gt; struct C {};
1055templateTypeParmDecl()
1056  matches 'T', but not 'N'.
1057</pre></td></tr>
1058
1059
1060<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1062
1063Given
1064  int X;
1065  namespace NS {
1066  int Y;
1067  }  // namespace NS
1068decl(hasDeclContext(translationUnitDecl()))
1069  matches "int X", but not "int Y".
1070</pre></td></tr>
1071
1072
1073<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1075
1076Given
1077  typedef int X;
1078  using Y = int;
1079typeAliasDecl()
1080  matches "using Y = int", but not "typedef int X"
1081</pre></td></tr>
1082
1083
1084<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1086
1087typeAliasTemplateDecl() matches
1088  template &lt;typename T&gt;
1089  using Y = X&lt;T&gt;;
1090</pre></td></tr>
1091
1092
1093<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1095
1096Given
1097  typedef int X;
1098  using Y = int;
1099typedefDecl()
1100  matches "typedef int X", but not "using Y = int"
1101</pre></td></tr>
1102
1103
1104<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1106
1107Given
1108  typedef int X;
1109  using Y = int;
1110typedefNameDecl()
1111  matches "typedef int X" and "using Y = int"
1112</pre></td></tr>
1113
1114
1115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1117typename.
1118
1119Given
1120  template &lt;typename T&gt;
1121  struct Base { typedef T Foo; };
1122
1123  template&lt;typename T&gt;
1124  struct S : private Base&lt;T&gt; {
1125    using typename Base&lt;T&gt;::Foo;
1126  };
1127unresolvedUsingTypenameDecl()
1128  matches using Base&lt;T&gt;::Foo </pre></td></tr>
1129
1130
1131<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1133
1134Given
1135  template&lt;typename X&gt;
1136  class C : private X {
1137    using X::x;
1138  };
1139unresolvedUsingValueDecl()
1140  matches using X::x </pre></td></tr>
1141
1142
1143<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1145
1146Given
1147  namespace X { int x; }
1148  using X::x;
1149usingDecl()
1150  matches using X::x </pre></td></tr>
1151
1152
1153<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1155
1156Given
1157  namespace X { int x; }
1158  using namespace X;
1159usingDirectiveDecl()
1160  matches using namespace X </pre></td></tr>
1161
1162
1163<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>&gt;...</td></tr>
1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations.
1165
1166Given
1167  namespace X { enum x {...}; }
1168  using enum X::x;
1169usingEnumDecl()
1170  matches using enum X::x </pre></td></tr>
1171
1172
1173<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1175
1176Example matches A, B, C and F
1177  enum X { A, B, C };
1178  void F();
1179</pre></td></tr>
1180
1181
1182<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1184
1185Note: this does not match declarations of member variables, which are
1186"field" declarations in Clang parlance.
1187
1188Example matches a
1189  int a;
1190</pre></td></tr>
1191
1192
1193<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('lambdaCapture0')"><a name="lambdaCapture0Anchor">lambdaCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;...</td></tr>
1194<tr><td colspan="4" class="doc" id="lambdaCapture0"><pre>Matches lambda captures.
1195
1196Given
1197  int main() {
1198    int x;
1199    auto f = [x](){};
1200    auto g = [x = 1](){};
1201  }
1202In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`,
1203`lambdaCapture()` matches `x` and `x=1`.
1204</pre></td></tr>
1205
1206
1207<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
1208<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1209</pre></td></tr>
1210
1211
1212<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
1213<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1214
1215Given
1216  namespace ns {
1217    struct A { static void f(); };
1218    void A::f() {}
1219    void g() { A::f(); }
1220  }
1221  ns::A a;
1222nestedNameSpecifier()
1223  matches "ns::" and both "A::"
1224</pre></td></tr>
1225
1226
1227<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
1228<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1229
1230Given
1231
1232  #pragma omp parallel default(none)
1233  #pragma omp parallel default(shared)
1234  #pragma omp parallel default(firstprivate)
1235  #pragma omp parallel
1236
1237``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1238``default(firstprivate)``
1239</pre></td></tr>
1240
1241
1242<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
1243<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1244</pre></td></tr>
1245
1246
1247<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
1248<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1249
1250Given
1251  FOO: bar();
1252  void *ptr = &amp;&amp;FOO;
1253  goto *bar;
1254addrLabelExpr()
1255  matches '&amp;&amp;FOO'
1256</pre></td></tr>
1257
1258
1259<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
1260<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1261
1262Given
1263  int i = a[1];
1264arraySubscriptExpr()
1265  matches "a[1]"
1266</pre></td></tr>
1267
1268
1269<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
1270<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1271
1272 int i = 100;
1273  __asm("mov al, 2");
1274asmStmt()
1275  matches '__asm("mov al, 2")'
1276</pre></td></tr>
1277
1278
1279<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
1280<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1281Example matches __atomic_load_n(ptr, 1)
1282  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1283</pre></td></tr>
1284
1285
1286<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
1287<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1288
1289Given
1290  @autoreleasepool {
1291    int x = 0;
1292  }
1293autoreleasePoolStmt(stmt()) matches the declaration of "x"
1294inside the autorelease pool.
1295</pre></td></tr>
1296
1297
1298<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
1299<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1300
1301Example matches a ?: b
1302  (a ?: b) + 42;
1303</pre></td></tr>
1304
1305
1306<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
1307<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1308
1309Example matches a || b
1310  !(a || b)
1311See also the binaryOperation() matcher for more-general matching.
1312</pre></td></tr>
1313
1314
1315<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
1316<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1317
1318Example: matches "^{}":
1319  void f() { ^{}(); }
1320</pre></td></tr>
1321
1322
1323<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
1324<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1325
1326Given
1327  while (true) { break; }
1328breakStmt()
1329  matches 'break'
1330</pre></td></tr>
1331
1332
1333<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
1334<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1335
1336Example: Matches (int) 2.2f in
1337  int i = (int) 2.2f;
1338</pre></td></tr>
1339
1340
1341<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
1342<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1343
1344Example matches x.y() and y()
1345  X x;
1346  x.y();
1347  y();
1348</pre></td></tr>
1349
1350
1351<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
1352<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1353
1354Given
1355  switch(a) { case 42: break; default: break; }
1356caseStmt()
1357  matches 'case 42:'.
1358</pre></td></tr>
1359
1360
1361<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
1362<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1363
1364Example: castExpr() matches each of the following:
1365  (int) 3;
1366  const_cast&lt;Expr *&gt;(SubExpr);
1367  char c = 0;
1368but does not match
1369  int i = (0);
1370  int k = 0;
1371</pre></td></tr>
1372
1373
1374<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
1375<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1376
1377Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1378though.
1379
1380Example matches 'a', L'a'
1381  char ch = 'a';
1382  wchar_t chw = L'a';
1383</pre></td></tr>
1384
1385
1386<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
1387<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1388</pre></td></tr>
1389
1390
1391<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>&gt;...</td></tr>
1392<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1393
1394Given
1395  co_await 1;
1396coawaitExpr()
1397  matches 'co_await 1'
1398</pre></td></tr>
1399
1400
1401<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
1402<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1403
1404Example match: {1}, (1, 2)
1405  int array[4] = {1};
1406  vector int myvec = (vector int)(1, 2);
1407</pre></td></tr>
1408
1409
1410<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
1411<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1412
1413Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1414  for (;;) {{}}
1415</pre></td></tr>
1416
1417
1418<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
1419<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1420
1421Example matches a ? b : c
1422  (a ? b : c) + 42
1423</pre></td></tr>
1424
1425
1426<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
1427<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1428
1429Example matches the constant in the case statement:
1430    (matcher = constantExpr())
1431  switch (a) {
1432  case 37: break;
1433  }
1434</pre></td></tr>
1435
1436
1437<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
1438<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1439
1440Given
1441  while (true) { continue; }
1442continueStmt()
1443  matches 'continue'
1444</pre></td></tr>
1445
1446
1447<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>&gt;...</td></tr>
1448<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1449
1450Given
1451  while (true) { co_return; }
1452coreturnStmt()
1453  matches 'co_return'
1454</pre></td></tr>
1455
1456
1457<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>&gt;...</td></tr>
1458<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1459
1460Given
1461  co_yield 1;
1462coyieldExpr()
1463  matches 'co_yield 1'
1464</pre></td></tr>
1465
1466
1467<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
1468<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1469
1470Example matches,
1471  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
1472</pre></td></tr>
1473
1474
1475<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
1476<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1477
1478Example matches FunctionTakesString(GetStringByValue())
1479    (matcher = cxxBindTemporaryExpr())
1480  FunctionTakesString(GetStringByValue());
1481  FunctionTakesStringByPointer(GetStringPointer());
1482</pre></td></tr>
1483
1484
1485<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
1486<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1487
1488Example matches true
1489  true
1490</pre></td></tr>
1491
1492
1493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
1494<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1495
1496  try {} catch(int i) {}
1497cxxCatchStmt()
1498  matches 'catch(int i)'
1499</pre></td></tr>
1500
1501
1502<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
1503<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1504
1505Example: Matches const_cast&lt;int*&gt;(&amp;r) in
1506  int n = 42;
1507  const int &amp;r(n);
1508  int* p = const_cast&lt;int*&gt;(&amp;r);
1509</pre></td></tr>
1510
1511
1512<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
1513<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1514
1515Example matches string(ptr, n) and ptr within arguments of f
1516    (matcher = cxxConstructExpr())
1517  void f(const string &amp;a, const string &amp;b);
1518  char *ptr;
1519  int n;
1520  f(string(ptr, n), ptr);
1521</pre></td></tr>
1522
1523
1524<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
1525<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1526
1527Example matches the CXXDefaultArgExpr placeholder inserted for the
1528    default value of the second parameter in the call expression f(42)
1529    (matcher = cxxDefaultArgExpr())
1530  void f(int x, int y = 0);
1531  f(42);
1532</pre></td></tr>
1533
1534
1535<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
1536<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1537
1538Given
1539  delete X;
1540cxxDeleteExpr()
1541  matches 'delete X'.
1542</pre></td></tr>
1543
1544
1545<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
1546<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1547resolved because the base expression or the member name was dependent.
1548
1549Given
1550  template &lt;class T&gt; void f() { T t; t.g(); }
1551cxxDependentScopeMemberExpr()
1552  matches t.g
1553</pre></td></tr>
1554
1555
1556<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
1557<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1558
1559Example:
1560  cxxDynamicCastExpr()
1561matches
1562  dynamic_cast&lt;D*&gt;(&amp;b);
1563in
1564  struct B { virtual ~B() {} }; struct D : B {};
1565  B b;
1566  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1567</pre></td></tr>
1568
1569
1570<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
1571<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1572
1573cxxForRangeStmt() matches 'for (auto a : i)'
1574  int i[] =  {1, 2, 3}; for (auto a : i);
1575  for(int j = 0; j &lt; 5; ++j);
1576</pre></td></tr>
1577
1578
1579<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
1580<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1581
1582Example: Matches Foo(bar);
1583  Foo f = bar;
1584  Foo g = (Foo) bar;
1585  Foo h = Foo(bar);
1586</pre></td></tr>
1587
1588
1589<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
1590<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1591
1592Example matches x.y()
1593  X x;
1594  x.y();
1595</pre></td></tr>
1596
1597
1598<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
1599<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1600
1601Given
1602  new X;
1603cxxNewExpr()
1604  matches 'new X'.
1605</pre></td></tr>
1606
1607
1608<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>&gt;...</td></tr>
1609<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1610
1611Given
1612  bool a() noexcept;
1613  bool b() noexcept(true);
1614  bool c() noexcept(false);
1615  bool d() noexcept(noexcept(a()));
1616  bool e = noexcept(b()) || noexcept(c());
1617cxxNoexceptExpr()
1618  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1619  doesn't match the noexcept specifier in the declarations a, b, c or d.
1620</pre></td></tr>
1621
1622
1623<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
1624<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1625</pre></td></tr>
1626
1627
1628<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
1629<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1630
1631Note that if an operator isn't overloaded, it won't match. Instead, use
1632binaryOperator matcher.
1633Currently it does not match operators such as new delete.
1634FIXME: figure out why these do not match?
1635
1636Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1637    (matcher = cxxOperatorCallExpr())
1638  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1639  ostream &amp;o; int b = 1, c = 1;
1640  o &lt;&lt; b &lt;&lt; c;
1641See also the binaryOperation() matcher for more-general matching of binary
1642uses of this AST node.
1643</pre></td></tr>
1644
1645
1646<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
1647<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1648
1649Either the source expression or the destination type can be matched
1650using has(), but hasDestinationType() is more specific and can be
1651more readable.
1652
1653Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1654  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1655</pre></td></tr>
1656
1657
1658<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;...</td></tr>
1659<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1660
1661Example matches use of "&lt;":
1662  #include &lt;compare&gt;
1663  struct HasSpaceshipMem {
1664    int a;
1665    constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
1666  };
1667  void compare() {
1668    HasSpaceshipMem hs1, hs2;
1669    if (hs1 &lt; hs2)
1670        return;
1671  }
1672See also the binaryOperation() matcher for more-general matching
1673of this AST node.
1674</pre></td></tr>
1675
1676
1677<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
1678<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1679
1680See also: hasDestinationType
1681See also: reinterpretCast
1682
1683Example:
1684  cxxStaticCastExpr()
1685matches
1686  static_cast&lt;long&gt;(8)
1687in
1688  long eight(static_cast&lt;long&gt;(8));
1689</pre></td></tr>
1690
1691
1692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
1693<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1694
1695Given
1696  std::vector&lt;int&gt; a({ 1, 2, 3 });
1697  std::vector&lt;int&gt; b = { 4, 5 };
1698  int c[] = { 6, 7 };
1699  std::pair&lt;int, int&gt; d = { 8, 9 };
1700cxxStdInitializerListExpr()
1701  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1702</pre></td></tr>
1703
1704
1705<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1706<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1707
1708Example: Matches Foo(bar, bar)
1709  Foo h = Foo(bar, bar);
1710</pre></td></tr>
1711
1712
1713<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1714<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1715
1716Example matches the implicit this expression in "return i".
1717    (matcher = cxxThisExpr())
1718struct foo {
1719  int i;
1720  int f() { return i; }
1721};
1722</pre></td></tr>
1723
1724
1725<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1726<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1727
1728  try { throw 5; } catch(int i) {}
1729cxxThrowExpr()
1730  matches 'throw 5'
1731</pre></td></tr>
1732
1733
1734<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1735<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1736
1737  try {} catch(int i) {}
1738cxxTryStmt()
1739  matches 'try {}'
1740</pre></td></tr>
1741
1742
1743<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1744<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1745
1746Example matches T(t) in return statement of f
1747    (matcher = cxxUnresolvedConstructExpr())
1748  template &lt;typename T&gt;
1749  void f(const T&amp; t) { return T(t); }
1750</pre></td></tr>
1751
1752
1753<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
1754<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1755
1756Example matches x in if (x)
1757  bool x;
1758  if (x) {}
1759</pre></td></tr>
1760
1761
1762<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
1763<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1764
1765Given
1766  int a;
1767declStmt()
1768  matches 'int a'.
1769</pre></td></tr>
1770
1771
1772<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
1773<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1774
1775Given
1776  switch(a) { case 42: break; default: break; }
1777defaultStmt()
1778  matches 'default:'.
1779</pre></td></tr>
1780
1781
1782<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>&gt;...</td></tr>
1783<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1784</pre></td></tr>
1785
1786
1787<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1788<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1789
1790Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1791  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1792</pre></td></tr>
1793
1794
1795<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
1796<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1797
1798Given
1799  do {} while (true);
1800doStmt()
1801  matches 'do {} while(true)'
1802</pre></td></tr>
1803
1804
1805<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
1806<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1807
1808Matches any cast expression written in user code, whether it be a
1809C-style cast, a functional-style cast, or a keyword cast.
1810
1811Does not match implicit conversions.
1812
1813Note: the name "explicitCast" is chosen to match Clang's terminology, as
1814Clang uses the term "cast" to apply to implicit conversions as well as to
1815actual cast expressions.
1816
1817See also: hasDestinationType.
1818
1819Example: matches all five of the casts in
1820  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1821but does not match the implicit conversion in
1822  long ell = 42;
1823</pre></td></tr>
1824
1825
1826<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
1827<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1828
1829Example matches x()
1830  void f() { x(); }
1831</pre></td></tr>
1832
1833
1834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
1835<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1836of the sub-expression's evaluation.
1837
1838Example matches std::string()
1839  const std::string str = std::string();
1840</pre></td></tr>
1841
1842
1843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>&gt;...</td></tr>
1844<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1845</pre></td></tr>
1846
1847
1848<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
1849<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
18501.0, 1.0f, 1.0L and 1e10.
1851
1852Does not match implicit conversions such as
1853  float a = 10;
1854</pre></td></tr>
1855
1856
1857<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
1858<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1859
1860Example matches 'for (;;) {}'
1861  for (;;) {}
1862  int i[] =  {1, 2, 3}; for (auto a : i);
1863</pre></td></tr>
1864
1865
1866<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>&gt;...</td></tr>
1867<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1868</pre></td></tr>
1869
1870
1871<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1872<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1873</pre></td></tr>
1874
1875
1876<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
1877<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1878
1879Given
1880  goto FOO;
1881  FOO: bar();
1882gotoStmt()
1883  matches 'goto FOO'
1884</pre></td></tr>
1885
1886
1887<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
1888<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1889
1890Example matches 'if (x) {}'
1891  if (x) {}
1892</pre></td></tr>
1893
1894
1895<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
1896<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1897point literals e.g.: 1i, 1.0i
1898</pre></td></tr>
1899
1900
1901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
1902<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1903
1904This matches many different places, including function call return value
1905eliding, as well as any type conversions.
1906</pre></td></tr>
1907
1908
1909<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1910<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1911
1912Given
1913  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1914implicitValueInitExpr()
1915  matches "[0].y" (implicitly)
1916</pre></td></tr>
1917
1918
1919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
1920<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1921
1922Given
1923  int a[] = { 1, 2 };
1924  struct B { int x, y; };
1925  B b = { 5, 6 };
1926initListExpr()
1927  matches "{ 1, 2 }" and "{ 5, 6 }"
1928</pre></td></tr>
1929
1930
1931<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
1932<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
19331, 1L, 0x1 and 1U.
1934
1935Does not match character-encoded integers such as L'a'.
1936</pre></td></tr>
1937
1938
1939<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
1940<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1941
1942Given
1943  goto FOO;
1944  FOO: bar();
1945labelStmt()
1946  matches 'FOO:'
1947</pre></td></tr>
1948
1949
1950<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
1951<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1952
1953Example matches [&amp;](){return 5;}
1954  [&amp;](){return 5;}
1955</pre></td></tr>
1956
1957
1958<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
1959<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1960
1961Example: Given
1962  struct T {void func();};
1963  T f();
1964  void g(T);
1965materializeTemporaryExpr() matches 'f()' in these statements
1966  T u(f());
1967  g(f());
1968  f().func();
1969but does not match
1970  f();
1971</pre></td></tr>
1972
1973
1974<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
1975<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1976
1977Given
1978  class Y {
1979    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1980    int a; static int b;
1981  };
1982memberExpr()
1983  matches this-&gt;x, x, y.x, a, this-&gt;b
1984</pre></td></tr>
1985
1986
1987<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
1988<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1989
1990  foo();;
1991nullStmt()
1992  matches the second ';'
1993</pre></td></tr>
1994
1995
1996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1997<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1998
1999Example matches @catch
2000  @try {}
2001  @catch (...) {}
2002</pre></td></tr>
2003
2004
2005<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
2006<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
2007
2008Example matches @finally
2009  @try {}
2010  @finally {}
2011</pre></td></tr>
2012
2013
2014<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
2015<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
2016
2017Example: matches "a" in "init" method:
2018@implementation A {
2019  NSString *a;
2020}
2021- (void) init {
2022  a = @"hello";
2023}
2024</pre></td></tr>
2025
2026
2027<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
2028<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
2029
2030The innermost message send invokes the "alloc" class method on the
2031NSString class, while the outermost message send invokes the
2032"initWithString" instance method on the object returned from
2033NSString's "alloc". This matcher should match both message sends.
2034  [[NSString alloc] initWithString:@"Hello"]
2035</pre></td></tr>
2036
2037
2038<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
2039<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
2040
2041Example matches @throw obj;
2042</pre></td></tr>
2043
2044
2045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
2046<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2047
2048Example matches @try
2049  @try {}
2050  @catch (...) {}
2051</pre></td></tr>
2052
2053
2054<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
2055<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2056
2057Given
2058
2059  #pragma omp parallel
2060  #pragma omp parallel default(none)
2061  #pragma omp taskyield
2062
2063``ompExecutableDirective()`` matches ``omp parallel``,
2064``omp parallel default(none)`` and ``omp taskyield``.
2065</pre></td></tr>
2066
2067
2068<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
2069<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2070to reference another expressions and can be met
2071in BinaryConditionalOperators, for example.
2072
2073Example matches 'a'
2074  (a ?: c) + 42;
2075</pre></td></tr>
2076
2077
2078<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
2079<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2080
2081Example matches (foo() + 1)
2082  int foo() { return 1; }
2083  int a = (foo() + 1);
2084</pre></td></tr>
2085
2086
2087<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
2088<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2089ParenListExprs don't have a predefined type and are used for late parsing.
2090In the final AST, they can be met in template declarations.
2091
2092Given
2093  template&lt;typename T&gt; class X {
2094    void f() {
2095      X x(*this);
2096      int a = 0, b = 1; int i = (a, b);
2097    }
2098  };
2099parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2100has a predefined type and is a ParenExpr, not a ParenListExpr.
2101</pre></td></tr>
2102
2103
2104<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
2105<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2106
2107Example: Matches __func__
2108  printf("%s", __func__);
2109</pre></td></tr>
2110
2111
2112<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
2113<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2114
2115Given
2116  return 1;
2117returnStmt()
2118  matches 'return 1'
2119</pre></td></tr>
2120
2121
2122<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
2123<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2124
2125Given
2126  { ++a; }
2127stmt()
2128  matches both the compound statement '{ ++a; }' and '++a'.
2129</pre></td></tr>
2130
2131
2132<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
2133<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2134
2135Example match: ({ int X = 4; X; })
2136  int C = ({ int X = 4; X; });
2137</pre></td></tr>
2138
2139
2140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
2141<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2142
2143Example matches "abcd", L"abcd"
2144  char *s = "abcd";
2145  wchar_t *ws = L"abcd";
2146</pre></td></tr>
2147
2148
2149<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
2150<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2151
2152Given
2153  template &lt;int N&gt;
2154  struct A { static const int n = N; };
2155  struct B : public A&lt;42&gt; {};
2156substNonTypeTemplateParmExpr()
2157  matches "N" in the right-hand side of "static const int n = N;"
2158</pre></td></tr>
2159
2160
2161<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
2162<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2163
2164Given
2165  switch(a) { case 42: break; default: break; }
2166switchCase()
2167  matches 'case 42:' and 'default:'.
2168</pre></td></tr>
2169
2170
2171<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
2172<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2173
2174Given
2175  switch(a) { case 42: break; default: break; }
2176switchStmt()
2177  matches 'switch(a)'.
2178</pre></td></tr>
2179
2180
2181<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
2182<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2183
2184Given
2185  Foo x = bar;
2186  int y = sizeof(x) + alignof(x);
2187unaryExprOrTypeTraitExpr()
2188  matches sizeof(x) and alignof(x)
2189</pre></td></tr>
2190
2191
2192<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
2193<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2194
2195Example matches !a
2196  !a || b
2197</pre></td></tr>
2198
2199
2200<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
2201<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2202but could not be resolved to a specific declaration.
2203
2204Given
2205  template&lt;typename T&gt;
2206  T foo() { T a; return a; }
2207  template&lt;typename T&gt;
2208  void bar() {
2209    foo&lt;T&gt;();
2210  }
2211unresolvedLookupExpr()
2212  matches foo&lt;T&gt;() </pre></td></tr>
2213
2214
2215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
2216<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2217
2218Given
2219  struct X {
2220    template &lt;class T&gt; void f();
2221    void g();
2222  };
2223  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
2224unresolvedMemberExpr()
2225  matches x.f&lt;T&gt;
2226</pre></td></tr>
2227
2228
2229<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
2230<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2231
2232Example match: "foo"_suffix
2233</pre></td></tr>
2234
2235
2236<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
2237<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2238
2239Given
2240  while (true) {}
2241whileStmt()
2242  matches 'while (true) {}'.
2243</pre></td></tr>
2244
2245
2246<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;...</td></tr>
2247<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2248
2249Given
2250  template &lt;typename T&gt; struct C {};
2251  C&lt;int&gt; c;
2252templateArgumentLoc()
2253  matches 'int' in C&lt;int&gt;.
2254</pre></td></tr>
2255
2256
2257<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
2258<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2259
2260Given
2261  template &lt;typename T&gt; struct C {};
2262  C&lt;int&gt; c;
2263templateArgument()
2264  matches 'int' in C&lt;int&gt;.
2265</pre></td></tr>
2266
2267
2268<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
2269<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2270
2271Given
2272  template &lt;typename T&gt; class X { };
2273  X&lt;int&gt; xi;
2274templateName()
2275  matches 'X' in X&lt;int&gt;.
2276</pre></td></tr>
2277
2278
2279<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
2280<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s.
2281
2282Given
2283  struct s {};
2284  struct s ss;
2285elaboratedTypeLoc()
2286  matches the `TypeLoc` of the variable declaration of `ss`.
2287</pre></td></tr>
2288
2289
2290<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
2291<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
2292
2293Given
2294  int* x;
2295pointerTypeLoc()
2296  matches `int*`.
2297</pre></td></tr>
2298
2299
2300<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('qualifiedTypeLoc0')"><a name="qualifiedTypeLoc0Anchor">qualifiedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;...</td></tr>
2301<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST.
2302
2303Given
2304  const int x = 0;
2305qualifiedTypeLoc()
2306  matches `const int`.
2307</pre></td></tr>
2308
2309
2310<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
2311<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s.
2312
2313Given
2314  int x = 3;
2315  int&amp; l = x;
2316  int&amp;&amp; r = 3;
2317referenceTypeLoc()
2318  matches `int&amp;` and `int&amp;&amp;`.
2319</pre></td></tr>
2320
2321
2322<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
2323<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s.
2324
2325Given
2326  template &lt;typename T&gt; class C {};
2327  C&lt;char&gt; var;
2328varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
2329  matches `C&lt;char&gt; var`.
2330</pre></td></tr>
2331
2332
2333<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
2334<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2335</pre></td></tr>
2336
2337
2338<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
2339<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2340
2341Given
2342  int a[] = { 2, 3 };
2343  int b[4];
2344  void f() { int c[a[0]]; }
2345arrayType()
2346  matches "int a[]", "int b[4]" and "int c[a[0]]";
2347</pre></td></tr>
2348
2349
2350<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
2351<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2352
2353Given
2354  _Atomic(int) i;
2355atomicType()
2356  matches "_Atomic(int) i"
2357</pre></td></tr>
2358
2359
2360<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
2361<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2362
2363Given:
2364  auto n = 4;
2365  int v[] = { 2, 3 }
2366  for (auto i : v) { }
2367autoType()
2368  matches "auto n" and "auto i"
2369</pre></td></tr>
2370
2371
2372<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
2373<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2374"void (^)(int)".
2375
2376The pointee is always required to be a FunctionType.
2377</pre></td></tr>
2378
2379
2380<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
2381<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2382
2383Given
2384  struct A {};
2385  A a;
2386  int b;
2387  float c;
2388  bool d;
2389builtinType()
2390  matches "int b", "float c" and "bool d"
2391</pre></td></tr>
2392
2393
2394<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
2395<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2396
2397Given
2398  _Complex float f;
2399complexType()
2400  matches "_Complex float f"
2401</pre></td></tr>
2402
2403
2404<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
2405<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2406
2407Given
2408  void() {
2409    int a[2];
2410    int b[] = { 2, 3 };
2411    int c[b[0]];
2412  }
2413constantArrayType()
2414  matches "int a[2]"
2415</pre></td></tr>
2416
2417
2418<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
2419<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2420Example matches i[] in declaration of f.
2421    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2422Example matches i[1].
2423    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2424  void f(int i[]) {
2425    i[1] = 0;
2426  }
2427</pre></td></tr>
2428
2429
2430<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
2431<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
2432
2433Given:
2434  short i = 1;
2435  int j = 42;
2436  decltype(i + j) result = i + j;
2437decltypeType()
2438  matches "decltype(i + j)"
2439</pre></td></tr>
2440
2441
2442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
2443<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2444template types.
2445
2446Given
2447  template &lt;typename T&gt;
2448  class C { public: C(T); };
2449
2450  C c(123);
2451deducedTemplateSpecializationType() matches the type in the declaration
2452of the variable c.
2453</pre></td></tr>
2454
2455
2456<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
2457<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2458
2459Given
2460  template&lt;typename T, int Size&gt;
2461  class array {
2462    T data[Size];
2463  };
2464dependentSizedArrayType
2465  matches "T data[Size]"
2466</pre></td></tr>
2467
2468
2469<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
2470<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2471qualified name.
2472
2473Given
2474  namespace N {
2475    namespace M {
2476      class D {};
2477    }
2478  }
2479  class C {};
2480
2481  class C c;
2482  N::M::D d;
2483
2484elaboratedType() matches the type of the variable declarations of both
2485c and d.
2486</pre></td></tr>
2487
2488
2489<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
2490<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2491
2492Given
2493  enum C { Green };
2494  enum class S { Red };
2495
2496  C c;
2497  S s;
2498
2499enumType() matches the type of the variable declarations of both c and
2500s.
2501</pre></td></tr>
2502
2503
2504<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
2505<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2506
2507Given
2508  int (*f)(int);
2509  void g();
2510functionProtoType()
2511  matches "int (*f)(int)" and the type of "g" in C++ mode.
2512  In C mode, "g" is not matched because it does not contain a prototype.
2513</pre></td></tr>
2514
2515
2516<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
2517<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2518
2519Given
2520  int (*f)(int);
2521  void g();
2522functionType()
2523  matches "int (*f)(int)" and the type of "g".
2524</pre></td></tr>
2525
2526
2527<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
2528<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2529
2530Given
2531  int a[] = { 2, 3 };
2532  int b[42];
2533  void f(int c[]) { int d[a[0]]; };
2534incompleteArrayType()
2535  matches "int a[]" and "int c[]"
2536</pre></td></tr>
2537
2538
2539<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
2540<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2541
2542Example matches S s, but not S&lt;T&gt; s.
2543    (matcher = parmVarDecl(hasType(injectedClassNameType())))
2544  template &lt;typename T&gt; struct S {
2545    void f(S s);
2546    void g(S&lt;T&gt; s);
2547  };
2548</pre></td></tr>
2549
2550
2551<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
2552<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2553
2554Given:
2555  int *a;
2556  int &amp;b = *a;
2557  int &amp;&amp;c = 1;
2558  auto &amp;d = b;
2559  auto &amp;&amp;e = c;
2560  auto &amp;&amp;f = 2;
2561  int g = 5;
2562
2563lValueReferenceType() matches the types of b, d, and e. e is
2564matched since the type is deduced as int&amp; by reference collapsing rules.
2565</pre></td></tr>
2566
2567
2568<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
2569<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2570Given
2571  struct A { int i; }
2572  A::* ptr = A::i;
2573memberPointerType()
2574  matches "A::* ptr"
2575</pre></td></tr>
2576
2577
2578<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
2579<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2580a pointer type, despite being syntactically similar.
2581
2582Given
2583  int *a;
2584
2585  @interface Foo
2586  @end
2587  Foo *f;
2588pointerType()
2589  matches "Foo *f", but does not match "int *a".
2590</pre></td></tr>
2591
2592
2593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
2594<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2595
2596Given
2597  int (*ptr_to_array)[4];
2598  int *array_of_ptrs[4];
2599
2600varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2601array_of_ptrs.
2602</pre></td></tr>
2603
2604
2605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
2606<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2607types.
2608
2609Given
2610  int *a;
2611  int &amp;b = *a;
2612  int c = 5;
2613
2614  @interface Foo
2615  @end
2616  Foo *f;
2617pointerType()
2618  matches "int *a", but does not match "Foo *f".
2619</pre></td></tr>
2620
2621
2622<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
2623<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2624
2625Given:
2626  int *a;
2627  int &amp;b = *a;
2628  int &amp;&amp;c = 1;
2629  auto &amp;d = b;
2630  auto &amp;&amp;e = c;
2631  auto &amp;&amp;f = 2;
2632  int g = 5;
2633
2634rValueReferenceType() matches the types of c and f. e is not
2635matched as it is deduced to int&amp; by reference collapsing rules.
2636</pre></td></tr>
2637
2638
2639<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
2640<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2641
2642Given
2643  class C {};
2644  struct S {};
2645
2646  C c;
2647  S s;
2648
2649recordType() matches the type of the variable declarations of both c
2650and s.
2651</pre></td></tr>
2652
2653
2654<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
2655<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2656
2657Given
2658  int *a;
2659  int &amp;b = *a;
2660  int &amp;&amp;c = 1;
2661  auto &amp;d = b;
2662  auto &amp;&amp;e = c;
2663  auto &amp;&amp;f = 2;
2664  int g = 5;
2665
2666referenceType() matches the types of b, c, d, e, and f.
2667</pre></td></tr>
2668
2669
2670<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
2671<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2672template type parameter.
2673
2674Given
2675  template &lt;typename T&gt;
2676  void F(T t) {
2677    int i = 1 + t;
2678  }
2679
2680substTemplateTypeParmType() matches the type of 't' but not '1'
2681</pre></td></tr>
2682
2683
2684<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
2685<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2686
2687Given
2688  enum E {};
2689  class C {};
2690
2691  E e;
2692  C c;
2693
2694tagType() matches the type of the variable declarations of both e
2695and c.
2696</pre></td></tr>
2697
2698
2699<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
2700<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2701
2702Given
2703  template &lt;typename T&gt;
2704  class C { };
2705
2706  template class C&lt;int&gt;;  // A
2707  C&lt;char&gt; var;            // B
2708
2709templateSpecializationType() matches the type of the explicit
2710instantiation in A and the type of the variable declaration in B.
2711</pre></td></tr>
2712
2713
2714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
2715<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2716
2717Example matches T, but not int.
2718    (matcher = templateTypeParmType())
2719  template &lt;typename T&gt; void f(int i);
2720</pre></td></tr>
2721
2722
2723<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
2724<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2725</pre></td></tr>
2726
2727
2728<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
2729<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2730
2731Given
2732  typedef int X;
2733typedefType()
2734  matches "typedef int X"
2735</pre></td></tr>
2736
2737
2738<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
2739<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2740
2741Given:
2742  typedef __underlying_type(T) type;
2743unaryTransformType()
2744  matches "__underlying_type(T)"
2745</pre></td></tr>
2746
2747
2748<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
2749<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2750integer-constant-expression.
2751
2752Given
2753  void f() {
2754    int a[] = { 2, 3 }
2755    int b[42];
2756    int c[a[0]];
2757  }
2758variableArrayType()
2759  matches "int c[a[0]]"
2760</pre></td></tr>
2761
2762<!--END_DECL_MATCHERS -->
2763</table>
2764
2765<!-- ======================================================================= -->
2766<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2767<!-- ======================================================================= -->
2768
2769<p>Narrowing matchers match certain attributes on the current node, thus
2770narrowing down the set of nodes of the current type to match on.</p>
2771
2772<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2773which allow users to create more powerful match expressions.</p>
2774
2775<table>
2776<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2777<!-- START_NARROWING_MATCHERS -->
2778
2779<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2780<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2781
2782Usable as: Any Matcher
2783</pre></td></tr>
2784
2785
2786<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2787<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2788
2789Usable as: Any Matcher
2790</pre></td></tr>
2791
2792
2793<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2794<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2795
2796Useful when another matcher requires a child matcher, but there's no
2797additional constraint. This will often be used with an explicit conversion
2798to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2799
2800Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2801"int* p" and "void f()" in
2802  int* p;
2803  void f();
2804
2805Usable as: Any Matcher
2806</pre></td></tr>
2807
2808
2809<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2810<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2811
2812Given
2813  if (true);
2814  for (; true; );
2815with the matcher
2816  mapAnyOf(ifStmt, forStmt).with(
2817    hasCondition(cxxBoolLiteralExpr(equals(true)))
2818    ).bind("trueCond")
2819matches the if and the for. It is equivalent to:
2820  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2821  anyOf(
2822    ifStmt(trueCond).bind("trueCond"),
2823    forStmt(trueCond).bind("trueCond")
2824    );
2825
2826The with() chain-call accepts zero or more matchers which are combined
2827as-if with allOf() in each of the node matchers.
2828Usable as: Any Matcher
2829</pre></td></tr>
2830
2831
2832<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2833<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2834
2835Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2836  class X {};
2837  class Y {};
2838
2839Usable as: Any Matcher
2840</pre></td></tr>
2841
2842
2843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('isImplicit1')"><a name="isImplicit1Anchor">isImplicit</a></td><td></td></tr>
2844<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
2845implicit default/copy constructors).
2846</pre></td></tr>
2847
2848
2849<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2850<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2851specified names.
2852
2853   hasAnyOperatorName("+", "-")
2854 Is equivalent to
2855   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2856</pre></td></tr>
2857
2858
2859<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2860<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2861unary).
2862
2863Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2864  !(a || b)
2865</pre></td></tr>
2866
2867
2868<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2869<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2870
2871Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2872  if (a == b)
2873    a += b;
2874
2875Example 2: matches s1 = s2
2876           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2877  struct S { S&amp; operator=(const S&amp;); };
2878  void x() { S s1, s2; s1 = s2; }
2879</pre></td></tr>
2880
2881
2882<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2883<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2884
2885Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2886  if (a == b)
2887    a += b;
2888
2889Example 2: matches s1 &lt; s2
2890           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2891  struct S { bool operator&lt;(const S&amp; other); };
2892  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2893</pre></td></tr>
2894
2895
2896<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
2897<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2898inheritance.
2899
2900Examples:
2901  class C {
2902  public:    int a;
2903  protected: int b;
2904  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2905  };
2906
2907  struct Base {};
2908  struct Derived1 : private Base {}; // matches 'Base'
2909  class Derived2 : Base {}; // matches 'Base'
2910</pre></td></tr>
2911
2912
2913<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
2914<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2915protected inheritance.
2916
2917Examples:
2918  class C {
2919  public:    int a;
2920  protected: int b; // fieldDecl(isProtected()) matches 'b'
2921  private:   int c;
2922  };
2923
2924  class Base {};
2925  class Derived : protected Base {}; // matches 'Base'
2926</pre></td></tr>
2927
2928
2929<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
2930<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2931inheritance.
2932
2933Examples:
2934  class C {
2935  public:    int a; // fieldDecl(isPublic()) matches 'a'
2936  protected: int b;
2937  private:   int c;
2938  };
2939
2940  class Base {};
2941  class Derived1 : public Base {}; // matches 'Base'
2942  struct Derived2 : Base {}; // matches 'Base'
2943</pre></td></tr>
2944
2945
2946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
2947<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2948virtual inheritance.
2949
2950Example:
2951  class A {
2952   public:
2953    virtual void x(); // matches x
2954  };
2955
2956Example:
2957  class Base {};
2958  class DirectlyDerived : virtual Base {}; // matches Base
2959  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2960
2961Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2962</pre></td></tr>
2963
2964
2965<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2966<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2967
2968
2969<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2970<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2971
2972Given
2973  f('false, 3.14, 42);
2974characterLiteral(equals(0))
2975  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2976  match false
2977floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2978  match 3.14
2979integerLiteral(equals(42))
2980  matches 42
2981
2982Note that you cannot directly match a negative numeric literal because the
2983minus sign is not part of the literal: It is a unary operator whose operand
2984is the positive numeric literal. Instead, you must use a unaryOperator()
2985matcher to match the minus sign:
2986
2987unaryOperator(hasOperatorName("-"),
2988              hasUnaryOperand(integerLiteral(equals(13))))
2989
2990Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2991           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2992</pre></td></tr>
2993
2994
2995<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2996<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2997
2998
2999<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
3000<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
3001
3002
3003<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
3004<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
3005
3006Given
3007  try {
3008    // ...
3009  } catch (int) {
3010    // ...
3011  } catch (...) {
3012    // ...
3013  }
3014cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
3015</pre></td></tr>
3016
3017
3018<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3019<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
3020a specific number of arguments (including absent default arguments).
3021
3022Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3023  void f(int x, int y);
3024  f(0, 0);
3025</pre></td></tr>
3026
3027
3028<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
3029<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
3030</pre></td></tr>
3031
3032
3033<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
3034<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
3035zero initialization.
3036
3037Given
3038void foo() {
3039  struct point { double x; double y; };
3040  point pt[2] = { { 1.0, 2.0 } };
3041}
3042initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
3043will match the implicit array filler for pt[1].
3044</pre></td></tr>
3045
3046
3047<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
3048<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
3049
3050Given
3051  struct S {
3052    S(); // #1
3053    S(const S &amp;); // #2
3054    S(S &amp;&amp;); // #3
3055  };
3056cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
3057</pre></td></tr>
3058
3059
3060<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
3061<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
3062
3063Given
3064  struct S {
3065    S(); // #1
3066    S(const S &amp;); // #2
3067    S(S &amp;&amp;); // #3
3068  };
3069cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
3070</pre></td></tr>
3071
3072
3073<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
3074<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
3075
3076Given
3077  struct S {
3078    S(); // #1
3079    S(int) {} // #2
3080    S(S &amp;&amp;) : S() {} // #3
3081  };
3082  S::S() : S(0) {} // #4
3083cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
3084#1 or #2.
3085</pre></td></tr>
3086
3087
3088<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
3089<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
3090that have an explicit specifier if this explicit specifier is resolved to
3091true.
3092
3093Given
3094  template&lt;bool b&gt;
3095  struct S {
3096    S(int); // #1
3097    explicit S(double); // #2
3098    operator int(); // #3
3099    explicit operator bool(); // #4
3100    explicit(false) S(bool) // # 7
3101    explicit(true) S(char) // # 8
3102    explicit(b) S(S) // # 9
3103  };
3104  S(int) -&gt; S&lt;true&gt; // #5
3105  explicit S(double) -&gt; S&lt;false&gt; // #6
3106cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3107cxxConversionDecl(isExplicit()) will match #4, but not #3.
3108cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3109</pre></td></tr>
3110
3111
3112<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isInheritingConstructor0')"><a name="isInheritingConstructor0Anchor">isInheritingConstructor</a></td><td></td></tr>
3113<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr>
3114
3115
3116<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
3117<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3118
3119Given
3120  struct S {
3121    S(); // #1
3122    S(const S &amp;); // #2
3123    S(S &amp;&amp;); // #3
3124  };
3125cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3126</pre></td></tr>
3127
3128
3129<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
3130<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3131that have an explicit specifier if this explicit specifier is resolved to
3132true.
3133
3134Given
3135  template&lt;bool b&gt;
3136  struct S {
3137    S(int); // #1
3138    explicit S(double); // #2
3139    operator int(); // #3
3140    explicit operator bool(); // #4
3141    explicit(false) S(bool) // # 7
3142    explicit(true) S(char) // # 8
3143    explicit(b) S(S) // # 9
3144  };
3145  S(int) -&gt; S&lt;true&gt; // #5
3146  explicit S(double) -&gt; S&lt;false&gt; // #6
3147cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3148cxxConversionDecl(isExplicit()) will match #4, but not #3.
3149cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3150</pre></td></tr>
3151
3152
3153<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
3154<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3155opposed to a member.
3156
3157Given
3158  struct B {};
3159  struct D : B {
3160    int I;
3161    D(int i) : I(i) {}
3162  };
3163  struct E : B {
3164    E() : B() {}
3165  };
3166cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3167  will match E(), but not match D(int).
3168</pre></td></tr>
3169
3170
3171<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
3172<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3173opposed to a base.
3174
3175Given
3176  struct B {};
3177  struct D : B {
3178    int I;
3179    D(int i) : I(i) {}
3180  };
3181  struct E : B {
3182    E() : B() {}
3183  };
3184cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3185  will match D(int), but not match E().
3186</pre></td></tr>
3187
3188
3189<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
3190<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3191code (as opposed to implicitly added by the compiler).
3192
3193Given
3194  struct Foo {
3195    Foo() { }
3196    Foo(int) : foo_("A") { }
3197    string foo_;
3198  };
3199cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3200  will match Foo(int), but not Foo()
3201</pre></td></tr>
3202
3203
3204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
3205<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3206that have an explicit specifier if this explicit specifier is resolved to
3207true.
3208
3209Given
3210  template&lt;bool b&gt;
3211  struct S {
3212    S(int); // #1
3213    explicit S(double); // #2
3214    operator int(); // #3
3215    explicit operator bool(); // #4
3216    explicit(false) S(bool) // # 7
3217    explicit(true) S(char) // # 8
3218    explicit(b) S(S) // # 9
3219  };
3220  S(int) -&gt; S&lt;true&gt; // #5
3221  explicit S(double) -&gt; S&lt;false&gt; // #6
3222cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3223cxxConversionDecl(isExplicit()) will match #4, but not #3.
3224cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3225</pre></td></tr>
3226
3227
3228<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr>
3229<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3230
3231In template declarations, dependent members are not resolved and so can
3232not be matched to particular named declarations.
3233
3234This matcher allows to match on the known name of members.
3235
3236Given
3237  template &lt;typename T&gt;
3238  struct S {
3239      void mem();
3240  };
3241  template &lt;typename T&gt;
3242  void x() {
3243      S&lt;T&gt; s;
3244      s.mem();
3245  }
3246cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3247</pre></td></tr>
3248
3249
3250<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
3251<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
3252to '.'.
3253
3254Member calls on the implicit this pointer match as called with '-&gt;'.
3255
3256Given
3257  class Y {
3258    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3259    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3260    int a;
3261    static int b;
3262  };
3263  template &lt;class T&gt;
3264  class Z {
3265    void x() { this-&gt;m; }
3266  };
3267memberExpr(isArrow())
3268  matches this-&gt;x, x, y.x, a, this-&gt;b
3269cxxDependentScopeMemberExpr(isArrow())
3270  matches this-&gt;m
3271unresolvedMemberExpr(isArrow())
3272  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3273</pre></td></tr>
3274
3275
3276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr>
3277<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3278node
3279
3280In template declarations, dependent members are not resolved and so can
3281not be matched to particular named declarations.
3282
3283This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3284and CXXMethodDecl nodes.
3285
3286Given
3287  template &lt;typename T&gt;
3288  struct S {
3289      void mem();
3290  };
3291  template &lt;typename T&gt;
3292  void x() {
3293      S&lt;T&gt; s;
3294      s.mem();
3295  }
3296The matcher
3297@code
3298cxxDependentScopeMemberExpr(
3299  hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3300      hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3301          cxxMethodDecl(hasName("mem")).bind("templMem")
3302          )))))
3303      )))),
3304  memberHasSameNameAsBoundNode("templMem")
3305  )
3306@endcode
3307first matches and binds the @c mem member of the @c S template, then
3308compares its name to the usage in @c s.mem() in the @c x function template
3309</pre></td></tr>
3310
3311
3312<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
3313<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3314
3315Given
3316struct A {
3317  void foo() const;
3318  void bar();
3319};
3320
3321cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3322</pre></td></tr>
3323
3324
3325<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
3326<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3327operator.
3328
3329Given
3330struct A {
3331  A &amp;operator=(const A &amp;);
3332  A &amp;operator=(A &amp;&amp;);
3333};
3334
3335cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3336the second one.
3337</pre></td></tr>
3338
3339
3340<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
3341<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3342
3343Given:
3344  class A final {};
3345
3346  struct B {
3347    virtual void f();
3348  };
3349
3350  struct C : B {
3351    void f() final;
3352  };
3353matches A and C::f, but not B, C, or B::f
3354</pre></td></tr>
3355
3356
3357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
3358<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3359operator.
3360
3361Given
3362struct A {
3363  A &amp;operator=(const A &amp;);
3364  A &amp;operator=(A &amp;&amp;);
3365};
3366
3367cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3368the first one.
3369</pre></td></tr>
3370
3371
3372<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
3373<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3374
3375Given
3376  class A {
3377   public:
3378    virtual void x();
3379  };
3380  class B : public A {
3381   public:
3382    virtual void x();
3383  };
3384  matches B::x
3385</pre></td></tr>
3386
3387
3388<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
3389<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3390
3391Given
3392  class A {
3393   public:
3394    virtual void x() = 0;
3395  };
3396  matches A::x
3397</pre></td></tr>
3398
3399
3400<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
3401<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3402
3403Given
3404  struct S {
3405    S(); // #1
3406    S(const S &amp;) = default; // #2
3407    S(S &amp;&amp;) = delete; // #3
3408  };
3409cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3410</pre></td></tr>
3411
3412
3413<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
3414<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3415virtual inheritance.
3416
3417Example:
3418  class A {
3419   public:
3420    virtual void x(); // matches x
3421  };
3422
3423Example:
3424  class Base {};
3425  class DirectlyDerived : virtual Base {}; // matches Base
3426  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3427
3428Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
3429</pre></td></tr>
3430
3431
3432<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
3433<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3434
3435Given
3436  class A {
3437   public:
3438    virtual void x();
3439  };
3440  class B : public A {
3441   public:
3442    void x();
3443  };
3444  matches A::x but not B::x
3445</pre></td></tr>
3446
3447
3448<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
3449<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3450
3451Given:
3452  MyClass *p1 = new MyClass[10];
3453cxxNewExpr(isArray())
3454  matches the expression 'new MyClass[10]'.
3455</pre></td></tr>
3456
3457
3458<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3459<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3460specified names.
3461
3462   hasAnyOperatorName("+", "-")
3463 Is equivalent to
3464   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3465</pre></td></tr>
3466
3467
3468<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3469<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3470
3471Matches overloaded operator names specified in strings without the
3472"operator" prefix: e.g. "&lt;&lt;".
3473
3474  hasAnyOverloadedOperatorName("+", "-")
3475Is equivalent to
3476  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3477</pre></td></tr>
3478
3479
3480<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3481<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3482unary).
3483
3484Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3485  !(a || b)
3486</pre></td></tr>
3487
3488
3489<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3490<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3491
3492Matches overloaded operator names specified in strings without the
3493"operator" prefix: e.g. "&lt;&lt;".
3494
3495Given:
3496  class A { int operator*(); };
3497  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3498  A a;
3499  a &lt;&lt; a;   // &lt;-- This matches
3500
3501cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3502specified line and
3503cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3504matches the declaration of A.
3505
3506Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
3507</pre></td></tr>
3508
3509
3510<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
3511<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3512
3513Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3514  if (a == b)
3515    a += b;
3516
3517Example 2: matches s1 = s2
3518           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3519  struct S { S&amp; operator=(const S&amp;); };
3520  void x() { S s1, s2; s1 = s2; }
3521</pre></td></tr>
3522
3523
3524<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
3525<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3526
3527Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3528  if (a == b)
3529    a += b;
3530
3531Example 2: matches s1 &lt; s2
3532           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3533  struct S { bool operator&lt;(const S&amp; other); };
3534  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3535</pre></td></tr>
3536
3537
3538<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
3539<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3540
3541Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3542class x {};
3543class y;
3544</pre></td></tr>
3545
3546
3547<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
3548<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3549</pre></td></tr>
3550
3551
3552<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
3553<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3554</pre></td></tr>
3555
3556
3557<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
3558<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3559static member variable template instantiations.
3560
3561Given
3562  template&lt;typename T&gt; void A(T t) { }
3563  template&lt;&gt; void A(int N) { }
3564functionDecl(isExplicitTemplateSpecialization())
3565  matches the specialization A&lt;int&gt;().
3566
3567Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3568</pre></td></tr>
3569
3570
3571<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
3572<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3573
3574Given:
3575  class A final {};
3576
3577  struct B {
3578    virtual void f();
3579  };
3580
3581  struct C : B {
3582    void f() final;
3583  };
3584matches A and C::f, but not B, C, or B::f
3585</pre></td></tr>
3586
3587
3588<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
3589<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3590
3591Given:
3592  auto x = []{};
3593
3594cxxRecordDecl(isLambda()) matches the implicit class declaration of
3595decltype(x)
3596</pre></td></tr>
3597
3598
3599<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
3600<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3601isSameOrDerivedFrom(hasName(...)).
3602</pre></td></tr>
3603
3604
3605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
3606<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3607member variable template instantiations.
3608
3609Given
3610  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3611or
3612  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3613or
3614  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3615cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3616  matches the template instantiation of X&lt;A&gt;.
3617
3618But given
3619  template &lt;typename T&gt;  class X {}; class A {};
3620  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3621cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3622  does not match, as X&lt;A&gt; is an explicit template specialization.
3623
3624Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3625</pre></td></tr>
3626
3627
3628<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3629<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3630specified names.
3631
3632   hasAnyOperatorName("+", "-")
3633 Is equivalent to
3634   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3635</pre></td></tr>
3636
3637
3638<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3639<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3640unary).
3641
3642Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3643  !(a || b)
3644</pre></td></tr>
3645
3646
3647<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr>
3648<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3649
3650Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3651  if (a == b)
3652    a += b;
3653
3654Example 2: matches s1 = s2
3655           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3656  struct S { S&amp; operator=(const S&amp;); };
3657  void x() { S s1, s2; s1 = s2; }
3658</pre></td></tr>
3659
3660
3661<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
3662<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3663
3664Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3665  if (a == b)
3666    a += b;
3667
3668Example 2: matches s1 &lt; s2
3669           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3670  struct S { bool operator&lt;(const S&amp; other); };
3671  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3672</pre></td></tr>
3673
3674
3675<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3676<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3677a specific number of arguments (including absent default arguments).
3678
3679Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3680  void f(int x, int y);
3681  f(0, 0);
3682</pre></td></tr>
3683
3684
3685<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3686<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3687a specific number of arguments (including absent default arguments).
3688
3689Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3690  void f(int x, int y);
3691  f(0, 0);
3692</pre></td></tr>
3693
3694
3695<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
3696<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3697
3698Example matches y(x) but not y(42) or NS::y(x).
3699  namespace NS {
3700    struct X {};
3701    void y(X);
3702  }
3703
3704  void y(...);
3705
3706  void test() {
3707    NS::X x;
3708    y(x); // Matches
3709    NS::y(x); // Doesn't match
3710    y(42); // Doesn't match
3711    using NS::y;
3712    y(x); // Found by both unqualified lookup and ADL, doesn't match
3713   }
3714</pre></td></tr>
3715
3716
3717<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
3718<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3719
3720Example: matches the implicit cast around 0
3721(matcher = castExpr(hasCastKind(CK_NullToPointer)))
3722  int *p = 0;
3723
3724If the matcher is use from clang-query, CastKind parameter
3725should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3726</pre></td></tr>
3727
3728
3729<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
3730<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3731
3732
3733<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
3734<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3735
3736Given
3737  f('false, 3.14, 42);
3738characterLiteral(equals(0))
3739  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3740  match false
3741floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3742  match 3.14
3743integerLiteral(equals(42))
3744  matches 42
3745
3746Note that you cannot directly match a negative numeric literal because the
3747minus sign is not part of the literal: It is a unary operator whose operand
3748is the positive numeric literal. Instead, you must use a unaryOperator()
3749matcher to match the minus sign:
3750
3751unaryOperator(hasOperatorName("-"),
3752              hasUnaryOperand(integerLiteral(equals(13))))
3753
3754Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3755           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
3756</pre></td></tr>
3757
3758
3759<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
3760<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3761
3762
3763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
3764<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3765
3766
3767<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
3768<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3769
3770Given
3771  template&lt;typename T&gt; struct C {};
3772  C&lt;int&gt; c;
3773classTemplateSpecializationDecl(templateArgumentCountIs(1))
3774  matches C&lt;int&gt;.
3775</pre></td></tr>
3776
3777
3778<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
3779<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3780child statements.
3781
3782Example: Given
3783  { for (;;) {} }
3784compoundStmt(statementCountIs(0)))
3785  matches '{}'
3786  but does not match the outer compound statement.
3787</pre></td></tr>
3788
3789
3790<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
3791<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3792
3793Given
3794  int a[42];
3795  int b[2 * 21];
3796  int c[41], d[43];
3797  char *s = "abcd";
3798  wchar_t *ws = L"abcd";
3799  char *w = "a";
3800constantArrayType(hasSize(42))
3801  matches "int a[42]" and "int b[2 * 21]"
3802stringLiteral(hasSize(4))
3803  matches "abcd", L"abcd"
3804</pre></td></tr>
3805
3806
3807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
3808<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3809declarations.
3810
3811Example: Given
3812  int a, b;
3813  int c;
3814  int d = 2, e;
3815declCountIs(2)
3816  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3817</pre></td></tr>
3818
3819
3820<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3821<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3822
3823Matches a node if it equals the node previously bound to ID.
3824
3825Given
3826  class X { int a; int b; };
3827cxxRecordDecl(
3828    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3829    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3830  matches the class X, as a and b have the same type.
3831
3832Note that when multiple matches are involved via forEach* matchers,
3833equalsBoundNodes acts as a filter.
3834For example:
3835compoundStmt(
3836    forEachDescendant(varDecl().bind("d")),
3837    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3838will trigger a match for each combination of variable declaration
3839and reference to that variable declaration within a compound statement.
3840</pre></td></tr>
3841
3842
3843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
3844<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3845
3846Decl has pointer identity in the AST.
3847</pre></td></tr>
3848
3849
3850<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
3851<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3852
3853Given
3854  __attribute__((device)) void f() { ... }
3855decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3856f. If the matcher is used from clang-query, attr::Kind parameter should be
3857passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3858</pre></td></tr>
3859
3860
3861<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
3862<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3863Does not match if only part of the statement is expanded from that macro or
3864if different parts of the statement are expanded from different
3865appearances of the macro.
3866</pre></td></tr>
3867
3868
3869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
3870<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3871partially matching a given regex.
3872
3873Example matches Y but not X
3874    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3875  #include "ASTMatcher.h"
3876  class X {};
3877ASTMatcher.h:
3878  class Y {};
3879
3880Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3881
3882If the matcher is used in clang-query, RegexFlags parameter
3883should be passed as a quoted string. e.g: "NoFlags".
3884Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3885</pre></td></tr>
3886
3887
3888<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
3889<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3890
3891Example matches X but not Y
3892  (matcher = cxxRecordDecl(isExpansionInMainFile())
3893  #include &lt;Y.h&gt;
3894  class X {};
3895Y.h:
3896  class Y {};
3897
3898Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3899</pre></td></tr>
3900
3901
3902<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3903<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3904
3905Example matches Y but not X
3906    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3907  #include &lt;SystemHeader.h&gt;
3908  class X {};
3909SystemHeader.h:
3910  class Y {};
3911
3912Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3913</pre></td></tr>
3914
3915
3916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3917<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
3918implicit default/copy constructors).
3919</pre></td></tr>
3920
3921
3922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
3923<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3924
3925Given
3926  class vector {};
3927  namespace foo {
3928    class vector {};
3929    namespace std {
3930      class vector {};
3931    }
3932  }
3933  namespace std {
3934    inline namespace __1 {
3935      class vector {}; // #1
3936      namespace experimental {
3937        class vector {};
3938      }
3939    }
3940  }
3941cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3942</pre></td></tr>
3943
3944
3945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
3946<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3947template instantiations.
3948
3949Given
3950  template&lt;typename T&gt; void A(T t) { T i; }
3951  A(0);
3952  A(0U);
3953functionDecl(isInstantiated())
3954  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3955</pre></td></tr>
3956
3957
3958<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
3959<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3960inheritance.
3961
3962Examples:
3963  class C {
3964  public:    int a;
3965  protected: int b;
3966  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3967  };
3968
3969  struct Base {};
3970  struct Derived1 : private Base {}; // matches 'Base'
3971  class Derived2 : Base {}; // matches 'Base'
3972</pre></td></tr>
3973
3974
3975<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
3976<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3977protected inheritance.
3978
3979Examples:
3980  class C {
3981  public:    int a;
3982  protected: int b; // fieldDecl(isProtected()) matches 'b'
3983  private:   int c;
3984  };
3985
3986  class Base {};
3987  class Derived : protected Base {}; // matches 'Base'
3988</pre></td></tr>
3989
3990
3991<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
3992<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3993inheritance.
3994
3995Examples:
3996  class C {
3997  public:    int a; // fieldDecl(isPublic()) matches 'a'
3998  protected: int b;
3999  private:   int c;
4000  };
4001
4002  class Base {};
4003  class Derived1 : public Base {}; // matches 'Base'
4004  struct Derived2 : Base {}; // matches 'Base'
4005</pre></td></tr>
4006
4007
4008<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
4009<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
4010a specific number of designators.
4011
4012Example: Given
4013  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
4014  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
4015designatorCountIs(2)
4016  matches '{ [2].y = 1.0, [0].x = 1.0 }',
4017  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
4018</pre></td></tr>
4019
4020
4021<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
4022<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
4023
4024Example matches Y (matcher = enumDecl(isScoped()))
4025enum X {};
4026enum class Y {};
4027</pre></td></tr>
4028
4029
4030<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
4031<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
4032neither type- nor value-dependent.
4033
4034In the following example, the expression sizeof(sizeof(T() + T()))
4035is instantiation-dependent (since it involves a template parameter T),
4036but is neither type- nor value-dependent, since the type of the inner
4037sizeof is known (std::size_t) and therefore the size of the outer
4038sizeof is known.
4039  template&lt;typename T&gt;
4040  void f(T x, T y) { sizeof(sizeof(T() + T()); }
4041expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
4042</pre></td></tr>
4043
4044
4045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
4046<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
4047is not yet instantiated.
4048
4049For example, the expressions "x" and "x + y" are type-dependent in
4050the following code, but "y" is not type-dependent:
4051  template&lt;typename T&gt;
4052  void add(T x, int y) {
4053    x + y;
4054  }
4055expr(isTypeDependent()) matches x + y
4056</pre></td></tr>
4057
4058
4059<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
4060<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
4061non-type template parameter.
4062
4063For example, the array bound of "Chars" in the following example is
4064value-dependent.
4065  template&lt;int Size&gt; int f() { return Size; }
4066expr(isValueDependent()) matches return Size
4067</pre></td></tr>
4068
4069
4070<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
4071<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4072GNU's __null, C++11's nullptr, or C's NULL macro.
4073
4074Given:
4075  void *v1 = NULL;
4076  void *v2 = nullptr;
4077  void *v3 = __null; // GNU extension
4078  char *cp = (char *)0;
4079  int *ip = 0;
4080  int i = 0;
4081expr(nullPointerConstant())
4082  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4083  initializer for i.
4084</pre></td></tr>
4085
4086
4087<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
4088<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
4089bit width.
4090
4091Given
4092  class C {
4093    int a : 2;
4094    int b : 4;
4095    int c : 2;
4096  };
4097fieldDecl(hasBitWidth(2))
4098  matches 'int a;' and 'int c;' but not 'int b;'.
4099</pre></td></tr>
4100
4101
4102<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
4103<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
4104
4105Given
4106  class C {
4107    int a : 2;
4108    int b;
4109  };
4110fieldDecl(isBitField())
4111  matches 'int a;' but not 'int b;'.
4112</pre></td></tr>
4113
4114
4115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4116<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4117
4118Given
4119  f('false, 3.14, 42);
4120characterLiteral(equals(0))
4121  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4122  match false
4123floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4124  match 3.14
4125integerLiteral(equals(42))
4126  matches 42
4127
4128Note that you cannot directly match a negative numeric literal because the
4129minus sign is not part of the literal: It is a unary operator whose operand
4130is the positive numeric literal. Instead, you must use a unaryOperator()
4131matcher to match the minus sign:
4132
4133unaryOperator(hasOperatorName("-"),
4134              hasUnaryOperand(integerLiteral(equals(13))))
4135
4136Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4137           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4138</pre></td></tr>
4139
4140
4141<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
4142<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4143
4144
4145<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
4146<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4147
4148Matches overloaded operator names specified in strings without the
4149"operator" prefix: e.g. "&lt;&lt;".
4150
4151  hasAnyOverloadedOperatorName("+", "-")
4152Is equivalent to
4153  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4154</pre></td></tr>
4155
4156
4157<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4158<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4159
4160Given:
4161  void f();
4162  void g() noexcept;
4163  void h() noexcept(true);
4164  void i() noexcept(false);
4165  void j() throw();
4166  void k() throw(int);
4167  void l() throw(...);
4168functionDecl(hasDynamicExceptionSpec()) and
4169  functionProtoType(hasDynamicExceptionSpec())
4170  match the declarations of j, k, and l, but not f, g, h, or i.
4171</pre></td></tr>
4172
4173
4174<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
4175<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4176
4177Matches overloaded operator names specified in strings without the
4178"operator" prefix: e.g. "&lt;&lt;".
4179
4180Given:
4181  class A { int operator*(); };
4182  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
4183  A a;
4184  a &lt;&lt; a;   // &lt;-- This matches
4185
4186cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
4187specified line and
4188cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4189matches the declaration of A.
4190
4191Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
4192</pre></td></tr>
4193
4194
4195<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
4196<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4197
4198Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4199int X() {}
4200auto Y() -&gt; int {}
4201</pre></td></tr>
4202
4203
4204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConsteval1')"><a name="isConsteval1Anchor">isConsteval</a></td><td></td></tr>
4205<tr><td colspan="4" class="doc" id="isConsteval1"><pre>Matches consteval function declarations and if consteval/if ! consteval
4206statements.
4207
4208Given:
4209  consteval int a();
4210  void b() { if consteval {} }
4211  void c() { if ! consteval {} }
4212  void d() { if ! consteval {} else {} }
4213functionDecl(isConsteval())
4214  matches the declaration of "int a()".
4215ifStmt(isConsteval())
4216  matches the if statement in "void b()", "void c()", "void d()".
4217</pre></td></tr>
4218
4219
4220<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
4221<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4222       and if constexpr.
4223
4224Given:
4225  constexpr int foo = 42;
4226  constexpr int bar();
4227  void baz() { if constexpr(1 &gt; 0) {} }
4228varDecl(isConstexpr())
4229  matches the declaration of foo.
4230functionDecl(isConstexpr())
4231  matches the declaration of bar.
4232ifStmt(isConstexpr())
4233  matches the if statement in baz.
4234</pre></td></tr>
4235
4236
4237<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
4238<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4239
4240Given:
4241  class A { ~A(); };
4242  class B { ~B() = default; };
4243functionDecl(isDefaulted())
4244  matches the declaration of ~B, but not ~A.
4245</pre></td></tr>
4246
4247
4248<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
4249<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4250
4251Example matches A, va, fa
4252  class A {};
4253  class B;  // Doesn't match, as it has no body.
4254  int va;
4255  extern int vb;  // Doesn't match, as it doesn't define the variable.
4256  void fa() {}
4257  void fb();  // Doesn't match, as it has no body.
4258  @interface X
4259  - (void)ma; // Doesn't match, interface is declaration.
4260  @end
4261  @implementation X
4262  - (void)ma {}
4263  @end
4264
4265Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4266  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4267</pre></td></tr>
4268
4269
4270<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
4271<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4272
4273Given:
4274  void Func();
4275  void DeletedFunc() = delete;
4276functionDecl(isDeleted())
4277  matches the declaration of DeletedFunc, but not Func.
4278</pre></td></tr>
4279
4280
4281<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
4282<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4283static member variable template instantiations.
4284
4285Given
4286  template&lt;typename T&gt; void A(T t) { }
4287  template&lt;&gt; void A(int N) { }
4288functionDecl(isExplicitTemplateSpecialization())
4289  matches the specialization A&lt;int&gt;().
4290
4291Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4292</pre></td></tr>
4293
4294
4295<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
4296<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4297
4298Given:
4299  extern "C" void f() {}
4300  extern "C" { void g() {} }
4301  void h() {}
4302  extern "C" int x = 1;
4303  extern "C" int y = 2;
4304  int z = 3;
4305functionDecl(isExternC())
4306  matches the declaration of f and g, but not the declaration of h.
4307varDecl(isExternC())
4308  matches the declaration of x and y, but not the declaration of z.
4309</pre></td></tr>
4310
4311
4312<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
4313<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4314the inline keyword.
4315
4316Given
4317  inline void f();
4318  void g();
4319  namespace n {
4320  inline namespace m {}
4321  }
4322functionDecl(isInline()) will match ::f().
4323namespaceDecl(isInline()) will match n::m.
4324</pre></td></tr>
4325
4326
4327<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
4328<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4329into an executable program.
4330</pre></td></tr>
4331
4332
4333<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
4334<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4335
4336Given
4337  void nope();
4338  [[noreturn]] void a();
4339  __attribute__((noreturn)) void b();
4340  struct c { [[noreturn]] c(); };
4341functionDecl(isNoReturn())
4342  matches all of those except
4343  void nope();
4344</pre></td></tr>
4345
4346
4347<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
4348<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4349
4350Given:
4351  void f();
4352  void g() noexcept;
4353  void h() throw();
4354  void i() throw(int);
4355  void j() noexcept(false);
4356functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4357  match the declarations of g, and h, but not f, i or j.
4358</pre></td></tr>
4359
4360
4361<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
4362<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4363class specifier ("static" keyword) written in the source.
4364
4365Given:
4366  static void f() {}
4367  static int i = 0;
4368  extern int j;
4369  int k;
4370functionDecl(isStaticStorageClass())
4371  matches the function declaration f.
4372varDecl(isStaticStorageClass())
4373  matches the variable declaration i.
4374</pre></td></tr>
4375
4376
4377<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
4378<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4379member variable template instantiations.
4380
4381Given
4382  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4383or
4384  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4385or
4386  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4387cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4388  matches the template instantiation of X&lt;A&gt;.
4389
4390But given
4391  template &lt;typename T&gt;  class X {}; class A {};
4392  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4393cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4394  does not match, as X&lt;A&gt; is an explicit template specialization.
4395
4396Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4397</pre></td></tr>
4398
4399
4400<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
4401<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4402
4403Example matches f, but not g or h. The function i will not match, even when
4404compiled in C mode.
4405  void f(...);
4406  void g(int);
4407  template &lt;typename... Ts&gt; void h(Ts...);
4408  void i();
4409</pre></td></tr>
4410
4411
4412<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr>
4413<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4414
4415Given:
4416  void foo() __attribute__((__weakref__("__foo")));
4417  void bar();
4418functionDecl(isWeak())
4419  matches the weak declaration "foo", but not "bar".
4420</pre></td></tr>
4421
4422
4423<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4424<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4425specific parameter count.
4426
4427Given
4428  void f(int i) {}
4429  void g(int i, int j) {}
4430  void h(int i, int j);
4431  void j(int i);
4432  void k(int x, int y, int z, ...);
4433functionDecl(parameterCountIs(2))
4434  matches g and h
4435functionProtoType(parameterCountIs(2))
4436  matches g and h
4437functionProtoType(parameterCountIs(3))
4438  matches k
4439</pre></td></tr>
4440
4441
4442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4443<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4444
4445Given:
4446  void f();
4447  void g() noexcept;
4448  void h() noexcept(true);
4449  void i() noexcept(false);
4450  void j() throw();
4451  void k() throw(int);
4452  void l() throw(...);
4453functionDecl(hasDynamicExceptionSpec()) and
4454  functionProtoType(hasDynamicExceptionSpec())
4455  match the declarations of j, k, and l, but not f, g, h, or i.
4456</pre></td></tr>
4457
4458
4459<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
4460<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4461
4462Given:
4463  void f();
4464  void g() noexcept;
4465  void h() throw();
4466  void i() throw(int);
4467  void j() noexcept(false);
4468functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4469  match the declarations of g, and h, but not f, i or j.
4470</pre></td></tr>
4471
4472
4473<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4474<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4475specific parameter count.
4476
4477Given
4478  void f(int i) {}
4479  void g(int i, int j) {}
4480  void h(int i, int j);
4481  void j(int i);
4482  void k(int x, int y, int z, ...);
4483functionDecl(parameterCountIs(2))
4484  matches g and h
4485functionProtoType(parameterCountIs(2))
4486  matches g and h
4487functionProtoType(parameterCountIs(3))
4488  matches k
4489</pre></td></tr>
4490
4491
4492<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConsteval2')"><a name="isConsteval2Anchor">isConsteval</a></td><td></td></tr>
4493<tr><td colspan="4" class="doc" id="isConsteval2"><pre>Matches consteval function declarations and if consteval/if ! consteval
4494statements.
4495
4496Given:
4497  consteval int a();
4498  void b() { if consteval {} }
4499  void c() { if ! consteval {} }
4500  void d() { if ! consteval {} else {} }
4501functionDecl(isConsteval())
4502  matches the declaration of "int a()".
4503ifStmt(isConsteval())
4504  matches the if statement in "void b()", "void c()", "void d()".
4505</pre></td></tr>
4506
4507
4508<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
4509<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4510       and if constexpr.
4511
4512Given:
4513  constexpr int foo = 42;
4514  constexpr int bar();
4515  void baz() { if constexpr(1 &gt; 0) {} }
4516varDecl(isConstexpr())
4517  matches the declaration of foo.
4518functionDecl(isConstexpr())
4519  matches the declaration of bar.
4520ifStmt(isConstexpr())
4521  matches the if statement in baz.
4522</pre></td></tr>
4523
4524
4525<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
4526<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4527
4528
4529<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4530<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4531
4532Given
4533  f('false, 3.14, 42);
4534characterLiteral(equals(0))
4535  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4536  match false
4537floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4538  match 3.14
4539integerLiteral(equals(42))
4540  matches 42
4541
4542Note that you cannot directly match a negative numeric literal because the
4543minus sign is not part of the literal: It is a unary operator whose operand
4544is the positive numeric literal. Instead, you must use a unaryOperator()
4545matcher to match the minus sign:
4546
4547unaryOperator(hasOperatorName("-"),
4548              hasUnaryOperand(integerLiteral(equals(13))))
4549
4550Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4551           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4552</pre></td></tr>
4553
4554
4555<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
4556<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4557
4558
4559<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
4560<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4561
4562
4563<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('capturesThis0')"><a name="capturesThis0Anchor">capturesThis</a></td><td></td></tr>
4564<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'.
4565
4566Given
4567class C {
4568  int cc;
4569  int f() {
4570    auto l = [this]() { return cc; };
4571    return l();
4572  }
4573};
4574lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4575  matches `[this]() { return cc; }`.
4576</pre></td></tr>
4577
4578
4579<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('isImplicit2')"><a name="isImplicit2Anchor">isImplicit</a></td><td></td></tr>
4580<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4581implicit default/copy constructors).
4582</pre></td></tr>
4583
4584
4585<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
4586<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4587to '.'.
4588
4589Member calls on the implicit this pointer match as called with '-&gt;'.
4590
4591Given
4592  class Y {
4593    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4594    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4595    int a;
4596    static int b;
4597  };
4598  template &lt;class T&gt;
4599  class Z {
4600    void x() { this-&gt;m; }
4601  };
4602memberExpr(isArrow())
4603  matches this-&gt;x, x, y.x, a, this-&gt;b
4604cxxDependentScopeMemberExpr(isArrow())
4605  matches this-&gt;m
4606unresolvedMemberExpr(isArrow())
4607  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4608</pre></td></tr>
4609
4610
4611<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
4612<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4613
4614This matcher is only provided as a performance optimization of hasName.
4615    hasAnyName(a, b, c)
4616 is equivalent to, but faster than
4617    anyOf(hasName(a), hasName(b), hasName(c))
4618</pre></td></tr>
4619
4620
4621<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
4622<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4623
4624Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4625void f() {
4626  int x;
4627  static int y;
4628}
4629int z;
4630
4631Example matches f() because it has external formal linkage despite being
4632unique to the translation unit as though it has internal likage
4633(matcher = functionDecl(hasExternalFormalLinkage()))
4634
4635namespace {
4636void f() {}
4637}
4638</pre></td></tr>
4639
4640
4641<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>StringRef Name</td></tr>
4642<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4643
4644Supports specifying enclosing namespaces or classes by prefixing the name
4645with '&lt;enclosing&gt;::'.
4646Does not match typedefs of an underlying type with the given name.
4647
4648Example matches X (Name == "X")
4649  class X;
4650
4651Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4652  namespace a { namespace b { class X; } }
4653</pre></td></tr>
4654
4655
4656<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4657<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4658a substring matched by the given RegExp.
4659
4660Supports specifying enclosing namespaces or classes by
4661prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4662of an underlying type with the given name.
4663
4664Example matches X (regexp == "::X")
4665  class X;
4666
4667Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4668  namespace foo { namespace bar { class X; } }
4669
4670If the matcher is used in clang-query, RegexFlags parameter
4671should be passed as a quoted string. e.g: "NoFlags".
4672Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4673</pre></td></tr>
4674
4675
4676<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isAnonymous0')"><a name="isAnonymous0Anchor">isAnonymous</a></td><td></td></tr>
4677<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4678
4679Given
4680  namespace n {
4681  namespace {} // #1
4682  }
4683namespaceDecl(isAnonymous()) will match #1 but not ::n.
4684</pre></td></tr>
4685
4686
4687<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
4688<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4689the inline keyword.
4690
4691Given
4692  inline void f();
4693  void g();
4694  namespace n {
4695  inline namespace m {}
4696  }
4697functionDecl(isInline()) will match ::f().
4698namespaceDecl(isInline()) will match n::m.
4699</pre></td></tr>
4700
4701
4702<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isFirstPrivateKind0')"><a name="isFirstPrivateKind0Anchor">isFirstPrivateKind</a></td><td></td></tr>
4703<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4704specified.
4705
4706Given
4707
4708  #pragma omp parallel
4709  #pragma omp parallel default(none)
4710  #pragma omp parallel default(shared)
4711  #pragma omp parallel default(firstprivate)
4712
4713``ompDefaultClause(isFirstPrivateKind())`` matches only
4714``default(firstprivate)``.
4715</pre></td></tr>
4716
4717
4718<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isNoneKind0')"><a name="isNoneKind0Anchor">isNoneKind</a></td><td></td></tr>
4719<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4720
4721Given
4722
4723  #pragma omp parallel
4724  #pragma omp parallel default(none)
4725  #pragma omp parallel default(shared)
4726  #pragma omp parallel default(firstprivate)
4727
4728``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4729</pre></td></tr>
4730
4731
4732<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;</td><td class="name" onclick="toggle('isSharedKind0')"><a name="isSharedKind0Anchor">isSharedKind</a></td><td></td></tr>
4733<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4734
4735Given
4736
4737  #pragma omp parallel
4738  #pragma omp parallel default(none)
4739  #pragma omp parallel default(shared)
4740  #pragma omp parallel default(firstprivate)
4741
4742``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4743</pre></td></tr>
4744
4745
4746<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isAllowedToContainClauseKind0')"><a name="isAllowedToContainClauseKind0Anchor">isAllowedToContainClauseKind</a></td><td>OpenMPClauseKind CKind</td></tr>
4747<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4748clause kind.
4749
4750Given
4751
4752  #pragma omp parallel
4753  #pragma omp parallel for
4754  #pragma omp          for
4755
4756`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4757``omp parallel`` and ``omp parallel for``.
4758
4759If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4760should be passed as a quoted string. e.g.,
4761``isAllowedToContainClauseKind("OMPC_default").``
4762</pre></td></tr>
4763
4764
4765<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
4766<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4767i.e., directives that can't have a structured block.
4768
4769Given
4770
4771  #pragma omp parallel
4772  {}
4773  #pragma omp taskyield
4774
4775``ompExecutableDirective(isStandaloneDirective()))`` matches
4776``omp taskyield``.
4777</pre></td></tr>
4778
4779
4780<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom3')"><a name="isDerivedFrom3Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
4781<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4782</pre></td></tr>
4783
4784
4785<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom3')"><a name="isDirectlyDerivedFrom3Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
4786<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4787</pre></td></tr>
4788
4789
4790<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom3')"><a name="isSameOrDerivedFrom3Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
4791<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4792isSameOrDerivedFrom(hasName(...)).
4793</pre></td></tr>
4794
4795
4796<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs3')"><a name="argumentCountIs3Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
4797<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4798a specific number of arguments (including absent default arguments).
4799
4800Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4801  void f(int x, int y);
4802  f(0, 0);
4803</pre></td></tr>
4804
4805
4806<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
4807<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4808Selector.getAsString()
4809
4810 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4811 matches both of the expressions below:
4812    [myObj methodA:argA];
4813    [myObj methodB:argB];
4814</pre></td></tr>
4815
4816
4817<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
4818<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4819
4820objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4821message expression in
4822
4823  UIWebView *webView = ...;
4824  CGRect bodyFrame = webView.frame;
4825  bodyFrame.size.height = self.bodyContentHeight;
4826  webView.frame = bodyFrame;
4827  //     ^---- matches here
4828</pre></td></tr>
4829
4830
4831<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
4832<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4833
4834Matches only when the selector of the objCMessageExpr is NULL. This may
4835represent an error condition in the tree!
4836</pre></td></tr>
4837
4838
4839<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
4840<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4841
4842 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4843 matches the outer message expr in the code below, but NOT the message
4844 invocation for self.bodyView.
4845    [self.bodyView loadHTMLString:html baseURL:NULL];
4846</pre></td></tr>
4847
4848
4849<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
4850<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4851
4852 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4853 matches self.bodyView in the code below, but NOT the outer message
4854 invocation of "loadHTMLString:baseURL:".
4855    [self.bodyView loadHTMLString:html baseURL:NULL];
4856</pre></td></tr>
4857
4858
4859<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isClassMessage0')"><a name="isClassMessage0Anchor">isClassMessage</a></td><td></td></tr>
4860<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4861
4862Example
4863matcher = objcMessageExpr(isClassMessage())
4864matches
4865  [NSString stringWithFormat:@"format"];
4866but not
4867  NSString *x = @"hello";
4868  [x containsString:@"h"];
4869</pre></td></tr>
4870
4871
4872<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('isInstanceMessage0')"><a name="isInstanceMessage0Anchor">isInstanceMessage</a></td><td></td></tr>
4873<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4874
4875Example
4876matcher = objcMessageExpr(isInstanceMessage())
4877matches
4878  NSString *x = @"hello";
4879  [x containsString:@"h"];
4880but not
4881  [NSString stringWithFormat:@"format"];
4882</pre></td></tr>
4883
4884
4885<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4886<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4887a substring matched by the given RegExp.
4888 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4889 invocation for self.bodyView.
4890    [self.bodyView loadHTMLString:html baseURL:NULL];
4891
4892If the matcher is used in clang-query, RegexFlags parameter
4893should be passed as a quoted string. e.g: "NoFlags".
4894Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4895</pre></td></tr>
4896
4897
4898<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('numSelectorArgs0')"><a name="numSelectorArgs0Anchor">numSelectorArgs</a></td><td>unsigned N</td></tr>
4899<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4900
4901 matcher = objCMessageExpr(numSelectorArgs(0));
4902 matches self.bodyView in the code below
4903
4904 matcher = objCMessageExpr(numSelectorArgs(2));
4905 matches the invocation of "loadHTMLString:baseURL:" but not that
4906 of self.bodyView
4907    [self.bodyView loadHTMLString:html baseURL:NULL];
4908</pre></td></tr>
4909
4910
4911<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isClassMethod0')"><a name="isClassMethod0Anchor">isClassMethod</a></td><td></td></tr>
4912<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4913
4914Example
4915matcher = objcMethodDecl(isClassMethod())
4916matches
4917@interface I + (void)foo; @end
4918but not
4919@interface I - (void)bar; @end
4920</pre></td></tr>
4921
4922
4923<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
4924<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4925
4926Example matches A, va, fa
4927  class A {};
4928  class B;  // Doesn't match, as it has no body.
4929  int va;
4930  extern int vb;  // Doesn't match, as it doesn't define the variable.
4931  void fa() {}
4932  void fb();  // Doesn't match, as it has no body.
4933  @interface X
4934  - (void)ma; // Doesn't match, interface is declaration.
4935  @end
4936  @implementation X
4937  - (void)ma {}
4938  @end
4939
4940Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4941  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4942</pre></td></tr>
4943
4944
4945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isInstanceMethod0')"><a name="isInstanceMethod0Anchor">isInstanceMethod</a></td><td></td></tr>
4946<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4947
4948Example
4949matcher = objcMethodDecl(isInstanceMethod())
4950matches
4951@interface I - (void)bar; @end
4952but not
4953@interface I + (void)foo; @end
4954</pre></td></tr>
4955
4956
4957<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefaultArgument0')"><a name="hasDefaultArgument0Anchor">hasDefaultArgument</a></td><td></td></tr>
4958<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4959
4960Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4961void x(int val) {}
4962void y(int val = 0) {}
4963
4964Deprecated. Use hasInitializer() instead to be able to
4965match on the contents of the default argument.  For example:
4966
4967void x(int val = 7) {}
4968void y(int val = 42) {}
4969parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4970  matches the parameter of y
4971
4972A matcher such as
4973  parmVarDecl(hasInitializer(anything()))
4974is equivalent to parmVarDecl(hasDefaultArgument()).
4975</pre></td></tr>
4976
4977
4978<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;</td><td class="name" onclick="toggle('isAtPosition0')"><a name="isAtPosition0Anchor">isAtPosition</a></td><td>unsigned N</td></tr>
4979<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4980list. The parameter list could be that of either a block, function, or
4981objc-method.
4982
4983
4984Given
4985
4986void f(int a, int b, int c) {
4987}
4988
4989``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4990
4991``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4992</pre></td></tr>
4993
4994
4995<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('asString0')"><a name="asString0Anchor">asString</a></td><td>std::string Name</td></tr>
4996<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4997
4998Given
4999  class Y { public: void x(); };
5000  void z() { Y* y; y-&gt;x(); }
5001cxxMemberCallExpr(on(hasType(asString("class Y *"))))
5002  matches y-&gt;x()
5003</pre></td></tr>
5004
5005
5006<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
5007<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
5008
5009Matches a node if it equals the node previously bound to ID.
5010
5011Given
5012  class X { int a; int b; };
5013cxxRecordDecl(
5014    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5015    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5016  matches the class X, as a and b have the same type.
5017
5018Note that when multiple matches are involved via forEach* matchers,
5019equalsBoundNodes acts as a filter.
5020For example:
5021compoundStmt(
5022    forEachDescendant(varDecl().bind("d")),
5023    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5024will trigger a match for each combination of variable declaration
5025and reference to that variable declaration within a compound statement.
5026</pre></td></tr>
5027
5028
5029<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
5030<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
5031the node, not hidden within a typedef.
5032
5033Given
5034  typedef const int const_int;
5035  const_int i;
5036  int *const j;
5037  int *volatile k;
5038  int m;
5039varDecl(hasType(hasLocalQualifiers())) matches only j and k.
5040i is const-qualified but the qualifier is not local.
5041</pre></td></tr>
5042
5043
5044<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
5045<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
5046
5047Given
5048  void a(char);
5049  void b(wchar_t);
5050  void c(double);
5051functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
5052matches "a(char)", "b(wchar_t)", but not "c(double)".
5053</pre></td></tr>
5054
5055
5056<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
5057<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
5058the Objective-C object pointer type, which is different despite being
5059syntactically similar.
5060
5061Given
5062  int *i = nullptr;
5063
5064  @interface Foo
5065  @end
5066  Foo *f;
5067
5068  int j;
5069varDecl(hasType(isAnyPointer()))
5070  matches "int *i" and "Foo *f", but not "int j".
5071</pre></td></tr>
5072
5073
5074<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
5075<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
5076include "top-level" const.
5077
5078Given
5079  void a(int);
5080  void b(int const);
5081  void c(const int);
5082  void d(const int*);
5083  void e(int const) {};
5084functionDecl(hasAnyParameter(hasType(isConstQualified())))
5085  matches "void b(int const)", "void c(const int)" and
5086  "void e(int const) {}". It does not match d as there
5087  is no top-level const on the parameter type "const int *".
5088</pre></td></tr>
5089
5090
5091<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isInteger0')"><a name="isInteger0Anchor">isInteger</a></td><td></td></tr>
5092<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
5093
5094Given
5095  void a(int);
5096  void b(long);
5097  void c(double);
5098functionDecl(hasAnyParameter(hasType(isInteger())))
5099matches "a(int)", "b(long)", but not "c(double)".
5100</pre></td></tr>
5101
5102
5103<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
5104<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
5105
5106Given
5107  void a(int);
5108  void b(unsigned long);
5109  void c(double);
5110functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5111matches "a(int)", but not "b(unsigned long)" and "c(double)".
5112</pre></td></tr>
5113
5114
5115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
5116<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
5117
5118Given
5119  void a(int);
5120  void b(unsigned long);
5121  void c(double);
5122functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5123matches "b(unsigned long)", but not "a(int)" and "c(double)".
5124</pre></td></tr>
5125
5126
5127<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
5128<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5129include "top-level" volatile.
5130
5131Given
5132  void a(int);
5133  void b(int volatile);
5134  void c(volatile int);
5135  void d(volatile int*);
5136  void e(int volatile) {};
5137functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5138  matches "void b(int volatile)", "void c(volatile int)" and
5139  "void e(int volatile) {}". It does not match d as there
5140  is no top-level volatile on the parameter type "volatile int *".
5141</pre></td></tr>
5142
5143
5144<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
5145<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
5146
5147Matches a node if it equals the node previously bound to ID.
5148
5149Given
5150  class X { int a; int b; };
5151cxxRecordDecl(
5152    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5153    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5154  matches the class X, as a and b have the same type.
5155
5156Note that when multiple matches are involved via forEach* matchers,
5157equalsBoundNodes acts as a filter.
5158For example:
5159compoundStmt(
5160    forEachDescendant(varDecl().bind("d")),
5161    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5162will trigger a match for each combination of variable declaration
5163and reference to that variable declaration within a compound statement.
5164</pre></td></tr>
5165
5166
5167<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
5168<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5169
5170Stmt has pointer identity in the AST.
5171</pre></td></tr>
5172
5173
5174<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5175<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5176Does not match if only part of the statement is expanded from that macro or
5177if different parts of the statement are expanded from different
5178appearances of the macro.
5179</pre></td></tr>
5180
5181
5182<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5183<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5184partially matching a given regex.
5185
5186Example matches Y but not X
5187    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5188  #include "ASTMatcher.h"
5189  class X {};
5190ASTMatcher.h:
5191  class Y {};
5192
5193Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5194
5195If the matcher is used in clang-query, RegexFlags parameter
5196should be passed as a quoted string. e.g: "NoFlags".
5197Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5198</pre></td></tr>
5199
5200
5201<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
5202<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5203
5204Example matches X but not Y
5205  (matcher = cxxRecordDecl(isExpansionInMainFile())
5206  #include &lt;Y.h&gt;
5207  class X {};
5208Y.h:
5209  class Y {};
5210
5211Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5212</pre></td></tr>
5213
5214
5215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5216<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5217
5218Example matches Y but not X
5219    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5220  #include &lt;SystemHeader.h&gt;
5221  class X {};
5222SystemHeader.h:
5223  class Y {};
5224
5225Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5226</pre></td></tr>
5227
5228
5229<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
5230<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5231
5232Given
5233  int j;
5234  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5235  A(0);
5236  A(0U);
5237declStmt(isInTemplateInstantiation())
5238  matches 'int i;' and 'unsigned i'.
5239unless(stmt(isInTemplateInstantiation()))
5240  will NOT match j += 42; as it's shared between the template definition and
5241  instantiation.
5242</pre></td></tr>
5243
5244
5245<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
5246<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5247
5248Given
5249  int a[42];
5250  int b[2 * 21];
5251  int c[41], d[43];
5252  char *s = "abcd";
5253  wchar_t *ws = L"abcd";
5254  char *w = "a";
5255constantArrayType(hasSize(42))
5256  matches "int a[42]" and "int b[2 * 21]"
5257stringLiteral(hasSize(4))
5258  matches "abcd", L"abcd"
5259</pre></td></tr>
5260
5261
5262<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
5263<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5264
5265Example matches C, but not S, U or E.
5266  struct S {};
5267  class C {};
5268  union U {};
5269  enum E {};
5270</pre></td></tr>
5271
5272
5273<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
5274<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5275
5276Example matches A, va, fa
5277  class A {};
5278  class B;  // Doesn't match, as it has no body.
5279  int va;
5280  extern int vb;  // Doesn't match, as it doesn't define the variable.
5281  void fa() {}
5282  void fb();  // Doesn't match, as it has no body.
5283  @interface X
5284  - (void)ma; // Doesn't match, interface is declaration.
5285  @end
5286  @implementation X
5287  - (void)ma {}
5288  @end
5289
5290Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
5291  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5292</pre></td></tr>
5293
5294
5295<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isEnum0')"><a name="isEnum0Anchor">isEnum</a></td><td></td></tr>
5296<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5297
5298Example matches E, but not C, S or U.
5299  struct S {};
5300  class C {};
5301  union U {};
5302  enum E {};
5303</pre></td></tr>
5304
5305
5306<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
5307<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5308
5309Example matches S, but not C, U or E.
5310  struct S {};
5311  class C {};
5312  union U {};
5313  enum E {};
5314</pre></td></tr>
5315
5316
5317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
5318<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5319
5320Example matches U, but not C, S or E.
5321  struct S {};
5322  class C {};
5323  union U {};
5324  enum E {};
5325</pre></td></tr>
5326
5327
5328<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
5329<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5330
5331Note that 'Value' is a string as the template argument's value is
5332an arbitrary precision integer. 'Value' must be euqal to the canonical
5333representation of that integral value in base 10.
5334
5335Given
5336  template&lt;int T&gt; struct C {};
5337  C&lt;42&gt; c;
5338classTemplateSpecializationDecl(
5339  hasAnyTemplateArgument(equalsIntegralValue("42")))
5340  matches the implicit instantiation of C in C&lt;42&gt;.
5341</pre></td></tr>
5342
5343
5344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
5345<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5346
5347Given
5348  template&lt;int T&gt; struct C {};
5349  C&lt;42&gt; c;
5350classTemplateSpecializationDecl(
5351  hasAnyTemplateArgument(isIntegral()))
5352  matches the implicit instantiation of C in C&lt;42&gt;
5353  with isIntegral() matching 42.
5354</pre></td></tr>
5355
5356
5357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs1')"><a name="templateArgumentCountIs1Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
5358<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5359
5360Given
5361  template&lt;typename T&gt; struct C {};
5362  C&lt;int&gt; c;
5363classTemplateSpecializationDecl(templateArgumentCountIs(1))
5364  matches C&lt;int&gt;.
5365</pre></td></tr>
5366
5367
5368<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
5369<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5370Does not match if only part of the statement is expanded from that macro or
5371if different parts of the statement are expanded from different
5372appearances of the macro.
5373</pre></td></tr>
5374
5375
5376<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
5377<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5378partially matching a given regex.
5379
5380Example matches Y but not X
5381    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5382  #include "ASTMatcher.h"
5383  class X {};
5384ASTMatcher.h:
5385  class Y {};
5386
5387Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5388
5389If the matcher is used in clang-query, RegexFlags parameter
5390should be passed as a quoted string. e.g: "NoFlags".
5391Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5392</pre></td></tr>
5393
5394
5395<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile2')"><a name="isExpansionInMainFile2Anchor">isExpansionInMainFile</a></td><td></td></tr>
5396<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5397
5398Example matches X but not Y
5399  (matcher = cxxRecordDecl(isExpansionInMainFile())
5400  #include &lt;Y.h&gt;
5401  class X {};
5402Y.h:
5403  class Y {};
5404
5405Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5406</pre></td></tr>
5407
5408
5409<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader2')"><a name="isExpansionInSystemHeader2Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
5410<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5411
5412Example matches Y but not X
5413    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5414  #include &lt;SystemHeader.h&gt;
5415  class X {};
5416SystemHeader.h:
5417  class Y {};
5418
5419Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5420</pre></td></tr>
5421
5422
5423<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
5424<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5425
5426Given
5427 struct S { bool func(); };
5428functionDecl(returns(booleanType()))
5429  matches "bool func();"
5430</pre></td></tr>
5431
5432
5433<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode2')"><a name="equalsBoundNode2Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
5434<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5435
5436Matches a node if it equals the node previously bound to ID.
5437
5438Given
5439  class X { int a; int b; };
5440cxxRecordDecl(
5441    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5442    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5443  matches the class X, as a and b have the same type.
5444
5445Note that when multiple matches are involved via forEach* matchers,
5446equalsBoundNodes acts as a filter.
5447For example:
5448compoundStmt(
5449    forEachDescendant(varDecl().bind("d")),
5450    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5451will trigger a match for each combination of variable declaration
5452and reference to that variable declaration within a compound statement.
5453</pre></td></tr>
5454
5455
5456<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('equalsNode2')"><a name="equalsNode2Anchor">equalsNode</a></td><td>const Type* Other</td></tr>
5457<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5458
5459Type has pointer identity in the AST.
5460</pre></td></tr>
5461
5462
5463<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
5464<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5465
5466Given
5467  int i;
5468  float f;
5469realFloatingPointType()
5470  matches "float f" but not "int i"
5471</pre></td></tr>
5472
5473
5474<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
5475<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5476
5477Given
5478 struct S { void func(); };
5479functionDecl(returns(voidType()))
5480  matches "void func();"
5481</pre></td></tr>
5482
5483
5484<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
5485<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5486
5487Given
5488  int x;
5489  int s = sizeof(x) + alignof(x)
5490unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5491  matches sizeof(x)
5492
5493If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5494should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5495</pre></td></tr>
5496
5497
5498<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName3')"><a name="hasAnyOperatorName3Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
5499<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5500specified names.
5501
5502   hasAnyOperatorName("+", "-")
5503 Is equivalent to
5504   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5505</pre></td></tr>
5506
5507
5508<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName3')"><a name="hasOperatorName3Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
5509<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5510unary).
5511
5512Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5513  !(a || b)
5514</pre></td></tr>
5515
5516
5517<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow1')"><a name="isArrow1Anchor">isArrow</a></td><td></td></tr>
5518<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5519to '.'.
5520
5521Member calls on the implicit this pointer match as called with '-&gt;'.
5522
5523Given
5524  class Y {
5525    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5526    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5527    int a;
5528    static int b;
5529  };
5530  template &lt;class T&gt;
5531  class Z {
5532    void x() { this-&gt;m; }
5533  };
5534memberExpr(isArrow())
5535  matches this-&gt;x, x, y.x, a, this-&gt;b
5536cxxDependentScopeMemberExpr(isArrow())
5537  matches this-&gt;m
5538unresolvedMemberExpr(isArrow())
5539  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5540</pre></td></tr>
5541
5542
5543<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
5544<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5545
5546Example matches x, but not y, z, or a.
5547(matcher = varDecl(hasAutomaticStorageDuration())
5548void f() {
5549  int x;
5550  static int y;
5551  thread_local int z;
5552}
5553int a;
5554</pre></td></tr>
5555
5556
5557<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
5558<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5559
5560Example matches y and z (matcher = varDecl(hasGlobalStorage())
5561void f() {
5562  int x;
5563  static int y;
5564}
5565int z;
5566</pre></td></tr>
5567
5568
5569<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
5570<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5571non-static local variable.
5572
5573Example matches x (matcher = varDecl(hasLocalStorage())
5574void f() {
5575  int x;
5576  static int y;
5577}
5578int z;
5579</pre></td></tr>
5580
5581
5582<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
5583<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5584It includes the variable declared at namespace scope and those declared
5585with "static" and "extern" storage class specifiers.
5586
5587void f() {
5588  int x;
5589  static int y;
5590  thread_local int z;
5591}
5592int a;
5593static int b;
5594extern int c;
5595varDecl(hasStaticStorageDuration())
5596  matches the function declaration y, a, b and c.
5597</pre></td></tr>
5598
5599
5600<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
5601<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5602
5603Example matches z, but not x, z, or a.
5604(matcher = varDecl(hasThreadStorageDuration())
5605void f() {
5606  int x;
5607  static int y;
5608  thread_local int z;
5609}
5610int a;
5611</pre></td></tr>
5612
5613
5614<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
5615<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5616       and if constexpr.
5617
5618Given:
5619  constexpr int foo = 42;
5620  constexpr int bar();
5621  void baz() { if constexpr(1 &gt; 0) {} }
5622varDecl(isConstexpr())
5623  matches the declaration of foo.
5624functionDecl(isConstexpr())
5625  matches the declaration of bar.
5626ifStmt(isConstexpr())
5627  matches the if statement in baz.
5628</pre></td></tr>
5629
5630
5631<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstinit0')"><a name="isConstinit0Anchor">isConstinit</a></td><td></td></tr>
5632<tr><td colspan="4" class="doc" id="isConstinit0"><pre>Matches constinit variable declarations.
5633
5634Given:
5635  constinit int foo = 42;
5636  constinit const char* bar = "baz";
5637  int baz = 42;
5638  [[clang::require_constant_initialization]] int xyz = 42;
5639varDecl(isConstinit())
5640  matches the declaration of `foo` and `bar`, but not `baz` and `xyz`.
5641</pre></td></tr>
5642
5643
5644<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>
5645<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5646
5647Example matches A, va, fa
5648  class A {};
5649  class B;  // Doesn't match, as it has no body.
5650  int va;
5651  extern int vb;  // Doesn't match, as it doesn't define the variable.
5652  void fa() {}
5653  void fb();  // Doesn't match, as it has no body.
5654  @interface X
5655  - (void)ma; // Doesn't match, interface is declaration.
5656  @end
5657  @implementation X
5658  - (void)ma {}
5659  @end
5660
5661Usable 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;,
5662  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5663</pre></td></tr>
5664
5665
5666<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
5667<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5668a C++ catch block, or an Objective-C statement.
5669
5670Example matches x (matcher = varDecl(isExceptionVariable())
5671void f(int y) {
5672  try {
5673  } catch (int x) {
5674  }
5675}
5676</pre></td></tr>
5677
5678
5679<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>
5680<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5681static member variable template instantiations.
5682
5683Given
5684  template&lt;typename T&gt; void A(T t) { }
5685  template&lt;&gt; void A(int N) { }
5686functionDecl(isExplicitTemplateSpecialization())
5687  matches the specialization A&lt;int&gt;().
5688
5689Usable 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;
5690</pre></td></tr>
5691
5692
5693<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>
5694<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5695
5696Given:
5697  extern "C" void f() {}
5698  extern "C" { void g() {} }
5699  void h() {}
5700  extern "C" int x = 1;
5701  extern "C" int y = 2;
5702  int z = 3;
5703functionDecl(isExternC())
5704  matches the declaration of f and g, but not the declaration of h.
5705varDecl(isExternC())
5706  matches the declaration of x and y, but not the declaration of z.
5707</pre></td></tr>
5708
5709
5710<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isInitCapture0')"><a name="isInitCapture0Anchor">isInitCapture</a></td><td></td></tr>
5711<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init-
5712capture.
5713
5714Example matches x (matcher = varDecl(isInitCapture()))
5715auto f = [x=3]() { return x; };
5716</pre></td></tr>
5717
5718
5719<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>
5720<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5721
5722Example matches y (matcher = varDecl(isStaticLocal()))
5723void f() {
5724  int x;
5725  static int y;
5726}
5727static int z;
5728</pre></td></tr>
5729
5730
5731<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass1')"><a name="isStaticStorageClass1Anchor">isStaticStorageClass</a></td><td></td></tr>
5732<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5733class specifier ("static" keyword) written in the source.
5734
5735Given:
5736  static void f() {}
5737  static int i = 0;
5738  extern int j;
5739  int k;
5740functionDecl(isStaticStorageClass())
5741  matches the function declaration f.
5742varDecl(isStaticStorageClass())
5743  matches the variable declaration i.
5744</pre></td></tr>
5745
5746
5747<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>
5748<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5749member variable template instantiations.
5750
5751Given
5752  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5753or
5754  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5755or
5756  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5757cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5758  matches the template instantiation of X&lt;A&gt;.
5759
5760But given
5761  template &lt;typename T&gt;  class X {}; class A {};
5762  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5763cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5764  does not match, as X&lt;A&gt; is an explicit template specialization.
5765
5766Usable 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;
5767</pre></td></tr>
5768
5769<!--END_NARROWING_MATCHERS -->
5770</table>
5771
5772<!-- ======================================================================= -->
5773<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5774<!-- ======================================================================= -->
5775
5776<p>Traversal matchers specify the relationship to other nodes that are
5777reachable from the current node.</p>
5778
5779<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5780forEachDescendant) which work on all nodes and allow users to write more generic
5781match expressions.</p>
5782
5783<table>
5784<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5785<!-- START_TRAVERSAL_MATCHERS -->
5786
5787<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>
5788<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5789
5790The code
5791  var1 != var2;
5792might be represented in the clang AST as a binaryOperator, a
5793cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5794
5795* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5796  least one is a class type (cxxOperatorCallExpr)
5797* whether the code appears in a template declaration, if at least one of the
5798  vars is a dependent-type (binaryOperator)
5799* whether the code relies on a rewritten binary operator, such as a
5800spaceship operator or an inverted equality operator
5801(cxxRewrittenBinaryOperator)
5802
5803This matcher elides details in places where the matchers for the nodes are
5804compatible.
5805
5806Given
5807  binaryOperation(
5808    hasOperatorName("!="),
5809    hasLHS(expr().bind("lhs")),
5810    hasRHS(expr().bind("rhs"))
5811  )
5812matches each use of "!=" in:
5813  struct S{
5814      bool operator!=(const S&amp;) const;
5815  };
5816
5817  void foo()
5818  {
5819     1 != 2;
5820     S() != S();
5821  }
5822
5823  template&lt;typename T&gt;
5824  void templ()
5825  {
5826     1 != 2;
5827     T() != S();
5828  }
5829  struct HasOpEq
5830  {
5831      bool operator==(const HasOpEq &amp;) const;
5832  };
5833
5834  void inverse()
5835  {
5836      HasOpEq s1;
5837      HasOpEq s2;
5838      if (s1 != s2)
5839          return;
5840  }
5841
5842  struct HasSpaceship
5843  {
5844      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5845  };
5846
5847  void use_spaceship()
5848  {
5849      HasSpaceship s1;
5850      HasSpaceship s2;
5851      if (s1 != s2)
5852          return;
5853  }
5854</pre></td></tr>
5855
5856
5857<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>
5858<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5859
5860Unlike anyOf, eachOf will generate a match result for each
5861matching submatcher.
5862
5863For example, in:
5864  class A { int a; int b; };
5865The matcher:
5866  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5867                       has(fieldDecl(hasName("b")).bind("v"))))
5868will generate two results binding "v", the first of which binds
5869the field declaration of a, the second the field declaration of
5870b.
5871
5872Usable as: Any Matcher
5873</pre></td></tr>
5874
5875
5876<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>
5877<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5878
5879Generates results for each match.
5880
5881For example, in:
5882  class A { class B {}; class C {}; };
5883The matcher:
5884  cxxRecordDecl(hasName("::A"),
5885                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5886will generate results for A, B and C.
5887
5888Usable as: Any Matcher
5889</pre></td></tr>
5890
5891
5892<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5893<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5894provided matcher.
5895
5896Example matches X, A, A::X, B, B::C, B::C::X
5897  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5898  class X {};
5899  class A { class X {}; };  // Matches A, because A::X is a class of name
5900                            // X inside A.
5901  class B { class C { class X {}; }; };
5902
5903DescendantT must be an AST base type.
5904
5905As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5906each result that matches instead of only on the first one.
5907
5908Note: Recursively combined ForEachDescendant can cause many matches:
5909  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5910    forEachDescendant(cxxRecordDecl())
5911  )))
5912will match 10 times (plus injected class name matches) on:
5913  class A { class B { class C { class D { class E {}; }; }; }; };
5914
5915Usable as: Any Matcher
5916</pre></td></tr>
5917
5918
5919<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5920<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5921provided matcher.
5922
5923Example matches X, Y, Y::X, Z::Y, Z::Y::X
5924  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5925  class X {};
5926  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5927                            // inside Y.
5928  class Z { class Y { class X {}; }; };  // Does not match Z.
5929
5930ChildT must be an AST base type.
5931
5932As opposed to 'has', 'forEach' will cause a match for each result that
5933matches instead of only on the first one.
5934
5935Usable as: Any Matcher
5936</pre></td></tr>
5937
5938
5939<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5940<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5941matcher.
5942
5943Given
5944void f() { if (true) { int x = 42; } }
5945void g() { for (;;) { int x = 43; } }
5946expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5947
5948Usable as: Any Matcher
5949</pre></td></tr>
5950
5951
5952<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5953<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5954provided matcher.
5955
5956Example matches X, Y, Z
5957    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5958  class X {};  // Matches X, because X::X is a class of name X inside X.
5959  class Y { class X {}; };
5960  class Z { class Y { class X {}; }; };
5961
5962DescendantT must be an AST base type.
5963
5964Usable as: Any Matcher
5965</pre></td></tr>
5966
5967
5968<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5969<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5970provided matcher.
5971
5972Example matches X, Y
5973  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5974  class X {};  // Matches X, because X::X is a class of name X inside X.
5975  class Y { class X {}; };
5976  class Z { class Y { class X {}; }; };  // Does not match Z.
5977
5978ChildT must be an AST base type.
5979
5980Usable as: Any Matcher
5981Note that has is direct matcher, so it also matches things like implicit
5982casts and paren casts. If you are matching with expr then you should
5983probably consider using ignoringParenImpCasts like:
5984has(ignoringParenImpCasts(expr())).
5985</pre></td></tr>
5986
5987
5988<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5989<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5990matcher.
5991
5992Given
5993void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5994compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5995
5996Usable as: Any Matcher
5997</pre></td></tr>
5998
5999
6000<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>
6001<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
6002
6003Because CallExpr and CXXConstructExpr do not share a common
6004base class with API accessing arguments etc, AST Matchers for code
6005which should match both are typically duplicated. This matcher
6006removes the need for duplication.
6007
6008Given code
6009struct ConstructorTakesInt
6010{
6011  ConstructorTakesInt(int i) {}
6012};
6013
6014void callTakesInt(int i)
6015{
6016}
6017
6018void doCall()
6019{
6020  callTakesInt(42);
6021}
6022
6023void doConstruct()
6024{
6025  ConstructorTakesInt cti(42);
6026}
6027
6028The matcher
6029invocation(hasArgument(0, integerLiteral(equals(42))))
6030matches the expression in both doCall and doConstruct
6031</pre></td></tr>
6032
6033
6034<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
6035<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
6036
6037However, optionally will retain any bindings generated by the submatcher.
6038Useful when additional information which may or may not present about a main
6039matching node is desired.
6040
6041For example, in:
6042  class Foo {
6043    int bar;
6044  }
6045The matcher:
6046  cxxRecordDecl(
6047    optionally(has(
6048      fieldDecl(hasName("bar")).bind("var")
6049  ))).bind("record")
6050will produce a result binding for both "record" and "var".
6051The matcher will produce a "record" binding for even if there is no data
6052member named "bar" in that class.
6053
6054Usable as: Any Matcher
6055</pre></td></tr>
6056
6057
6058<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>
6059<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
6060
6061Given
6062  void foo()
6063  {
6064      int i = 3.0;
6065  }
6066The matcher
6067  traverse(TK_IgnoreUnlessSpelledInSource,
6068    varDecl(hasInitializer(floatLiteral().bind("init")))
6069  )
6070matches the variable declaration with "init" bound to the "3.0".
6071</pre></td></tr>
6072
6073
6074<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>
6075<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
6076switch statement or conditional operator.
6077
6078Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6079  if (true) {}
6080</pre></td></tr>
6081
6082
6083<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>
6084<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
6085(binary or ternary).
6086
6087Example matches b
6088  condition ? a : b
6089  condition ?: b
6090</pre></td></tr>
6091
6092
6093<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>
6094<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
6095
6096Example 1 (conditional ternary operator): matches a
6097  condition ? a : b
6098
6099Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6100  condition ?: b
6101</pre></td></tr>
6102
6103
6104<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>
6105<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
6106matches the given matcher.
6107
6108The associated declaration is:
6109- for type nodes, the declaration of the underlying type
6110- for CallExpr, the declaration of the callee
6111- for MemberExpr, the declaration of the referenced member
6112- for CXXConstructExpr, the declaration of the constructor
6113- for CXXNewExpr, the declaration of the operator new
6114- for ObjCIvarExpr, the declaration of the ivar
6115
6116For type nodes, hasDeclaration will generally match the declaration of the
6117sugared type. Given
6118  class X {};
6119  typedef X Y;
6120  Y y;
6121in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6122typedefDecl. A common use case is to match the underlying, desugared type.
6123This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6124  varDecl(hasType(hasUnqualifiedDesugaredType(
6125      recordType(hasDeclaration(decl())))))
6126In this matcher, the decl will match the CXXRecordDecl of class X.
6127
6128Usable 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;,
6129  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;,
6130  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;,
6131  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;,
6132  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;,
6133  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;,
6134  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6135</pre></td></tr>
6136
6137
6138<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>
6139<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
6140
6141Given
6142  int i[5];
6143  void f() { i[1] = 42; }
6144arraySubscriptExpression(hasBase(implicitCastExpr(
6145    hasSourceExpression(declRefExpr()))))
6146  matches i[1] with the declRefExpr() matching i
6147</pre></td></tr>
6148
6149
6150<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>
6151<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
6152
6153Given
6154  int i[5];
6155  void f() { i[1] = 42; }
6156arraySubscriptExpression(hasIndex(integerLiteral()))
6157  matches i[1] with the integerLiteral() matching 1
6158</pre></td></tr>
6159
6160
6161<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>
6162<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
6163
6164Example matches a (matcher = binaryOperator(hasLHS()))
6165  a || b
6166</pre></td></tr>
6167
6168
6169<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>
6170<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
6171
6172Example matches b (matcher = binaryOperator(hasRHS()))
6173  a || b
6174</pre></td></tr>
6175
6176
6177<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>
6178<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
6179type.
6180
6181Given
6182  struct A {};
6183  A a[7];
6184  int b[7];
6185arrayType(hasElementType(builtinType()))
6186  matches "int b[7]"
6187
6188Usable 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;
6189</pre></td></tr>
6190
6191
6192<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>
6193<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6194
6195Given
6196  _Atomic(int) i;
6197  _Atomic(float) f;
6198atomicType(hasValueType(isInteger()))
6199 matches "_Atomic(int) i"
6200
6201Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6202</pre></td></tr>
6203
6204
6205<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>
6206<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6207
6208Note: There is no TypeLoc for the deduced type and thus no
6209getDeducedLoc() matcher.
6210
6211Given
6212  auto a = 1;
6213  auto b = 2.0;
6214autoType(hasDeducedType(isInteger()))
6215  matches "auto a"
6216
6217Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6218</pre></td></tr>
6219
6220
6221<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BaseUsingDecl.html">BaseUsingDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyUsingShadowDecl0')"><a name="hasAnyUsingShadowDecl0Anchor">hasAnyUsingShadowDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
6222<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6223
6224Given
6225  namespace X { void b(); }
6226  using X::b;
6227usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6228  matches using X::b </pre></td></tr>
6229
6230
6231<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>
6232<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6233binary operator matches.
6234</pre></td></tr>
6235
6236
6237<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>
6238<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6239
6240Example matches a (matcher = binaryOperator(hasLHS()))
6241  a || b
6242</pre></td></tr>
6243
6244
6245<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>
6246<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6247
6248Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6249                                             integerLiteral(equals(2)))
6250  1 + 2 // Match
6251  2 + 1 // Match
6252  1 + 1 // No match
6253  2 + 2 // No match
6254</pre></td></tr>
6255
6256
6257<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>
6258<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6259
6260Example matches b (matcher = binaryOperator(hasRHS()))
6261  a || b
6262</pre></td></tr>
6263
6264
6265<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>
6266<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6267
6268For example, in:
6269void foo()
6270{
6271    int arr[3];
6272    auto &amp;[f, s, t] = arr;
6273
6274    f = 42;
6275}
6276The matcher:
6277  bindingDecl(hasName("f"),
6278                forDecomposition(decompositionDecl())
6279matches 'f' in 'auto &amp;[f, s, t]'.
6280</pre></td></tr>
6281
6282
6283<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>
6284<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6285block.
6286
6287Does not match the 'this' parameter of a method.
6288
6289Given
6290  class X { void f(int x, int y, int z) {} };
6291cxxMethodDecl(hasAnyParameter(hasName("y")))
6292  matches f(int x, int y, int z) {}
6293with hasAnyParameter(...)
6294  matching int y
6295
6296For ObjectiveC, given
6297  @interface I - (void) f:(int) y; @end
6298
6299the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6300matches the declaration of method f with hasParameter
6301matching y.
6302
6303For blocks, given
6304  b = ^(int y) { printf("%d", y) };
6305
6306the matcher blockDecl(hasAnyParameter(hasName("y")))
6307matches the declaration of the block b with hasParameter
6308matching y.
6309</pre></td></tr>
6310
6311
6312<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>
6313<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6314declaration or a block.
6315
6316Given
6317  class X { void f(int x) {} };
6318cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6319  matches f(int x) {}
6320with hasParameter(...)
6321  matching int x
6322
6323For ObjectiveC, given
6324  @interface I - (void) f:(int) y; @end
6325
6326the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6327matches the declaration of method f with hasParameter
6328matching y.
6329</pre></td></tr>
6330
6331
6332<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>
6333<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6334
6335Examples:
6336  int x;
6337declaratorDecl(hasTypeLoc(loc(asString("int"))))
6338  matches int x
6339
6340auto x = int(3);
6341cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6342  matches int(3)
6343
6344struct Foo { Foo(int, int); };
6345auto x = Foo(1, 2);
6346cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6347  matches Foo(1, 2)
6348
6349Usable 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;,
6350  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;,
6351  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;,
6352  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6353  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;,
6354  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;,
6355  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;,
6356  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6357</pre></td></tr>
6358
6359
6360<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>
6361<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6362pointee matches a given matcher.
6363
6364Given
6365  int *a;
6366  int const *b;
6367  float const *f;
6368pointerType(pointee(isConstQualified(), isInteger()))
6369  matches "int const *b"
6370
6371Usable 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;,
6372  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;
6373</pre></td></tr>
6374
6375
6376<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>
6377<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6378
6379Examples:
6380  int x;
6381declaratorDecl(hasTypeLoc(loc(asString("int"))))
6382  matches int x
6383
6384auto x = int(3);
6385cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6386  matches int(3)
6387
6388struct Foo { Foo(int, int); };
6389auto x = Foo(1, 2);
6390cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6391  matches Foo(1, 2)
6392
6393Usable 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;,
6394  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;,
6395  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;,
6396  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6397  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;,
6398  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;,
6399  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;,
6400  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6401</pre></td></tr>
6402
6403
6404<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>
6405<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6406declaration's type.
6407
6408In case of a value declaration (for example a variable declaration),
6409this resolves one layer of indirection. For example, in the value
6410declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6411X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6412declaration of x.
6413
6414Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6415            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6416            and friend class X (matcher = friendDecl(hasType("X"))
6417            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6418                                              cxxRecordDecl(hasName("X"))))
6419 class X {};
6420 void y(X &amp;x) { x; X z; }
6421 class Y { friend class X; };
6422 class Z : public virtual X {};
6423
6424Example matches class Derived
6425(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6426class Base {};
6427class Derived : Base {};
6428
6429Usable 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;,
6430Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6431</pre></td></tr>
6432
6433
6434<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>
6435<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6436matcher.
6437
6438Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6439            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6440            and U (matcher = typedefDecl(hasType(asString("int")))
6441            and friend class X (matcher = friendDecl(hasType("X"))
6442            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6443                                              asString("class X")))
6444 class X {};
6445 void y(X &amp;x) { x; X z; }
6446 typedef int U;
6447 class Y { friend class X; };
6448 class Z : public virtual X {};
6449</pre></td></tr>
6450
6451
6452<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>
6453<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6454
6455Given
6456  void f(int i);
6457  int y;
6458  f(y);
6459callExpr(
6460  forEachArgumentWithParam(
6461    declRefExpr(to(varDecl(hasName("y")))),
6462    parmVarDecl(hasType(isInteger()))
6463))
6464  matches f(y);
6465with declRefExpr(...)
6466  matching int y
6467and parmVarDecl(...)
6468  matching int i
6469</pre></td></tr>
6470
6471
6472<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>
6473<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6474CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6475it works on calls through function pointers as well.
6476
6477The difference is, that function pointers do not provide access to a
6478ParmVarDecl, but only the QualType for each argument.
6479
6480Given
6481  void f(int i);
6482  int y;
6483  f(y);
6484  void (*f_ptr)(int) = f;
6485  f_ptr(y);
6486callExpr(
6487  forEachArgumentWithParamType(
6488    declRefExpr(to(varDecl(hasName("y")))),
6489    qualType(isInteger()).bind("type)
6490))
6491  matches f(y) and f_ptr(y)
6492with declRefExpr(...)
6493  matching int y
6494and qualType(...)
6495  matching int
6496</pre></td></tr>
6497
6498
6499<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>
6500<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6501expression, or an ObjC-message-send expression.
6502
6503Given
6504  void x(int, int, int) { int y; x(1, y, 42); }
6505callExpr(hasAnyArgument(declRefExpr()))
6506  matches x(1, y, 42)
6507with hasAnyArgument(...)
6508  matching y
6509
6510For ObjectiveC, given
6511  @interface I - (void) f:(int) y; @end
6512  void foo(I *i) { [i f:12]; }
6513objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6514  matches [i f:12]
6515</pre></td></tr>
6516
6517
6518<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>
6519<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6520call expression.
6521
6522Example matches y in x(y)
6523    (matcher = callExpr(hasArgument(0, declRefExpr())))
6524  void x(int) { int y; x(y); }
6525</pre></td></tr>
6526
6527
6528<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>
6529<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6530matches the given matcher.
6531
6532The associated declaration is:
6533- for type nodes, the declaration of the underlying type
6534- for CallExpr, the declaration of the callee
6535- for MemberExpr, the declaration of the referenced member
6536- for CXXConstructExpr, the declaration of the constructor
6537- for CXXNewExpr, the declaration of the operator new
6538- for ObjCIvarExpr, the declaration of the ivar
6539
6540For type nodes, hasDeclaration will generally match the declaration of the
6541sugared type. Given
6542  class X {};
6543  typedef X Y;
6544  Y y;
6545in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6546typedefDecl. A common use case is to match the underlying, desugared type.
6547This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6548  varDecl(hasType(hasUnqualifiedDesugaredType(
6549      recordType(hasDeclaration(decl())))))
6550In this matcher, the decl will match the CXXRecordDecl of class X.
6551
6552Usable 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;,
6553  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;,
6554  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;,
6555  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;,
6556  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;,
6557  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;,
6558  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6559</pre></td></tr>
6560
6561
6562<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>
6563<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6564
6565Given
6566  class A { A() : i(42), j(42) {} int i; int j; };
6567cxxConstructorDecl(forEachConstructorInitializer(
6568  forField(decl().bind("x"))
6569))
6570  will trigger two matches, binding for 'i' and 'j' respectively.
6571</pre></td></tr>
6572
6573
6574<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>
6575<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6576
6577Given
6578  struct Foo {
6579    Foo() : foo_(1) { }
6580    int foo_;
6581  };
6582cxxRecordDecl(has(cxxConstructorDecl(
6583  hasAnyConstructorInitializer(anything())
6584)))
6585  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6586</pre></td></tr>
6587
6588
6589<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>
6590<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6591
6592Given
6593  struct Foo {
6594    Foo() : foo_(1) { }
6595    int foo_;
6596  };
6597cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6598    forField(hasName("foo_"))))))
6599  matches Foo
6600with forField matching foo_
6601</pre></td></tr>
6602
6603
6604<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>
6605<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6606
6607Examples:
6608  int x;
6609declaratorDecl(hasTypeLoc(loc(asString("int"))))
6610  matches int x
6611
6612auto x = int(3);
6613cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6614  matches int(3)
6615
6616struct Foo { Foo(int, int); };
6617auto x = Foo(1, 2);
6618cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6619  matches Foo(1, 2)
6620
6621Usable 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;,
6622  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;,
6623  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;,
6624  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6625  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;,
6626  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;,
6627  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;,
6628  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6629</pre></td></tr>
6630
6631
6632<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>
6633<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6634
6635Given
6636  struct Foo {
6637    Foo() : foo_(1) { }
6638    int foo_;
6639  };
6640cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6641    withInitializer(integerLiteral(equals(1)))))))
6642  matches Foo
6643with withInitializer matching (1)
6644</pre></td></tr>
6645
6646
6647<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>
6648<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6649given matcher. Implicit object expressions are included; that is, it matches
6650use of implicit `this`.
6651
6652Given
6653  struct X {
6654    int m;
6655    int f(X x) { x.m; return m; }
6656  };
6657memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6658  matches `x.m`, but not `m`; however,
6659memberExpr(hasObjectExpression(hasType(pointsTo(
6660     cxxRecordDecl(hasName("X"))))))
6661  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6662</pre></td></tr>
6663
6664
6665<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>
6666<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6667
6668
6669<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>
6670<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6671
6672Given:
6673 void foo() {
6674   if (int i = foobar(); i &gt; 0) {}
6675   switch (int i = foobar(); i) {}
6676   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6677 }
6678 void bar() {
6679   if (foobar() &gt; 0) {}
6680   switch (foobar()) {}
6681   for (auto&amp; x : get_range()) {}
6682 }
6683ifStmt(hasInitStatement(anything()))
6684  matches the if statement in foo but not in bar.
6685switchStmt(hasInitStatement(anything()))
6686  matches the switch statement in foo but not in bar.
6687cxxForRangeStmt(hasInitStatement(anything()))
6688  matches the range for statement in foo but not in bar.
6689</pre></td></tr>
6690
6691
6692<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>
6693<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6694
6695Example:
6696    forStmt(hasLoopVariable(anything()))
6697matches 'int x' in
6698    for (int x : a) { }
6699</pre></td></tr>
6700
6701
6702<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>
6703<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6704
6705Example:
6706    forStmt(hasRangeInit(anything()))
6707matches 'a' in
6708    for (int x : a) { }
6709</pre></td></tr>
6710
6711
6712<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>
6713<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6714
6715Examples:
6716  int x;
6717declaratorDecl(hasTypeLoc(loc(asString("int"))))
6718  matches int x
6719
6720auto x = int(3);
6721cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6722  matches int(3)
6723
6724struct Foo { Foo(int, int); };
6725auto x = Foo(1, 2);
6726cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6727  matches Foo(1, 2)
6728
6729Usable 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;,
6730  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;,
6731  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;,
6732  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6733  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;,
6734  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;,
6735  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;,
6736  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6737</pre></td></tr>
6738
6739
6740<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>
6741<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6742`on`, matches the argument directly without stripping away anything.
6743
6744Given
6745  class Y { public: void m(); };
6746  Y g();
6747  class X : public Y { void g(); };
6748  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6749cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6750    cxxRecordDecl(hasName("Y")))))
6751  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6752cxxMemberCallExpr(on(callExpr()))
6753  does not match `(g()).m()`, because the parens are not ignored.
6754
6755FIXME: Overload to allow directly matching types?
6756</pre></td></tr>
6757
6758
6759<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>
6760<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6761stripping off any parentheses or implicit casts.
6762
6763Given
6764  class Y { public: void m(); };
6765  Y g();
6766  class X : public Y {};
6767  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6768cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6769  matches `y.m()` and `(g()).m()`.
6770cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6771  matches `x.m()`.
6772cxxMemberCallExpr(on(callExpr()))
6773  matches `(g()).m()`.
6774
6775FIXME: Overload to allow directly matching types?
6776</pre></td></tr>
6777
6778
6779<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>
6780<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6781</pre></td></tr>
6782
6783
6784<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>
6785<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6786matches the InnerMatcher, or is a pointer to a type that matches the
6787InnerMatcher.
6788
6789Given
6790  class Y { public: void m(); };
6791  class X : public Y { void g(); };
6792  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6793cxxMemberCallExpr(thisPointerType(hasDeclaration(
6794    cxxRecordDecl(hasName("Y")))))
6795  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6796cxxMemberCallExpr(thisPointerType(hasDeclaration(
6797    cxxRecordDecl(hasName("X")))))
6798  matches `x.g()`.
6799</pre></td></tr>
6800
6801
6802<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>
6803<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6804produce multiple matches.
6805
6806Given
6807  class A { virtual void f(); };
6808  class B : public A { void f(); };
6809  class C : public B { void f(); };
6810cxxMethodDecl(ofClass(hasName("C")),
6811              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6812  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6813  that B::f is not overridden by C::f).
6814
6815The check can produce multiple matches in case of multiple inheritance, e.g.
6816  class A1 { virtual void f(); };
6817  class A2 { virtual void f(); };
6818  class C : public A1, public A2 { void f(); };
6819cxxMethodDecl(ofClass(hasName("C")),
6820              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6821  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6822  once with "b" binding "A2::f" and "d" binding "C::f".
6823</pre></td></tr>
6824
6825
6826<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>
6827<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6828belongs to.
6829
6830FIXME: Generalize this for other kinds of declarations.
6831FIXME: What other kind of declarations would we need to generalize
6832this to?
6833
6834Example matches A() in the last line
6835    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6836        ofClass(hasName("A"))))))
6837  class A {
6838   public:
6839    A();
6840  };
6841  A a = A();
6842</pre></td></tr>
6843
6844
6845<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>
6846<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6847
6848Given:
6849  MyClass *p1 = new (Storage) MyClass();
6850cxxNewExpr(hasAnyPlacementArg(anything()))
6851  matches the expression 'new (Storage, 16) MyClass()'.
6852</pre></td></tr>
6853
6854
6855<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>
6856<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6857
6858Given:
6859  MyClass *p1 = new MyClass[10];
6860cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6861  matches the expression 'new MyClass[10]'.
6862</pre></td></tr>
6863
6864
6865<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>
6866<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6867matches the given matcher.
6868
6869The associated declaration is:
6870- for type nodes, the declaration of the underlying type
6871- for CallExpr, the declaration of the callee
6872- for MemberExpr, the declaration of the referenced member
6873- for CXXConstructExpr, the declaration of the constructor
6874- for CXXNewExpr, the declaration of the operator new
6875- for ObjCIvarExpr, the declaration of the ivar
6876
6877For type nodes, hasDeclaration will generally match the declaration of the
6878sugared type. Given
6879  class X {};
6880  typedef X Y;
6881  Y y;
6882in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6883typedefDecl. A common use case is to match the underlying, desugared type.
6884This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6885  varDecl(hasType(hasUnqualifiedDesugaredType(
6886      recordType(hasDeclaration(decl())))))
6887In this matcher, the decl will match the CXXRecordDecl of class X.
6888
6889Usable 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;,
6890  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;,
6891  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;,
6892  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;,
6893  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;,
6894  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;,
6895  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6896</pre></td></tr>
6897
6898
6899<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>
6900<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6901
6902Given:
6903  MyClass *p1 = new (Storage, 16) MyClass();
6904cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6905  matches the expression 'new (Storage, 16) MyClass()'.
6906</pre></td></tr>
6907
6908
6909<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>
6910<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6911
6912Examples:
6913  int x;
6914declaratorDecl(hasTypeLoc(loc(asString("int"))))
6915  matches int x
6916
6917auto x = int(3);
6918cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6919  matches int(3)
6920
6921struct Foo { Foo(int, int); };
6922auto x = Foo(1, 2);
6923cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6924  matches Foo(1, 2)
6925
6926Usable 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;,
6927  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;,
6928  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;,
6929  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6930  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;,
6931  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;,
6932  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;,
6933  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6934</pre></td></tr>
6935
6936
6937<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>
6938<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6939binary operator matches.
6940</pre></td></tr>
6941
6942
6943<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>
6944<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6945
6946Example matches a (matcher = binaryOperator(hasLHS()))
6947  a || b
6948</pre></td></tr>
6949
6950
6951<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>
6952<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6953
6954Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6955                                             integerLiteral(equals(2)))
6956  1 + 2 // Match
6957  2 + 1 // Match
6958  1 + 1 // No match
6959  2 + 2 // No match
6960</pre></td></tr>
6961
6962
6963<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>
6964<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6965
6966Example matches b (matcher = binaryOperator(hasRHS()))
6967  a || b
6968</pre></td></tr>
6969
6970
6971<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>
6972<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6973
6974Example matches true (matcher = hasUnaryOperand(
6975                                  cxxBoolLiteral(equals(true))))
6976  !true
6977</pre></td></tr>
6978
6979
6980<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('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>
6981<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6982
6983Example:
6984matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6985  class Foo;
6986  class Bar : Foo {};
6987  class Baz : Bar {};
6988  class SpecialBase;
6989  class Proxy : SpecialBase {};  // matches Proxy
6990  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6991
6992FIXME: Refactor this and isDerivedFrom to reuse implementation.
6993</pre></td></tr>
6994
6995
6996<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>
6997<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6998
6999Example:
7000matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
7001  class Foo;
7002  class Bar : Foo {};
7003  class Baz : Bar {};
7004  class SpecialBase;
7005  class Proxy : SpecialBase {};  // matches Proxy
7006  class IndirectlyDerived : Proxy {};  // doesn't match
7007</pre></td></tr>
7008
7009
7010<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>
7011<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
7012
7013Given:
7014  class A { void func(); };
7015  class B { void member(); };
7016
7017cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
7018A but not B.
7019</pre></td></tr>
7020
7021
7022<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>
7023<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
7024matching Base, or Objective-C classes that directly or indirectly
7025subclass a class matching Base.
7026
7027Note that a class is not considered to be derived from itself.
7028
7029Example matches Y, Z, C (Base == hasName("X"))
7030  class X;
7031  class Y : public X {};  // directly derived
7032  class Z : public Y {};  // indirectly derived
7033  typedef X A;
7034  typedef A B;
7035  class C : public B {};  // derived from a typedef of X
7036
7037In the following example, Bar matches isDerivedFrom(hasName("X")):
7038  class Foo;
7039  typedef Foo X;
7040  class Bar : public Foo {};  // derived from a type that X is a typedef of
7041
7042In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7043  @interface NSObject @end
7044  @interface Bar : NSObject @end
7045
7046Usable 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;
7047</pre></td></tr>
7048
7049
7050<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>
7051<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7052matching Base.
7053
7054Note that a class is not considered to be derived from itself.
7055
7056Example matches Y, C (Base == hasName("X"))
7057  class X;
7058  class Y : public X {};  // directly derived
7059  class Z : public Y {};  // indirectly derived
7060  typedef X A;
7061  typedef A B;
7062  class C : public B {};  // derived from a typedef of X
7063
7064In the following example, Bar matches isDerivedFrom(hasName("X")):
7065  class Foo;
7066  typedef Foo X;
7067  class Bar : public Foo {};  // derived from a type that X is a typedef of
7068</pre></td></tr>
7069
7070
7071<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>
7072<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7073match Base.
7074</pre></td></tr>
7075
7076
7077<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>
7078<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
7079binary operator matches.
7080</pre></td></tr>
7081
7082
7083<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>
7084<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
7085
7086Example matches a (matcher = binaryOperator(hasLHS()))
7087  a || b
7088</pre></td></tr>
7089
7090
7091<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>
7092<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
7093
7094Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
7095                                             integerLiteral(equals(2)))
7096  1 + 2 // Match
7097  2 + 1 // Match
7098  1 + 1 // No match
7099  2 + 2 // No match
7100</pre></td></tr>
7101
7102
7103<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>
7104<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7105
7106Example matches b (matcher = binaryOperator(hasRHS()))
7107  a || b
7108</pre></td></tr>
7109
7110
7111<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>
7112<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7113
7114Examples:
7115  int x;
7116declaratorDecl(hasTypeLoc(loc(asString("int"))))
7117  matches int x
7118
7119auto x = int(3);
7120cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7121  matches int(3)
7122
7123struct Foo { Foo(int, int); };
7124auto x = Foo(1, 2);
7125cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7126  matches Foo(1, 2)
7127
7128Usable 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;,
7129  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;,
7130  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;,
7131  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7132  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;,
7133  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;,
7134  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;,
7135  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7136</pre></td></tr>
7137
7138
7139<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>
7140<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7141expression, or an ObjC-message-send expression.
7142
7143Given
7144  void x(int, int, int) { int y; x(1, y, 42); }
7145callExpr(hasAnyArgument(declRefExpr()))
7146  matches x(1, y, 42)
7147with hasAnyArgument(...)
7148  matching y
7149
7150For ObjectiveC, given
7151  @interface I - (void) f:(int) y; @end
7152  void foo(I *i) { [i f:12]; }
7153objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7154  matches [i f:12]
7155</pre></td></tr>
7156
7157
7158<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>
7159<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7160call expression.
7161
7162Example matches y in x(y)
7163    (matcher = callExpr(hasArgument(0, declRefExpr())))
7164  void x(int) { int y; x(y); }
7165</pre></td></tr>
7166
7167
7168<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>
7169<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7170
7171Examples:
7172  int x;
7173declaratorDecl(hasTypeLoc(loc(asString("int"))))
7174  matches int x
7175
7176auto x = int(3);
7177cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7178  matches int(3)
7179
7180struct Foo { Foo(int, int); };
7181auto x = Foo(1, 2);
7182cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7183  matches Foo(1, 2)
7184
7185Usable 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;,
7186  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;,
7187  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;,
7188  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7189  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;,
7190  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;,
7191  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;,
7192  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7193</pre></td></tr>
7194
7195
7196<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>
7197<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7198given matcher.
7199
7200Example matches y.x() (matcher = callExpr(callee(
7201                                   cxxMethodDecl(hasName("x")))))
7202  class Y { public: void x(); };
7203  void z() { Y y; y.x(); }
7204</pre></td></tr>
7205
7206
7207<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>
7208<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7209
7210Given
7211  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
7212  void f() { f(); }
7213callExpr(callee(expr()))
7214  matches this-&gt;x(), x(), y.x(), f()
7215with callee(...)
7216  matching this-&gt;x, x, y.x, f respectively
7217
7218Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7219because this introduces ambiguous overloads with calls to Callee taking a
7220internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7221implemented in terms of implicit casts.
7222</pre></td></tr>
7223
7224
7225<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>
7226<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7227
7228Given
7229  void f(int i);
7230  int y;
7231  f(y);
7232callExpr(
7233  forEachArgumentWithParam(
7234    declRefExpr(to(varDecl(hasName("y")))),
7235    parmVarDecl(hasType(isInteger()))
7236))
7237  matches f(y);
7238with declRefExpr(...)
7239  matching int y
7240and parmVarDecl(...)
7241  matching int i
7242</pre></td></tr>
7243
7244
7245<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>
7246<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7247CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7248it works on calls through function pointers as well.
7249
7250The difference is, that function pointers do not provide access to a
7251ParmVarDecl, but only the QualType for each argument.
7252
7253Given
7254  void f(int i);
7255  int y;
7256  f(y);
7257  void (*f_ptr)(int) = f;
7258  f_ptr(y);
7259callExpr(
7260  forEachArgumentWithParamType(
7261    declRefExpr(to(varDecl(hasName("y")))),
7262    qualType(isInteger()).bind("type)
7263))
7264  matches f(y) and f_ptr(y)
7265with declRefExpr(...)
7266  matching int y
7267and qualType(...)
7268  matching int
7269</pre></td></tr>
7270
7271
7272<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>
7273<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7274expression, or an ObjC-message-send expression.
7275
7276Given
7277  void x(int, int, int) { int y; x(1, y, 42); }
7278callExpr(hasAnyArgument(declRefExpr()))
7279  matches x(1, y, 42)
7280with hasAnyArgument(...)
7281  matching y
7282
7283For ObjectiveC, given
7284  @interface I - (void) f:(int) y; @end
7285  void foo(I *i) { [i f:12]; }
7286objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7287  matches [i f:12]
7288</pre></td></tr>
7289
7290
7291<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>
7292<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7293call expression.
7294
7295Example matches y in x(y)
7296    (matcher = callExpr(hasArgument(0, declRefExpr())))
7297  void x(int) { int y; x(y); }
7298</pre></td></tr>
7299
7300
7301<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>
7302<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7303matches the given matcher.
7304
7305The associated declaration is:
7306- for type nodes, the declaration of the underlying type
7307- for CallExpr, the declaration of the callee
7308- for MemberExpr, the declaration of the referenced member
7309- for CXXConstructExpr, the declaration of the constructor
7310- for CXXNewExpr, the declaration of the operator new
7311- for ObjCIvarExpr, the declaration of the ivar
7312
7313For type nodes, hasDeclaration will generally match the declaration of the
7314sugared type. Given
7315  class X {};
7316  typedef X Y;
7317  Y y;
7318in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7319typedefDecl. A common use case is to match the underlying, desugared type.
7320This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7321  varDecl(hasType(hasUnqualifiedDesugaredType(
7322      recordType(hasDeclaration(decl())))))
7323In this matcher, the decl will match the CXXRecordDecl of class X.
7324
7325Usable 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;,
7326  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;,
7327  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;,
7328  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;,
7329  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;,
7330  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;,
7331  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7332</pre></td></tr>
7333
7334
7335<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>
7336<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7337extension, matches the constant given in the statement.
7338
7339Given
7340  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7341caseStmt(hasCaseConstant(integerLiteral()))
7342  matches "case 1:"
7343</pre></td></tr>
7344
7345
7346<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>
7347<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7348or opaque value's source expression matches the given matcher.
7349
7350Example 1: matches "a string"
7351(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7352class URL { URL(string); };
7353URL url = "a string";
7354
7355Example 2: matches 'b' (matcher =
7356opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7357int a = b ?: 1;
7358</pre></td></tr>
7359
7360
7361<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>
7362<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7363functionDecl that have at least one TemplateArgument matching the given
7364InnerMatcher.
7365
7366Given
7367  template&lt;typename T&gt; class A {};
7368  template&lt;&gt; class A&lt;double&gt; {};
7369  A&lt;int&gt; a;
7370
7371  template&lt;typename T&gt; f() {};
7372  void func() { f&lt;int&gt;(); };
7373
7374classTemplateSpecializationDecl(hasAnyTemplateArgument(
7375    refersToType(asString("int"))))
7376  matches the specialization A&lt;int&gt;
7377
7378functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7379  matches the specialization f&lt;int&gt;
7380</pre></td></tr>
7381
7382
7383<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>
7384<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7385
7386Given
7387  template&lt;typename T&gt; class A {}; #1
7388  template&lt;&gt; class A&lt;int&gt; {}; #2
7389classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7390  matches '#2' with classTemplateDecl() matching the class template
7391  declaration of 'A' at #1.
7392</pre></td></tr>
7393
7394
7395<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>
7396<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7397functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7398
7399Given
7400  template&lt;typename T, typename U&gt; class A {};
7401  A&lt;bool, int&gt; b;
7402  A&lt;int, bool&gt; c;
7403
7404  template&lt;typename T&gt; void f() {}
7405  void func() { f&lt;int&gt;(); };
7406classTemplateSpecializationDecl(hasTemplateArgument(
7407    1, refersToType(asString("int"))))
7408  matches the specialization A&lt;bool, int&gt;
7409
7410functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7411  matches the specialization f&lt;int&gt;
7412</pre></td></tr>
7413
7414
7415<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>
7416<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7417
7418Examples:
7419  int x;
7420declaratorDecl(hasTypeLoc(loc(asString("int"))))
7421  matches int x
7422
7423auto x = int(3);
7424cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7425  matches int(3)
7426
7427struct Foo { Foo(int, int); };
7428auto x = Foo(1, 2);
7429cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7430  matches Foo(1, 2)
7431
7432Usable 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;,
7433  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;,
7434  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;,
7435  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7436  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;,
7437  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;,
7438  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;,
7439  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7440</pre></td></tr>
7441
7442
7443<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>
7444<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7445type.
7446
7447Given
7448  struct A {};
7449  A a[7];
7450  int b[7];
7451arrayType(hasElementType(builtinType()))
7452  matches "int b[7]"
7453
7454Usable 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;
7455</pre></td></tr>
7456
7457
7458<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>
7459<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7460
7461Examples:
7462  int x;
7463declaratorDecl(hasTypeLoc(loc(asString("int"))))
7464  matches int x
7465
7466auto x = int(3);
7467cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7468  matches int(3)
7469
7470struct Foo { Foo(int, int); };
7471auto x = Foo(1, 2);
7472cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7473  matches Foo(1, 2)
7474
7475Usable 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;,
7476  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;,
7477  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;,
7478  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7479  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;,
7480  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;,
7481  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;,
7482  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7483</pre></td></tr>
7484
7485
7486<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>
7487<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7488a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7489
7490Given
7491  { {}; 1+2; }
7492hasAnySubstatement(compoundStmt())
7493  matches '{ {}; 1+2; }'
7494with compoundStmt()
7495  matching '{}'
7496</pre></td></tr>
7497
7498
7499<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>
7500<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7501</pre></td></tr>
7502
7503
7504<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>
7505<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7506matches the given matcher.
7507
7508The associated declaration is:
7509- for type nodes, the declaration of the underlying type
7510- for CallExpr, the declaration of the callee
7511- for MemberExpr, the declaration of the referenced member
7512- for CXXConstructExpr, the declaration of the constructor
7513- for CXXNewExpr, the declaration of the operator new
7514- for ObjCIvarExpr, the declaration of the ivar
7515
7516For type nodes, hasDeclaration will generally match the declaration of the
7517sugared type. Given
7518  class X {};
7519  typedef X Y;
7520  Y y;
7521in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7522typedefDecl. A common use case is to match the underlying, desugared type.
7523This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7524  varDecl(hasType(hasUnqualifiedDesugaredType(
7525      recordType(hasDeclaration(decl())))))
7526In this matcher, the decl will match the CXXRecordDecl of class X.
7527
7528Usable 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;,
7529  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;,
7530  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;,
7531  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;,
7532  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;,
7533  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;,
7534  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7535</pre></td></tr>
7536
7537
7538<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgumentLoc0')"><a name="hasTemplateArgumentLoc0Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
7539<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th
7540`TemplateArgumentLoc` matches the given `InnerMatcher`.
7541
7542Given
7543  template&lt;typename T, typename U&gt; class A {};
7544  A&lt;double, int&gt; b;
7545  A&lt;int, double&gt; c;
7546varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
7547  hasTypeLoc(loc(asString("double")))))))
7548  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
7549</pre></td></tr>
7550
7551
7552<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('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>
7553<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7554specific using shadow declaration.
7555
7556Given
7557  namespace a { void f() {} }
7558  using a::f;
7559  void g() {
7560    f();     // Matches this ..
7561    a::f();  // .. but not this.
7562  }
7563declRefExpr(throughUsingDecl(anything()))
7564  matches f()
7565</pre></td></tr>
7566
7567
7568<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>
7569<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7570specified matcher.
7571
7572Example matches x in if(x)
7573    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7574  bool x;
7575  if (x) {}
7576</pre></td></tr>
7577
7578
7579<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>
7580<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7581
7582Note that this does not work for global declarations because the AST
7583breaks up multiple-declaration DeclStmt's into multiple single-declaration
7584DeclStmt's.
7585Example: Given non-global declarations
7586  int a, b = 0;
7587  int c;
7588  int d = 2, e;
7589declStmt(containsDeclaration(
7590      0, varDecl(hasInitializer(anything()))))
7591  matches only 'int d = 2, e;', and
7592declStmt(containsDeclaration(1, varDecl()))
7593  matches 'int a, b = 0' as well as 'int d = 2, e;'
7594  but 'int c;' is not matched.
7595</pre></td></tr>
7596
7597
7598<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>
7599<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7600
7601Given
7602  int a, b;
7603  int c;
7604declStmt(hasSingleDecl(anything()))
7605  matches 'int c;' but not 'int a, b;'.
7606</pre></td></tr>
7607
7608
7609<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>
7610<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7611
7612Examples:
7613  int x;
7614declaratorDecl(hasTypeLoc(loc(asString("int"))))
7615  matches int x
7616
7617auto x = int(3);
7618cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7619  matches int(3)
7620
7621struct Foo { Foo(int, int); };
7622auto x = Foo(1, 2);
7623cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7624  matches Foo(1, 2)
7625
7626Usable 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;,
7627  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;,
7628  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;,
7629  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7630  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;,
7631  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;,
7632  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;,
7633  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7634</pre></td></tr>
7635
7636
7637<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>
7638<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7639Decl, matches InnerMatcher.
7640
7641Given
7642  namespace N {
7643    namespace M {
7644      class D {};
7645    }
7646  }
7647
7648cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7649declaration of class D.
7650</pre></td></tr>
7651
7652
7653<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>
7654<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7655
7656Given
7657  decltype(1) a = 1;
7658  decltype(2.0) b = 2.0;
7659decltypeType(hasUnderlyingType(isInteger()))
7660  matches the type of "a"
7661
7662Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7663</pre></td></tr>
7664
7665
7666<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>
7667<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7668
7669For example, in:
7670void foo()
7671{
7672    int arr[3];
7673    auto &amp;[f, s, t] = arr;
7674
7675    f = 42;
7676}
7677The matcher:
7678  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7679matches the decomposition decl with 'f' bound to "fBinding".
7680</pre></td></tr>
7681
7682
7683<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>
7684<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7685
7686For example, in:
7687void foo()
7688{
7689    int arr[3];
7690    auto &amp;[f, s, t] = arr;
7691
7692    f = 42;
7693}
7694The matcher:
7695  decompositionDecl(hasBinding(0,
7696  bindingDecl(hasName("f").bind("fBinding"))))
7697matches the decomposition decl with 'f' bound to "fBinding".
7698</pre></td></tr>
7699
7700
7701<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>
7702<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7703
7704
7705<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>
7706<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7707switch statement or conditional operator.
7708
7709Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7710  if (true) {}
7711</pre></td></tr>
7712
7713
7714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasNamedTypeLoc0')"><a name="hasNamedTypeLoc0Anchor">hasNamedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
7715<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
7716`InnerMatcher`.
7717
7718Given
7719  template &lt;typename T&gt;
7720  class C {};
7721  class C&lt;int&gt; c;
7722
7723  class D {};
7724  class D d;
7725elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
7726  matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
7727</pre></td></tr>
7728
7729
7730<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>
7731<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7732matches InnerMatcher if the qualifier exists.
7733
7734Given
7735  namespace N {
7736    namespace M {
7737      class D {};
7738    }
7739  }
7740  N::M::D d;
7741
7742elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7743matches the type of the variable declaration of d.
7744</pre></td></tr>
7745
7746
7747<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>
7748<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7749
7750Given
7751  namespace N {
7752    namespace M {
7753      class D {};
7754    }
7755  }
7756  N::M::D d;
7757
7758elaboratedType(namesType(recordType(
7759hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7760declaration of d.
7761</pre></td></tr>
7762
7763
7764<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>
7765<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7766matches the given matcher.
7767
7768The associated declaration is:
7769- for type nodes, the declaration of the underlying type
7770- for CallExpr, the declaration of the callee
7771- for MemberExpr, the declaration of the referenced member
7772- for CXXConstructExpr, the declaration of the constructor
7773- for CXXNewExpr, the declaration of the operator new
7774- for ObjCIvarExpr, the declaration of the ivar
7775
7776For type nodes, hasDeclaration will generally match the declaration of the
7777sugared type. Given
7778  class X {};
7779  typedef X Y;
7780  Y y;
7781in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7782typedefDecl. A common use case is to match the underlying, desugared type.
7783This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7784  varDecl(hasType(hasUnqualifiedDesugaredType(
7785      recordType(hasDeclaration(decl())))))
7786In this matcher, the decl will match the CXXRecordDecl of class X.
7787
7788Usable 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;,
7789  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;,
7790  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;,
7791  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;,
7792  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;,
7793  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;,
7794  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7795</pre></td></tr>
7796
7797
7798<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>
7799<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7800
7801(Note: Clang's AST refers to other conversions as "casts" too, and calls
7802actual casts "explicit" casts.)
7803</pre></td></tr>
7804
7805
7806<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>
7807<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7808
7809Examples:
7810  int x;
7811declaratorDecl(hasTypeLoc(loc(asString("int"))))
7812  matches int x
7813
7814auto x = int(3);
7815cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7816  matches int(3)
7817
7818struct Foo { Foo(int, int); };
7819auto x = Foo(1, 2);
7820cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7821  matches Foo(1, 2)
7822
7823Usable 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;,
7824  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;,
7825  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;,
7826  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7827  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;,
7828  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;,
7829  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;,
7830  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7831</pre></td></tr>
7832
7833
7834<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>
7835<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7836declaration's type.
7837
7838In case of a value declaration (for example a variable declaration),
7839this resolves one layer of indirection. For example, in the value
7840declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7841X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7842declaration of x.
7843
7844Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7845            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7846            and friend class X (matcher = friendDecl(hasType("X"))
7847            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7848                                              cxxRecordDecl(hasName("X"))))
7849 class X {};
7850 void y(X &amp;x) { x; X z; }
7851 class Y { friend class X; };
7852 class Z : public virtual X {};
7853
7854Example matches class Derived
7855(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7856class Base {};
7857class Derived : Base {};
7858
7859Usable 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;,
7860Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7861</pre></td></tr>
7862
7863
7864<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>
7865<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7866matcher.
7867
7868Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7869            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7870            and U (matcher = typedefDecl(hasType(asString("int")))
7871            and friend class X (matcher = friendDecl(hasType("X"))
7872            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7873                                              asString("class X")))
7874 class X {};
7875 void y(X &amp;x) { x; X z; }
7876 typedef int U;
7877 class Y { friend class X; };
7878 class Z : public virtual X {};
7879</pre></td></tr>
7880
7881
7882<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>
7883<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7884elidable constructor and other corresponding bookkeeping nodes.
7885
7886In C++17, elidable copy constructors are no longer being generated in the
7887AST as it is not permitted by the standard. They are, however, part of the
7888AST in C++14 and earlier. So, a matcher must abstract over these differences
7889to work in all language modes. This matcher skips elidable constructor-call
7890AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7891various implicit nodes inside the constructor calls, all of which will not
7892appear in the C++17 AST.
7893
7894Given
7895
7896struct H {};
7897H G();
7898void f() {
7899  H D = G();
7900}
7901
7902``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7903matches ``H D = G()`` in C++11 through C++17 (and beyond).
7904</pre></td></tr>
7905
7906
7907<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>
7908<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7909are stripped off.
7910
7911Parentheses and explicit casts are not discarded.
7912Given
7913  int arr[5];
7914  int a = 0;
7915  char b = 0;
7916  const int c = a;
7917  int *d = arr;
7918  long e = (long) 0l;
7919The matchers
7920   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7921   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7922would match the declarations for a, b, c, and d, but not e.
7923While
7924   varDecl(hasInitializer(integerLiteral()))
7925   varDecl(hasInitializer(declRefExpr()))
7926only match the declarations for a.
7927</pre></td></tr>
7928
7929
7930<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>
7931<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7932nodes are stripped off.
7933
7934Parentheses and explicit casts are not discarded.
7935Given
7936  class C {};
7937  C a = C();
7938  C b;
7939  C c = b;
7940The matchers
7941   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7942would match the declarations for a, b, and c.
7943While
7944   varDecl(hasInitializer(cxxConstructExpr()))
7945only match the declarations for b and c.
7946</pre></td></tr>
7947
7948
7949<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>
7950<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7951casts are stripped off.
7952
7953Implicit and non-C Style casts are also discarded.
7954Given
7955  int a = 0;
7956  char b = (0);
7957  void* c = reinterpret_cast&lt;char*&gt;(0);
7958  char d = char(0);
7959The matcher
7960   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7961would match the declarations for a, b, c, and d.
7962while
7963   varDecl(hasInitializer(integerLiteral()))
7964only match the declaration for a.
7965</pre></td></tr>
7966
7967
7968<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>
7969<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7970parentheses are stripped off.
7971
7972Explicit casts are not discarded.
7973Given
7974  int arr[5];
7975  int a = 0;
7976  char b = (0);
7977  const int c = a;
7978  int *d = (arr);
7979  long e = ((long) 0l);
7980The matchers
7981   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7982   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7983would match the declarations for a, b, c, and d, but not e.
7984while
7985   varDecl(hasInitializer(integerLiteral()))
7986   varDecl(hasInitializer(declRefExpr()))
7987would only match the declaration for a.
7988</pre></td></tr>
7989
7990
7991<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>
7992<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7993
7994Given
7995  const char* str = ("my-string");
7996The matcher
7997  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7998would match the implicit cast resulting from the assignment.
7999</pre></td></tr>
8000
8001
8002<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>
8003<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
8004
8005Given
8006  class C {
8007    int a = 2;
8008    int b = 3;
8009    int c;
8010  };
8011fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
8012  matches 'int a;' but not 'int b;'.
8013fieldDecl(hasInClassInitializer(anything()))
8014  matches 'int a;' and 'int b;' but not 'int c;'.
8015</pre></td></tr>
8016
8017
8018<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('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>
8019<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
8020
8021
8022<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>
8023<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
8024switch statement or conditional operator.
8025
8026Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8027  if (true) {}
8028</pre></td></tr>
8029
8030
8031<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>
8032<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
8033
8034Example:
8035    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
8036matches '++x' in
8037    for (x; x &lt; N; ++x) { }
8038</pre></td></tr>
8039
8040
8041<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>
8042<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
8043
8044Example:
8045    forStmt(hasLoopInit(declStmt()))
8046matches 'int x = 0' in
8047    for (int x = 0; x &lt; N; ++x) { }
8048</pre></td></tr>
8049
8050
8051<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>
8052<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
8053declaration's type.
8054
8055In case of a value declaration (for example a variable declaration),
8056this resolves one layer of indirection. For example, in the value
8057declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8058X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8059declaration of x.
8060
8061Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8062            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8063            and friend class X (matcher = friendDecl(hasType("X"))
8064            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8065                                              cxxRecordDecl(hasName("X"))))
8066 class X {};
8067 void y(X &amp;x) { x; X z; }
8068 class Y { friend class X; };
8069 class Z : public virtual X {};
8070
8071Example matches class Derived
8072(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8073class Base {};
8074class Derived : Base {};
8075
8076Usable 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;,
8077Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8078</pre></td></tr>
8079
8080
8081<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>
8082<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
8083matcher.
8084
8085Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8086            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8087            and U (matcher = typedefDecl(hasType(asString("int")))
8088            and friend class X (matcher = friendDecl(hasType("X"))
8089            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8090                                              asString("class X")))
8091 class X {};
8092 void y(X &amp;x) { x; X z; }
8093 typedef int U;
8094 class Y { friend class X; };
8095 class Z : public virtual X {};
8096</pre></td></tr>
8097
8098
8099<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>
8100<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
8101Note that this matcher matches all the declarations of a function whose
8102body is present in the AST.
8103
8104Given
8105  void f();
8106  void f() {}
8107  void g();
8108functionDecl(hasAnyBody(compoundStmt()))
8109  matches both 'void f();'
8110  and 'void f() {}'
8111with compoundStmt()
8112  matching '{}'
8113  but does not match 'void g();'
8114</pre></td></tr>
8115
8116
8117<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>
8118<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
8119block.
8120
8121Does not match the 'this' parameter of a method.
8122
8123Given
8124  class X { void f(int x, int y, int z) {} };
8125cxxMethodDecl(hasAnyParameter(hasName("y")))
8126  matches f(int x, int y, int z) {}
8127with hasAnyParameter(...)
8128  matching int y
8129
8130For ObjectiveC, given
8131  @interface I - (void) f:(int) y; @end
8132
8133the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8134matches the declaration of method f with hasParameter
8135matching y.
8136
8137For blocks, given
8138  b = ^(int y) { printf("%d", y) };
8139
8140the matcher blockDecl(hasAnyParameter(hasName("y")))
8141matches the declaration of the block b with hasParameter
8142matching y.
8143</pre></td></tr>
8144
8145
8146<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>
8147<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8148functionDecl that have at least one TemplateArgument matching the given
8149InnerMatcher.
8150
8151Given
8152  template&lt;typename T&gt; class A {};
8153  template&lt;&gt; class A&lt;double&gt; {};
8154  A&lt;int&gt; a;
8155
8156  template&lt;typename T&gt; f() {};
8157  void func() { f&lt;int&gt;(); };
8158
8159classTemplateSpecializationDecl(hasAnyTemplateArgument(
8160    refersToType(asString("int"))))
8161  matches the specialization A&lt;int&gt;
8162
8163functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8164  matches the specialization f&lt;int&gt;
8165</pre></td></tr>
8166
8167
8168<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>
8169<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
8170
8171
8172<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>
8173<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
8174declaration.
8175
8176Given
8177  template&lt;bool b&gt;
8178  struct S {
8179    S(int); // #1
8180    explicit S(double); // #2
8181    operator int(); // #3
8182    explicit operator bool(); // #4
8183    explicit(false) S(bool) // # 7
8184    explicit(true) S(char) // # 8
8185    explicit(b) S(S) // # 9
8186  };
8187  S(int) -&gt; S&lt;true&gt; // #5
8188  explicit S(double) -&gt; S&lt;false&gt; // #6
8189cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8190cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8191cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8192</pre></td></tr>
8193
8194
8195<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>
8196<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
8197declaration or a block.
8198
8199Given
8200  class X { void f(int x) {} };
8201cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8202  matches f(int x) {}
8203with hasParameter(...)
8204  matching int x
8205
8206For ObjectiveC, given
8207  @interface I - (void) f:(int) y; @end
8208
8209the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8210matches the declaration of method f with hasParameter
8211matching y.
8212</pre></td></tr>
8213
8214
8215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasReturnTypeLoc0')"><a name="hasReturnTypeLoc0Anchor">hasReturnTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; ReturnMatcher</td></tr>
8216<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`.
8217
8218Given
8219  int f() { return 5; }
8220  void g() {}
8221functionDecl(hasReturnTypeLoc(loc(asString("int"))))
8222  matches the declaration of `f`, but not `g`.
8223</pre></td></tr>
8224
8225
8226<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>
8227<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8228functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8229
8230Given
8231  template&lt;typename T, typename U&gt; class A {};
8232  A&lt;bool, int&gt; b;
8233  A&lt;int, bool&gt; c;
8234
8235  template&lt;typename T&gt; void f() {}
8236  void func() { f&lt;int&gt;(); };
8237classTemplateSpecializationDecl(hasTemplateArgument(
8238    1, refersToType(asString("int"))))
8239  matches the specialization A&lt;bool, int&gt;
8240
8241functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8242  matches the specialization f&lt;int&gt;
8243</pre></td></tr>
8244
8245
8246<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>
8247<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8248
8249Given:
8250  class X { int f() { return 1; } };
8251cxxMethodDecl(returns(asString("int")))
8252  matches int f() { return 1; }
8253</pre></td></tr>
8254
8255
8256<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>
8257<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8258switch statement or conditional operator.
8259
8260Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8261  if (true) {}
8262</pre></td></tr>
8263
8264
8265<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>
8266<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8267
8268Given
8269  if (A* a = GetAPointer()) {}
8270hasConditionVariableStatement(...)
8271  matches 'A* a = GetAPointer()'.
8272</pre></td></tr>
8273
8274
8275<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>
8276<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8277
8278Examples matches the if statement
8279  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8280  if (false) false; else true;
8281</pre></td></tr>
8282
8283
8284<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>
8285<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8286
8287Given:
8288 void foo() {
8289   if (int i = foobar(); i &gt; 0) {}
8290   switch (int i = foobar(); i) {}
8291   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8292 }
8293 void bar() {
8294   if (foobar() &gt; 0) {}
8295   switch (foobar()) {}
8296   for (auto&amp; x : get_range()) {}
8297 }
8298ifStmt(hasInitStatement(anything()))
8299  matches the if statement in foo but not in bar.
8300switchStmt(hasInitStatement(anything()))
8301  matches the switch statement in foo but not in bar.
8302cxxForRangeStmt(hasInitStatement(anything()))
8303  matches the range for statement in foo but not in bar.
8304</pre></td></tr>
8305
8306
8307<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>
8308<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8309
8310Examples matches the if statement
8311  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8312  if (false) true; else false;
8313</pre></td></tr>
8314
8315
8316<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>
8317<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8318matcher.
8319
8320FIXME: Unit test this matcher
8321</pre></td></tr>
8322
8323
8324<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>
8325<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8326
8327Example matches y.
8328    (matcher = initListExpr(hasInit(0, expr())))
8329  int x{y}.
8330</pre></td></tr>
8331
8332
8333<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>
8334<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8335(if expression have it).
8336</pre></td></tr>
8337
8338
8339<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>
8340<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8341matches the given matcher.
8342
8343The associated declaration is:
8344- for type nodes, the declaration of the underlying type
8345- for CallExpr, the declaration of the callee
8346- for MemberExpr, the declaration of the referenced member
8347- for CXXConstructExpr, the declaration of the constructor
8348- for CXXNewExpr, the declaration of the operator new
8349- for ObjCIvarExpr, the declaration of the ivar
8350
8351For type nodes, hasDeclaration will generally match the declaration of the
8352sugared type. Given
8353  class X {};
8354  typedef X Y;
8355  Y y;
8356in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8357typedefDecl. A common use case is to match the underlying, desugared type.
8358This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8359  varDecl(hasType(hasUnqualifiedDesugaredType(
8360      recordType(hasDeclaration(decl())))))
8361In this matcher, the decl will match the CXXRecordDecl of class X.
8362
8363Usable 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;,
8364  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;,
8365  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;,
8366  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;,
8367  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;,
8368  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;,
8369  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8370</pre></td></tr>
8371
8372
8373<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>
8374<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8375matches the given matcher.
8376
8377The associated declaration is:
8378- for type nodes, the declaration of the underlying type
8379- for CallExpr, the declaration of the callee
8380- for MemberExpr, the declaration of the referenced member
8381- for CXXConstructExpr, the declaration of the constructor
8382- for CXXNewExpr, the declaration of the operator new
8383- for ObjCIvarExpr, the declaration of the ivar
8384
8385For type nodes, hasDeclaration will generally match the declaration of the
8386sugared type. Given
8387  class X {};
8388  typedef X Y;
8389  Y y;
8390in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8391typedefDecl. A common use case is to match the underlying, desugared type.
8392This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8393  varDecl(hasType(hasUnqualifiedDesugaredType(
8394      recordType(hasDeclaration(decl())))))
8395In this matcher, the decl will match the CXXRecordDecl of class X.
8396
8397Usable 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;,
8398  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;,
8399  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;,
8400  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;,
8401  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;,
8402  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;,
8403  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8404</pre></td></tr>
8405
8406
8407<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('capturesVar0')"><a name="capturesVar0Anchor">capturesVar</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
8408<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
8409`VarDecl` can be a separate variable that is captured by value or
8410reference, or a synthesized variable if the capture has an initializer.
8411
8412Given
8413  void foo() {
8414    int x;
8415    auto f = [x](){};
8416    auto g = [x = 1](){};
8417  }
8418In the matcher
8419lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))),
8420capturesVar(hasName("x")) matches `x` and `x = 1`.
8421</pre></td></tr>
8422
8423
8424<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('forEachLambdaCapture0')"><a name="forEachLambdaCapture0Anchor">forEachLambdaCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8425<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression.
8426
8427Given
8428  int main() {
8429    int x, y;
8430    float z;
8431    auto f = [=]() { return x + y + z; };
8432  }
8433lambdaExpr(forEachLambdaCapture(
8434    lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
8435will trigger two matches, binding for 'x' and 'y' respectively.
8436</pre></td></tr>
8437
8438
8439<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8440<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression.
8441
8442Given
8443  void foo() {
8444    int t = 5;
8445    auto f = [=](){ return t; };
8446  }
8447lambdaExpr(hasAnyCapture(lambdaCapture())) and
8448lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t")))))
8449  both match `[=](){ return t; }`.
8450</pre></td></tr>
8451
8452
8453<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>
8454<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8455matches the given matcher.
8456
8457The associated declaration is:
8458- for type nodes, the declaration of the underlying type
8459- for CallExpr, the declaration of the callee
8460- for MemberExpr, the declaration of the referenced member
8461- for CXXConstructExpr, the declaration of the constructor
8462- for CXXNewExpr, the declaration of the operator new
8463- for ObjCIvarExpr, the declaration of the ivar
8464
8465For type nodes, hasDeclaration will generally match the declaration of the
8466sugared type. Given
8467  class X {};
8468  typedef X Y;
8469  Y y;
8470in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8471typedefDecl. A common use case is to match the underlying, desugared type.
8472This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8473  varDecl(hasType(hasUnqualifiedDesugaredType(
8474      recordType(hasDeclaration(decl())))))
8475In this matcher, the decl will match the CXXRecordDecl of class X.
8476
8477Usable 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;,
8478  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;,
8479  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;,
8480  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;,
8481  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;,
8482  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;,
8483  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8484</pre></td></tr>
8485
8486
8487<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>
8488<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8489given matcher. Implicit object expressions are included; that is, it matches
8490use of implicit `this`.
8491
8492Given
8493  struct X {
8494    int m;
8495    int f(X x) { x.m; return m; }
8496  };
8497memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8498  matches `x.m`, but not `m`; however,
8499memberExpr(hasObjectExpression(hasType(pointsTo(
8500     cxxRecordDecl(hasName("X"))))))
8501  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8502</pre></td></tr>
8503
8504
8505<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>
8506<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8507given matcher.
8508
8509Given
8510  struct { int first, second; } first, second;
8511  int i(second.first);
8512  int j(first.second);
8513memberExpr(member(hasName("first")))
8514  matches second.first
8515  but not first.second (because the member name there is "second").
8516</pre></td></tr>
8517
8518
8519<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>
8520<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8521pointee matches a given matcher.
8522
8523Given
8524  int *a;
8525  int const *b;
8526  float const *f;
8527pointerType(pointee(isConstQualified(), isInteger()))
8528  matches "int const *b"
8529
8530Usable 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;,
8531  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;
8532</pre></td></tr>
8533
8534
8535<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>
8536<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8537matcher.
8538
8539Given
8540  namespace N { template&lt;class T&gt; void f(T t); }
8541  template &lt;class T&gt; void g() { using N::f; f(T()); }
8542unresolvedLookupExpr(hasAnyDeclaration(
8543    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8544  matches the use of f in g() .
8545</pre></td></tr>
8546
8547
8548<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>
8549<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8550
8551Given
8552  struct A { struct B { struct C {}; }; };
8553  A::B::C c;
8554nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8555  matches "A::"
8556</pre></td></tr>
8557
8558
8559<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>
8560<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8561NestedNameSpecifier-matcher matches.
8562</pre></td></tr>
8563
8564
8565<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>
8566<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8567given TypeLoc.
8568
8569Given
8570  struct A { struct B { struct C {}; }; };
8571  A::B::C c;
8572nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8573  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8574  matches "A::"
8575</pre></td></tr>
8576
8577
8578<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>
8579<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8580
8581Given
8582  struct A { struct B { struct C {}; }; };
8583  A::B::C c;
8584nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8585  matches "A::"
8586</pre></td></tr>
8587
8588
8589<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>
8590<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8591given namespace matcher.
8592
8593Given
8594  namespace ns { struct A {}; }
8595  ns::A a;
8596nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8597  matches "ns::"
8598</pre></td></tr>
8599
8600
8601<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>
8602<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8603given QualType matcher without qualifiers.
8604
8605Given
8606  struct A { struct B { struct C {}; }; };
8607  A::B::C c;
8608nestedNameSpecifier(specifiesType(
8609  hasDeclaration(cxxRecordDecl(hasName("A")))
8610))
8611  matches "A::"
8612</pre></td></tr>
8613
8614
8615<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('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>
8616<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8617
8618Given
8619
8620  #pragma omp parallel
8621  #pragma omp parallel default(none)
8622
8623``ompExecutableDirective(hasAnyClause(anything()))`` matches
8624``omp parallel default(none)``.
8625</pre></td></tr>
8626
8627
8628<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>
8629<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8630
8631Prerequisite: the executable directive must not be standalone directive.
8632If it is, it will never match.
8633
8634Given
8635
8636   #pragma omp parallel
8637   ;
8638   #pragma omp parallel
8639   {}
8640
8641``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8642</pre></td></tr>
8643
8644
8645<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>
8646<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8647matching Base, or Objective-C classes that directly or indirectly
8648subclass a class matching Base.
8649
8650Note that a class is not considered to be derived from itself.
8651
8652Example matches Y, Z, C (Base == hasName("X"))
8653  class X;
8654  class Y : public X {};  // directly derived
8655  class Z : public Y {};  // indirectly derived
8656  typedef X A;
8657  typedef A B;
8658  class C : public B {};  // derived from a typedef of X
8659
8660In the following example, Bar matches isDerivedFrom(hasName("X")):
8661  class Foo;
8662  typedef Foo X;
8663  class Bar : public Foo {};  // derived from a type that X is a typedef of
8664
8665In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8666  @interface NSObject @end
8667  @interface Bar : NSObject @end
8668
8669Usable 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;
8670</pre></td></tr>
8671
8672
8673<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>
8674<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8675matching Base.
8676
8677Note that a class is not considered to be derived from itself.
8678
8679Example matches Y, C (Base == hasName("X"))
8680  class X;
8681  class Y : public X {};  // directly derived
8682  class Z : public Y {};  // indirectly derived
8683  typedef X A;
8684  typedef A B;
8685  class C : public B {};  // derived from a typedef of X
8686
8687In the following example, Bar matches isDerivedFrom(hasName("X")):
8688  class Foo;
8689  typedef Foo X;
8690  class Bar : public Foo {};  // derived from a type that X is a typedef of
8691</pre></td></tr>
8692
8693
8694<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>
8695<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8696match Base.
8697</pre></td></tr>
8698
8699
8700<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>
8701<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8702expression, or an ObjC-message-send expression.
8703
8704Given
8705  void x(int, int, int) { int y; x(1, y, 42); }
8706callExpr(hasAnyArgument(declRefExpr()))
8707  matches x(1, y, 42)
8708with hasAnyArgument(...)
8709  matching y
8710
8711For ObjectiveC, given
8712  @interface I - (void) f:(int) y; @end
8713  void foo(I *i) { [i f:12]; }
8714objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8715  matches [i f:12]
8716</pre></td></tr>
8717
8718
8719<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>
8720<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8721call expression.
8722
8723Example matches y in x(y)
8724    (matcher = callExpr(hasArgument(0, declRefExpr())))
8725  void x(int) { int y; x(y); }
8726</pre></td></tr>
8727
8728
8729<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>
8730<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8731and the inner matcher matches on that instance.
8732
8733For example the method call in
8734  NSString *x = @"hello";
8735  [x containsString:@"h"];
8736is matched by
8737objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8738</pre></td></tr>
8739
8740
8741<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>
8742<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8743
8744Example
8745matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8746matches the [webView ...] message invocation.
8747  NSString *webViewJavaScript = ...
8748  UIWebView *webView = ...
8749  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8750</pre></td></tr>
8751
8752
8753<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>
8754<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8755block.
8756
8757Does not match the 'this' parameter of a method.
8758
8759Given
8760  class X { void f(int x, int y, int z) {} };
8761cxxMethodDecl(hasAnyParameter(hasName("y")))
8762  matches f(int x, int y, int z) {}
8763with hasAnyParameter(...)
8764  matching int y
8765
8766For ObjectiveC, given
8767  @interface I - (void) f:(int) y; @end
8768
8769the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8770matches the declaration of method f with hasParameter
8771matching y.
8772
8773For blocks, given
8774  b = ^(int y) { printf("%d", y) };
8775
8776the matcher blockDecl(hasAnyParameter(hasName("y")))
8777matches the declaration of the block b with hasParameter
8778matching y.
8779</pre></td></tr>
8780
8781
8782<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>
8783<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8784declaration or a block.
8785
8786Given
8787  class X { void f(int x) {} };
8788cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8789  matches f(int x) {}
8790with hasParameter(...)
8791  matching int x
8792
8793For ObjectiveC, given
8794  @interface I - (void) f:(int) y; @end
8795
8796the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8797matches the declaration of method f with hasParameter
8798matching y.
8799</pre></td></tr>
8800
8801
8802<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>
8803<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8804
8805Examples:
8806  int x;
8807declaratorDecl(hasTypeLoc(loc(asString("int"))))
8808  matches int x
8809
8810auto x = int(3);
8811cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8812  matches int(3)
8813
8814struct Foo { Foo(int, int); };
8815auto x = Foo(1, 2);
8816cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8817  matches Foo(1, 2)
8818
8819Usable 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;,
8820  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;,
8821  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;,
8822  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8823  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;,
8824  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;,
8825  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;,
8826  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8827</pre></td></tr>
8828
8829
8830<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>
8831<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8832or opaque value's source expression matches the given matcher.
8833
8834Example 1: matches "a string"
8835(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8836class URL { URL(string); };
8837URL url = "a string";
8838
8839Example 2: matches 'b' (matcher =
8840opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8841int a = b ?: 1;
8842</pre></td></tr>
8843
8844
8845<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>
8846<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8847overloads matches the given matcher.
8848
8849Given
8850  template &lt;typename T&gt; void foo(T);
8851  template &lt;typename T&gt; void bar(T);
8852  template &lt;typename T&gt; void baz(T t) {
8853    foo(t);
8854    bar(t);
8855  }
8856unresolvedLookupExpr(hasAnyDeclaration(
8857    functionTemplateDecl(hasName("foo"))))
8858  matches foo in foo(t); but not bar in bar(t);
8859</pre></td></tr>
8860
8861
8862<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>
8863<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8864
8865Given
8866  int (*ptr_to_array)[4];
8867  int (*ptr_to_func)(int);
8868
8869varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8870ptr_to_func but not ptr_to_array.
8871
8872Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8873</pre></td></tr>
8874
8875
8876<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasPointeeLoc0')"><a name="hasPointeeLoc0Anchor">hasPointeeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; PointeeMatcher</td></tr>
8877<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
8878`PointeeMatcher`.
8879
8880Given
8881  int* x;
8882pointerTypeLoc(hasPointeeLoc(loc(asString("int"))))
8883  matches `int*`.
8884</pre></td></tr>
8885
8886
8887<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>
8888<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8889pointee matches a given matcher.
8890
8891Given
8892  int *a;
8893  int const *b;
8894  float const *f;
8895pointerType(pointee(isConstQualified(), isInteger()))
8896  matches "int const *b"
8897
8898Usable 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;,
8899  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;
8900</pre></td></tr>
8901
8902
8903<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('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>
8904<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8905
8906Given:
8907  typedef int &amp;int_ref;
8908  int a;
8909  int_ref b = a;
8910
8911varDecl(hasType(qualType(referenceType()))))) will not match the
8912declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8913</pre></td></tr>
8914
8915
8916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('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>
8917<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8918matches the given matcher.
8919
8920The associated declaration is:
8921- for type nodes, the declaration of the underlying type
8922- for CallExpr, the declaration of the callee
8923- for MemberExpr, the declaration of the referenced member
8924- for CXXConstructExpr, the declaration of the constructor
8925- for CXXNewExpr, the declaration of the operator new
8926- for ObjCIvarExpr, the declaration of the ivar
8927
8928For type nodes, hasDeclaration will generally match the declaration of the
8929sugared type. Given
8930  class X {};
8931  typedef X Y;
8932  Y y;
8933in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8934typedefDecl. A common use case is to match the underlying, desugared type.
8935This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8936  varDecl(hasType(hasUnqualifiedDesugaredType(
8937      recordType(hasDeclaration(decl())))))
8938In this matcher, the decl will match the CXXRecordDecl of class X.
8939
8940Usable 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;,
8941  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;,
8942  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;,
8943  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;,
8944  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;,
8945  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;,
8946  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8947</pre></td></tr>
8948
8949
8950<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>
8951<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8952
8953Given
8954  void (*fp)(void);
8955The matcher
8956  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8957would match the declaration for fp.
8958</pre></td></tr>
8959
8960
8961<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>
8962<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8963</pre></td></tr>
8964
8965
8966<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>
8967<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8968matches the specified matcher.
8969
8970Example matches y-&gt;x()
8971  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8972     cxxRecordDecl(hasName("Y")))))))
8973  class Y { public: void x(); };
8974  void z() { Y *y; y-&gt;x(); }
8975</pre></td></tr>
8976
8977
8978<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>
8979<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8980</pre></td></tr>
8981
8982
8983<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>
8984<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8985type matches the specified matcher.
8986
8987Example matches X &amp;x and const X &amp;y
8988    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8989  class X {
8990    void a(X b) {
8991      X &amp;x = b;
8992      const X &amp;y = b;
8993    }
8994  };
8995</pre></td></tr>
8996
8997
8998<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedLoc0')"><a name="hasUnqualifiedLoc0Anchor">hasUnqualifiedLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
8999<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
9000`InnerMatcher`.
9001
9002Given
9003  int* const x;
9004  const int y;
9005qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
9006  matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
9007</pre></td></tr>
9008
9009
9010<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>
9011<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
9012matches the given matcher.
9013
9014The associated declaration is:
9015- for type nodes, the declaration of the underlying type
9016- for CallExpr, the declaration of the callee
9017- for MemberExpr, the declaration of the referenced member
9018- for CXXConstructExpr, the declaration of the constructor
9019- for CXXNewExpr, the declaration of the operator new
9020- for ObjCIvarExpr, the declaration of the ivar
9021
9022For type nodes, hasDeclaration will generally match the declaration of the
9023sugared type. Given
9024  class X {};
9025  typedef X Y;
9026  Y y;
9027in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9028typedefDecl. A common use case is to match the underlying, desugared type.
9029This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9030  varDecl(hasType(hasUnqualifiedDesugaredType(
9031      recordType(hasDeclaration(decl())))))
9032In this matcher, the decl will match the CXXRecordDecl of class X.
9033
9034Usable 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;,
9035  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;,
9036  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;,
9037  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;,
9038  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;,
9039  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;,
9040  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9041</pre></td></tr>
9042
9043
9044<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasReferentLoc0')"><a name="hasReferentLoc0Anchor">hasReferentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; ReferentMatcher</td></tr>
9045<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
9046`ReferentMatcher`.
9047
9048Given
9049  int x = 3;
9050  int&amp; xx = x;
9051referenceTypeLoc(hasReferentLoc(loc(asString("int"))))
9052  matches `int&amp;`.
9053</pre></td></tr>
9054
9055
9056<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>
9057<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
9058pointee matches a given matcher.
9059
9060Given
9061  int *a;
9062  int const *b;
9063  float const *f;
9064pointerType(pointee(isConstQualified(), isInteger()))
9065  matches "int const *b"
9066
9067Usable 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;,
9068  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;
9069</pre></td></tr>
9070
9071
9072<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>
9073<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
9074
9075Given
9076  return a + b;
9077hasReturnValue(binaryOperator())
9078  matches 'return a + b'
9079with binaryOperator()
9080  matching 'a + b'
9081</pre></td></tr>
9082
9083
9084<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>
9085<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
9086a given matcher. Also matches StmtExprs that have CompoundStmt as children.
9087
9088Given
9089  { {}; 1+2; }
9090hasAnySubstatement(compoundStmt())
9091  matches '{ {}; 1+2; }'
9092with compoundStmt()
9093  matching '{}'
9094</pre></td></tr>
9095
9096
9097<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>
9098<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9099alignof.
9100</pre></td></tr>
9101
9102
9103<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>
9104<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
9105belongs to.
9106
9107Given:
9108F&amp; operator=(const F&amp; o) {
9109  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9110  return *this;
9111}
9112returnStmt(forCallable(functionDecl(hasName("operator="))))
9113  matches 'return *this'
9114  but does not match 'return v &gt; 0'
9115
9116Given:
9117-(void) foo {
9118  int x = 1;
9119  dispatch_sync(queue, ^{ int y = 2; });
9120}
9121declStmt(forCallable(objcMethodDecl()))
9122  matches 'int x = 1'
9123  but does not match 'int y = 2'.
9124whereas declStmt(forCallable(blockDecl()))
9125  matches 'int y = 2'
9126  but does not match 'int x = 1'.
9127</pre></td></tr>
9128
9129
9130<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>
9131<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
9132
9133Deprecated. Use forCallable() to correctly handle the situation when
9134the declaration is not a function (but a block or an Objective-C method).
9135forFunction() not only fails to take non-functions into account but also
9136may match the wrong declaration in their presence.
9137
9138Given:
9139F&amp; operator=(const F&amp; o) {
9140  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9141  return *this;
9142}
9143returnStmt(forFunction(hasName("operator=")))
9144  matches 'return *this'
9145  but does not match 'return v &gt; 0'
9146</pre></td></tr>
9147
9148
9149<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>
9150<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9151sizeof.
9152</pre></td></tr>
9153
9154
9155<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>
9156<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
9157type that matches the provided matcher.
9158
9159Given
9160  template &lt;typename T&gt;
9161  double F(T t);
9162  int i;
9163  double j = F(i);
9164
9165substTemplateTypeParmType(hasReplacementType(type())) matches int
9166</pre></td></tr>
9167
9168
9169<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('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>
9170<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
9171statement. This matcher may produce multiple matches.
9172
9173Given
9174  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9175switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
9176  matches four times, with "c" binding each of "case 1:", "case 2:",
9177"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
9178"switch (1)", "switch (2)" and "switch (2)".
9179</pre></td></tr>
9180
9181
9182<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>
9183<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
9184switch statement or conditional operator.
9185
9186Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9187  if (true) {}
9188</pre></td></tr>
9189
9190
9191<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>
9192<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
9193
9194Given:
9195 void foo() {
9196   if (int i = foobar(); i &gt; 0) {}
9197   switch (int i = foobar(); i) {}
9198   for (auto&amp; a = get_range(); auto&amp; x : a) {}
9199 }
9200 void bar() {
9201   if (foobar() &gt; 0) {}
9202   switch (foobar()) {}
9203   for (auto&amp; x : get_range()) {}
9204 }
9205ifStmt(hasInitStatement(anything()))
9206  matches the if statement in foo but not in bar.
9207switchStmt(hasInitStatement(anything()))
9208  matches the switch statement in foo but not in bar.
9209cxxForRangeStmt(hasInitStatement(anything()))
9210  matches the range for statement in foo but not in bar.
9211</pre></td></tr>
9212
9213
9214<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>
9215<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
9216matches the given matcher.
9217
9218The associated declaration is:
9219- for type nodes, the declaration of the underlying type
9220- for CallExpr, the declaration of the callee
9221- for MemberExpr, the declaration of the referenced member
9222- for CXXConstructExpr, the declaration of the constructor
9223- for CXXNewExpr, the declaration of the operator new
9224- for ObjCIvarExpr, the declaration of the ivar
9225
9226For type nodes, hasDeclaration will generally match the declaration of the
9227sugared type. Given
9228  class X {};
9229  typedef X Y;
9230  Y y;
9231in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9232typedefDecl. A common use case is to match the underlying, desugared type.
9233This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9234  varDecl(hasType(hasUnqualifiedDesugaredType(
9235      recordType(hasDeclaration(decl())))))
9236In this matcher, the decl will match the CXXRecordDecl of class X.
9237
9238Usable 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;,
9239  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;,
9240  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;,
9241  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;,
9242  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;,
9243  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;,
9244  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9245</pre></td></tr>
9246
9247
9248<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>
9249<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
9250
9251Examples:
9252  int x;
9253declaratorDecl(hasTypeLoc(loc(asString("int"))))
9254  matches int x
9255
9256auto x = int(3);
9257cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9258  matches int(3)
9259
9260struct Foo { Foo(int, int); };
9261auto x = Foo(1, 2);
9262cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9263  matches Foo(1, 2)
9264
9265Usable 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;,
9266  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;,
9267  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;,
9268  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9269  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;,
9270  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;,
9271  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;,
9272  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9273</pre></td></tr>
9274
9275
9276<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>
9277<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
9278
9279Given
9280  struct B { int next; };
9281  template&lt;int(B::*next_ptr)&gt; struct A {};
9282  A&lt;&amp;B::next&gt; a;
9283templateSpecializationType(hasAnyTemplateArgument(
9284  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
9285  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9286    B::next
9287</pre></td></tr>
9288
9289
9290<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>
9291<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9292declaration.
9293
9294Given
9295  struct B { int next; };
9296  template&lt;int(B::*next_ptr)&gt; struct A {};
9297  A&lt;&amp;B::next&gt; a;
9298classTemplateSpecializationDecl(hasAnyTemplateArgument(
9299    refersToDeclaration(fieldDecl(hasName("next")))))
9300  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9301    B::next
9302</pre></td></tr>
9303
9304
9305<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>
9306<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9307
9308Given
9309  template&lt;int T&gt; struct C {};
9310  C&lt;42&gt; c;
9311classTemplateSpecializationDecl(
9312  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9313  matches the implicit instantiation of C in C&lt;42&gt;.
9314</pre></td></tr>
9315
9316
9317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('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>
9318<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9319
9320Given
9321  template&lt;template &lt;typename&gt; class S&gt; class X {};
9322  template&lt;typename T&gt; class Y {};
9323  X&lt;Y&gt; xi;
9324classTemplateSpecializationDecl(hasAnyTemplateArgument(
9325    refersToTemplate(templateName())))
9326  matches the specialization X&lt;Y&gt;
9327</pre></td></tr>
9328
9329
9330<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>
9331<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9332
9333Given
9334  struct X {};
9335  template&lt;typename T&gt; struct A {};
9336  A&lt;X&gt; a;
9337classTemplateSpecializationDecl(hasAnyTemplateArgument(
9338    refersToType(class(hasName("X")))))
9339  matches the specialization A&lt;X&gt;
9340</pre></td></tr>
9341
9342
9343<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgumentLoc0')"><a name="hasAnyTemplateArgumentLoc0Anchor">hasAnyTemplateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9344<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one
9345`TemplateArgumentLoc` matching the given `InnerMatcher`.
9346
9347Given
9348  template&lt;typename T&gt; class A {};
9349  A&lt;int&gt; a;
9350varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
9351  hasTypeLoc(loc(asString("int")))))))
9352  matches `A&lt;int&gt; a`.
9353</pre></td></tr>
9354
9355
9356<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgumentLoc1')"><a name="hasTemplateArgumentLoc1Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9357<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th
9358`TemplateArgumentLoc` matches the given `InnerMatcher`.
9359
9360Given
9361  template&lt;typename T, typename U&gt; class A {};
9362  A&lt;double, int&gt; b;
9363  A&lt;int, double&gt; c;
9364varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
9365  hasTypeLoc(loc(asString("double")))))))
9366  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
9367</pre></td></tr>
9368
9369
9370<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>
9371<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9372functionDecl that have at least one TemplateArgument matching the given
9373InnerMatcher.
9374
9375Given
9376  template&lt;typename T&gt; class A {};
9377  template&lt;&gt; class A&lt;double&gt; {};
9378  A&lt;int&gt; a;
9379
9380  template&lt;typename T&gt; f() {};
9381  void func() { f&lt;int&gt;(); };
9382
9383classTemplateSpecializationDecl(hasAnyTemplateArgument(
9384    refersToType(asString("int"))))
9385  matches the specialization A&lt;int&gt;
9386
9387functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9388  matches the specialization f&lt;int&gt;
9389</pre></td></tr>
9390
9391
9392<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>
9393<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9394matches the given matcher.
9395
9396The associated declaration is:
9397- for type nodes, the declaration of the underlying type
9398- for CallExpr, the declaration of the callee
9399- for MemberExpr, the declaration of the referenced member
9400- for CXXConstructExpr, the declaration of the constructor
9401- for CXXNewExpr, the declaration of the operator new
9402- for ObjCIvarExpr, the declaration of the ivar
9403
9404For type nodes, hasDeclaration will generally match the declaration of the
9405sugared type. Given
9406  class X {};
9407  typedef X Y;
9408  Y y;
9409in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9410typedefDecl. A common use case is to match the underlying, desugared type.
9411This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9412  varDecl(hasType(hasUnqualifiedDesugaredType(
9413      recordType(hasDeclaration(decl())))))
9414In this matcher, the decl will match the CXXRecordDecl of class X.
9415
9416Usable 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;,
9417  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;,
9418  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;,
9419  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;,
9420  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;,
9421  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;,
9422  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9423</pre></td></tr>
9424
9425
9426<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>
9427<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9428functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9429
9430Given
9431  template&lt;typename T, typename U&gt; class A {};
9432  A&lt;bool, int&gt; b;
9433  A&lt;int, bool&gt; c;
9434
9435  template&lt;typename T&gt; void f() {}
9436  void func() { f&lt;int&gt;(); };
9437classTemplateSpecializationDecl(hasTemplateArgument(
9438    1, refersToType(asString("int"))))
9439  matches the specialization A&lt;bool, int&gt;
9440
9441functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9442  matches the specialization f&lt;int&gt;
9443</pre></td></tr>
9444
9445
9446<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>
9447<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9448matches the given matcher.
9449
9450The associated declaration is:
9451- for type nodes, the declaration of the underlying type
9452- for CallExpr, the declaration of the callee
9453- for MemberExpr, the declaration of the referenced member
9454- for CXXConstructExpr, the declaration of the constructor
9455- for CXXNewExpr, the declaration of the operator new
9456- for ObjCIvarExpr, the declaration of the ivar
9457
9458For type nodes, hasDeclaration will generally match the declaration of the
9459sugared type. Given
9460  class X {};
9461  typedef X Y;
9462  Y y;
9463in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9464typedefDecl. A common use case is to match the underlying, desugared type.
9465This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9466  varDecl(hasType(hasUnqualifiedDesugaredType(
9467      recordType(hasDeclaration(decl())))))
9468In this matcher, the decl will match the CXXRecordDecl of class X.
9469
9470Usable 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;,
9471  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;,
9472  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;,
9473  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;,
9474  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;,
9475  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;,
9476  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9477</pre></td></tr>
9478
9479
9480<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>
9481<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9482QualType-matcher matches.
9483</pre></td></tr>
9484
9485
9486<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>
9487<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9488
9489Examples:
9490  int x;
9491declaratorDecl(hasTypeLoc(loc(asString("int"))))
9492  matches int x
9493
9494auto x = int(3);
9495cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9496  matches int(3)
9497
9498struct Foo { Foo(int, int); };
9499auto x = Foo(1, 2);
9500cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9501  matches Foo(1, 2)
9502
9503Usable 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;,
9504  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;,
9505  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;,
9506  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9507  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;,
9508  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;,
9509  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;,
9510  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9511</pre></td></tr>
9512
9513
9514<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>
9515<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9516matcher.
9517
9518Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9519            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9520            and U (matcher = typedefDecl(hasType(asString("int")))
9521            and friend class X (matcher = friendDecl(hasType("X"))
9522            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9523                                              asString("class X")))
9524 class X {};
9525 void y(X &amp;x) { x; X z; }
9526 typedef int U;
9527 class Y { friend class X; };
9528 class Z : public virtual X {};
9529</pre></td></tr>
9530
9531
9532<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>
9533<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9534matches the given matcher.
9535
9536The associated declaration is:
9537- for type nodes, the declaration of the underlying type
9538- for CallExpr, the declaration of the callee
9539- for MemberExpr, the declaration of the referenced member
9540- for CXXConstructExpr, the declaration of the constructor
9541- for CXXNewExpr, the declaration of the operator new
9542- for ObjCIvarExpr, the declaration of the ivar
9543
9544For type nodes, hasDeclaration will generally match the declaration of the
9545sugared type. Given
9546  class X {};
9547  typedef X Y;
9548  Y y;
9549in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9550typedefDecl. A common use case is to match the underlying, desugared type.
9551This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9552  varDecl(hasType(hasUnqualifiedDesugaredType(
9553      recordType(hasDeclaration(decl())))))
9554In this matcher, the decl will match the CXXRecordDecl of class X.
9555
9556Usable 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;,
9557  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;,
9558  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;,
9559  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;,
9560  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;,
9561  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;,
9562  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9563</pre></td></tr>
9564
9565
9566<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>
9567<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9568type of the matched node.
9569
9570For example, in:
9571  class A {};
9572  using B = A;
9573The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9574both B and A.
9575</pre></td></tr>
9576
9577
9578<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>
9579<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9580
9581Given
9582  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9583unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9584  matches sizeof(a) and alignof(c)
9585</pre></td></tr>
9586
9587
9588<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>
9589<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9590
9591Example matches true (matcher = hasUnaryOperand(
9592                                  cxxBoolLiteral(equals(true))))
9593  !true
9594</pre></td></tr>
9595
9596
9597<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>
9598<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9599given matcher. Implicit object expressions are included; that is, it matches
9600use of implicit `this`.
9601
9602Given
9603  struct X {
9604    int m;
9605    int f(X x) { x.m; return m; }
9606  };
9607memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9608  matches `x.m`, but not `m`; however,
9609memberExpr(hasObjectExpression(hasType(pointsTo(
9610     cxxRecordDecl(hasName("X"))))))
9611  matches `m` (aka. `this-&gt;m`), but not `x.m`.
9612</pre></td></tr>
9613
9614
9615<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>
9616<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9617matches the given matcher.
9618
9619The associated declaration is:
9620- for type nodes, the declaration of the underlying type
9621- for CallExpr, the declaration of the callee
9622- for MemberExpr, the declaration of the referenced member
9623- for CXXConstructExpr, the declaration of the constructor
9624- for CXXNewExpr, the declaration of the operator new
9625- for ObjCIvarExpr, the declaration of the ivar
9626
9627For type nodes, hasDeclaration will generally match the declaration of the
9628sugared type. Given
9629  class X {};
9630  typedef X Y;
9631  Y y;
9632in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9633typedefDecl. A common use case is to match the underlying, desugared type.
9634This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9635  varDecl(hasType(hasUnqualifiedDesugaredType(
9636      recordType(hasDeclaration(decl())))))
9637In this matcher, the decl will match the CXXRecordDecl of class X.
9638
9639Usable 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;,
9640  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;,
9641  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;,
9642  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;,
9643  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;,
9644  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;,
9645  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9646</pre></td></tr>
9647
9648
9649<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>
9650<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9651matched by the given matcher.
9652
9653Given
9654  namespace X { int a; void b(); }
9655  using X::a;
9656  using X::b;
9657usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9658  matches using X::b but not using X::a </pre></td></tr>
9659
9660
9661<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>
9662<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9663declaration's type.
9664
9665In case of a value declaration (for example a variable declaration),
9666this resolves one layer of indirection. For example, in the value
9667declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9668X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9669declaration of x.
9670
9671Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9672            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9673            and friend class X (matcher = friendDecl(hasType("X"))
9674            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9675                                              cxxRecordDecl(hasName("X"))))
9676 class X {};
9677 void y(X &amp;x) { x; X z; }
9678 class Y { friend class X; };
9679 class Z : public virtual X {};
9680
9681Example matches class Derived
9682(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9683class Base {};
9684class Derived : Base {};
9685
9686Usable 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;,
9687Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
9688</pre></td></tr>
9689
9690
9691<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>
9692<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9693matcher.
9694
9695Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9696            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9697            and U (matcher = typedefDecl(hasType(asString("int")))
9698            and friend class X (matcher = friendDecl(hasType("X"))
9699            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9700                                              asString("class X")))
9701 class X {};
9702 void y(X &amp;x) { x; X z; }
9703 typedef int U;
9704 class Y { friend class X; };
9705 class Z : public virtual X {};
9706</pre></td></tr>
9707
9708
9709<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>
9710<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9711that matches the given matcher.
9712
9713Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9714  bool y() { return true; }
9715  bool x = y();
9716</pre></td></tr>
9717
9718
9719<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>
9720<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9721expression.
9722
9723Given
9724  void f(int b) {
9725    int a[b];
9726  }
9727variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9728  varDecl(hasName("b")))))))
9729  matches "int a[b]"
9730</pre></td></tr>
9731
9732
9733<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>
9734<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9735
9736
9737<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>
9738<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9739switch statement or conditional operator.
9740
9741Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9742  if (true) {}
9743</pre></td></tr>
9744
9745<!--END_TRAVERSAL_MATCHERS -->
9746</table>
9747
9748</div>
9749</body>
9750</html>
9751
9752
9753