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