1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20span.mono { font-family: monospace; }
21
22.traverse_compare, .traverse_compare td, .traverse_compare th {
23  border: 1px solid black;
24  border-collapse: collapse;
25}
26</style>
27<script type="text/javascript">
28function toggle(id) {
29  if (!id) return;
30  row = document.getElementById(id);
31  if (row.style.display != 'table-cell')
32    row.style.display = 'table-cell';
33  else
34    row.style.display = 'none';
35}
36</script>
37</head>
38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39
40<!--#include virtual="../menu.html.incl"-->
41
42<div id="content">
43
44<h1>AST Matcher Reference</h1>
45
46<p>This document shows all currently implemented matchers. The matchers are grouped
47by category and node type they match. You can click on matcher names to show the
48matcher's source documentation.</p>
49
50<p>There are three different basic categories of matchers:
51<ul>
52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55</ul>
56</p>
57
58<p>Within each category the matchers are ordered by node type they match on.
59Note that if a matcher can match multiple node types, it will appear
60multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
61find all matchers that can be used to match on Stmt nodes.</p>
62
63<p>The exception to that rule are matchers that can match on any node. Those
64are marked with a * and are listed in the beginning of each category.</p>
65
66<p>Note that the categorization of matchers is a great help when you combine
67them into matcher expressions. You will usually want to form matcher expressions
68that read like english sentences by alternating between node matchers and
69narrowing or traversal matchers, like this:
70<pre>
71recordDecl(hasDescendant(
72    ifStmt(hasTrueExpression(
73        expr(hasDescendant(
74            ifStmt()))))))
75</pre>
76</p>
77
78<!-- ======================================================================= -->
79<h2 id="traverse-mode">Traverse Mode</h2>
80<!-- ======================================================================= -->
81
82<p>The default mode of operation of AST Matchers visits all nodes in the AST,
83even if they are not spelled in the source. This is
84<span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
85that explicitly traverse or ignore implicit nodes, such as parentheses
86surrounding an expression or expressions with cleanups.  These implicit
87nodes are not always obvious from the syntax of the source code, and so this
88mode requires careful consideration and testing to get the desired behavior
89from an AST matcher.
90</p>
91
92<p>In addition, because template instantiations are matched in the default mode,
93transformations can be accidentally made to template declarations. Finally,
94because implicit nodes are matched by default, transformations can be made on
95entirely incorrect places in the code.</p>
96
97<p>For these reasons, it is possible to ignore AST nodes which are not spelled
98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99mode. This is likely to be far less error-prone for users who are not already
100very familiar with where implicit nodes appear in the AST. It is also likely
101to be less error-prone for experienced AST users, as difficult cases do not
102need to be encountered and matcher expressions adjusted for these cases.</p>
103
104<p>In clang-query, the mode can be changed with
105<pre>
106set traversal IgnoreUnlessSpelledInSource
107</pre>
108</p>
109This affects both matchers and AST dump output in results.
110
111<p>When using the C++ API such as in clang-tidy checks, the
112<span class="mono">traverse()</span> matcher is used to set the mode:
113<pre>
114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115  returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116  ), this);
117</pre>
118</p>
119<p>The following table compares the <span class="mono">AsIs</span> mode with
120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121
122<table class="traverse_compare">
123<tr>
124<th></th>
125<th><span class="mono">AsIs</span></th>
126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127</tr>
128<tr>
129  <td>AST dump of <span class="mono">func1</span>:
130<pre>
131struct B {
132  B(int);
133};
134
135B func1() { return 42; }
136</pre>
137
138  </td>
139  <td>
140C++98 dialect:
141<pre>
142FunctionDecl
143`-CompoundStmt
144  `-ReturnStmt
145    `-ExprWithCleanups
146      `-CXXConstructExpr
147        `-MaterializeTemporaryExpr
148          `-ImplicitCastExpr
149            `-ImplicitCastExpr
150              `-CXXConstructExpr
151                `-IntegerLiteral 'int' 42
152</pre>
153C++11, C++14 dialect:
154<pre>
155FunctionDecl
156`-CompoundStmt
157  `-ReturnStmt
158    `-ExprWithCleanups
159      `-CXXConstructExpr
160        `-MaterializeTemporaryExpr
161          `-ImplicitCastExpr
162            `-CXXConstructExpr
163              `-IntegerLiteral 'int' 42
164</pre>
165C++17, C++20 dialect:
166<pre>
167FunctionDecl
168`-CompoundStmt
169  `-ReturnStmt
170    `-ImplicitCastExpr
171      `-CXXConstructExpr
172        `-IntegerLiteral 'int' 42
173</pre>
174</td>
175  <td>
176All dialects:
177    <pre>
178FunctionDecl
179`-CompoundStmt
180  `-ReturnStmt
181    `-IntegerLiteral 'int' 42
182</pre></td>
183</tr>
184
185<tr>
186<td>Matcher for returned <span class="mono">42</span>:
187<pre>
188struct B {
189  B(int);
190};
191
192B func1() { return 42; }
193</pre>
194
195  </td>
196  <td>
197All dialects:
198<pre>
199returnStmt(hasReturnValue(
200    ignoringImplicit(
201        ignoringElidableConstructorCall(
202            ignoringImplicit(
203                cxxConstructExpr(hasArgument(0,
204                    ignoringImplicit(
205                        integerLiteral().bind("returnVal")
206                        )
207                    ))
208                )
209            )
210        )
211    ))
212</pre></td>
213  <td>
214All dialects:
215<pre>
216returnStmt(hasReturnValue(
217    integerLiteral().bind("returnVal")
218))
219</pre></td>
220</tr>
221<tr>
222<td>Match result for
223<pre>implicitCastExpr()</pre>
224given:
225<pre>
226struct B {
227  B(int);
228};
229
230B func1() { return 42; }
231</pre>
232
233</td>
234<td>
235Match found.</td>
236  <td>
237No match.</td>
238</tr>
239<tr>
240  <td>Match result for:
241<pre>
242cxxConstructorDecl(
243  isCopyConstructor()
244  ).bind("prepend_explicit")
245</pre>
246given:
247<pre>
248struct Other {};
249struct Copyable {
250  Other m_o;
251  Copyable();
252};
253</pre>
254</td>
255<td>
256Match found. Insertion produces incorrect output:
257<pre>
258struct Other {};
259struct explicit Copyable {
260  Other m_o;
261  Copyable();
262};
263</pre>
264</td>
265<td>
266No match found. Incorrect replacement not possible.
267</td>
268</tr>
269<tr>
270  <td>Replacement of <span class="mono">begin()</span>
271    with <span class="mono">cbegin()</span>:
272<pre>
273cxxMemberCallExpr(
274  on(ConstContainerExpr),
275  callee(cxxMethodDecl(hasName("begin")))
276  ).bind("replace_with_cbegin")
277</pre>
278given:
279<pre>
280void foo() {
281  const Container c;
282  c.begin();
283
284  for (auto i : c) {
285  }
286}
287</pre>
288</td>
289<td>
2902 matches found. Replacement produces incorrect output:
291<pre>
292void foo() {
293  const Container c;
294  c.cbegin();
295
296  for (auto i :.cbegin() c) {
297  }
298}
299</pre>
300</td>
301<td>
3021 match found. Replacement produces correct output:
303<pre>
304void foo() {
305  const Container c;
306  c.cbegin();
307
308  for (auto i : c) {
309  }
310}
311</pre>
312</td>
313</tr>
314<tr>
315  <td>Replacement of <span class="mono">int</span> member
316    with <span class="mono">safe_int</span>:
317<pre>
318fieldDecl(
319  hasType(asString("int"))
320  ).bind("use_safe_int")
321</pre>
322given:
323<pre>
324struct S {
325  int m_i;
326};
327
328template &lt;typename T&gt; struct TemplStruct {
329  TemplStruct() {}
330  ~TemplStruct() {}
331
332private:
333  T m_t;
334};
335
336void instantiate() { TemplStruct&lt;int&gt; ti; }
337</pre>
338</td>
339<td>
3402 matches found. Replacement produces incorrect output:
341<pre>
342struct S {
343  safe_int m_i;
344};
345
346template &lt;typename T&gt; struct TemplStruct {
347  TemplStruct() {}
348  ~TemplStruct() {}
349
350private:
351  safe_int m_t;
352};
353
354void instantiate() { TemplStruct&lt;int&gt; ti; }
355</pre>
356</td>
357<td>
3581 match found. Replacement produces correct output:
359<pre>
360struct S {
361  safe_int m_i;
362};
363
364template &lt;typename T&gt; struct TemplStruct {
365  TemplStruct() {}
366  ~TemplStruct() {}
367
368private:
369  T m_t;
370};
371
372void instantiate() { TemplStruct&lt;int&gt; ti; }
373</pre>
374</td>
375</tr>
376<tr>
377  <td>Add prefix to member initializer
378<pre>
379cxxCtorInitializer(
380  forField(fieldDecl())
381  ).bind("add_prefix")
382</pre>
383given:
384<pre>
385struct Simple {};
386
387struct Record {
388  Record() : i(42) {}
389private:
390  int i;
391  Simple s;
392};
393</pre>
394</td>
395<td>
3962 matches found. Replacement produces incorrect output:
397<pre>
398struct Simple {};
399
400struct Record {
401  m_Record() : m_i(42) {}
402private:
403  int i;
404  Simple s;
405};
406</pre>
407</td>
408<td>
4091 match found. Replacement produces correct output:
410<pre>
411struct Simple {};
412
413struct Record {
414  Record() : m_i(42) {}
415private:
416  int i;
417  Simple s;
418};
419</pre>
420</td>
421</tr>
422<tr>
423  <td>Ignored default arguments
424<pre>
425callExpr(
426  callee(functionDecl(
427    hasName("hasDefaultArg")
428    )),
429  argumentCountIs(1)
430  ).bind("add_prefix")
431</pre>
432given:
433<pre>
434void hasDefaultArg(int i, int j = 0) {}
435void callDefaultArg() { hasDefaultArg(42); }
436</pre>
437</td>
438<td>
439No match.
440</td>
441<td>
4421 match found.
443</td>
444</tr>
445<tr>
446  <td>Lambda fields
447<pre>
448fieldDecl(
449  hasType(asString("int"))
450  ).bind("make_safe")
451</pre>
452given:
453<pre>
454struct S {
455  int m_i;
456};
457
458void func() {
459  int a = 0;
460  int c = 0;
461
462  auto l = [a, b = c](int d) { int e = d; };
463  l(43);
464}
465</pre>
466</td>
467<td>
4682 matches found. Replacement produces incorrect output:
469<pre>
470struct S {
471  safe_int m_i;
472};
473
474void func() {
475  int a = 0;
476  int c = 0;
477
478  auto l = [safe_a, safe_b = c](int d) { int e = d; };
479  l(43);
480}
481</pre>
482</td>
483<td>
4841 match found. Replacement produces correct output:
485<pre>
486struct S {
487  safe_int m_i;
488};
489
490void func() {
491  int a = 0;
492  int c = 0;
493
494  auto l = [a, b = c](int d) { int e = d; };
495  l(43);
496}
497</pre>
498</td>
499
500</tr>
501
502
503
504
505
506<tr>
507  <td>Rewritten binary operators
508<pre>
509binaryOperator(
510  hasOperatorName("&lt;"),
511  hasRHS(hasDescendant(integerLiteral(equals(0))))
512  )
513</pre>
514given:
515<pre>
516#include &lt;compare&gt;
517
518class HasSpaceship {
519public:
520   int x;
521   bool operator==(const HasSpaceship&) const = default;
522   std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523};
524
525bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526   return a < b;
527}
528</pre>
529</td>
530<td>
5311 match found.
532
533<pre>
534   return a < b;
535          ^~~~~
536</pre>
537
538</td>
539<td>
540No match found.
541</td>
542</tr>
543</table>
544
545<!-- ======================================================================= -->
546<h2 id="decl-matchers">Node Matchers</h2>
547<!-- ======================================================================= -->
548
549<p>Node matchers are at the core of matcher expressions - they specify the type
550of node that is expected. Every match expression starts with a node matcher,
551which can then be further refined with a narrowing or traversal matcher. All
552traversal matchers take node matchers as their arguments.</p>
553
554<p>For convenience, all node matchers take an arbitrary number of arguments
555and implicitly act as allOf matchers.</p>
556
557<p>Node matchers are the only matchers that support the bind("id") call to
558bind the matched node to the given string, to be later retrieved from the
559match callback.</p>
560
561<p>It is important to remember that the arguments to node matchers are
562predicates on the same node, just with additional information about the type.
563This is often useful to make matcher expression more readable by inlining bind
564calls into redundant node matchers inside another node matcher:
565<pre>
566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567// the same node.
568recordDecl(decl().bind("id"), hasName("::MyClass"))
569</pre>
570</p>
571
572<table>
573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574<!-- START_DECL_MATCHERS -->
575
576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;...</td></tr>
577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes.
578Attributes may be attached with a variety of different syntaxes (including
579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
580and ``#pragma``s). They may also be implicit.
581
582Given
583  struct [[nodiscard]] Foo{};
584  void bar(int * __attribute__((nonnull)) );
585  __declspec(noinline) void baz();
586
587  #pragma omp declare simd
588  int min();
589attr()
590  matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line.
591</pre></td></tr>
592
593
594<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;...</td></tr>
595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
596
597Examples matches public virtual B.
598  class B {};
599  class C : public virtual B {};
600</pre></td></tr>
601
602
603<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
605
606Examples matches i(42).
607  class C {
608    C() : i(42) {}
609    int i;
610  };
611</pre></td></tr>
612
613
614<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
616
617Given
618  class C {
619  public:
620    int a;
621  };
622accessSpecDecl()
623  matches 'public:'
624</pre></td></tr>
625
626
627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;...</td></tr>
628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
629Example matches foo and bar
630(matcher = bindingDecl()
631
632  auto [foo, bar] = std::make_pair{42, 42};
633</pre></td></tr>
634
635
636<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
638
639Example matches the declaration of the nameless block printing an input
640integer.
641
642  myFunc(^(int p) {
643    printf("%d", p);
644  })
645</pre></td></tr>
646
647
648<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
650
651Example matches Z
652  template&lt;class T&gt; class Z {};
653</pre></td></tr>
654
655
656<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
658
659Given
660  template&lt;class T1, class T2, int I&gt;
661  class A {};
662
663  template&lt;class T, int I&gt;
664  class A&lt;T, T*, I&gt; {};
665
666  template&lt;&gt;
667  class A&lt;int, int, 1&gt; {};
668classTemplatePartialSpecializationDecl()
669  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
670</pre></td></tr>
671
672
673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
675
676Given
677  template&lt;typename T&gt; class A {};
678  template&lt;&gt; class A&lt;double&gt; {};
679  A&lt;int&gt; a;
680classTemplateSpecializationDecl()
681  matches the specializations A&lt;int&gt; and A&lt;double&gt;
682</pre></td></tr>
683
684
685<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
687
688Example matches Foo::Foo() and Foo::Foo(int)
689  class Foo {
690   public:
691    Foo();
692    Foo(int);
693    int DoSomething();
694  };
695</pre></td></tr>
696
697
698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
700
701Example matches the operator.
702  class X { operator int() const; };
703</pre></td></tr>
704
705
706<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
708
709Example matches the deduction guide.
710  template&lt;typename T&gt;
711  class X { X(int) };
712  X(int) -&gt; X&lt;int&gt;;
713</pre></td></tr>
714
715
716<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
718
719Example matches Foo::~Foo()
720  class Foo {
721   public:
722    virtual ~Foo();
723  };
724</pre></td></tr>
725
726
727<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
729
730Example matches y
731  class X { void y(); };
732</pre></td></tr>
733
734
735<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
737
738Example matches X, Z
739  class X;
740  template&lt;class T&gt; class Z {};
741</pre></td></tr>
742
743
744<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
746
747Examples matches X, C, and the friend declaration inside C;
748  void X();
749  class C {
750    friend X;
751  };
752</pre></td></tr>
753
754
755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
757and non-type template parameter declarations).
758
759Given
760  class X { int y; };
761declaratorDecl()
762  matches int y.
763</pre></td></tr>
764
765
766<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
768
769Examples matches the declaration node with foo and bar, but not
770number.
771(matcher = declStmt(has(decompositionDecl())))
772
773  int number = 42;
774  auto [foo, bar] = std::make_pair{42, 42};
775</pre></td></tr>
776
777
778<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
780
781Example matches A, B, C
782  enum X {
783    A, B, C
784  };
785</pre></td></tr>
786
787
788<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
790
791Example matches X
792  enum X {
793    A, B, C
794  };
795</pre></td></tr>
796
797
798<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
800
801Given
802  class X { int m; };
803fieldDecl()
804  matches 'm'.
805</pre></td></tr>
806
807
808<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
810
811Given
812  class X { friend void foo(); };
813friendDecl()
814  matches 'friend void foo()'.
815</pre></td></tr>
816
817
818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
820
821Example matches f
822  void f();
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
828
829Example matches f
830  template&lt;class T&gt; void f(T t) {}
831</pre></td></tr>
832
833
834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
836
837Given
838  struct X { struct { int a; }; };
839indirectFieldDecl()
840  matches 'a'.
841</pre></td></tr>
842
843
844<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
846
847Given
848  goto FOO;
849  FOO: bar();
850labelDecl()
851  matches 'FOO:'
852</pre></td></tr>
853
854
855<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
857
858Given
859  extern "C" {}
860linkageSpecDecl()
861  matches "extern "C" {}"
862</pre></td></tr>
863
864
865<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
867
868Example matches X, S, the anonymous union type, i, and U;
869  typedef int X;
870  struct S {
871    union {
872      int i;
873    } U;
874  };
875</pre></td></tr>
876
877
878<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
880
881Given
882  namespace test {}
883  namespace alias = ::test;
884namespaceAliasDecl()
885  matches "namespace alias" but not "namespace test"
886</pre></td></tr>
887
888
889<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
891
892Given
893  namespace {}
894  namespace test {}
895namespaceDecl()
896  matches "namespace {}" and "namespace test {}"
897</pre></td></tr>
898
899
900<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
902
903Given
904  template &lt;typename T, int N&gt; struct C {};
905nonTypeTemplateParmDecl()
906  matches 'N', but not 'T'.
907</pre></td></tr>
908
909
910<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
912
913Example matches Foo (Additions)
914  @interface Foo (Additions)
915  @end
916</pre></td></tr>
917
918
919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
921
922Example matches Foo (Additions)
923  @implementation Foo (Additions)
924  @end
925</pre></td></tr>
926
927
928<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
930
931Example matches Foo
932  @implementation Foo
933  @end
934</pre></td></tr>
935
936
937<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
939
940Example matches Foo
941  @interface Foo
942  @end
943</pre></td></tr>
944
945
946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
948
949Example matches _enabled
950  @implementation Foo {
951    BOOL _enabled;
952  }
953  @end
954</pre></td></tr>
955
956
957<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
959
960Example matches both declaration and definition of -[Foo method]
961  @interface Foo
962  - (void)method;
963  @end
964
965  @implementation Foo
966  - (void)method {}
967  @end
968</pre></td></tr>
969
970
971<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
973
974Example matches enabled
975  @interface Foo
976  @property BOOL enabled;
977  @end
978</pre></td></tr>
979
980
981<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
983
984Example matches FooDelegate
985  @protocol FooDelegate
986  @end
987</pre></td></tr>
988
989
990<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
992
993Given
994  void f(int x);
995parmVarDecl()
996  matches int x.
997</pre></td></tr>
998
999
1000<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
1002
1003Example matches X, Z, U, and S
1004  class X;
1005  template&lt;class T&gt; class Z {};
1006  struct S {};
1007  union U {};
1008</pre></td></tr>
1009
1010
1011<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
1013
1014Example:
1015  staticAssertExpr()
1016matches
1017  static_assert(sizeof(S) == sizeof(int))
1018in
1019  struct S {
1020    int x;
1021  };
1022  static_assert(sizeof(S) == sizeof(int));
1023</pre></td></tr>
1024
1025
1026<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1028
1029Example matches X, Z, U, S, E
1030  class X;
1031  template&lt;class T&gt; class Z {};
1032  struct S {};
1033  union U {};
1034  enum E {
1035    A, B, C
1036  };
1037</pre></td></tr>
1038
1039
1040<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1042
1043Given
1044  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
1045templateTypeParmDecl()
1046  matches 'Z', but not 'N'.
1047</pre></td></tr>
1048
1049
1050<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1052
1053Given
1054  template &lt;typename T, int N&gt; struct C {};
1055templateTypeParmDecl()
1056  matches 'T', but not 'N'.
1057</pre></td></tr>
1058
1059
1060<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1062
1063Given
1064  int X;
1065  namespace NS {
1066  int Y;
1067  }  // namespace NS
1068decl(hasDeclContext(translationUnitDecl()))
1069  matches "int X", but not "int Y".
1070</pre></td></tr>
1071
1072
1073<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1075
1076Given
1077  typedef int X;
1078  using Y = int;
1079typeAliasDecl()
1080  matches "using Y = int", but not "typedef int X"
1081</pre></td></tr>
1082
1083
1084<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1086
1087typeAliasTemplateDecl() matches
1088  template &lt;typename T&gt;
1089  using Y = X&lt;T&gt;;
1090</pre></td></tr>
1091
1092
1093<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1095
1096Given
1097  typedef int X;
1098  using Y = int;
1099typedefDecl()
1100  matches "typedef int X", but not "using Y = int"
1101</pre></td></tr>
1102
1103
1104<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1106
1107Given
1108  typedef int X;
1109  using Y = int;
1110typedefNameDecl()
1111  matches "typedef int X" and "using Y = int"
1112</pre></td></tr>
1113
1114
1115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1117typename.
1118
1119Given
1120  template &lt;typename T&gt;
1121  struct Base { typedef T Foo; };
1122
1123  template&lt;typename T&gt;
1124  struct S : private Base&lt;T&gt; {
1125    using typename Base&lt;T&gt;::Foo;
1126  };
1127unresolvedUsingTypenameDecl()
1128  matches using Base&lt;T&gt;::Foo </pre></td></tr>
1129
1130
1131<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1133
1134Given
1135  template&lt;typename X&gt;
1136  class C : private X {
1137    using X::x;
1138  };
1139unresolvedUsingValueDecl()
1140  matches using X::x </pre></td></tr>
1141
1142
1143<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1145
1146Given
1147  namespace X { int x; }
1148  using X::x;
1149usingDecl()
1150  matches using X::x </pre></td></tr>
1151
1152
1153<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1155
1156Given
1157  namespace X { int x; }
1158  using namespace X;
1159usingDirectiveDecl()
1160  matches using namespace X </pre></td></tr>
1161
1162
1163<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>&gt;...</td></tr>
1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations.
1165
1166Given
1167  namespace X { enum x {...}; }
1168  using enum X::x;
1169usingEnumDecl()
1170  matches using enum X::x </pre></td></tr>
1171
1172
1173<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1175
1176Example matches A, B, C and F
1177  enum X { A, B, C };
1178  void F();
1179</pre></td></tr>
1180
1181
1182<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1184
1185Note: this does not match declarations of member variables, which are
1186"field" declarations in Clang parlance.
1187
1188Example matches a
1189  int a;
1190</pre></td></tr>
1191
1192
1193<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('lambdaCapture0')"><a name="lambdaCapture0Anchor">lambdaCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;...</td></tr>
1194<tr><td colspan="4" class="doc" id="lambdaCapture0"><pre>Matches lambda captures.
1195
1196Given
1197  int main() {
1198    int x;
1199    auto f = [x](){};
1200    auto g = [x = 1](){};
1201  }
1202In the matcher `lambdaExpr(hasAnyCapture(lambdaCapture()))`,
1203`lambdaCapture()` matches `x` and `x=1`.
1204</pre></td></tr>
1205
1206
1207<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
1208<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1209</pre></td></tr>
1210
1211
1212<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
1213<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1214
1215Given
1216  namespace ns {
1217    struct A { static void f(); };
1218    void A::f() {}
1219    void g() { A::f(); }
1220  }
1221  ns::A a;
1222nestedNameSpecifier()
1223  matches "ns::" and both "A::"
1224</pre></td></tr>
1225
1226
1227<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
1228<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1229
1230Given
1231
1232  #pragma omp parallel default(none)
1233  #pragma omp parallel default(shared)
1234  #pragma omp parallel default(firstprivate)
1235  #pragma omp parallel
1236
1237``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1238``default(firstprivate)``
1239</pre></td></tr>
1240
1241
1242<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
1243<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1244</pre></td></tr>
1245
1246
1247<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
1248<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1249
1250Given
1251  FOO: bar();
1252  void *ptr = &amp;&amp;FOO;
1253  goto *bar;
1254addrLabelExpr()
1255  matches '&amp;&amp;FOO'
1256</pre></td></tr>
1257
1258
1259<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
1260<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1261
1262Given
1263  int i = a[1];
1264arraySubscriptExpr()
1265  matches "a[1]"
1266</pre></td></tr>
1267
1268
1269<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
1270<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1271
1272 int i = 100;
1273  __asm("mov al, 2");
1274asmStmt()
1275  matches '__asm("mov al, 2")'
1276</pre></td></tr>
1277
1278
1279<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
1280<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1281Example matches __atomic_load_n(ptr, 1)
1282  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1283</pre></td></tr>
1284
1285
1286<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
1287<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1288
1289Given
1290  @autoreleasepool {
1291    int x = 0;
1292  }
1293autoreleasePoolStmt(stmt()) matches the declaration of "x"
1294inside the autorelease pool.
1295</pre></td></tr>
1296
1297
1298<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
1299<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1300
1301Example matches a ?: b
1302  (a ?: b) + 42;
1303</pre></td></tr>
1304
1305
1306<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
1307<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1308
1309Example matches a || b
1310  !(a || b)
1311See also the binaryOperation() matcher for more-general matching.
1312</pre></td></tr>
1313
1314
1315<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
1316<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1317
1318Example: matches "^{}":
1319  void f() { ^{}(); }
1320</pre></td></tr>
1321
1322
1323<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
1324<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1325
1326Given
1327  while (true) { break; }
1328breakStmt()
1329  matches 'break'
1330</pre></td></tr>
1331
1332
1333<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
1334<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1335
1336Example: Matches (int) 2.2f in
1337  int i = (int) 2.2f;
1338</pre></td></tr>
1339
1340
1341<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
1342<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1343
1344Example matches x.y() and y()
1345  X x;
1346  x.y();
1347  y();
1348</pre></td></tr>
1349
1350
1351<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
1352<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1353
1354Given
1355  switch(a) { case 42: break; default: break; }
1356caseStmt()
1357  matches 'case 42:'.
1358</pre></td></tr>
1359
1360
1361<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
1362<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1363
1364Example: castExpr() matches each of the following:
1365  (int) 3;
1366  const_cast&lt;Expr *&gt;(SubExpr);
1367  char c = 0;
1368but does not match
1369  int i = (0);
1370  int k = 0;
1371</pre></td></tr>
1372
1373
1374<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
1375<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1376
1377Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1378though.
1379
1380Example matches 'a', L'a'
1381  char ch = 'a';
1382  wchar_t chw = L'a';
1383</pre></td></tr>
1384
1385
1386<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
1387<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1388</pre></td></tr>
1389
1390
1391<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coawaitExpr0')"><a name="coawaitExpr0Anchor">coawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoawaitExpr.html">CoawaitExpr</a>&gt;...</td></tr>
1392<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1393
1394Given
1395  co_await 1;
1396coawaitExpr()
1397  matches 'co_await 1'
1398</pre></td></tr>
1399
1400
1401<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
1402<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1403
1404Example match: {1}, (1, 2)
1405  int array[4] = {1};
1406  vector int myvec = (vector int)(1, 2);
1407</pre></td></tr>
1408
1409
1410<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
1411<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1412
1413Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1414  for (;;) {{}}
1415</pre></td></tr>
1416
1417
1418<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
1419<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1420
1421Example matches a ? b : c
1422  (a ? b : c) + 42
1423</pre></td></tr>
1424
1425
1426<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
1427<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1428
1429Example matches the constant in the case statement:
1430    (matcher = constantExpr())
1431  switch (a) {
1432  case 37: break;
1433  }
1434</pre></td></tr>
1435
1436
1437<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
1438<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1439
1440Given
1441  while (true) { continue; }
1442continueStmt()
1443  matches 'continue'
1444</pre></td></tr>
1445
1446
1447<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coreturnStmt0')"><a name="coreturnStmt0Anchor">coreturnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoreturnStmt.html">CoreturnStmt</a>&gt;...</td></tr>
1448<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1449
1450Given
1451  while (true) { co_return; }
1452coreturnStmt()
1453  matches 'co_return'
1454</pre></td></tr>
1455
1456
1457<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('coyieldExpr0')"><a name="coyieldExpr0Anchor">coyieldExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CoyieldExpr.html">CoyieldExpr</a>&gt;...</td></tr>
1458<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1459
1460Given
1461  co_yield 1;
1462coyieldExpr()
1463  matches 'co_yield 1'
1464</pre></td></tr>
1465
1466
1467<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
1468<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1469
1470Example matches,
1471  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
1472</pre></td></tr>
1473
1474
1475<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
1476<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1477
1478Example matches FunctionTakesString(GetStringByValue())
1479    (matcher = cxxBindTemporaryExpr())
1480  FunctionTakesString(GetStringByValue());
1481  FunctionTakesStringByPointer(GetStringPointer());
1482</pre></td></tr>
1483
1484
1485<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
1486<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1487
1488Example matches true
1489  true
1490</pre></td></tr>
1491
1492
1493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
1494<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1495
1496  try {} catch(int i) {}
1497cxxCatchStmt()
1498  matches 'catch(int i)'
1499</pre></td></tr>
1500
1501
1502<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
1503<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1504
1505Example: Matches const_cast&lt;int*&gt;(&amp;r) in
1506  int n = 42;
1507  const int &amp;r(n);
1508  int* p = const_cast&lt;int*&gt;(&amp;r);
1509</pre></td></tr>
1510
1511
1512<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
1513<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1514
1515Example matches string(ptr, n) and ptr within arguments of f
1516    (matcher = cxxConstructExpr())
1517  void f(const string &amp;a, const string &amp;b);
1518  char *ptr;
1519  int n;
1520  f(string(ptr, n), ptr);
1521</pre></td></tr>
1522
1523
1524<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
1525<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1526
1527Example matches the CXXDefaultArgExpr placeholder inserted for the
1528    default value of the second parameter in the call expression f(42)
1529    (matcher = cxxDefaultArgExpr())
1530  void f(int x, int y = 0);
1531  f(42);
1532</pre></td></tr>
1533
1534
1535<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
1536<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1537
1538Given
1539  delete X;
1540cxxDeleteExpr()
1541  matches 'delete X'.
1542</pre></td></tr>
1543
1544
1545<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
1546<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1547resolved because the base expression or the member name was dependent.
1548
1549Given
1550  template &lt;class T&gt; void f() { T t; t.g(); }
1551cxxDependentScopeMemberExpr()
1552  matches t.g
1553</pre></td></tr>
1554
1555
1556<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
1557<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1558
1559Example:
1560  cxxDynamicCastExpr()
1561matches
1562  dynamic_cast&lt;D*&gt;(&amp;b);
1563in
1564  struct B { virtual ~B() {} }; struct D : B {};
1565  B b;
1566  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1567</pre></td></tr>
1568
1569
1570<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
1571<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1572
1573cxxForRangeStmt() matches 'for (auto a : i)'
1574  int i[] =  {1, 2, 3}; for (auto a : i);
1575  for(int j = 0; j &lt; 5; ++j);
1576</pre></td></tr>
1577
1578
1579<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
1580<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1581
1582Example: Matches Foo(bar);
1583  Foo f = bar;
1584  Foo g = (Foo) bar;
1585  Foo h = Foo(bar);
1586</pre></td></tr>
1587
1588
1589<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
1590<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1591
1592Example matches x.y()
1593  X x;
1594  x.y();
1595</pre></td></tr>
1596
1597
1598<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
1599<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1600
1601Given
1602  new X;
1603cxxNewExpr()
1604  matches 'new X'.
1605</pre></td></tr>
1606
1607
1608<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>&gt;...</td></tr>
1609<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1610
1611Given
1612  bool a() noexcept;
1613  bool b() noexcept(true);
1614  bool c() noexcept(false);
1615  bool d() noexcept(noexcept(a()));
1616  bool e = noexcept(b()) || noexcept(c());
1617cxxNoexceptExpr()
1618  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1619  doesn't match the noexcept specifier in the declarations a, b, c or d.
1620</pre></td></tr>
1621
1622
1623<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
1624<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1625</pre></td></tr>
1626
1627
1628<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
1629<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1630
1631Note that if an operator isn't overloaded, it won't match. Instead, use
1632binaryOperator matcher.
1633Currently it does not match operators such as new delete.
1634FIXME: figure out why these do not match?
1635
1636Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1637    (matcher = cxxOperatorCallExpr())
1638  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1639  ostream &amp;o; int b = 1, c = 1;
1640  o &lt;&lt; b &lt;&lt; c;
1641See also the binaryOperation() matcher for more-general matching of binary
1642uses of this AST node.
1643</pre></td></tr>
1644
1645
1646<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
1647<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1648
1649Either the source expression or the destination type can be matched
1650using has(), but hasDestinationType() is more specific and can be
1651more readable.
1652
1653Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1654  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1655</pre></td></tr>
1656
1657
1658<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxRewrittenBinaryOperator0')"><a name="cxxRewrittenBinaryOperator0Anchor">cxxRewrittenBinaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;...</td></tr>
1659<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1660
1661Example matches use of "&lt;":
1662  #include &lt;compare&gt;
1663  struct HasSpaceshipMem {
1664    int a;
1665    constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
1666  };
1667  void compare() {
1668    HasSpaceshipMem hs1, hs2;
1669    if (hs1 &lt; hs2)
1670        return;
1671  }
1672See also the binaryOperation() matcher for more-general matching
1673of this AST node.
1674</pre></td></tr>
1675
1676
1677<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
1678<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1679
1680See also: hasDestinationType
1681See also: reinterpretCast
1682
1683Example:
1684  cxxStaticCastExpr()
1685matches
1686  static_cast&lt;long&gt;(8)
1687in
1688  long eight(static_cast&lt;long&gt;(8));
1689</pre></td></tr>
1690
1691
1692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
1693<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1694
1695Given
1696  std::vector&lt;int&gt; a({ 1, 2, 3 });
1697  std::vector&lt;int&gt; b = { 4, 5 };
1698  int c[] = { 6, 7 };
1699  std::pair&lt;int, int&gt; d = { 8, 9 };
1700cxxStdInitializerListExpr()
1701  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1702</pre></td></tr>
1703
1704
1705<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1706<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1707
1708Example: Matches Foo(bar, bar)
1709  Foo h = Foo(bar, bar);
1710</pre></td></tr>
1711
1712
1713<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1714<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1715
1716Example matches the implicit this expression in "return i".
1717    (matcher = cxxThisExpr())
1718struct foo {
1719  int i;
1720  int f() { return i; }
1721};
1722</pre></td></tr>
1723
1724
1725<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1726<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1727
1728  try { throw 5; } catch(int i) {}
1729cxxThrowExpr()
1730  matches 'throw 5'
1731</pre></td></tr>
1732
1733
1734<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1735<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1736
1737  try {} catch(int i) {}
1738cxxTryStmt()
1739  matches 'try {}'
1740</pre></td></tr>
1741
1742
1743<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1744<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1745
1746Example matches T(t) in return statement of f
1747    (matcher = cxxUnresolvedConstructExpr())
1748  template &lt;typename T&gt;
1749  void f(const T&amp; t) { return T(t); }
1750</pre></td></tr>
1751
1752
1753<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
1754<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1755
1756Example matches x in if (x)
1757  bool x;
1758  if (x) {}
1759</pre></td></tr>
1760
1761
1762<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
1763<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1764
1765Given
1766  int a;
1767declStmt()
1768  matches 'int a'.
1769</pre></td></tr>
1770
1771
1772<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
1773<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1774
1775Given
1776  switch(a) { case 42: break; default: break; }
1777defaultStmt()
1778  matches 'default:'.
1779</pre></td></tr>
1780
1781
1782<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dependentCoawaitExpr0')"><a name="dependentCoawaitExpr0Anchor">dependentCoawaitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentCoawaitExpr.html">DependentCoawaitExpr</a>&gt;...</td></tr>
1783<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
1784</pre></td></tr>
1785
1786
1787<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1788<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1789
1790Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1791  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1792</pre></td></tr>
1793
1794
1795<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
1796<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1797
1798Given
1799  do {} while (true);
1800doStmt()
1801  matches 'do {} while(true)'
1802</pre></td></tr>
1803
1804
1805<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
1806<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1807
1808Matches any cast expression written in user code, whether it be a
1809C-style cast, a functional-style cast, or a keyword cast.
1810
1811Does not match implicit conversions.
1812
1813Note: the name "explicitCast" is chosen to match Clang's terminology, as
1814Clang uses the term "cast" to apply to implicit conversions as well as to
1815actual cast expressions.
1816
1817See also: hasDestinationType.
1818
1819Example: matches all five of the casts in
1820  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1821but does not match the implicit conversion in
1822  long ell = 42;
1823</pre></td></tr>
1824
1825
1826<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
1827<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1828
1829Example matches x()
1830  void f() { x(); }
1831</pre></td></tr>
1832
1833
1834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
1835<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1836of the sub-expression's evaluation.
1837
1838Example matches std::string()
1839  const std::string str = std::string();
1840</pre></td></tr>
1841
1842
1843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>&gt;...</td></tr>
1844<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1845</pre></td></tr>
1846
1847
1848<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
1849<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
18501.0, 1.0f, 1.0L and 1e10.
1851
1852Does not match implicit conversions such as
1853  float a = 10;
1854</pre></td></tr>
1855
1856
1857<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
1858<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1859
1860Example matches 'for (;;) {}'
1861  for (;;) {}
1862  int i[] =  {1, 2, 3}; for (auto a : i);
1863</pre></td></tr>
1864
1865
1866<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('genericSelectionExpr0')"><a name="genericSelectionExpr0Anchor">genericSelectionExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GenericSelectionExpr.html">GenericSelectionExpr</a>&gt;...</td></tr>
1867<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1868</pre></td></tr>
1869
1870
1871<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1872<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1873</pre></td></tr>
1874
1875
1876<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
1877<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1878
1879Given
1880  goto FOO;
1881  FOO: bar();
1882gotoStmt()
1883  matches 'goto FOO'
1884</pre></td></tr>
1885
1886
1887<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
1888<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1889
1890Example matches 'if (x) {}'
1891  if (x) {}
1892</pre></td></tr>
1893
1894
1895<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
1896<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1897point literals e.g.: 1i, 1.0i
1898</pre></td></tr>
1899
1900
1901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
1902<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1903
1904This matches many different places, including function call return value
1905eliding, as well as any type conversions.
1906</pre></td></tr>
1907
1908
1909<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1910<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1911
1912Given
1913  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1914implicitValueInitExpr()
1915  matches "[0].y" (implicitly)
1916</pre></td></tr>
1917
1918
1919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
1920<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1921
1922Given
1923  int a[] = { 1, 2 };
1924  struct B { int x, y; };
1925  B b = { 5, 6 };
1926initListExpr()
1927  matches "{ 1, 2 }" and "{ 5, 6 }"
1928</pre></td></tr>
1929
1930
1931<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
1932<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
19331, 1L, 0x1 and 1U.
1934
1935Does not match character-encoded integers such as L'a'.
1936</pre></td></tr>
1937
1938
1939<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
1940<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1941
1942Given
1943  goto FOO;
1944  FOO: bar();
1945labelStmt()
1946  matches 'FOO:'
1947</pre></td></tr>
1948
1949
1950<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
1951<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1952
1953Example matches [&amp;](){return 5;}
1954  [&amp;](){return 5;}
1955</pre></td></tr>
1956
1957
1958<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
1959<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1960
1961Example: Given
1962  struct T {void func();};
1963  T f();
1964  void g(T);
1965materializeTemporaryExpr() matches 'f()' in these statements
1966  T u(f());
1967  g(f());
1968  f().func();
1969but does not match
1970  f();
1971</pre></td></tr>
1972
1973
1974<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
1975<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1976
1977Given
1978  class Y {
1979    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1980    int a; static int b;
1981  };
1982memberExpr()
1983  matches this-&gt;x, x, y.x, a, this-&gt;b
1984</pre></td></tr>
1985
1986
1987<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
1988<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1989
1990  foo();;
1991nullStmt()
1992  matches the second ';'
1993</pre></td></tr>
1994
1995
1996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1997<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1998
1999Example matches @catch
2000  @try {}
2001  @catch (...) {}
2002</pre></td></tr>
2003
2004
2005<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
2006<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
2007
2008Example matches @finally
2009  @try {}
2010  @finally {}
2011</pre></td></tr>
2012
2013
2014<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
2015<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
2016
2017Example: matches "a" in "init" method:
2018@implementation A {
2019  NSString *a;
2020}
2021- (void) init {
2022  a = @"hello";
2023}
2024</pre></td></tr>
2025
2026
2027<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
2028<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
2029
2030The innermost message send invokes the "alloc" class method on the
2031NSString class, while the outermost message send invokes the
2032"initWithString" instance method on the object returned from
2033NSString's "alloc". This matcher should match both message sends.
2034  [[NSString alloc] initWithString:@"Hello"]
2035</pre></td></tr>
2036
2037
2038<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
2039<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
2040
2041Example matches @throw obj;
2042</pre></td></tr>
2043
2044
2045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
2046<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2047
2048Example matches @try
2049  @try {}
2050  @catch (...) {}
2051</pre></td></tr>
2052
2053
2054<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
2055<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2056
2057Given
2058
2059  #pragma omp parallel
2060  #pragma omp parallel default(none)
2061  #pragma omp taskyield
2062
2063``ompExecutableDirective()`` matches ``omp parallel``,
2064``omp parallel default(none)`` and ``omp taskyield``.
2065</pre></td></tr>
2066
2067
2068<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
2069<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2070to reference another expressions and can be met
2071in BinaryConditionalOperators, for example.
2072
2073Example matches 'a'
2074  (a ?: c) + 42;
2075</pre></td></tr>
2076
2077
2078<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
2079<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2080
2081Example matches (foo() + 1)
2082  int foo() { return 1; }
2083  int a = (foo() + 1);
2084</pre></td></tr>
2085
2086
2087<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
2088<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2089ParenListExprs don't have a predefined type and are used for late parsing.
2090In the final AST, they can be met in template declarations.
2091
2092Given
2093  template&lt;typename T&gt; class X {
2094    void f() {
2095      X x(*this);
2096      int a = 0, b = 1; int i = (a, b);
2097    }
2098  };
2099parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2100has a predefined type and is a ParenExpr, not a ParenListExpr.
2101</pre></td></tr>
2102
2103
2104<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
2105<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2106
2107Example: Matches __func__
2108  printf("%s", __func__);
2109</pre></td></tr>
2110
2111
2112<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
2113<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2114
2115Given
2116  return 1;
2117returnStmt()
2118  matches 'return 1'
2119</pre></td></tr>
2120
2121
2122<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
2123<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2124
2125Given
2126  { ++a; }
2127stmt()
2128  matches both the compound statement '{ ++a; }' and '++a'.
2129</pre></td></tr>
2130
2131
2132<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
2133<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2134
2135Example match: ({ int X = 4; X; })
2136  int C = ({ int X = 4; X; });
2137</pre></td></tr>
2138
2139
2140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
2141<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2142
2143Example matches "abcd", L"abcd"
2144  char *s = "abcd";
2145  wchar_t *ws = L"abcd";
2146</pre></td></tr>
2147
2148
2149<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
2150<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2151
2152Given
2153  template &lt;int N&gt;
2154  struct A { static const int n = N; };
2155  struct B : public A&lt;42&gt; {};
2156substNonTypeTemplateParmExpr()
2157  matches "N" in the right-hand side of "static const int n = N;"
2158</pre></td></tr>
2159
2160
2161<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
2162<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2163
2164Given
2165  switch(a) { case 42: break; default: break; }
2166switchCase()
2167  matches 'case 42:' and 'default:'.
2168</pre></td></tr>
2169
2170
2171<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
2172<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2173
2174Given
2175  switch(a) { case 42: break; default: break; }
2176switchStmt()
2177  matches 'switch(a)'.
2178</pre></td></tr>
2179
2180
2181<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
2182<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2183
2184Given
2185  Foo x = bar;
2186  int y = sizeof(x) + alignof(x);
2187unaryExprOrTypeTraitExpr()
2188  matches sizeof(x) and alignof(x)
2189</pre></td></tr>
2190
2191
2192<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
2193<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2194
2195Example matches !a
2196  !a || b
2197</pre></td></tr>
2198
2199
2200<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
2201<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2202but could not be resolved to a specific declaration.
2203
2204Given
2205  template&lt;typename T&gt;
2206  T foo() { T a; return a; }
2207  template&lt;typename T&gt;
2208  void bar() {
2209    foo&lt;T&gt;();
2210  }
2211unresolvedLookupExpr()
2212  matches foo&lt;T&gt;() </pre></td></tr>
2213
2214
2215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
2216<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2217
2218Given
2219  struct X {
2220    template &lt;class T&gt; void f();
2221    void g();
2222  };
2223  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
2224unresolvedMemberExpr()
2225  matches x.f&lt;T&gt;
2226</pre></td></tr>
2227
2228
2229<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
2230<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2231
2232Example match: "foo"_suffix
2233</pre></td></tr>
2234
2235
2236<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
2237<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2238
2239Given
2240  while (true) {}
2241whileStmt()
2242  matches 'while (true) {}'.
2243</pre></td></tr>
2244
2245
2246<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;...</td></tr>
2247<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2248
2249Given
2250  template &lt;typename T&gt; struct C {};
2251  C&lt;int&gt; c;
2252templateArgumentLoc()
2253  matches 'int' in C&lt;int&gt;.
2254</pre></td></tr>
2255
2256
2257<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
2258<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2259
2260Given
2261  template &lt;typename T&gt; struct C {};
2262  C&lt;int&gt; c;
2263templateArgument()
2264  matches 'int' in C&lt;int&gt;.
2265</pre></td></tr>
2266
2267
2268<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
2269<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2270
2271Given
2272  template &lt;typename T&gt; class X { };
2273  X&lt;int&gt; xi;
2274templateName()
2275  matches 'X' in X&lt;int&gt;.
2276</pre></td></tr>
2277
2278
2279<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('elaboratedTypeLoc0')"><a name="elaboratedTypeLoc0Anchor">elaboratedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedTypeLoc.html">ElaboratedTypeLoc</a>&gt;...</td></tr>
2280<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s.
2281
2282Given
2283  struct s {};
2284  struct s ss;
2285elaboratedTypeLoc()
2286  matches the `TypeLoc` of the variable declaration of `ss`.
2287</pre></td></tr>
2288
2289
2290<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;...</td></tr>
2291<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
2292
2293Given
2294  int* x;
2295pointerTypeLoc()
2296  matches `int*`.
2297</pre></td></tr>
2298
2299
2300<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('qualifiedTypeLoc0')"><a name="qualifiedTypeLoc0Anchor">qualifiedTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;...</td></tr>
2301<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST.
2302
2303Given
2304  const int x = 0;
2305qualifiedTypeLoc()
2306  matches `const int`.
2307</pre></td></tr>
2308
2309
2310<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('referenceTypeLoc0')"><a name="referenceTypeLoc0Anchor">referenceTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;...</td></tr>
2311<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s.
2312
2313Given
2314  int x = 3;
2315  int&amp; l = x;
2316  int&amp;&amp; r = 3;
2317referenceTypeLoc()
2318  matches `int&amp;` and `int&amp;&amp;`.
2319</pre></td></tr>
2320
2321
2322<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationTypeLoc0')"><a name="templateSpecializationTypeLoc0Anchor">templateSpecializationTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;...</td></tr>
2323<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s.
2324
2325Given
2326  template &lt;typename T&gt; class C {};
2327  C&lt;char&gt; var;
2328varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
2329  matches `C&lt;char&gt; var`.
2330</pre></td></tr>
2331
2332
2333<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
2334<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2335</pre></td></tr>
2336
2337
2338<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
2339<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2340
2341Given
2342  int a[] = { 2, 3 };
2343  int b[4];
2344  void f() { int c[a[0]]; }
2345arrayType()
2346  matches "int a[]", "int b[4]" and "int c[a[0]]";
2347</pre></td></tr>
2348
2349
2350<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
2351<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2352
2353Given
2354  _Atomic(int) i;
2355atomicType()
2356  matches "_Atomic(int) i"
2357</pre></td></tr>
2358
2359
2360<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
2361<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2362
2363Given:
2364  auto n = 4;
2365  int v[] = { 2, 3 }
2366  for (auto i : v) { }
2367autoType()
2368  matches "auto n" and "auto i"
2369</pre></td></tr>
2370
2371
2372<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
2373<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2374"void (^)(int)".
2375
2376The pointee is always required to be a FunctionType.
2377</pre></td></tr>
2378
2379
2380<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
2381<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2382
2383Given
2384  struct A {};
2385  A a;
2386  int b;
2387  float c;
2388  bool d;
2389builtinType()
2390  matches "int b", "float c" and "bool d"
2391</pre></td></tr>
2392
2393
2394<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
2395<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2396
2397Given
2398  _Complex float f;
2399complexType()
2400  matches "_Complex float f"
2401</pre></td></tr>
2402
2403
2404<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
2405<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2406
2407Given
2408  void() {
2409    int a[2];
2410    int b[] = { 2, 3 };
2411    int c[b[0]];
2412  }
2413constantArrayType()
2414  matches "int a[2]"
2415</pre></td></tr>
2416
2417
2418<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
2419<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2420Example matches i[] in declaration of f.
2421    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2422Example matches i[1].
2423    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2424  void f(int i[]) {
2425    i[1] = 0;
2426  }
2427</pre></td></tr>
2428
2429
2430<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
2431<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
2432
2433Given:
2434  short i = 1;
2435  int j = 42;
2436  decltype(i + j) result = i + j;
2437decltypeType()
2438  matches "decltype(i + j)"
2439</pre></td></tr>
2440
2441
2442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
2443<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2444template types.
2445
2446Given
2447  template &lt;typename T&gt;
2448  class C { public: C(T); };
2449
2450  C c(123);
2451deducedTemplateSpecializationType() matches the type in the declaration
2452of the variable c.
2453</pre></td></tr>
2454
2455
2456<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
2457<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2458
2459Given
2460  template&lt;typename T, int Size&gt;
2461  class array {
2462    T data[Size];
2463  };
2464dependentSizedArrayType
2465  matches "T data[Size]"
2466</pre></td></tr>
2467
2468
2469<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
2470<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2471qualified name.
2472
2473Given
2474  namespace N {
2475    namespace M {
2476      class D {};
2477    }
2478  }
2479  class C {};
2480
2481  class C c;
2482  N::M::D d;
2483
2484elaboratedType() matches the type of the variable declarations of both
2485c and d.
2486</pre></td></tr>
2487
2488
2489<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
2490<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2491
2492Given
2493  enum C { Green };
2494  enum class S { Red };
2495
2496  C c;
2497  S s;
2498
2499enumType() matches the type of the variable declarations of both c and
2500s.
2501</pre></td></tr>
2502
2503
2504<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
2505<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2506
2507Given
2508  int (*f)(int);
2509  void g();
2510functionProtoType()
2511  matches "int (*f)(int)" and the type of "g" in C++ mode.
2512  In C mode, "g" is not matched because it does not contain a prototype.
2513</pre></td></tr>
2514
2515
2516<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
2517<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2518
2519Given
2520  int (*f)(int);
2521  void g();
2522functionType()
2523  matches "int (*f)(int)" and the type of "g".
2524</pre></td></tr>
2525
2526
2527<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
2528<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2529
2530Given
2531  int a[] = { 2, 3 };
2532  int b[42];
2533  void f(int c[]) { int d[a[0]]; };
2534incompleteArrayType()
2535  matches "int a[]" and "int c[]"
2536</pre></td></tr>
2537
2538
2539<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
2540<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2541
2542Example matches S s, but not S&lt;T&gt; s.
2543    (matcher = parmVarDecl(hasType(injectedClassNameType())))
2544  template &lt;typename T&gt; struct S {
2545    void f(S s);
2546    void g(S&lt;T&gt; s);
2547  };
2548</pre></td></tr>
2549
2550
2551<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
2552<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2553
2554Given:
2555  int *a;
2556  int &amp;b = *a;
2557  int &amp;&amp;c = 1;
2558  auto &amp;d = b;
2559  auto &amp;&amp;e = c;
2560  auto &amp;&amp;f = 2;
2561  int g = 5;
2562
2563lValueReferenceType() matches the types of b, d, and e. e is
2564matched since the type is deduced as int&amp; by reference collapsing rules.
2565</pre></td></tr>
2566
2567
2568<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
2569<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2570Given
2571  struct A { int i; }
2572  A::* ptr = A::i;
2573memberPointerType()
2574  matches "A::* ptr"
2575</pre></td></tr>
2576
2577
2578<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
2579<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2580a pointer type, despite being syntactically similar.
2581
2582Given
2583  int *a;
2584
2585  @interface Foo
2586  @end
2587  Foo *f;
2588pointerType()
2589  matches "Foo *f", but does not match "int *a".
2590</pre></td></tr>
2591
2592
2593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
2594<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2595
2596Given
2597  int (*ptr_to_array)[4];
2598  int *array_of_ptrs[4];
2599
2600varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2601array_of_ptrs.
2602</pre></td></tr>
2603
2604
2605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
2606<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2607types.
2608
2609Given
2610  int *a;
2611  int &amp;b = *a;
2612  int c = 5;
2613
2614  @interface Foo
2615  @end
2616  Foo *f;
2617pointerType()
2618  matches "int *a", but does not match "Foo *f".
2619</pre></td></tr>
2620
2621
2622<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
2623<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2624
2625Given:
2626  int *a;
2627  int &amp;b = *a;
2628  int &amp;&amp;c = 1;
2629  auto &amp;d = b;
2630  auto &amp;&amp;e = c;
2631  auto &amp;&amp;f = 2;
2632  int g = 5;
2633
2634rValueReferenceType() matches the types of c and f. e is not
2635matched as it is deduced to int&amp; by reference collapsing rules.
2636</pre></td></tr>
2637
2638
2639<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
2640<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2641
2642Given
2643  class C {};
2644  struct S {};
2645
2646  C c;
2647  S s;
2648
2649recordType() matches the type of the variable declarations of both c
2650and s.
2651</pre></td></tr>
2652
2653
2654<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
2655<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2656
2657Given
2658  int *a;
2659  int &amp;b = *a;
2660  int &amp;&amp;c = 1;
2661  auto &amp;d = b;
2662  auto &amp;&amp;e = c;
2663  auto &amp;&amp;f = 2;
2664  int g = 5;
2665
2666referenceType() matches the types of b, c, d, e, and f.
2667</pre></td></tr>
2668
2669
2670<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
2671<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2672template type parameter.
2673
2674Given
2675  template &lt;typename T&gt;
2676  void F(T t) {
2677    int i = 1 + t;
2678  }
2679
2680substTemplateTypeParmType() matches the type of 't' but not '1'
2681</pre></td></tr>
2682
2683
2684<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
2685<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2686
2687Given
2688  enum E {};
2689  class C {};
2690
2691  E e;
2692  C c;
2693
2694tagType() matches the type of the variable declarations of both e
2695and c.
2696</pre></td></tr>
2697
2698
2699<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
2700<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2701
2702Given
2703  template &lt;typename T&gt;
2704  class C { };
2705
2706  template class C&lt;int&gt;;  // A
2707  C&lt;char&gt; var;            // B
2708
2709templateSpecializationType() matches the type of the explicit
2710instantiation in A and the type of the variable declaration in B.
2711</pre></td></tr>
2712
2713
2714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
2715<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2716
2717Example matches T, but not int.
2718    (matcher = templateTypeParmType())
2719  template &lt;typename T&gt; void f(int i);
2720</pre></td></tr>
2721
2722
2723<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
2724<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2725</pre></td></tr>
2726
2727
2728<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
2729<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2730
2731Given
2732  typedef int X;
2733typedefType()
2734  matches "typedef int X"
2735</pre></td></tr>
2736
2737
2738<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
2739<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2740
2741Given:
2742  typedef __underlying_type(T) type;
2743unaryTransformType()
2744  matches "__underlying_type(T)"
2745</pre></td></tr>
2746
2747
2748<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
2749<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2750integer-constant-expression.
2751
2752Given
2753  void f() {
2754    int a[] = { 2, 3 }
2755    int b[42];
2756    int c[a[0]];
2757  }
2758variableArrayType()
2759  matches "int c[a[0]]"
2760</pre></td></tr>
2761
2762<!--END_DECL_MATCHERS -->
2763</table>
2764
2765<!-- ======================================================================= -->
2766<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2767<!-- ======================================================================= -->
2768
2769<p>Narrowing matchers match certain attributes on the current node, thus
2770narrowing down the set of nodes of the current type to match on.</p>
2771
2772<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2773which allow users to create more powerful match expressions.</p>
2774
2775<table>
2776<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2777<!-- START_NARROWING_MATCHERS -->
2778
2779<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2780<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2781
2782Usable as: Any Matcher
2783</pre></td></tr>
2784
2785
2786<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2787<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2788
2789Usable as: Any Matcher
2790</pre></td></tr>
2791
2792
2793<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2794<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2795
2796Useful when another matcher requires a child matcher, but there's no
2797additional constraint. This will often be used with an explicit conversion
2798to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2799
2800Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2801"int* p" and "void f()" in
2802  int* p;
2803  void f();
2804
2805Usable as: Any Matcher
2806</pre></td></tr>
2807
2808
2809<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2810<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2811
2812Given
2813  if (true);
2814  for (; true; );
2815with the matcher
2816  mapAnyOf(ifStmt, forStmt).with(
2817    hasCondition(cxxBoolLiteralExpr(equals(true)))
2818    ).bind("trueCond")
2819matches the if and the for. It is equivalent to:
2820  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2821  anyOf(
2822    ifStmt(trueCond).bind("trueCond"),
2823    forStmt(trueCond).bind("trueCond")
2824    );
2825
2826The with() chain-call accepts zero or more matchers which are combined
2827as-if with allOf() in each of the node matchers.
2828Usable as: Any Matcher
2829</pre></td></tr>
2830
2831
2832<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2833<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2834
2835Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2836  class X {};
2837  class Y {};
2838
2839Usable as: Any Matcher
2840</pre></td></tr>
2841
2842
2843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('isImplicit1')"><a name="isImplicit1Anchor">isImplicit</a></td><td></td></tr>
2844<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
2845implicit default/copy constructors).
2846</pre></td></tr>
2847
2848
2849<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2850<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2851specified names.
2852
2853   hasAnyOperatorName("+", "-")
2854 Is equivalent to
2855   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2856</pre></td></tr>
2857
2858
2859<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2860<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2861unary).
2862
2863Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2864  !(a || b)
2865</pre></td></tr>
2866
2867
2868<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2869<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2870
2871Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2872  if (a == b)
2873    a += b;
2874
2875Example 2: matches s1 = s2
2876           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2877  struct S { S&amp; operator=(const S&amp;); };
2878  void x() { S s1, s2; s1 = s2; }
2879</pre></td></tr>
2880
2881
2882<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2883<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2884
2885Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2886  if (a == b)
2887    a += b;
2888
2889Example 2: matches s1 &lt; s2
2890           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2891  struct S { bool operator&lt;(const S&amp; other); };
2892  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2893</pre></td></tr>
2894
2895
2896<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
2897<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2898inheritance.
2899
2900Examples:
2901  class C {
2902  public:    int a;
2903  protected: int b;
2904  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2905  };
2906
2907  struct Base {};
2908  struct Derived1 : private Base {}; // matches 'Base'
2909  class Derived2 : Base {}; // matches 'Base'
2910</pre></td></tr>
2911
2912
2913<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
2914<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2915protected inheritance.
2916
2917Examples:
2918  class C {
2919  public:    int a;
2920  protected: int b; // fieldDecl(isProtected()) matches 'b'
2921  private:   int c;
2922  };
2923
2924  class Base {};
2925  class Derived : protected Base {}; // matches 'Base'
2926</pre></td></tr>
2927
2928
2929<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
2930<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2931inheritance.
2932
2933Examples:
2934  class C {
2935  public:    int a; // fieldDecl(isPublic()) matches 'a'
2936  protected: int b;
2937  private:   int c;
2938  };
2939
2940  class Base {};
2941  class Derived1 : public Base {}; // matches 'Base'
2942  struct Derived2 : Base {}; // matches 'Base'
2943</pre></td></tr>
2944
2945
2946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
2947<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2948virtual inheritance.
2949
2950Example:
2951  class A {
2952   public:
2953    virtual void x(); // matches x
2954  };
2955
2956Example:
2957  class Base {};
2958  class DirectlyDerived : virtual Base {}; // matches Base
2959  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2960
2961Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2962</pre></td></tr>
2963
2964
2965<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2966<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2967
2968
2969<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2970<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2971
2972Given
2973  f('false, 3.14, 42);
2974characterLiteral(equals(0))
2975  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2976  match false
2977floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2978  match 3.14
2979integerLiteral(equals(42))
2980  matches 42
2981
2982Note that you cannot directly match a negative numeric literal because the
2983minus sign is not part of the literal: It is a unary operator whose operand
2984is the positive numeric literal. Instead, you must use a unaryOperator()
2985matcher to match the minus sign:
2986
2987unaryOperator(hasOperatorName("-"),
2988              hasUnaryOperand(integerLiteral(equals(13))))
2989
2990Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2991           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2992</pre></td></tr>
2993
2994
2995<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2996<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2997
2998
2999<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
3000<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
3001
3002
3003<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
3004<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
3005
3006Given
3007  try {
3008    // ...
3009  } catch (int) {
3010    // ...
3011  } catch (...) {
3012    // ...
3013  }
3014cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
3015</pre></td></tr>
3016
3017
3018<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3019<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
3020a specific number of arguments (including absent default arguments).
3021
3022Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3023  void f(int x, int y);
3024  f(0, 0);
3025</pre></td></tr>
3026
3027
3028<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
3029<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
3030</pre></td></tr>
3031
3032
3033<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
3034<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
3035zero initialization.
3036
3037Given
3038void foo() {
3039  struct point { double x; double y; };
3040  point pt[2] = { { 1.0, 2.0 } };
3041}
3042initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
3043will match the implicit array filler for pt[1].
3044</pre></td></tr>
3045
3046
3047<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
3048<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
3049
3050Given
3051  struct S {
3052    S(); // #1
3053    S(const S &amp;); // #2
3054    S(S &amp;&amp;); // #3
3055  };
3056cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
3057</pre></td></tr>
3058
3059
3060<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
3061<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
3062
3063Given
3064  struct S {
3065    S(); // #1
3066    S(const S &amp;); // #2
3067    S(S &amp;&amp;); // #3
3068  };
3069cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
3070</pre></td></tr>
3071
3072
3073<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
3074<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
3075
3076Given
3077  struct S {
3078    S(); // #1
3079    S(int) {} // #2
3080    S(S &amp;&amp;) : S() {} // #3
3081  };
3082  S::S() : S(0) {} // #4
3083cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
3084#1 or #2.
3085</pre></td></tr>
3086
3087
3088<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
3089<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
3090that have an explicit specifier if this explicit specifier is resolved to
3091true.
3092
3093Given
3094  template&lt;bool b&gt;
3095  struct S {
3096    S(int); // #1
3097    explicit S(double); // #2
3098    operator int(); // #3
3099    explicit operator bool(); // #4
3100    explicit(false) S(bool) // # 7
3101    explicit(true) S(char) // # 8
3102    explicit(b) S(S) // # 9
3103  };
3104  S(int) -&gt; S&lt;true&gt; // #5
3105  explicit S(double) -&gt; S&lt;false&gt; // #6
3106cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3107cxxConversionDecl(isExplicit()) will match #4, but not #3.
3108cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3109</pre></td></tr>
3110
3111
3112<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isInheritingConstructor0')"><a name="isInheritingConstructor0Anchor">isInheritingConstructor</a></td><td></td></tr>
3113<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr>
3114
3115
3116<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
3117<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3118
3119Given
3120  struct S {
3121    S(); // #1
3122    S(const S &amp;); // #2
3123    S(S &amp;&amp;); // #3
3124  };
3125cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3126</pre></td></tr>
3127
3128
3129<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
3130<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3131that have an explicit specifier if this explicit specifier is resolved to
3132true.
3133
3134Given
3135  template&lt;bool b&gt;
3136  struct S {
3137    S(int); // #1
3138    explicit S(double); // #2
3139    operator int(); // #3
3140    explicit operator bool(); // #4
3141    explicit(false) S(bool) // # 7
3142    explicit(true) S(char) // # 8
3143    explicit(b) S(S) // # 9
3144  };
3145  S(int) -&gt; S&lt;true&gt; // #5
3146  explicit S(double) -&gt; S&lt;false&gt; // #6
3147cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3148cxxConversionDecl(isExplicit()) will match #4, but not #3.
3149cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3150</pre></td></tr>
3151
3152
3153<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
3154<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3155opposed to a member.
3156
3157Given
3158  struct B {};
3159  struct D : B {
3160    int I;
3161    D(int i) : I(i) {}
3162  };
3163  struct E : B {
3164    E() : B() {}
3165  };
3166cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3167  will match E(), but not match D(int).
3168</pre></td></tr>
3169
3170
3171<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
3172<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3173opposed to a base.
3174
3175Given
3176  struct B {};
3177  struct D : B {
3178    int I;
3179    D(int i) : I(i) {}
3180  };
3181  struct E : B {
3182    E() : B() {}
3183  };
3184cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3185  will match D(int), but not match E().
3186</pre></td></tr>
3187
3188
3189<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
3190<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3191code (as opposed to implicitly added by the compiler).
3192
3193Given
3194  struct Foo {
3195    Foo() { }
3196    Foo(int) : foo_("A") { }
3197    string foo_;
3198  };
3199cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3200  will match Foo(int), but not Foo()
3201</pre></td></tr>
3202
3203
3204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
3205<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3206that have an explicit specifier if this explicit specifier is resolved to
3207true.
3208
3209Given
3210  template&lt;bool b&gt;
3211  struct S {
3212    S(int); // #1
3213    explicit S(double); // #2
3214    operator int(); // #3
3215    explicit operator bool(); // #4
3216    explicit(false) S(bool) // # 7
3217    explicit(true) S(char) // # 8
3218    explicit(b) S(S) // # 9
3219  };
3220  S(int) -&gt; S&lt;true&gt; // #5
3221  explicit S(double) -&gt; S&lt;false&gt; // #6
3222cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3223cxxConversionDecl(isExplicit()) will match #4, but not #3.
3224cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3225</pre></td></tr>
3226
3227
3228<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasMemberName0')"><a name="hasMemberName0Anchor">hasMemberName</a></td><td>std::string N</td></tr>
3229<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3230
3231In template declarations, dependent members are not resolved and so can
3232not be matched to particular named declarations.
3233
3234This matcher allows to match on the known name of members.
3235
3236Given
3237  template &lt;typename T&gt;
3238  struct S {
3239      void mem();
3240  };
3241  template &lt;typename T&gt;
3242  void x() {
3243      S&lt;T&gt; s;
3244      s.mem();
3245  }
3246cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3247</pre></td></tr>
3248
3249
3250<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
3251<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
3252to '.'.
3253
3254Member calls on the implicit this pointer match as called with '-&gt;'.
3255
3256Given
3257  class Y {
3258    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3259    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3260    int a;
3261    static int b;
3262  };
3263  template &lt;class T&gt;
3264  class Z {
3265    void x() { this-&gt;m; }
3266  };
3267memberExpr(isArrow())
3268  matches this-&gt;x, x, y.x, a, this-&gt;b
3269cxxDependentScopeMemberExpr(isArrow())
3270  matches this-&gt;m
3271unresolvedMemberExpr(isArrow())
3272  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3273</pre></td></tr>
3274
3275
3276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr>
3277<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3278node
3279
3280In template declarations, dependent members are not resolved and so can
3281not be matched to particular named declarations.
3282
3283This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3284and CXXMethodDecl nodes.
3285
3286Given
3287  template &lt;typename T&gt;
3288  struct S {
3289      void mem();
3290  };
3291  template &lt;typename T&gt;
3292  void x() {
3293      S&lt;T&gt; s;
3294      s.mem();
3295  }
3296The matcher
3297@code
3298cxxDependentScopeMemberExpr(
3299  hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3300      hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3301          cxxMethodDecl(hasName("mem")).bind("templMem")
3302          )))))
3303      )))),
3304  memberHasSameNameAsBoundNode("templMem")
3305  )
3306@endcode
3307first matches and binds the @c mem member of the @c S template, then
3308compares its name to the usage in @c s.mem() in the @c x function template
3309</pre></td></tr>
3310
3311
3312<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
3313<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3314
3315Given
3316struct A {
3317  void foo() const;
3318  void bar();
3319};
3320
3321cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3322</pre></td></tr>
3323
3324
3325<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
3326<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3327operator.
3328
3329Given
3330struct A {
3331  A &amp;operator=(const A &amp;);
3332  A &amp;operator=(A &amp;&amp;);
3333};
3334
3335cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3336the second one.
3337</pre></td></tr>
3338
3339
3340<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
3341<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3342
3343Given:
3344  class A final {};
3345
3346  struct B {
3347    virtual void f();
3348  };
3349
3350  struct C : B {
3351    void f() final;
3352  };
3353matches A and C::f, but not B, C, or B::f
3354</pre></td></tr>
3355
3356
3357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
3358<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3359operator.
3360
3361Given
3362struct A {
3363  A &amp;operator=(const A &amp;);
3364  A &amp;operator=(A &amp;&amp;);
3365};
3366
3367cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3368the first one.
3369</pre></td></tr>
3370
3371
3372<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
3373<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3374
3375Given
3376  class A {
3377   public:
3378    virtual void x();
3379  };
3380  class B : public A {
3381   public:
3382    virtual void x();
3383  };
3384  matches B::x
3385</pre></td></tr>
3386
3387
3388<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
3389<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3390
3391Given
3392  class A {
3393   public:
3394    virtual void x() = 0;
3395  };
3396  matches A::x
3397</pre></td></tr>
3398
3399
3400<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
3401<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3402
3403Given
3404  struct S {
3405    S(); // #1
3406    S(const S &amp;) = default; // #2
3407    S(S &amp;&amp;) = delete; // #3
3408  };
3409cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3410</pre></td></tr>
3411
3412
3413<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
3414<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3415virtual inheritance.
3416
3417Example:
3418  class A {
3419   public:
3420    virtual void x(); // matches x
3421  };
3422
3423Example:
3424  class Base {};
3425  class DirectlyDerived : virtual Base {}; // matches Base
3426  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3427
3428Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
3429</pre></td></tr>
3430
3431
3432<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
3433<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3434
3435Given
3436  class A {
3437   public:
3438    virtual void x();
3439  };
3440  class B : public A {
3441   public:
3442    void x();
3443  };
3444  matches A::x but not B::x
3445</pre></td></tr>
3446
3447
3448<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
3449<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3450
3451Given:
3452  MyClass *p1 = new MyClass[10];
3453cxxNewExpr(isArray())
3454  matches the expression 'new MyClass[10]'.
3455</pre></td></tr>
3456
3457
3458<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3459<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3460specified names.
3461
3462   hasAnyOperatorName("+", "-")
3463 Is equivalent to
3464   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3465</pre></td></tr>
3466
3467
3468<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3469<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3470
3471Matches overloaded operator names specified in strings without the
3472"operator" prefix: e.g. "&lt;&lt;".
3473
3474  hasAnyOverloadedOperatorName("+", "-")
3475Is equivalent to
3476  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3477</pre></td></tr>
3478
3479
3480<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3481<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3482unary).
3483
3484Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3485  !(a || b)
3486</pre></td></tr>
3487
3488
3489<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3490<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3491
3492Matches overloaded operator names specified in strings without the
3493"operator" prefix: e.g. "&lt;&lt;".
3494
3495Given:
3496  class A { int operator*(); };
3497  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3498  A a;
3499  a &lt;&lt; a;   // &lt;-- This matches
3500
3501cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3502specified line and
3503cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3504matches the declaration of A.
3505
3506Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
3507</pre></td></tr>
3508
3509
3510<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
3511<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3512
3513Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3514  if (a == b)
3515    a += b;
3516
3517Example 2: matches s1 = s2
3518           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3519  struct S { S&amp; operator=(const S&amp;); };
3520  void x() { S s1, s2; s1 = s2; }
3521</pre></td></tr>
3522
3523
3524<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
3525<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3526
3527Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3528  if (a == b)
3529    a += b;
3530
3531Example 2: matches s1 &lt; s2
3532           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3533  struct S { bool operator&lt;(const S&amp; other); };
3534  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3535</pre></td></tr>
3536
3537
3538<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
3539<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3540
3541Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3542class x {};
3543class y;
3544</pre></td></tr>
3545
3546
3547<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
3548<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3549</pre></td></tr>
3550
3551
3552<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
3553<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3554</pre></td></tr>
3555
3556
3557<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
3558<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3559static member variable template instantiations.
3560
3561Given
3562  template&lt;typename T&gt; void A(T t) { }
3563  template&lt;&gt; void A(int N) { }
3564functionDecl(isExplicitTemplateSpecialization())
3565  matches the specialization A&lt;int&gt;().
3566
3567Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3568</pre></td></tr>
3569
3570
3571<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
3572<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3573
3574Given:
3575  class A final {};
3576
3577  struct B {
3578    virtual void f();
3579  };
3580
3581  struct C : B {
3582    void f() final;
3583  };
3584matches A and C::f, but not B, C, or B::f
3585</pre></td></tr>
3586
3587
3588<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
3589<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3590
3591Given:
3592  auto x = []{};
3593
3594cxxRecordDecl(isLambda()) matches the implicit class declaration of
3595decltype(x)
3596</pre></td></tr>
3597
3598
3599<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
3600<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3601isSameOrDerivedFrom(hasName(...)).
3602</pre></td></tr>
3603
3604
3605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
3606<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3607member variable template instantiations.
3608
3609Given
3610  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3611or
3612  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3613or
3614  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3615cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3616  matches the template instantiation of X&lt;A&gt;.
3617
3618But given
3619  template &lt;typename T&gt;  class X {}; class A {};
3620  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3621cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3622  does not match, as X&lt;A&gt; is an explicit template specialization.
3623
3624Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3625</pre></td></tr>
3626
3627
3628<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName2')"><a name="hasAnyOperatorName2Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3629<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3630specified names.
3631
3632   hasAnyOperatorName("+", "-")
3633 Is equivalent to
3634   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3635</pre></td></tr>
3636
3637
3638<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName2')"><a name="hasOperatorName2Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
3639<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3640unary).
3641
3642Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3643  !(a || b)
3644</pre></td></tr>
3645
3646
3647<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator2')"><a name="isAssignmentOperator2Anchor">isAssignmentOperator</a></td><td></td></tr>
3648<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3649
3650Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3651  if (a == b)
3652    a += b;
3653
3654Example 2: matches s1 = s2
3655           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3656  struct S { S&amp; operator=(const S&amp;); };
3657  void x() { S s1, s2; s1 = s2; }
3658</pre></td></tr>
3659
3660
3661<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
3662<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3663
3664Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3665  if (a == b)
3666    a += b;
3667
3668Example 2: matches s1 &lt; s2
3669           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3670  struct S { bool operator&lt;(const S&amp; other); };
3671  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3672</pre></td></tr>
3673
3674
3675<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3676<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3677a specific number of arguments (including absent default arguments).
3678
3679Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3680  void f(int x, int y);
3681  f(0, 0);
3682</pre></td></tr>
3683
3684
3685<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3686<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3687a specific number of arguments (including absent default arguments).
3688
3689Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3690  void f(int x, int y);
3691  f(0, 0);
3692</pre></td></tr>
3693
3694
3695<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
3696<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3697
3698Example matches y(x) but not y(42) or NS::y(x).
3699  namespace NS {
3700    struct X {};
3701    void y(X);
3702  }
3703
3704  void y(...);
3705
3706  void test() {
3707    NS::X x;
3708    y(x); // Matches
3709    NS::y(x); // Doesn't match
3710    y(42); // Doesn't match
3711    using NS::y;
3712    y(x); // Found by both unqualified lookup and ADL, doesn't match
3713   }
3714</pre></td></tr>
3715
3716
3717<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
3718<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3719
3720Example: matches the implicit cast around 0
3721(matcher = castExpr(hasCastKind(CK_NullToPointer)))
3722  int *p = 0;
3723
3724If the matcher is use from clang-query, CastKind parameter
3725should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3726</pre></td></tr>
3727
3728
3729<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
3730<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3731
3732
3733<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
3734<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3735
3736Given
3737  f('false, 3.14, 42);
3738characterLiteral(equals(0))
3739  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3740  match false
3741floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3742  match 3.14
3743integerLiteral(equals(42))
3744  matches 42
3745
3746Note that you cannot directly match a negative numeric literal because the
3747minus sign is not part of the literal: It is a unary operator whose operand
3748is the positive numeric literal. Instead, you must use a unaryOperator()
3749matcher to match the minus sign:
3750
3751unaryOperator(hasOperatorName("-"),
3752              hasUnaryOperand(integerLiteral(equals(13))))
3753
3754Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3755           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
3756</pre></td></tr>
3757
3758
3759<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
3760<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3761
3762
3763<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
3764<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3765
3766
3767<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
3768<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3769
3770Given
3771  template&lt;typename T&gt; struct C {};
3772  C&lt;int&gt; c;
3773classTemplateSpecializationDecl(templateArgumentCountIs(1))
3774  matches C&lt;int&gt;.
3775</pre></td></tr>
3776
3777
3778<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
3779<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3780child statements.
3781
3782Example: Given
3783  { for (;;) {} }
3784compoundStmt(statementCountIs(0)))
3785  matches '{}'
3786  but does not match the outer compound statement.
3787</pre></td></tr>
3788
3789
3790<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
3791<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3792
3793Given
3794  int a[42];
3795  int b[2 * 21];
3796  int c[41], d[43];
3797  char *s = "abcd";
3798  wchar_t *ws = L"abcd";
3799  char *w = "a";
3800constantArrayType(hasSize(42))
3801  matches "int a[42]" and "int b[2 * 21]"
3802stringLiteral(hasSize(4))
3803  matches "abcd", L"abcd"
3804</pre></td></tr>
3805
3806
3807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
3808<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3809declarations.
3810
3811Example: Given
3812  int a, b;
3813  int c;
3814  int d = 2, e;
3815declCountIs(2)
3816  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3817</pre></td></tr>
3818
3819
3820<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3821<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3822
3823Matches a node if it equals the node previously bound to ID.
3824
3825Given
3826  class X { int a; int b; };
3827cxxRecordDecl(
3828    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3829    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3830  matches the class X, as a and b have the same type.
3831
3832Note that when multiple matches are involved via forEach* matchers,
3833equalsBoundNodes acts as a filter.
3834For example:
3835compoundStmt(
3836    forEachDescendant(varDecl().bind("d")),
3837    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3838will trigger a match for each combination of variable declaration
3839and reference to that variable declaration within a compound statement.
3840</pre></td></tr>
3841
3842
3843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
3844<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3845
3846Decl has pointer identity in the AST.
3847</pre></td></tr>
3848
3849
3850<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
3851<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3852
3853Given
3854  __attribute__((device)) void f() { ... }
3855decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3856f. If the matcher is used from clang-query, attr::Kind parameter should be
3857passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3858</pre></td></tr>
3859
3860
3861<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
3862<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3863Does not match if only part of the statement is expanded from that macro or
3864if different parts of the statement are expanded from different
3865appearances of the macro.
3866</pre></td></tr>
3867
3868
3869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
3870<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3871partially matching a given regex.
3872
3873Example matches Y but not X
3874    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3875  #include "ASTMatcher.h"
3876  class X {};
3877ASTMatcher.h:
3878  class Y {};
3879
3880Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3881
3882If the matcher is used in clang-query, RegexFlags parameter
3883should be passed as a quoted string. e.g: "NoFlags".
3884Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3885</pre></td></tr>
3886
3887
3888<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
3889<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3890
3891Example matches X but not Y
3892  (matcher = cxxRecordDecl(isExpansionInMainFile())
3893  #include &lt;Y.h&gt;
3894  class X {};
3895Y.h:
3896  class Y {};
3897
3898Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3899</pre></td></tr>
3900
3901
3902<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3903<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3904
3905Example matches Y but not X
3906    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3907  #include &lt;SystemHeader.h&gt;
3908  class X {};
3909SystemHeader.h:
3910  class Y {};
3911
3912Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3913</pre></td></tr>
3914
3915
3916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3917<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
3918implicit default/copy constructors).
3919</pre></td></tr>
3920
3921
3922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
3923<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3924
3925Given
3926  class vector {};
3927  namespace foo {
3928    class vector {};
3929    namespace std {
3930      class vector {};
3931    }
3932  }
3933  namespace std {
3934    inline namespace __1 {
3935      class vector {}; // #1
3936      namespace experimental {
3937        class vector {};
3938      }
3939    }
3940  }
3941cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3942</pre></td></tr>
3943
3944
3945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
3946<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3947template instantiations.
3948
3949Given
3950  template&lt;typename T&gt; void A(T t) { T i; }
3951  A(0);
3952  A(0U);
3953functionDecl(isInstantiated())
3954  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3955</pre></td></tr>
3956
3957
3958<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
3959<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3960inheritance.
3961
3962Examples:
3963  class C {
3964  public:    int a;
3965  protected: int b;
3966  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3967  };
3968
3969  struct Base {};
3970  struct Derived1 : private Base {}; // matches 'Base'
3971  class Derived2 : Base {}; // matches 'Base'
3972</pre></td></tr>
3973
3974
3975<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
3976<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3977protected inheritance.
3978
3979Examples:
3980  class C {
3981  public:    int a;
3982  protected: int b; // fieldDecl(isProtected()) matches 'b'
3983  private:   int c;
3984  };
3985
3986  class Base {};
3987  class Derived : protected Base {}; // matches 'Base'
3988</pre></td></tr>
3989
3990
3991<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
3992<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3993inheritance.
3994
3995Examples:
3996  class C {
3997  public:    int a; // fieldDecl(isPublic()) matches 'a'
3998  protected: int b;
3999  private:   int c;
4000  };
4001
4002  class Base {};
4003  class Derived1 : public Base {}; // matches 'Base'
4004  struct Derived2 : Base {}; // matches 'Base'
4005</pre></td></tr>
4006
4007
4008<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
4009<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
4010a specific number of designators.
4011
4012Example: Given
4013  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
4014  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
4015designatorCountIs(2)
4016  matches '{ [2].y = 1.0, [0].x = 1.0 }',
4017  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
4018</pre></td></tr>
4019
4020
4021<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
4022<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
4023
4024Example matches Y (matcher = enumDecl(isScoped()))
4025enum X {};
4026enum class Y {};
4027</pre></td></tr>
4028
4029
4030<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
4031<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
4032neither type- nor value-dependent.
4033
4034In the following example, the expression sizeof(sizeof(T() + T()))
4035is instantiation-dependent (since it involves a template parameter T),
4036but is neither type- nor value-dependent, since the type of the inner
4037sizeof is known (std::size_t) and therefore the size of the outer
4038sizeof is known.
4039  template&lt;typename T&gt;
4040  void f(T x, T y) { sizeof(sizeof(T() + T()); }
4041expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
4042</pre></td></tr>
4043
4044
4045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
4046<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
4047is not yet instantiated.
4048
4049For example, the expressions "x" and "x + y" are type-dependent in
4050the following code, but "y" is not type-dependent:
4051  template&lt;typename T&gt;
4052  void add(T x, int y) {
4053    x + y;
4054  }
4055expr(isTypeDependent()) matches x + y
4056</pre></td></tr>
4057
4058
4059<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
4060<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
4061non-type template parameter.
4062
4063For example, the array bound of "Chars" in the following example is
4064value-dependent.
4065  template&lt;int Size&gt; int f() { return Size; }
4066expr(isValueDependent()) matches return Size
4067</pre></td></tr>
4068
4069
4070<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
4071<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4072GNU's __null, C++11's nullptr, or C's NULL macro.
4073
4074Given:
4075  void *v1 = NULL;
4076  void *v2 = nullptr;
4077  void *v3 = __null; // GNU extension
4078  char *cp = (char *)0;
4079  int *ip = 0;
4080  int i = 0;
4081expr(nullPointerConstant())
4082  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4083  initializer for i.
4084</pre></td></tr>
4085
4086
4087<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
4088<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
4089bit width.
4090
4091Given
4092  class C {
4093    int a : 2;
4094    int b : 4;
4095    int c : 2;
4096  };
4097fieldDecl(hasBitWidth(2))
4098  matches 'int a;' and 'int c;' but not 'int b;'.
4099</pre></td></tr>
4100
4101
4102<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
4103<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
4104
4105Given
4106  class C {
4107    int a : 2;
4108    int b;
4109  };
4110fieldDecl(isBitField())
4111  matches 'int a;' but not 'int b;'.
4112</pre></td></tr>
4113
4114
4115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4116<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4117
4118Given
4119  f('false, 3.14, 42);
4120characterLiteral(equals(0))
4121  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4122  match false
4123floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4124  match 3.14
4125integerLiteral(equals(42))
4126  matches 42
4127
4128Note that you cannot directly match a negative numeric literal because the
4129minus sign is not part of the literal: It is a unary operator whose operand
4130is the positive numeric literal. Instead, you must use a unaryOperator()
4131matcher to match the minus sign:
4132
4133unaryOperator(hasOperatorName("-"),
4134              hasUnaryOperand(integerLiteral(equals(13))))
4135
4136Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4137           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4138</pre></td></tr>
4139
4140
4141<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
4142<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4143
4144
4145<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
4146<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4147
4148Matches overloaded operator names specified in strings without the
4149"operator" prefix: e.g. "&lt;&lt;".
4150
4151  hasAnyOverloadedOperatorName("+", "-")
4152Is equivalent to
4153  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4154</pre></td></tr>
4155
4156
4157<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4158<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4159
4160Given:
4161  void f();
4162  void g() noexcept;
4163  void h() noexcept(true);
4164  void i() noexcept(false);
4165  void j() throw();
4166  void k() throw(int);
4167  void l() throw(...);
4168functionDecl(hasDynamicExceptionSpec()) and
4169  functionProtoType(hasDynamicExceptionSpec())
4170  match the declarations of j, k, and l, but not f, g, h, or i.
4171</pre></td></tr>
4172
4173
4174<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
4175<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4176
4177Matches overloaded operator names specified in strings without the
4178"operator" prefix: e.g. "&lt;&lt;".
4179
4180Given:
4181  class A { int operator*(); };
4182  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
4183  A a;
4184  a &lt;&lt; a;   // &lt;-- This matches
4185
4186cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
4187specified line and
4188cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4189matches the declaration of A.
4190
4191Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
4192</pre></td></tr>
4193
4194
4195<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
4196<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4197
4198Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4199int X() {}
4200auto Y() -&gt; int {}
4201</pre></td></tr>
4202
4203
4204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
4205<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4206       and if constexpr.
4207
4208Given:
4209  constexpr int foo = 42;
4210  constexpr int bar();
4211  void baz() { if constexpr(1 &gt; 0) {} }
4212varDecl(isConstexpr())
4213  matches the declaration of foo.
4214functionDecl(isConstexpr())
4215  matches the declaration of bar.
4216ifStmt(isConstexpr())
4217  matches the if statement in baz.
4218</pre></td></tr>
4219
4220
4221<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
4222<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4223
4224Given:
4225  class A { ~A(); };
4226  class B { ~B() = default; };
4227functionDecl(isDefaulted())
4228  matches the declaration of ~B, but not ~A.
4229</pre></td></tr>
4230
4231
4232<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
4233<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4234
4235Example matches A, va, fa
4236  class A {};
4237  class B;  // Doesn't match, as it has no body.
4238  int va;
4239  extern int vb;  // Doesn't match, as it doesn't define the variable.
4240  void fa() {}
4241  void fb();  // Doesn't match, as it has no body.
4242  @interface X
4243  - (void)ma; // Doesn't match, interface is declaration.
4244  @end
4245  @implementation X
4246  - (void)ma {}
4247  @end
4248
4249Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
4250  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4251</pre></td></tr>
4252
4253
4254<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
4255<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4256
4257Given:
4258  void Func();
4259  void DeletedFunc() = delete;
4260functionDecl(isDeleted())
4261  matches the declaration of DeletedFunc, but not Func.
4262</pre></td></tr>
4263
4264
4265<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
4266<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4267static member variable template instantiations.
4268
4269Given
4270  template&lt;typename T&gt; void A(T t) { }
4271  template&lt;&gt; void A(int N) { }
4272functionDecl(isExplicitTemplateSpecialization())
4273  matches the specialization A&lt;int&gt;().
4274
4275Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4276</pre></td></tr>
4277
4278
4279<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
4280<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4281
4282Given:
4283  extern "C" void f() {}
4284  extern "C" { void g() {} }
4285  void h() {}
4286  extern "C" int x = 1;
4287  extern "C" int y = 2;
4288  int z = 3;
4289functionDecl(isExternC())
4290  matches the declaration of f and g, but not the declaration of h.
4291varDecl(isExternC())
4292  matches the declaration of x and y, but not the declaration of z.
4293</pre></td></tr>
4294
4295
4296<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
4297<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4298the inline keyword.
4299
4300Given
4301  inline void f();
4302  void g();
4303  namespace n {
4304  inline namespace m {}
4305  }
4306functionDecl(isInline()) will match ::f().
4307namespaceDecl(isInline()) will match n::m.
4308</pre></td></tr>
4309
4310
4311<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
4312<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4313into an executable program.
4314</pre></td></tr>
4315
4316
4317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
4318<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4319
4320Given
4321  void nope();
4322  [[noreturn]] void a();
4323  __attribute__((noreturn)) void b();
4324  struct c { [[noreturn]] c(); };
4325functionDecl(isNoReturn())
4326  matches all of those except
4327  void nope();
4328</pre></td></tr>
4329
4330
4331<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
4332<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4333
4334Given:
4335  void f();
4336  void g() noexcept;
4337  void h() throw();
4338  void i() throw(int);
4339  void j() noexcept(false);
4340functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4341  match the declarations of g, and h, but not f, i or j.
4342</pre></td></tr>
4343
4344
4345<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
4346<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4347class specifier ("static" keyword) written in the source.
4348
4349Given:
4350  static void f() {}
4351  static int i = 0;
4352  extern int j;
4353  int k;
4354functionDecl(isStaticStorageClass())
4355  matches the function declaration f.
4356varDecl(isStaticStorageClass())
4357  matches the variable declaration i.
4358</pre></td></tr>
4359
4360
4361<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
4362<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4363member variable template instantiations.
4364
4365Given
4366  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4367or
4368  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4369or
4370  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4371cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4372  matches the template instantiation of X&lt;A&gt;.
4373
4374But given
4375  template &lt;typename T&gt;  class X {}; class A {};
4376  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4377cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4378  does not match, as X&lt;A&gt; is an explicit template specialization.
4379
4380Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
4381</pre></td></tr>
4382
4383
4384<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
4385<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4386
4387Example matches f, but not g or h. The function i will not match, even when
4388compiled in C mode.
4389  void f(...);
4390  void g(int);
4391  template &lt;typename... Ts&gt; void h(Ts...);
4392  void i();
4393</pre></td></tr>
4394
4395
4396<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr>
4397<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4398
4399Given:
4400  void foo() __attribute__((__weakref__("__foo")));
4401  void bar();
4402functionDecl(isWeak())
4403  matches the weak declaration "foo", but not "bar".
4404</pre></td></tr>
4405
4406
4407<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4408<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4409specific parameter count.
4410
4411Given
4412  void f(int i) {}
4413  void g(int i, int j) {}
4414  void h(int i, int j);
4415  void j(int i);
4416  void k(int x, int y, int z, ...);
4417functionDecl(parameterCountIs(2))
4418  matches g and h
4419functionProtoType(parameterCountIs(2))
4420  matches g and h
4421functionProtoType(parameterCountIs(3))
4422  matches k
4423</pre></td></tr>
4424
4425
4426<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
4427<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4428
4429Given:
4430  void f();
4431  void g() noexcept;
4432  void h() noexcept(true);
4433  void i() noexcept(false);
4434  void j() throw();
4435  void k() throw(int);
4436  void l() throw(...);
4437functionDecl(hasDynamicExceptionSpec()) and
4438  functionProtoType(hasDynamicExceptionSpec())
4439  match the declarations of j, k, and l, but not f, g, h, or i.
4440</pre></td></tr>
4441
4442
4443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('isNoThrow1')"><a name="isNoThrow1Anchor">isNoThrow</a></td><td></td></tr>
4444<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4445
4446Given:
4447  void f();
4448  void g() noexcept;
4449  void h() throw();
4450  void i() throw(int);
4451  void j() noexcept(false);
4452functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4453  match the declarations of g, and h, but not f, i or j.
4454</pre></td></tr>
4455
4456
4457<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4458<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4459specific parameter count.
4460
4461Given
4462  void f(int i) {}
4463  void g(int i, int j) {}
4464  void h(int i, int j);
4465  void j(int i);
4466  void k(int x, int y, int z, ...);
4467functionDecl(parameterCountIs(2))
4468  matches g and h
4469functionProtoType(parameterCountIs(2))
4470  matches g and h
4471functionProtoType(parameterCountIs(3))
4472  matches k
4473</pre></td></tr>
4474
4475
4476<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('isConstexpr2')"><a name="isConstexpr2Anchor">isConstexpr</a></td><td></td></tr>
4477<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4478       and if constexpr.
4479
4480Given:
4481  constexpr int foo = 42;
4482  constexpr int bar();
4483  void baz() { if constexpr(1 &gt; 0) {} }
4484varDecl(isConstexpr())
4485  matches the declaration of foo.
4486functionDecl(isConstexpr())
4487  matches the declaration of bar.
4488ifStmt(isConstexpr())
4489  matches the if statement in baz.
4490</pre></td></tr>
4491
4492
4493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals6')"><a name="equals6Anchor">equals</a></td><td>bool Value</td></tr>
4494<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4495
4496
4497<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4498<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4499
4500Given
4501  f('false, 3.14, 42);
4502characterLiteral(equals(0))
4503  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4504  match false
4505floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4506  match 3.14
4507integerLiteral(equals(42))
4508  matches 42
4509
4510Note that you cannot directly match a negative numeric literal because the
4511minus sign is not part of the literal: It is a unary operator whose operand
4512is the positive numeric literal. Instead, you must use a unaryOperator()
4513matcher to match the minus sign:
4514
4515unaryOperator(hasOperatorName("-"),
4516              hasUnaryOperand(integerLiteral(equals(13))))
4517
4518Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
4519           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
4520</pre></td></tr>
4521
4522
4523<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals13')"><a name="equals13Anchor">equals</a></td><td>double Value</td></tr>
4524<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4525
4526
4527<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
4528<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4529
4530
4531<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('capturesThis0')"><a name="capturesThis0Anchor">capturesThis</a></td><td></td></tr>
4532<tr><td colspan="4" class="doc" id="capturesThis0"><pre>Matches a `LambdaCapture` that refers to 'this'.
4533
4534Given
4535class C {
4536  int cc;
4537  int f() {
4538    auto l = [this]() { return cc; };
4539    return l();
4540  }
4541};
4542lambdaExpr(hasAnyCapture(lambdaCapture(capturesThis())))
4543  matches `[this]() { return cc; }`.
4544</pre></td></tr>
4545
4546
4547<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt;</td><td class="name" onclick="toggle('isImplicit2')"><a name="isImplicit2Anchor">isImplicit</a></td><td></td></tr>
4548<tr><td colspan="4" class="doc" id="isImplicit2"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
4549implicit default/copy constructors).
4550</pre></td></tr>
4551
4552
4553<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow0')"><a name="isArrow0Anchor">isArrow</a></td><td></td></tr>
4554<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4555to '.'.
4556
4557Member calls on the implicit this pointer match as called with '-&gt;'.
4558
4559Given
4560  class Y {
4561    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4562    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4563    int a;
4564    static int b;
4565  };
4566  template &lt;class T&gt;
4567  class Z {
4568    void x() { this-&gt;m; }
4569  };
4570memberExpr(isArrow())
4571  matches this-&gt;x, x, y.x, a, this-&gt;b
4572cxxDependentScopeMemberExpr(isArrow())
4573  matches this-&gt;m
4574unresolvedMemberExpr(isArrow())
4575  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4576</pre></td></tr>
4577
4578
4579<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>
4580<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4581
4582This matcher is only provided as a performance optimization of hasName.
4583    hasAnyName(a, b, c)
4584 is equivalent to, but faster than
4585    anyOf(hasName(a), hasName(b), hasName(c))
4586</pre></td></tr>
4587
4588
4589<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>
4590<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4591
4592Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4593void f() {
4594  int x;
4595  static int y;
4596}
4597int z;
4598
4599Example matches f() because it has external formal linkage despite being
4600unique to the translation unit as though it has internal likage
4601(matcher = functionDecl(hasExternalFormalLinkage()))
4602
4603namespace {
4604void f() {}
4605}
4606</pre></td></tr>
4607
4608
4609<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>
4610<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4611
4612Supports specifying enclosing namespaces or classes by prefixing the name
4613with '&lt;enclosing&gt;::'.
4614Does not match typedefs of an underlying type with the given name.
4615
4616Example matches X (Name == "X")
4617  class X;
4618
4619Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4620  namespace a { namespace b { class X; } }
4621</pre></td></tr>
4622
4623
4624<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>
4625<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4626a substring matched by the given RegExp.
4627
4628Supports specifying enclosing namespaces or classes by
4629prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4630of an underlying type with the given name.
4631
4632Example matches X (regexp == "::X")
4633  class X;
4634
4635Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4636  namespace foo { namespace bar { class X; } }
4637
4638If the matcher is used in clang-query, RegexFlags parameter
4639should be passed as a quoted string. e.g: "NoFlags".
4640Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4641</pre></td></tr>
4642
4643
4644<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>
4645<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4646
4647Given
4648  namespace n {
4649  namespace {} // #1
4650  }
4651namespaceDecl(isAnonymous()) will match #1 but not ::n.
4652</pre></td></tr>
4653
4654
4655<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>
4656<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4657the inline keyword.
4658
4659Given
4660  inline void f();
4661  void g();
4662  namespace n {
4663  inline namespace m {}
4664  }
4665functionDecl(isInline()) will match ::f().
4666namespaceDecl(isInline()) will match n::m.
4667</pre></td></tr>
4668
4669
4670<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>
4671<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4672specified.
4673
4674Given
4675
4676  #pragma omp parallel
4677  #pragma omp parallel default(none)
4678  #pragma omp parallel default(shared)
4679  #pragma omp parallel default(firstprivate)
4680
4681``ompDefaultClause(isFirstPrivateKind())`` matches only
4682``default(firstprivate)``.
4683</pre></td></tr>
4684
4685
4686<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>
4687<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4688
4689Given
4690
4691  #pragma omp parallel
4692  #pragma omp parallel default(none)
4693  #pragma omp parallel default(shared)
4694  #pragma omp parallel default(firstprivate)
4695
4696``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4697</pre></td></tr>
4698
4699
4700<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>
4701<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4702
4703Given
4704
4705  #pragma omp parallel
4706  #pragma omp parallel default(none)
4707  #pragma omp parallel default(shared)
4708  #pragma omp parallel default(firstprivate)
4709
4710``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4711</pre></td></tr>
4712
4713
4714<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>
4715<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4716clause kind.
4717
4718Given
4719
4720  #pragma omp parallel
4721  #pragma omp parallel for
4722  #pragma omp          for
4723
4724`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4725``omp parallel`` and ``omp parallel for``.
4726
4727If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4728should be passed as a quoted string. e.g.,
4729``isAllowedToContainClauseKind("OMPC_default").``
4730</pre></td></tr>
4731
4732
4733<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>
4734<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4735i.e., directives that can't have a structured block.
4736
4737Given
4738
4739  #pragma omp parallel
4740  {}
4741  #pragma omp taskyield
4742
4743``ompExecutableDirective(isStandaloneDirective()))`` matches
4744``omp taskyield``.
4745</pre></td></tr>
4746
4747
4748<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>
4749<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4750</pre></td></tr>
4751
4752
4753<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>
4754<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4755</pre></td></tr>
4756
4757
4758<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>
4759<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4760isSameOrDerivedFrom(hasName(...)).
4761</pre></td></tr>
4762
4763
4764<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>
4765<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4766a specific number of arguments (including absent default arguments).
4767
4768Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4769  void f(int x, int y);
4770  f(0, 0);
4771</pre></td></tr>
4772
4773
4774<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>
4775<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4776Selector.getAsString()
4777
4778 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4779 matches both of the expressions below:
4780    [myObj methodA:argA];
4781    [myObj methodB:argB];
4782</pre></td></tr>
4783
4784
4785<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>
4786<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4787
4788objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4789message expression in
4790
4791  UIWebView *webView = ...;
4792  CGRect bodyFrame = webView.frame;
4793  bodyFrame.size.height = self.bodyContentHeight;
4794  webView.frame = bodyFrame;
4795  //     ^---- matches here
4796</pre></td></tr>
4797
4798
4799<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>
4800<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4801
4802Matches only when the selector of the objCMessageExpr is NULL. This may
4803represent an error condition in the tree!
4804</pre></td></tr>
4805
4806
4807<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>
4808<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4809
4810 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4811 matches the outer message expr in the code below, but NOT the message
4812 invocation for self.bodyView.
4813    [self.bodyView loadHTMLString:html baseURL:NULL];
4814</pre></td></tr>
4815
4816
4817<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasUnarySelector0')"><a name="hasUnarySelector0Anchor">hasUnarySelector</a></td><td></td></tr>
4818<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4819
4820 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4821 matches self.bodyView in the code below, but NOT the outer message
4822 invocation of "loadHTMLString:baseURL:".
4823    [self.bodyView loadHTMLString:html baseURL:NULL];
4824</pre></td></tr>
4825
4826
4827<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>
4828<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4829
4830Example
4831matcher = objcMessageExpr(isClassMessage())
4832matches
4833  [NSString stringWithFormat:@"format"];
4834but not
4835  NSString *x = @"hello";
4836  [x containsString:@"h"];
4837</pre></td></tr>
4838
4839
4840<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>
4841<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4842
4843Example
4844matcher = objcMessageExpr(isInstanceMessage())
4845matches
4846  NSString *x = @"hello";
4847  [x containsString:@"h"];
4848but not
4849  [NSString stringWithFormat:@"format"];
4850</pre></td></tr>
4851
4852
4853<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>
4854<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4855a substring matched by the given RegExp.
4856 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4857 invocation for self.bodyView.
4858    [self.bodyView loadHTMLString:html baseURL:NULL];
4859
4860If the matcher is used in clang-query, RegexFlags parameter
4861should be passed as a quoted string. e.g: "NoFlags".
4862Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4863</pre></td></tr>
4864
4865
4866<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>
4867<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4868
4869 matcher = objCMessageExpr(numSelectorArgs(0));
4870 matches self.bodyView in the code below
4871
4872 matcher = objCMessageExpr(numSelectorArgs(2));
4873 matches the invocation of "loadHTMLString:baseURL:" but not that
4874 of self.bodyView
4875    [self.bodyView loadHTMLString:html baseURL:NULL];
4876</pre></td></tr>
4877
4878
4879<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>
4880<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4881
4882Example
4883matcher = objcMethodDecl(isClassMethod())
4884matches
4885@interface I + (void)foo; @end
4886but not
4887@interface I - (void)bar; @end
4888</pre></td></tr>
4889
4890
4891<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>
4892<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4893
4894Example matches A, va, fa
4895  class A {};
4896  class B;  // Doesn't match, as it has no body.
4897  int va;
4898  extern int vb;  // Doesn't match, as it doesn't define the variable.
4899  void fa() {}
4900  void fb();  // Doesn't match, as it has no body.
4901  @interface X
4902  - (void)ma; // Doesn't match, interface is declaration.
4903  @end
4904  @implementation X
4905  - (void)ma {}
4906  @end
4907
4908Usable 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;,
4909  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4910</pre></td></tr>
4911
4912
4913<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>
4914<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4915
4916Example
4917matcher = objcMethodDecl(isInstanceMethod())
4918matches
4919@interface I - (void)bar; @end
4920but not
4921@interface I + (void)foo; @end
4922</pre></td></tr>
4923
4924
4925<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>
4926<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4927
4928Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4929void x(int val) {}
4930void y(int val = 0) {}
4931
4932Deprecated. Use hasInitializer() instead to be able to
4933match on the contents of the default argument.  For example:
4934
4935void x(int val = 7) {}
4936void y(int val = 42) {}
4937parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4938  matches the parameter of y
4939
4940A matcher such as
4941  parmVarDecl(hasInitializer(anything()))
4942is equivalent to parmVarDecl(hasDefaultArgument()).
4943</pre></td></tr>
4944
4945
4946<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>
4947<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4948list. The parameter list could be that of either a block, function, or
4949objc-method.
4950
4951
4952Given
4953
4954void f(int a, int b, int c) {
4955}
4956
4957``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4958
4959``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4960</pre></td></tr>
4961
4962
4963<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>
4964<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4965
4966Given
4967  class Y { public: void x(); };
4968  void z() { Y* y; y-&gt;x(); }
4969cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4970  matches y-&gt;x()
4971</pre></td></tr>
4972
4973
4974<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>
4975<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4976
4977Matches a node if it equals the node previously bound to ID.
4978
4979Given
4980  class X { int a; int b; };
4981cxxRecordDecl(
4982    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4983    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4984  matches the class X, as a and b have the same type.
4985
4986Note that when multiple matches are involved via forEach* matchers,
4987equalsBoundNodes acts as a filter.
4988For example:
4989compoundStmt(
4990    forEachDescendant(varDecl().bind("d")),
4991    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4992will trigger a match for each combination of variable declaration
4993and reference to that variable declaration within a compound statement.
4994</pre></td></tr>
4995
4996
4997<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>
4998<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4999the node, not hidden within a typedef.
5000
5001Given
5002  typedef const int const_int;
5003  const_int i;
5004  int *const j;
5005  int *volatile k;
5006  int m;
5007varDecl(hasType(hasLocalQualifiers())) matches only j and k.
5008i is const-qualified but the qualifier is not local.
5009</pre></td></tr>
5010
5011
5012<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>
5013<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
5014
5015Given
5016  void a(char);
5017  void b(wchar_t);
5018  void c(double);
5019functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
5020matches "a(char)", "b(wchar_t)", but not "c(double)".
5021</pre></td></tr>
5022
5023
5024<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>
5025<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
5026the Objective-C object pointer type, which is different despite being
5027syntactically similar.
5028
5029Given
5030  int *i = nullptr;
5031
5032  @interface Foo
5033  @end
5034  Foo *f;
5035
5036  int j;
5037varDecl(hasType(isAnyPointer()))
5038  matches "int *i" and "Foo *f", but not "int j".
5039</pre></td></tr>
5040
5041
5042<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>
5043<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
5044include "top-level" const.
5045
5046Given
5047  void a(int);
5048  void b(int const);
5049  void c(const int);
5050  void d(const int*);
5051  void e(int const) {};
5052functionDecl(hasAnyParameter(hasType(isConstQualified())))
5053  matches "void b(int const)", "void c(const int)" and
5054  "void e(int const) {}". It does not match d as there
5055  is no top-level const on the parameter type "const int *".
5056</pre></td></tr>
5057
5058
5059<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>
5060<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
5061
5062Given
5063  void a(int);
5064  void b(long);
5065  void c(double);
5066functionDecl(hasAnyParameter(hasType(isInteger())))
5067matches "a(int)", "b(long)", but not "c(double)".
5068</pre></td></tr>
5069
5070
5071<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
5072<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
5073
5074Given
5075  void a(int);
5076  void b(unsigned long);
5077  void c(double);
5078functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5079matches "a(int)", but not "b(unsigned long)" and "c(double)".
5080</pre></td></tr>
5081
5082
5083<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>
5084<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
5085
5086Given
5087  void a(int);
5088  void b(unsigned long);
5089  void c(double);
5090functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5091matches "b(unsigned long)", but not "a(int)" and "c(double)".
5092</pre></td></tr>
5093
5094
5095<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>
5096<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5097include "top-level" volatile.
5098
5099Given
5100  void a(int);
5101  void b(int volatile);
5102  void c(volatile int);
5103  void d(volatile int*);
5104  void e(int volatile) {};
5105functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5106  matches "void b(int volatile)", "void c(volatile int)" and
5107  "void e(int volatile) {}". It does not match d as there
5108  is no top-level volatile on the parameter type "volatile int *".
5109</pre></td></tr>
5110
5111
5112<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>
5113<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
5114
5115Matches a node if it equals the node previously bound to ID.
5116
5117Given
5118  class X { int a; int b; };
5119cxxRecordDecl(
5120    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5121    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5122  matches the class X, as a and b have the same type.
5123
5124Note that when multiple matches are involved via forEach* matchers,
5125equalsBoundNodes acts as a filter.
5126For example:
5127compoundStmt(
5128    forEachDescendant(varDecl().bind("d")),
5129    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5130will trigger a match for each combination of variable declaration
5131and reference to that variable declaration within a compound statement.
5132</pre></td></tr>
5133
5134
5135<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>
5136<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5137
5138Stmt has pointer identity in the AST.
5139</pre></td></tr>
5140
5141
5142<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>
5143<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5144Does not match if only part of the statement is expanded from that macro or
5145if different parts of the statement are expanded from different
5146appearances of the macro.
5147</pre></td></tr>
5148
5149
5150<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>
5151<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5152partially matching a given regex.
5153
5154Example matches Y but not X
5155    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5156  #include "ASTMatcher.h"
5157  class X {};
5158ASTMatcher.h:
5159  class Y {};
5160
5161Usable 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;
5162
5163If the matcher is used in clang-query, RegexFlags parameter
5164should be passed as a quoted string. e.g: "NoFlags".
5165Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5166</pre></td></tr>
5167
5168
5169<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>
5170<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5171
5172Example matches X but not Y
5173  (matcher = cxxRecordDecl(isExpansionInMainFile())
5174  #include &lt;Y.h&gt;
5175  class X {};
5176Y.h:
5177  class Y {};
5178
5179Usable 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;
5180</pre></td></tr>
5181
5182
5183<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>
5184<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5185
5186Example matches Y but not X
5187    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5188  #include &lt;SystemHeader.h&gt;
5189  class X {};
5190SystemHeader.h:
5191  class Y {};
5192
5193Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5194</pre></td></tr>
5195
5196
5197<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>
5198<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5199
5200Given
5201  int j;
5202  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5203  A(0);
5204  A(0U);
5205declStmt(isInTemplateInstantiation())
5206  matches 'int i;' and 'unsigned i'.
5207unless(stmt(isInTemplateInstantiation()))
5208  will NOT match j += 42; as it's shared between the template definition and
5209  instantiation.
5210</pre></td></tr>
5211
5212
5213<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>
5214<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5215
5216Given
5217  int a[42];
5218  int b[2 * 21];
5219  int c[41], d[43];
5220  char *s = "abcd";
5221  wchar_t *ws = L"abcd";
5222  char *w = "a";
5223constantArrayType(hasSize(42))
5224  matches "int a[42]" and "int b[2 * 21]"
5225stringLiteral(hasSize(4))
5226  matches "abcd", L"abcd"
5227</pre></td></tr>
5228
5229
5230<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>
5231<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5232
5233Example matches C, but not S, U or E.
5234  struct S {};
5235  class C {};
5236  union U {};
5237  enum E {};
5238</pre></td></tr>
5239
5240
5241<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>
5242<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5243
5244Example matches A, va, fa
5245  class A {};
5246  class B;  // Doesn't match, as it has no body.
5247  int va;
5248  extern int vb;  // Doesn't match, as it doesn't define the variable.
5249  void fa() {}
5250  void fb();  // Doesn't match, as it has no body.
5251  @interface X
5252  - (void)ma; // Doesn't match, interface is declaration.
5253  @end
5254  @implementation X
5255  - (void)ma {}
5256  @end
5257
5258Usable 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;,
5259  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5260</pre></td></tr>
5261
5262
5263<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>
5264<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5265
5266Example matches E, but not C, S or U.
5267  struct S {};
5268  class C {};
5269  union U {};
5270  enum E {};
5271</pre></td></tr>
5272
5273
5274<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>
5275<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5276
5277Example matches S, but not C, U or E.
5278  struct S {};
5279  class C {};
5280  union U {};
5281  enum E {};
5282</pre></td></tr>
5283
5284
5285<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>
5286<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5287
5288Example matches U, but not C, S or E.
5289  struct S {};
5290  class C {};
5291  union U {};
5292  enum E {};
5293</pre></td></tr>
5294
5295
5296<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>
5297<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5298
5299Note that 'Value' is a string as the template argument's value is
5300an arbitrary precision integer. 'Value' must be euqal to the canonical
5301representation of that integral value in base 10.
5302
5303Given
5304  template&lt;int T&gt; struct C {};
5305  C&lt;42&gt; c;
5306classTemplateSpecializationDecl(
5307  hasAnyTemplateArgument(equalsIntegralValue("42")))
5308  matches the implicit instantiation of C in C&lt;42&gt;.
5309</pre></td></tr>
5310
5311
5312<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>
5313<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5314
5315Given
5316  template&lt;int T&gt; struct C {};
5317  C&lt;42&gt; c;
5318classTemplateSpecializationDecl(
5319  hasAnyTemplateArgument(isIntegral()))
5320  matches the implicit instantiation of C in C&lt;42&gt;
5321  with isIntegral() matching 42.
5322</pre></td></tr>
5323
5324
5325<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>
5326<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5327
5328Given
5329  template&lt;typename T&gt; struct C {};
5330  C&lt;int&gt; c;
5331classTemplateSpecializationDecl(templateArgumentCountIs(1))
5332  matches C&lt;int&gt;.
5333</pre></td></tr>
5334
5335
5336<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>
5337<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5338Does not match if only part of the statement is expanded from that macro or
5339if different parts of the statement are expanded from different
5340appearances of the macro.
5341</pre></td></tr>
5342
5343
5344<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>
5345<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5346partially matching a given regex.
5347
5348Example matches Y but not X
5349    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5350  #include "ASTMatcher.h"
5351  class X {};
5352ASTMatcher.h:
5353  class Y {};
5354
5355Usable 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;
5356
5357If the matcher is used in clang-query, RegexFlags parameter
5358should be passed as a quoted string. e.g: "NoFlags".
5359Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5360</pre></td></tr>
5361
5362
5363<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>
5364<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5365
5366Example matches X but not Y
5367  (matcher = cxxRecordDecl(isExpansionInMainFile())
5368  #include &lt;Y.h&gt;
5369  class X {};
5370Y.h:
5371  class Y {};
5372
5373Usable 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;
5374</pre></td></tr>
5375
5376
5377<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>
5378<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5379
5380Example matches Y but not X
5381    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5382  #include &lt;SystemHeader.h&gt;
5383  class X {};
5384SystemHeader.h:
5385  class Y {};
5386
5387Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
5388</pre></td></tr>
5389
5390
5391<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>
5392<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5393
5394Given
5395 struct S { bool func(); };
5396functionDecl(returns(booleanType()))
5397  matches "bool func();"
5398</pre></td></tr>
5399
5400
5401<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>
5402<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5403
5404Matches a node if it equals the node previously bound to ID.
5405
5406Given
5407  class X { int a; int b; };
5408cxxRecordDecl(
5409    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5410    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5411  matches the class X, as a and b have the same type.
5412
5413Note that when multiple matches are involved via forEach* matchers,
5414equalsBoundNodes acts as a filter.
5415For example:
5416compoundStmt(
5417    forEachDescendant(varDecl().bind("d")),
5418    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5419will trigger a match for each combination of variable declaration
5420and reference to that variable declaration within a compound statement.
5421</pre></td></tr>
5422
5423
5424<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>
5425<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5426
5427Type has pointer identity in the AST.
5428</pre></td></tr>
5429
5430
5431<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>
5432<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5433
5434Given
5435  int i;
5436  float f;
5437realFloatingPointType()
5438  matches "float f" but not "int i"
5439</pre></td></tr>
5440
5441
5442<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>
5443<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5444
5445Given
5446 struct S { void func(); };
5447functionDecl(returns(voidType()))
5448  matches "void func();"
5449</pre></td></tr>
5450
5451
5452<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>
5453<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5454
5455Given
5456  int x;
5457  int s = sizeof(x) + alignof(x)
5458unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5459  matches sizeof(x)
5460
5461If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5462should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5463</pre></td></tr>
5464
5465
5466<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>
5467<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5468specified names.
5469
5470   hasAnyOperatorName("+", "-")
5471 Is equivalent to
5472   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5473</pre></td></tr>
5474
5475
5476<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>
5477<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5478unary).
5479
5480Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5481  !(a || b)
5482</pre></td></tr>
5483
5484
5485<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>
5486<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5487to '.'.
5488
5489Member calls on the implicit this pointer match as called with '-&gt;'.
5490
5491Given
5492  class Y {
5493    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5494    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5495    int a;
5496    static int b;
5497  };
5498  template &lt;class T&gt;
5499  class Z {
5500    void x() { this-&gt;m; }
5501  };
5502memberExpr(isArrow())
5503  matches this-&gt;x, x, y.x, a, this-&gt;b
5504cxxDependentScopeMemberExpr(isArrow())
5505  matches this-&gt;m
5506unresolvedMemberExpr(isArrow())
5507  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5508</pre></td></tr>
5509
5510
5511<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>
5512<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5513
5514Example matches x, but not y, z, or a.
5515(matcher = varDecl(hasAutomaticStorageDuration())
5516void f() {
5517  int x;
5518  static int y;
5519  thread_local int z;
5520}
5521int a;
5522</pre></td></tr>
5523
5524
5525<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>
5526<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5527
5528Example matches y and z (matcher = varDecl(hasGlobalStorage())
5529void f() {
5530  int x;
5531  static int y;
5532}
5533int z;
5534</pre></td></tr>
5535
5536
5537<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>
5538<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5539non-static local variable.
5540
5541Example matches x (matcher = varDecl(hasLocalStorage())
5542void f() {
5543  int x;
5544  static int y;
5545}
5546int z;
5547</pre></td></tr>
5548
5549
5550<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>
5551<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5552It includes the variable declared at namespace scope and those declared
5553with "static" and "extern" storage class specifiers.
5554
5555void f() {
5556  int x;
5557  static int y;
5558  thread_local int z;
5559}
5560int a;
5561static int b;
5562extern int c;
5563varDecl(hasStaticStorageDuration())
5564  matches the function declaration y, a, b and c.
5565</pre></td></tr>
5566
5567
5568<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>
5569<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5570
5571Example matches z, but not x, z, or a.
5572(matcher = varDecl(hasThreadStorageDuration())
5573void f() {
5574  int x;
5575  static int y;
5576  thread_local int z;
5577}
5578int a;
5579</pre></td></tr>
5580
5581
5582<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr0')"><a name="isConstexpr0Anchor">isConstexpr</a></td><td></td></tr>
5583<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5584       and if constexpr.
5585
5586Given:
5587  constexpr int foo = 42;
5588  constexpr int bar();
5589  void baz() { if constexpr(1 &gt; 0) {} }
5590varDecl(isConstexpr())
5591  matches the declaration of foo.
5592functionDecl(isConstexpr())
5593  matches the declaration of bar.
5594ifStmt(isConstexpr())
5595  matches the if statement in baz.
5596</pre></td></tr>
5597
5598
5599<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>
5600<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5601
5602Example matches A, va, fa
5603  class A {};
5604  class B;  // Doesn't match, as it has no body.
5605  int va;
5606  extern int vb;  // Doesn't match, as it doesn't define the variable.
5607  void fa() {}
5608  void fb();  // Doesn't match, as it has no body.
5609  @interface X
5610  - (void)ma; // Doesn't match, interface is declaration.
5611  @end
5612  @implementation X
5613  - (void)ma {}
5614  @end
5615
5616Usable 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;,
5617  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5618</pre></td></tr>
5619
5620
5621<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>
5622<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5623a C++ catch block, or an Objective-C statement.
5624
5625Example matches x (matcher = varDecl(isExceptionVariable())
5626void f(int y) {
5627  try {
5628  } catch (int x) {
5629  }
5630}
5631</pre></td></tr>
5632
5633
5634<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>
5635<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5636static member variable template instantiations.
5637
5638Given
5639  template&lt;typename T&gt; void A(T t) { }
5640  template&lt;&gt; void A(int N) { }
5641functionDecl(isExplicitTemplateSpecialization())
5642  matches the specialization A&lt;int&gt;().
5643
5644Usable 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;
5645</pre></td></tr>
5646
5647
5648<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>
5649<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5650
5651Given:
5652  extern "C" void f() {}
5653  extern "C" { void g() {} }
5654  void h() {}
5655  extern "C" int x = 1;
5656  extern "C" int y = 2;
5657  int z = 3;
5658functionDecl(isExternC())
5659  matches the declaration of f and g, but not the declaration of h.
5660varDecl(isExternC())
5661  matches the declaration of x and y, but not the declaration of z.
5662</pre></td></tr>
5663
5664
5665<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isInitCapture0')"><a name="isInitCapture0Anchor">isInitCapture</a></td><td></td></tr>
5666<tr><td colspan="4" class="doc" id="isInitCapture0"><pre>Matches a variable serving as the implicit variable for a lambda init-
5667capture.
5668
5669Example matches x (matcher = varDecl(isInitCapture()))
5670auto f = [x=3]() { return x; };
5671</pre></td></tr>
5672
5673
5674<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>
5675<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5676
5677Example matches y (matcher = varDecl(isStaticLocal()))
5678void f() {
5679  int x;
5680  static int y;
5681}
5682static int z;
5683</pre></td></tr>
5684
5685
5686<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>
5687<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5688class specifier ("static" keyword) written in the source.
5689
5690Given:
5691  static void f() {}
5692  static int i = 0;
5693  extern int j;
5694  int k;
5695functionDecl(isStaticStorageClass())
5696  matches the function declaration f.
5697varDecl(isStaticStorageClass())
5698  matches the variable declaration i.
5699</pre></td></tr>
5700
5701
5702<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>
5703<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5704member variable template instantiations.
5705
5706Given
5707  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5708or
5709  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5710or
5711  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5712cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5713  matches the template instantiation of X&lt;A&gt;.
5714
5715But given
5716  template &lt;typename T&gt;  class X {}; class A {};
5717  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5718cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5719  does not match, as X&lt;A&gt; is an explicit template specialization.
5720
5721Usable 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;
5722</pre></td></tr>
5723
5724<!--END_NARROWING_MATCHERS -->
5725</table>
5726
5727<!-- ======================================================================= -->
5728<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5729<!-- ======================================================================= -->
5730
5731<p>Traversal matchers specify the relationship to other nodes that are
5732reachable from the current node.</p>
5733
5734<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5735forEachDescendant) which work on all nodes and allow users to write more generic
5736match expressions.</p>
5737
5738<table>
5739<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5740<!-- START_TRAVERSAL_MATCHERS -->
5741
5742<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>
5743<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5744
5745The code
5746  var1 != var2;
5747might be represented in the clang AST as a binaryOperator, a
5748cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5749
5750* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5751  least one is a class type (cxxOperatorCallExpr)
5752* whether the code appears in a template declaration, if at least one of the
5753  vars is a dependent-type (binaryOperator)
5754* whether the code relies on a rewritten binary operator, such as a
5755spaceship operator or an inverted equality operator
5756(cxxRewrittenBinaryOperator)
5757
5758This matcher elides details in places where the matchers for the nodes are
5759compatible.
5760
5761Given
5762  binaryOperation(
5763    hasOperatorName("!="),
5764    hasLHS(expr().bind("lhs")),
5765    hasRHS(expr().bind("rhs"))
5766  )
5767matches each use of "!=" in:
5768  struct S{
5769      bool operator!=(const S&amp;) const;
5770  };
5771
5772  void foo()
5773  {
5774     1 != 2;
5775     S() != S();
5776  }
5777
5778  template&lt;typename T&gt;
5779  void templ()
5780  {
5781     1 != 2;
5782     T() != S();
5783  }
5784  struct HasOpEq
5785  {
5786      bool operator==(const HasOpEq &amp;) const;
5787  };
5788
5789  void inverse()
5790  {
5791      HasOpEq s1;
5792      HasOpEq s2;
5793      if (s1 != s2)
5794          return;
5795  }
5796
5797  struct HasSpaceship
5798  {
5799      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5800  };
5801
5802  void use_spaceship()
5803  {
5804      HasSpaceship s1;
5805      HasSpaceship s2;
5806      if (s1 != s2)
5807          return;
5808  }
5809</pre></td></tr>
5810
5811
5812<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>
5813<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5814
5815Unlike anyOf, eachOf will generate a match result for each
5816matching submatcher.
5817
5818For example, in:
5819  class A { int a; int b; };
5820The matcher:
5821  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5822                       has(fieldDecl(hasName("b")).bind("v"))))
5823will generate two results binding "v", the first of which binds
5824the field declaration of a, the second the field declaration of
5825b.
5826
5827Usable as: Any Matcher
5828</pre></td></tr>
5829
5830
5831<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>
5832<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5833
5834Generates results for each match.
5835
5836For example, in:
5837  class A { class B {}; class C {}; };
5838The matcher:
5839  cxxRecordDecl(hasName("::A"),
5840                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5841will generate results for A, B and C.
5842
5843Usable as: Any Matcher
5844</pre></td></tr>
5845
5846
5847<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5848<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5849provided matcher.
5850
5851Example matches X, A, A::X, B, B::C, B::C::X
5852  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5853  class X {};
5854  class A { class X {}; };  // Matches A, because A::X is a class of name
5855                            // X inside A.
5856  class B { class C { class X {}; }; };
5857
5858DescendantT must be an AST base type.
5859
5860As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5861each result that matches instead of only on the first one.
5862
5863Note: Recursively combined ForEachDescendant can cause many matches:
5864  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5865    forEachDescendant(cxxRecordDecl())
5866  )))
5867will match 10 times (plus injected class name matches) on:
5868  class A { class B { class C { class D { class E {}; }; }; }; };
5869
5870Usable as: Any Matcher
5871</pre></td></tr>
5872
5873
5874<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5875<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5876provided matcher.
5877
5878Example matches X, Y, Y::X, Z::Y, Z::Y::X
5879  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5880  class X {};
5881  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5882                            // inside Y.
5883  class Z { class Y { class X {}; }; };  // Does not match Z.
5884
5885ChildT must be an AST base type.
5886
5887As opposed to 'has', 'forEach' will cause a match for each result that
5888matches instead of only on the first one.
5889
5890Usable as: Any Matcher
5891</pre></td></tr>
5892
5893
5894<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5895<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5896matcher.
5897
5898Given
5899void f() { if (true) { int x = 42; } }
5900void g() { for (;;) { int x = 43; } }
5901expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5902
5903Usable as: Any Matcher
5904</pre></td></tr>
5905
5906
5907<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5908<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5909provided matcher.
5910
5911Example matches X, Y, Z
5912    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5913  class X {};  // Matches X, because X::X is a class of name X inside X.
5914  class Y { class X {}; };
5915  class Z { class Y { class X {}; }; };
5916
5917DescendantT must be an AST base type.
5918
5919Usable as: Any Matcher
5920</pre></td></tr>
5921
5922
5923<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5924<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5925provided matcher.
5926
5927Example matches X, Y
5928  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5929  class X {};  // Matches X, because X::X is a class of name X inside X.
5930  class Y { class X {}; };
5931  class Z { class Y { class X {}; }; };  // Does not match Z.
5932
5933ChildT must be an AST base type.
5934
5935Usable as: Any Matcher
5936Note that has is direct matcher, so it also matches things like implicit
5937casts and paren casts. If you are matching with expr then you should
5938probably consider using ignoringParenImpCasts like:
5939has(ignoringParenImpCasts(expr())).
5940</pre></td></tr>
5941
5942
5943<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5944<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5945matcher.
5946
5947Given
5948void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5949compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5950
5951Usable as: Any Matcher
5952</pre></td></tr>
5953
5954
5955<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>
5956<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5957
5958Because CallExpr and CXXConstructExpr do not share a common
5959base class with API accessing arguments etc, AST Matchers for code
5960which should match both are typically duplicated. This matcher
5961removes the need for duplication.
5962
5963Given code
5964struct ConstructorTakesInt
5965{
5966  ConstructorTakesInt(int i) {}
5967};
5968
5969void callTakesInt(int i)
5970{
5971}
5972
5973void doCall()
5974{
5975  callTakesInt(42);
5976}
5977
5978void doConstruct()
5979{
5980  ConstructorTakesInt cti(42);
5981}
5982
5983The matcher
5984invocation(hasArgument(0, integerLiteral(equals(42))))
5985matches the expression in both doCall and doConstruct
5986</pre></td></tr>
5987
5988
5989<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
5990<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5991
5992However, optionally will retain any bindings generated by the submatcher.
5993Useful when additional information which may or may not present about a main
5994matching node is desired.
5995
5996For example, in:
5997  class Foo {
5998    int bar;
5999  }
6000The matcher:
6001  cxxRecordDecl(
6002    optionally(has(
6003      fieldDecl(hasName("bar")).bind("var")
6004  ))).bind("record")
6005will produce a result binding for both "record" and "var".
6006The matcher will produce a "record" binding for even if there is no data
6007member named "bar" in that class.
6008
6009Usable as: Any Matcher
6010</pre></td></tr>
6011
6012
6013<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>
6014<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
6015
6016Given
6017  void foo()
6018  {
6019      int i = 3.0;
6020  }
6021The matcher
6022  traverse(TK_IgnoreUnlessSpelledInSource,
6023    varDecl(hasInitializer(floatLiteral().bind("init")))
6024  )
6025matches the variable declaration with "init" bound to the "3.0".
6026</pre></td></tr>
6027
6028
6029<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>
6030<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
6031switch statement or conditional operator.
6032
6033Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6034  if (true) {}
6035</pre></td></tr>
6036
6037
6038<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>
6039<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
6040(binary or ternary).
6041
6042Example matches b
6043  condition ? a : b
6044  condition ?: b
6045</pre></td></tr>
6046
6047
6048<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>
6049<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
6050
6051Example 1 (conditional ternary operator): matches a
6052  condition ? a : b
6053
6054Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6055  condition ?: b
6056</pre></td></tr>
6057
6058
6059<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>
6060<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
6061matches the given matcher.
6062
6063The associated declaration is:
6064- for type nodes, the declaration of the underlying type
6065- for CallExpr, the declaration of the callee
6066- for MemberExpr, the declaration of the referenced member
6067- for CXXConstructExpr, the declaration of the constructor
6068- for CXXNewExpr, the declaration of the operator new
6069- for ObjCIvarExpr, the declaration of the ivar
6070
6071For type nodes, hasDeclaration will generally match the declaration of the
6072sugared type. Given
6073  class X {};
6074  typedef X Y;
6075  Y y;
6076in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6077typedefDecl. A common use case is to match the underlying, desugared type.
6078This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6079  varDecl(hasType(hasUnqualifiedDesugaredType(
6080      recordType(hasDeclaration(decl())))))
6081In this matcher, the decl will match the CXXRecordDecl of class X.
6082
6083Usable 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;,
6084  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;,
6085  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;,
6086  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;,
6087  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;,
6088  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;,
6089  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6090</pre></td></tr>
6091
6092
6093<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>
6094<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
6095
6096Given
6097  int i[5];
6098  void f() { i[1] = 42; }
6099arraySubscriptExpression(hasBase(implicitCastExpr(
6100    hasSourceExpression(declRefExpr()))))
6101  matches i[1] with the declRefExpr() matching i
6102</pre></td></tr>
6103
6104
6105<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>
6106<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
6107
6108Given
6109  int i[5];
6110  void f() { i[1] = 42; }
6111arraySubscriptExpression(hasIndex(integerLiteral()))
6112  matches i[1] with the integerLiteral() matching 1
6113</pre></td></tr>
6114
6115
6116<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>
6117<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
6118
6119Example matches a (matcher = binaryOperator(hasLHS()))
6120  a || b
6121</pre></td></tr>
6122
6123
6124<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>
6125<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
6126
6127Example matches b (matcher = binaryOperator(hasRHS()))
6128  a || b
6129</pre></td></tr>
6130
6131
6132<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>
6133<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
6134type.
6135
6136Given
6137  struct A {};
6138  A a[7];
6139  int b[7];
6140arrayType(hasElementType(builtinType()))
6141  matches "int b[7]"
6142
6143Usable 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;
6144</pre></td></tr>
6145
6146
6147<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>
6148<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6149
6150Given
6151  _Atomic(int) i;
6152  _Atomic(float) f;
6153atomicType(hasValueType(isInteger()))
6154 matches "_Atomic(int) i"
6155
6156Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6157</pre></td></tr>
6158
6159
6160<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>
6161<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6162
6163Note: There is no TypeLoc for the deduced type and thus no
6164getDeducedLoc() matcher.
6165
6166Given
6167  auto a = 1;
6168  auto b = 2.0;
6169autoType(hasDeducedType(isInteger()))
6170  matches "auto a"
6171
6172Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6173</pre></td></tr>
6174
6175
6176<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>
6177<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6178
6179Given
6180  namespace X { void b(); }
6181  using X::b;
6182usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6183  matches using X::b </pre></td></tr>
6184
6185
6186<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>
6187<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6188binary operator matches.
6189</pre></td></tr>
6190
6191
6192<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>
6193<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6194
6195Example matches a (matcher = binaryOperator(hasLHS()))
6196  a || b
6197</pre></td></tr>
6198
6199
6200<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>
6201<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6202
6203Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6204                                             integerLiteral(equals(2)))
6205  1 + 2 // Match
6206  2 + 1 // Match
6207  1 + 1 // No match
6208  2 + 2 // No match
6209</pre></td></tr>
6210
6211
6212<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>
6213<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6214
6215Example matches b (matcher = binaryOperator(hasRHS()))
6216  a || b
6217</pre></td></tr>
6218
6219
6220<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>
6221<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6222
6223For example, in:
6224void foo()
6225{
6226    int arr[3];
6227    auto &amp;[f, s, t] = arr;
6228
6229    f = 42;
6230}
6231The matcher:
6232  bindingDecl(hasName("f"),
6233                forDecomposition(decompositionDecl())
6234matches 'f' in 'auto &amp;[f, s, t]'.
6235</pre></td></tr>
6236
6237
6238<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>
6239<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6240block.
6241
6242Does not match the 'this' parameter of a method.
6243
6244Given
6245  class X { void f(int x, int y, int z) {} };
6246cxxMethodDecl(hasAnyParameter(hasName("y")))
6247  matches f(int x, int y, int z) {}
6248with hasAnyParameter(...)
6249  matching int y
6250
6251For ObjectiveC, given
6252  @interface I - (void) f:(int) y; @end
6253
6254the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6255matches the declaration of method f with hasParameter
6256matching y.
6257
6258For blocks, given
6259  b = ^(int y) { printf("%d", y) };
6260
6261the matcher blockDecl(hasAnyParameter(hasName("y")))
6262matches the declaration of the block b with hasParameter
6263matching y.
6264</pre></td></tr>
6265
6266
6267<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;</td><td class="name" onclick="toggle('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>
6268<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6269declaration or a block.
6270
6271Given
6272  class X { void f(int x) {} };
6273cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6274  matches f(int x) {}
6275with hasParameter(...)
6276  matching int x
6277
6278For ObjectiveC, given
6279  @interface I - (void) f:(int) y; @end
6280
6281the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6282matches the declaration of method f with hasParameter
6283matching y.
6284</pre></td></tr>
6285
6286
6287<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>
6288<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6289
6290Examples:
6291  int x;
6292declaratorDecl(hasTypeLoc(loc(asString("int"))))
6293  matches int x
6294
6295auto x = int(3);
6296cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6297  matches int(3)
6298
6299struct Foo { Foo(int, int); };
6300auto x = Foo(1, 2);
6301cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6302  matches Foo(1, 2)
6303
6304Usable 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;,
6305  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;,
6306  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;,
6307  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6308  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;,
6309  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;,
6310  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;,
6311  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6312</pre></td></tr>
6313
6314
6315<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>
6316<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6317pointee matches a given matcher.
6318
6319Given
6320  int *a;
6321  int const *b;
6322  float const *f;
6323pointerType(pointee(isConstQualified(), isInteger()))
6324  matches "int const *b"
6325
6326Usable 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;,
6327  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;
6328</pre></td></tr>
6329
6330
6331<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>
6332<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6333
6334Examples:
6335  int x;
6336declaratorDecl(hasTypeLoc(loc(asString("int"))))
6337  matches int x
6338
6339auto x = int(3);
6340cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6341  matches int(3)
6342
6343struct Foo { Foo(int, int); };
6344auto x = Foo(1, 2);
6345cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6346  matches Foo(1, 2)
6347
6348Usable 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;,
6349  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;,
6350  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;,
6351  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6352  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;,
6353  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;,
6354  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;,
6355  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6356</pre></td></tr>
6357
6358
6359<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>
6360<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6361declaration's type.
6362
6363In case of a value declaration (for example a variable declaration),
6364this resolves one layer of indirection. For example, in the value
6365declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6366X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6367declaration of x.
6368
6369Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6370            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6371            and friend class X (matcher = friendDecl(hasType("X"))
6372            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6373                                              cxxRecordDecl(hasName("X"))))
6374 class X {};
6375 void y(X &amp;x) { x; X z; }
6376 class Y { friend class X; };
6377 class Z : public virtual X {};
6378
6379Example matches class Derived
6380(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6381class Base {};
6382class Derived : Base {};
6383
6384Usable 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;,
6385Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6386</pre></td></tr>
6387
6388
6389<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>
6390<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6391matcher.
6392
6393Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6394            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6395            and U (matcher = typedefDecl(hasType(asString("int")))
6396            and friend class X (matcher = friendDecl(hasType("X"))
6397            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6398                                              asString("class X")))
6399 class X {};
6400 void y(X &amp;x) { x; X z; }
6401 typedef int U;
6402 class Y { friend class X; };
6403 class Z : public virtual X {};
6404</pre></td></tr>
6405
6406
6407<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>
6408<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6409
6410Given
6411  void f(int i);
6412  int y;
6413  f(y);
6414callExpr(
6415  forEachArgumentWithParam(
6416    declRefExpr(to(varDecl(hasName("y")))),
6417    parmVarDecl(hasType(isInteger()))
6418))
6419  matches f(y);
6420with declRefExpr(...)
6421  matching int y
6422and parmVarDecl(...)
6423  matching int i
6424</pre></td></tr>
6425
6426
6427<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>
6428<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6429CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6430it works on calls through function pointers as well.
6431
6432The difference is, that function pointers do not provide access to a
6433ParmVarDecl, but only the QualType for each argument.
6434
6435Given
6436  void f(int i);
6437  int y;
6438  f(y);
6439  void (*f_ptr)(int) = f;
6440  f_ptr(y);
6441callExpr(
6442  forEachArgumentWithParamType(
6443    declRefExpr(to(varDecl(hasName("y")))),
6444    qualType(isInteger()).bind("type)
6445))
6446  matches f(y) and f_ptr(y)
6447with declRefExpr(...)
6448  matching int y
6449and qualType(...)
6450  matching int
6451</pre></td></tr>
6452
6453
6454<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>
6455<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6456expression, or an ObjC-message-send expression.
6457
6458Given
6459  void x(int, int, int) { int y; x(1, y, 42); }
6460callExpr(hasAnyArgument(declRefExpr()))
6461  matches x(1, y, 42)
6462with hasAnyArgument(...)
6463  matching y
6464
6465For ObjectiveC, given
6466  @interface I - (void) f:(int) y; @end
6467  void foo(I *i) { [i f:12]; }
6468objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6469  matches [i f:12]
6470</pre></td></tr>
6471
6472
6473<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>
6474<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6475call expression.
6476
6477Example matches y in x(y)
6478    (matcher = callExpr(hasArgument(0, declRefExpr())))
6479  void x(int) { int y; x(y); }
6480</pre></td></tr>
6481
6482
6483<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('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>
6484<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6485matches the given matcher.
6486
6487The associated declaration is:
6488- for type nodes, the declaration of the underlying type
6489- for CallExpr, the declaration of the callee
6490- for MemberExpr, the declaration of the referenced member
6491- for CXXConstructExpr, the declaration of the constructor
6492- for CXXNewExpr, the declaration of the operator new
6493- for ObjCIvarExpr, the declaration of the ivar
6494
6495For type nodes, hasDeclaration will generally match the declaration of the
6496sugared type. Given
6497  class X {};
6498  typedef X Y;
6499  Y y;
6500in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6501typedefDecl. A common use case is to match the underlying, desugared type.
6502This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6503  varDecl(hasType(hasUnqualifiedDesugaredType(
6504      recordType(hasDeclaration(decl())))))
6505In this matcher, the decl will match the CXXRecordDecl of class X.
6506
6507Usable 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;,
6508  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;,
6509  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;,
6510  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;,
6511  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;,
6512  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;,
6513  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6514</pre></td></tr>
6515
6516
6517<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>
6518<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6519
6520Given
6521  class A { A() : i(42), j(42) {} int i; int j; };
6522cxxConstructorDecl(forEachConstructorInitializer(
6523  forField(decl().bind("x"))
6524))
6525  will trigger two matches, binding for 'i' and 'j' respectively.
6526</pre></td></tr>
6527
6528
6529<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>
6530<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6531
6532Given
6533  struct Foo {
6534    Foo() : foo_(1) { }
6535    int foo_;
6536  };
6537cxxRecordDecl(has(cxxConstructorDecl(
6538  hasAnyConstructorInitializer(anything())
6539)))
6540  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6541</pre></td></tr>
6542
6543
6544<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>
6545<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6546
6547Given
6548  struct Foo {
6549    Foo() : foo_(1) { }
6550    int foo_;
6551  };
6552cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6553    forField(hasName("foo_"))))))
6554  matches Foo
6555with forField matching foo_
6556</pre></td></tr>
6557
6558
6559<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>
6560<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6561
6562Examples:
6563  int x;
6564declaratorDecl(hasTypeLoc(loc(asString("int"))))
6565  matches int x
6566
6567auto x = int(3);
6568cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6569  matches int(3)
6570
6571struct Foo { Foo(int, int); };
6572auto x = Foo(1, 2);
6573cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6574  matches Foo(1, 2)
6575
6576Usable 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;,
6577  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;,
6578  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;,
6579  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6580  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;,
6581  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;,
6582  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;,
6583  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6584</pre></td></tr>
6585
6586
6587<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>
6588<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6589
6590Given
6591  struct Foo {
6592    Foo() : foo_(1) { }
6593    int foo_;
6594  };
6595cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6596    withInitializer(integerLiteral(equals(1)))))))
6597  matches Foo
6598with withInitializer matching (1)
6599</pre></td></tr>
6600
6601
6602<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>
6603<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6604given matcher. Implicit object expressions are included; that is, it matches
6605use of implicit `this`.
6606
6607Given
6608  struct X {
6609    int m;
6610    int f(X x) { x.m; return m; }
6611  };
6612memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6613  matches `x.m`, but not `m`; however,
6614memberExpr(hasObjectExpression(hasType(pointsTo(
6615     cxxRecordDecl(hasName("X"))))))
6616  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6617</pre></td></tr>
6618
6619
6620<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>
6621<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6622
6623
6624<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>
6625<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6626
6627Given:
6628 void foo() {
6629   if (int i = foobar(); i &gt; 0) {}
6630   switch (int i = foobar(); i) {}
6631   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6632 }
6633 void bar() {
6634   if (foobar() &gt; 0) {}
6635   switch (foobar()) {}
6636   for (auto&amp; x : get_range()) {}
6637 }
6638ifStmt(hasInitStatement(anything()))
6639  matches the if statement in foo but not in bar.
6640switchStmt(hasInitStatement(anything()))
6641  matches the switch statement in foo but not in bar.
6642cxxForRangeStmt(hasInitStatement(anything()))
6643  matches the range for statement in foo but not in bar.
6644</pre></td></tr>
6645
6646
6647<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>
6648<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6649
6650Example:
6651    forStmt(hasLoopVariable(anything()))
6652matches 'int x' in
6653    for (int x : a) { }
6654</pre></td></tr>
6655
6656
6657<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>
6658<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6659
6660Example:
6661    forStmt(hasRangeInit(anything()))
6662matches 'a' in
6663    for (int x : a) { }
6664</pre></td></tr>
6665
6666
6667<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>
6668<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6669
6670Examples:
6671  int x;
6672declaratorDecl(hasTypeLoc(loc(asString("int"))))
6673  matches int x
6674
6675auto x = int(3);
6676cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6677  matches int(3)
6678
6679struct Foo { Foo(int, int); };
6680auto x = Foo(1, 2);
6681cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6682  matches Foo(1, 2)
6683
6684Usable 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;,
6685  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;,
6686  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;,
6687  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6688  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;,
6689  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;,
6690  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;,
6691  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6692</pre></td></tr>
6693
6694
6695<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>
6696<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6697`on`, matches the argument directly without stripping away anything.
6698
6699Given
6700  class Y { public: void m(); };
6701  Y g();
6702  class X : public Y { void g(); };
6703  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6704cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6705    cxxRecordDecl(hasName("Y")))))
6706  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6707cxxMemberCallExpr(on(callExpr()))
6708  does not match `(g()).m()`, because the parens are not ignored.
6709
6710FIXME: Overload to allow directly matching types?
6711</pre></td></tr>
6712
6713
6714<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>
6715<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6716stripping off any parentheses or implicit casts.
6717
6718Given
6719  class Y { public: void m(); };
6720  Y g();
6721  class X : public Y {};
6722  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6723cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6724  matches `y.m()` and `(g()).m()`.
6725cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6726  matches `x.m()`.
6727cxxMemberCallExpr(on(callExpr()))
6728  matches `(g()).m()`.
6729
6730FIXME: Overload to allow directly matching types?
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('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>
6735<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6736</pre></td></tr>
6737
6738
6739<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>
6740<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6741matches the InnerMatcher, or is a pointer to a type that matches the
6742InnerMatcher.
6743
6744Given
6745  class Y { public: void m(); };
6746  class X : public Y { void g(); };
6747  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6748cxxMemberCallExpr(thisPointerType(hasDeclaration(
6749    cxxRecordDecl(hasName("Y")))))
6750  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6751cxxMemberCallExpr(thisPointerType(hasDeclaration(
6752    cxxRecordDecl(hasName("X")))))
6753  matches `x.g()`.
6754</pre></td></tr>
6755
6756
6757<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>
6758<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6759produce multiple matches.
6760
6761Given
6762  class A { virtual void f(); };
6763  class B : public A { void f(); };
6764  class C : public B { void f(); };
6765cxxMethodDecl(ofClass(hasName("C")),
6766              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6767  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6768  that B::f is not overridden by C::f).
6769
6770The check can produce multiple matches in case of multiple inheritance, e.g.
6771  class A1 { virtual void f(); };
6772  class A2 { virtual void f(); };
6773  class C : public A1, public A2 { void f(); };
6774cxxMethodDecl(ofClass(hasName("C")),
6775              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6776  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6777  once with "b" binding "A2::f" and "d" binding "C::f".
6778</pre></td></tr>
6779
6780
6781<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>
6782<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6783belongs to.
6784
6785FIXME: Generalize this for other kinds of declarations.
6786FIXME: What other kind of declarations would we need to generalize
6787this to?
6788
6789Example matches A() in the last line
6790    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6791        ofClass(hasName("A"))))))
6792  class A {
6793   public:
6794    A();
6795  };
6796  A a = A();
6797</pre></td></tr>
6798
6799
6800<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>
6801<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6802
6803Given:
6804  MyClass *p1 = new (Storage) MyClass();
6805cxxNewExpr(hasAnyPlacementArg(anything()))
6806  matches the expression 'new (Storage, 16) MyClass()'.
6807</pre></td></tr>
6808
6809
6810<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>
6811<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6812
6813Given:
6814  MyClass *p1 = new MyClass[10];
6815cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6816  matches the expression 'new MyClass[10]'.
6817</pre></td></tr>
6818
6819
6820<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>
6821<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6822matches the given matcher.
6823
6824The associated declaration is:
6825- for type nodes, the declaration of the underlying type
6826- for CallExpr, the declaration of the callee
6827- for MemberExpr, the declaration of the referenced member
6828- for CXXConstructExpr, the declaration of the constructor
6829- for CXXNewExpr, the declaration of the operator new
6830- for ObjCIvarExpr, the declaration of the ivar
6831
6832For type nodes, hasDeclaration will generally match the declaration of the
6833sugared type. Given
6834  class X {};
6835  typedef X Y;
6836  Y y;
6837in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6838typedefDecl. A common use case is to match the underlying, desugared type.
6839This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6840  varDecl(hasType(hasUnqualifiedDesugaredType(
6841      recordType(hasDeclaration(decl())))))
6842In this matcher, the decl will match the CXXRecordDecl of class X.
6843
6844Usable 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;,
6845  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;,
6846  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;,
6847  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;,
6848  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;,
6849  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;,
6850  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6851</pre></td></tr>
6852
6853
6854<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>
6855<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6856
6857Given:
6858  MyClass *p1 = new (Storage, 16) MyClass();
6859cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6860  matches the expression 'new (Storage, 16) MyClass()'.
6861</pre></td></tr>
6862
6863
6864<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>
6865<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6866
6867Examples:
6868  int x;
6869declaratorDecl(hasTypeLoc(loc(asString("int"))))
6870  matches int x
6871
6872auto x = int(3);
6873cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6874  matches int(3)
6875
6876struct Foo { Foo(int, int); };
6877auto x = Foo(1, 2);
6878cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6879  matches Foo(1, 2)
6880
6881Usable 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;,
6882  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;,
6883  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;,
6884  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6885  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;,
6886  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;,
6887  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;,
6888  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6889</pre></td></tr>
6890
6891
6892<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>
6893<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6894binary operator matches.
6895</pre></td></tr>
6896
6897
6898<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>
6899<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6900
6901Example matches a (matcher = binaryOperator(hasLHS()))
6902  a || b
6903</pre></td></tr>
6904
6905
6906<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>
6907<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6908
6909Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6910                                             integerLiteral(equals(2)))
6911  1 + 2 // Match
6912  2 + 1 // Match
6913  1 + 1 // No match
6914  2 + 2 // No match
6915</pre></td></tr>
6916
6917
6918<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>
6919<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6920
6921Example matches b (matcher = binaryOperator(hasRHS()))
6922  a || b
6923</pre></td></tr>
6924
6925
6926<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>
6927<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6928
6929Example matches true (matcher = hasUnaryOperand(
6930                                  cxxBoolLiteral(equals(true))))
6931  !true
6932</pre></td></tr>
6933
6934
6935<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>
6936<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6937
6938Example:
6939matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6940  class Foo;
6941  class Bar : Foo {};
6942  class Baz : Bar {};
6943  class SpecialBase;
6944  class Proxy : SpecialBase {};  // matches Proxy
6945  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6946
6947FIXME: Refactor this and isDerivedFrom to reuse implementation.
6948</pre></td></tr>
6949
6950
6951<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>
6952<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6953
6954Example:
6955matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6956  class Foo;
6957  class Bar : Foo {};
6958  class Baz : Bar {};
6959  class SpecialBase;
6960  class Proxy : SpecialBase {};  // matches Proxy
6961  class IndirectlyDerived : Proxy {};  // doesn't match
6962</pre></td></tr>
6963
6964
6965<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>
6966<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6967
6968Given:
6969  class A { void func(); };
6970  class B { void member(); };
6971
6972cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
6973A but not B.
6974</pre></td></tr>
6975
6976
6977<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>
6978<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
6979matching Base, or Objective-C classes that directly or indirectly
6980subclass a class matching Base.
6981
6982Note that a class is not considered to be derived from itself.
6983
6984Example matches Y, Z, C (Base == hasName("X"))
6985  class X;
6986  class Y : public X {};  // directly derived
6987  class Z : public Y {};  // indirectly derived
6988  typedef X A;
6989  typedef A B;
6990  class C : public B {};  // derived from a typedef of X
6991
6992In the following example, Bar matches isDerivedFrom(hasName("X")):
6993  class Foo;
6994  typedef Foo X;
6995  class Bar : public Foo {};  // derived from a type that X is a typedef of
6996
6997In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6998  @interface NSObject @end
6999  @interface Bar : NSObject @end
7000
7001Usable 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;
7002</pre></td></tr>
7003
7004
7005<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>
7006<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7007matching Base.
7008
7009Note that a class is not considered to be derived from itself.
7010
7011Example matches Y, C (Base == hasName("X"))
7012  class X;
7013  class Y : public X {};  // directly derived
7014  class Z : public Y {};  // indirectly derived
7015  typedef X A;
7016  typedef A B;
7017  class C : public B {};  // derived from a typedef of X
7018
7019In the following example, Bar matches isDerivedFrom(hasName("X")):
7020  class Foo;
7021  typedef Foo X;
7022  class Bar : public Foo {};  // derived from a type that X is a typedef of
7023</pre></td></tr>
7024
7025
7026<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>
7027<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7028match Base.
7029</pre></td></tr>
7030
7031
7032<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>
7033<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
7034binary operator matches.
7035</pre></td></tr>
7036
7037
7038<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>
7039<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
7040
7041Example matches a (matcher = binaryOperator(hasLHS()))
7042  a || b
7043</pre></td></tr>
7044
7045
7046<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>
7047<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
7048
7049Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
7050                                             integerLiteral(equals(2)))
7051  1 + 2 // Match
7052  2 + 1 // Match
7053  1 + 1 // No match
7054  2 + 2 // No match
7055</pre></td></tr>
7056
7057
7058<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>
7059<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7060
7061Example matches b (matcher = binaryOperator(hasRHS()))
7062  a || b
7063</pre></td></tr>
7064
7065
7066<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>
7067<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7068
7069Examples:
7070  int x;
7071declaratorDecl(hasTypeLoc(loc(asString("int"))))
7072  matches int x
7073
7074auto x = int(3);
7075cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7076  matches int(3)
7077
7078struct Foo { Foo(int, int); };
7079auto x = Foo(1, 2);
7080cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7081  matches Foo(1, 2)
7082
7083Usable 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;,
7084  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;,
7085  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;,
7086  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7087  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;,
7088  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;,
7089  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;,
7090  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7091</pre></td></tr>
7092
7093
7094<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>
7095<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7096expression, or an ObjC-message-send expression.
7097
7098Given
7099  void x(int, int, int) { int y; x(1, y, 42); }
7100callExpr(hasAnyArgument(declRefExpr()))
7101  matches x(1, y, 42)
7102with hasAnyArgument(...)
7103  matching y
7104
7105For ObjectiveC, given
7106  @interface I - (void) f:(int) y; @end
7107  void foo(I *i) { [i f:12]; }
7108objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7109  matches [i f:12]
7110</pre></td></tr>
7111
7112
7113<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>
7114<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7115call expression.
7116
7117Example matches y in x(y)
7118    (matcher = callExpr(hasArgument(0, declRefExpr())))
7119  void x(int) { int y; x(y); }
7120</pre></td></tr>
7121
7122
7123<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;</td><td class="name" onclick="toggle('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>
7124<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7125
7126Examples:
7127  int x;
7128declaratorDecl(hasTypeLoc(loc(asString("int"))))
7129  matches int x
7130
7131auto x = int(3);
7132cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7133  matches int(3)
7134
7135struct Foo { Foo(int, int); };
7136auto x = Foo(1, 2);
7137cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7138  matches Foo(1, 2)
7139
7140Usable 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;,
7141  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;,
7142  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;,
7143  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7144  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;,
7145  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;,
7146  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;,
7147  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7148</pre></td></tr>
7149
7150
7151<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>
7152<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7153given matcher.
7154
7155Example matches y.x() (matcher = callExpr(callee(
7156                                   cxxMethodDecl(hasName("x")))))
7157  class Y { public: void x(); };
7158  void z() { Y y; y.x(); }
7159</pre></td></tr>
7160
7161
7162<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>
7163<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7164
7165Given
7166  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
7167  void f() { f(); }
7168callExpr(callee(expr()))
7169  matches this-&gt;x(), x(), y.x(), f()
7170with callee(...)
7171  matching this-&gt;x, x, y.x, f respectively
7172
7173Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7174because this introduces ambiguous overloads with calls to Callee taking a
7175internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7176implemented in terms of implicit casts.
7177</pre></td></tr>
7178
7179
7180<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('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>
7181<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7182
7183Given
7184  void f(int i);
7185  int y;
7186  f(y);
7187callExpr(
7188  forEachArgumentWithParam(
7189    declRefExpr(to(varDecl(hasName("y")))),
7190    parmVarDecl(hasType(isInteger()))
7191))
7192  matches f(y);
7193with declRefExpr(...)
7194  matching int y
7195and parmVarDecl(...)
7196  matching int i
7197</pre></td></tr>
7198
7199
7200<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>
7201<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7202CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7203it works on calls through function pointers as well.
7204
7205The difference is, that function pointers do not provide access to a
7206ParmVarDecl, but only the QualType for each argument.
7207
7208Given
7209  void f(int i);
7210  int y;
7211  f(y);
7212  void (*f_ptr)(int) = f;
7213  f_ptr(y);
7214callExpr(
7215  forEachArgumentWithParamType(
7216    declRefExpr(to(varDecl(hasName("y")))),
7217    qualType(isInteger()).bind("type)
7218))
7219  matches f(y) and f_ptr(y)
7220with declRefExpr(...)
7221  matching int y
7222and qualType(...)
7223  matching int
7224</pre></td></tr>
7225
7226
7227<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>
7228<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7229expression, or an ObjC-message-send expression.
7230
7231Given
7232  void x(int, int, int) { int y; x(1, y, 42); }
7233callExpr(hasAnyArgument(declRefExpr()))
7234  matches x(1, y, 42)
7235with hasAnyArgument(...)
7236  matching y
7237
7238For ObjectiveC, given
7239  @interface I - (void) f:(int) y; @end
7240  void foo(I *i) { [i f:12]; }
7241objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7242  matches [i f:12]
7243</pre></td></tr>
7244
7245
7246<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>
7247<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7248call expression.
7249
7250Example matches y in x(y)
7251    (matcher = callExpr(hasArgument(0, declRefExpr())))
7252  void x(int) { int y; x(y); }
7253</pre></td></tr>
7254
7255
7256<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('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>
7257<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7258matches the given matcher.
7259
7260The associated declaration is:
7261- for type nodes, the declaration of the underlying type
7262- for CallExpr, the declaration of the callee
7263- for MemberExpr, the declaration of the referenced member
7264- for CXXConstructExpr, the declaration of the constructor
7265- for CXXNewExpr, the declaration of the operator new
7266- for ObjCIvarExpr, the declaration of the ivar
7267
7268For type nodes, hasDeclaration will generally match the declaration of the
7269sugared type. Given
7270  class X {};
7271  typedef X Y;
7272  Y y;
7273in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7274typedefDecl. A common use case is to match the underlying, desugared type.
7275This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7276  varDecl(hasType(hasUnqualifiedDesugaredType(
7277      recordType(hasDeclaration(decl())))))
7278In this matcher, the decl will match the CXXRecordDecl of class X.
7279
7280Usable 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;,
7281  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;,
7282  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;,
7283  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;,
7284  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;,
7285  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;,
7286  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7287</pre></td></tr>
7288
7289
7290<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>
7291<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7292extension, matches the constant given in the statement.
7293
7294Given
7295  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7296caseStmt(hasCaseConstant(integerLiteral()))
7297  matches "case 1:"
7298</pre></td></tr>
7299
7300
7301<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>
7302<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7303or opaque value's source expression matches the given matcher.
7304
7305Example 1: matches "a string"
7306(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7307class URL { URL(string); };
7308URL url = "a string";
7309
7310Example 2: matches 'b' (matcher =
7311opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7312int a = b ?: 1;
7313</pre></td></tr>
7314
7315
7316<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>
7317<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7318functionDecl that have at least one TemplateArgument matching the given
7319InnerMatcher.
7320
7321Given
7322  template&lt;typename T&gt; class A {};
7323  template&lt;&gt; class A&lt;double&gt; {};
7324  A&lt;int&gt; a;
7325
7326  template&lt;typename T&gt; f() {};
7327  void func() { f&lt;int&gt;(); };
7328
7329classTemplateSpecializationDecl(hasAnyTemplateArgument(
7330    refersToType(asString("int"))))
7331  matches the specialization A&lt;int&gt;
7332
7333functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7334  matches the specialization f&lt;int&gt;
7335</pre></td></tr>
7336
7337
7338<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>
7339<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7340
7341Given
7342  template&lt;typename T&gt; class A {}; #1
7343  template&lt;&gt; class A&lt;int&gt; {}; #2
7344classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7345  matches '#2' with classTemplateDecl() matching the class template
7346  declaration of 'A' at #1.
7347</pre></td></tr>
7348
7349
7350<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>
7351<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7352functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7353
7354Given
7355  template&lt;typename T, typename U&gt; class A {};
7356  A&lt;bool, int&gt; b;
7357  A&lt;int, bool&gt; c;
7358
7359  template&lt;typename T&gt; void f() {}
7360  void func() { f&lt;int&gt;(); };
7361classTemplateSpecializationDecl(hasTemplateArgument(
7362    1, refersToType(asString("int"))))
7363  matches the specialization A&lt;bool, int&gt;
7364
7365functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7366  matches the specialization f&lt;int&gt;
7367</pre></td></tr>
7368
7369
7370<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('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>
7371<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7372
7373Examples:
7374  int x;
7375declaratorDecl(hasTypeLoc(loc(asString("int"))))
7376  matches int x
7377
7378auto x = int(3);
7379cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7380  matches int(3)
7381
7382struct Foo { Foo(int, int); };
7383auto x = Foo(1, 2);
7384cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7385  matches Foo(1, 2)
7386
7387Usable 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;,
7388  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;,
7389  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;,
7390  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7391  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;,
7392  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;,
7393  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;,
7394  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7395</pre></td></tr>
7396
7397
7398<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>
7399<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7400type.
7401
7402Given
7403  struct A {};
7404  A a[7];
7405  int b[7];
7406arrayType(hasElementType(builtinType()))
7407  matches "int b[7]"
7408
7409Usable 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;
7410</pre></td></tr>
7411
7412
7413<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>
7414<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7415
7416Examples:
7417  int x;
7418declaratorDecl(hasTypeLoc(loc(asString("int"))))
7419  matches int x
7420
7421auto x = int(3);
7422cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7423  matches int(3)
7424
7425struct Foo { Foo(int, int); };
7426auto x = Foo(1, 2);
7427cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7428  matches Foo(1, 2)
7429
7430Usable 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;,
7431  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;,
7432  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;,
7433  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7434  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;,
7435  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;,
7436  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;,
7437  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7438</pre></td></tr>
7439
7440
7441<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>
7442<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7443a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7444
7445Given
7446  { {}; 1+2; }
7447hasAnySubstatement(compoundStmt())
7448  matches '{ {}; 1+2; }'
7449with compoundStmt()
7450  matching '{}'
7451</pre></td></tr>
7452
7453
7454<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>
7455<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7456</pre></td></tr>
7457
7458
7459<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>
7460<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7461matches the given matcher.
7462
7463The associated declaration is:
7464- for type nodes, the declaration of the underlying type
7465- for CallExpr, the declaration of the callee
7466- for MemberExpr, the declaration of the referenced member
7467- for CXXConstructExpr, the declaration of the constructor
7468- for CXXNewExpr, the declaration of the operator new
7469- for ObjCIvarExpr, the declaration of the ivar
7470
7471For type nodes, hasDeclaration will generally match the declaration of the
7472sugared type. Given
7473  class X {};
7474  typedef X Y;
7475  Y y;
7476in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7477typedefDecl. A common use case is to match the underlying, desugared type.
7478This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7479  varDecl(hasType(hasUnqualifiedDesugaredType(
7480      recordType(hasDeclaration(decl())))))
7481In this matcher, the decl will match the CXXRecordDecl of class X.
7482
7483Usable 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;,
7484  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;,
7485  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;,
7486  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;,
7487  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;,
7488  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;,
7489  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7490</pre></td></tr>
7491
7492
7493<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>
7494<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th
7495`TemplateArgumentLoc` matches the given `InnerMatcher`.
7496
7497Given
7498  template&lt;typename T, typename U&gt; class A {};
7499  A&lt;double, int&gt; b;
7500  A&lt;int, double&gt; c;
7501varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
7502  hasTypeLoc(loc(asString("double")))))))
7503  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
7504</pre></td></tr>
7505
7506
7507<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>
7508<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7509specific using shadow declaration.
7510
7511Given
7512  namespace a { void f() {} }
7513  using a::f;
7514  void g() {
7515    f();     // Matches this ..
7516    a::f();  // .. but not this.
7517  }
7518declRefExpr(throughUsingDecl(anything()))
7519  matches f()
7520</pre></td></tr>
7521
7522
7523<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>
7524<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7525specified matcher.
7526
7527Example matches x in if(x)
7528    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7529  bool x;
7530  if (x) {}
7531</pre></td></tr>
7532
7533
7534<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>
7535<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7536
7537Note that this does not work for global declarations because the AST
7538breaks up multiple-declaration DeclStmt's into multiple single-declaration
7539DeclStmt's.
7540Example: Given non-global declarations
7541  int a, b = 0;
7542  int c;
7543  int d = 2, e;
7544declStmt(containsDeclaration(
7545      0, varDecl(hasInitializer(anything()))))
7546  matches only 'int d = 2, e;', and
7547declStmt(containsDeclaration(1, varDecl()))
7548  matches 'int a, b = 0' as well as 'int d = 2, e;'
7549  but 'int c;' is not matched.
7550</pre></td></tr>
7551
7552
7553<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>
7554<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7555
7556Given
7557  int a, b;
7558  int c;
7559declStmt(hasSingleDecl(anything()))
7560  matches 'int c;' but not 'int a, b;'.
7561</pre></td></tr>
7562
7563
7564<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>
7565<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7566
7567Examples:
7568  int x;
7569declaratorDecl(hasTypeLoc(loc(asString("int"))))
7570  matches int x
7571
7572auto x = int(3);
7573cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7574  matches int(3)
7575
7576struct Foo { Foo(int, int); };
7577auto x = Foo(1, 2);
7578cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7579  matches Foo(1, 2)
7580
7581Usable 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;,
7582  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;,
7583  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;,
7584  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7585  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;,
7586  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;,
7587  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;,
7588  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7589</pre></td></tr>
7590
7591
7592<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>
7593<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7594Decl, matches InnerMatcher.
7595
7596Given
7597  namespace N {
7598    namespace M {
7599      class D {};
7600    }
7601  }
7602
7603cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7604declaration of class D.
7605</pre></td></tr>
7606
7607
7608<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>
7609<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7610
7611Given
7612  decltype(1) a = 1;
7613  decltype(2.0) b = 2.0;
7614decltypeType(hasUnderlyingType(isInteger()))
7615  matches the type of "a"
7616
7617Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7618</pre></td></tr>
7619
7620
7621<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>
7622<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7623
7624For example, in:
7625void foo()
7626{
7627    int arr[3];
7628    auto &amp;[f, s, t] = arr;
7629
7630    f = 42;
7631}
7632The matcher:
7633  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7634matches the decomposition decl with 'f' bound to "fBinding".
7635</pre></td></tr>
7636
7637
7638<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>
7639<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7640
7641For example, in:
7642void foo()
7643{
7644    int arr[3];
7645    auto &amp;[f, s, t] = arr;
7646
7647    f = 42;
7648}
7649The matcher:
7650  decompositionDecl(hasBinding(0,
7651  bindingDecl(hasName("f").bind("fBinding"))))
7652matches the decomposition decl with 'f' bound to "fBinding".
7653</pre></td></tr>
7654
7655
7656<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>
7657<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7658
7659
7660<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>
7661<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7662switch statement or conditional operator.
7663
7664Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7665  if (true) {}
7666</pre></td></tr>
7667
7668
7669<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>
7670<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
7671`InnerMatcher`.
7672
7673Given
7674  template &lt;typename T&gt;
7675  class C {};
7676  class C&lt;int&gt; c;
7677
7678  class D {};
7679  class D d;
7680elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
7681  matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
7682</pre></td></tr>
7683
7684
7685<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>
7686<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7687matches InnerMatcher if the qualifier exists.
7688
7689Given
7690  namespace N {
7691    namespace M {
7692      class D {};
7693    }
7694  }
7695  N::M::D d;
7696
7697elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7698matches the type of the variable declaration of d.
7699</pre></td></tr>
7700
7701
7702<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>
7703<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7704
7705Given
7706  namespace N {
7707    namespace M {
7708      class D {};
7709    }
7710  }
7711  N::M::D d;
7712
7713elaboratedType(namesType(recordType(
7714hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7715declaration of d.
7716</pre></td></tr>
7717
7718
7719<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>
7720<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7721matches the given matcher.
7722
7723The associated declaration is:
7724- for type nodes, the declaration of the underlying type
7725- for CallExpr, the declaration of the callee
7726- for MemberExpr, the declaration of the referenced member
7727- for CXXConstructExpr, the declaration of the constructor
7728- for CXXNewExpr, the declaration of the operator new
7729- for ObjCIvarExpr, the declaration of the ivar
7730
7731For type nodes, hasDeclaration will generally match the declaration of the
7732sugared type. Given
7733  class X {};
7734  typedef X Y;
7735  Y y;
7736in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7737typedefDecl. A common use case is to match the underlying, desugared type.
7738This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7739  varDecl(hasType(hasUnqualifiedDesugaredType(
7740      recordType(hasDeclaration(decl())))))
7741In this matcher, the decl will match the CXXRecordDecl of class X.
7742
7743Usable 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;,
7744  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;,
7745  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;,
7746  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;,
7747  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;,
7748  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;,
7749  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7750</pre></td></tr>
7751
7752
7753<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>
7754<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7755
7756(Note: Clang's AST refers to other conversions as "casts" too, and calls
7757actual casts "explicit" casts.)
7758</pre></td></tr>
7759
7760
7761<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>
7762<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7763
7764Examples:
7765  int x;
7766declaratorDecl(hasTypeLoc(loc(asString("int"))))
7767  matches int x
7768
7769auto x = int(3);
7770cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7771  matches int(3)
7772
7773struct Foo { Foo(int, int); };
7774auto x = Foo(1, 2);
7775cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7776  matches Foo(1, 2)
7777
7778Usable 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;,
7779  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;,
7780  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;,
7781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7782  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;,
7783  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;,
7784  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;,
7785  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7786</pre></td></tr>
7787
7788
7789<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>
7790<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7791declaration's type.
7792
7793In case of a value declaration (for example a variable declaration),
7794this resolves one layer of indirection. For example, in the value
7795declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7796X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7797declaration of x.
7798
7799Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7800            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7801            and friend class X (matcher = friendDecl(hasType("X"))
7802            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7803                                              cxxRecordDecl(hasName("X"))))
7804 class X {};
7805 void y(X &amp;x) { x; X z; }
7806 class Y { friend class X; };
7807 class Z : public virtual X {};
7808
7809Example matches class Derived
7810(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7811class Base {};
7812class Derived : Base {};
7813
7814Usable 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;,
7815Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7816</pre></td></tr>
7817
7818
7819<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>
7820<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7821matcher.
7822
7823Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7824            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7825            and U (matcher = typedefDecl(hasType(asString("int")))
7826            and friend class X (matcher = friendDecl(hasType("X"))
7827            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7828                                              asString("class X")))
7829 class X {};
7830 void y(X &amp;x) { x; X z; }
7831 typedef int U;
7832 class Y { friend class X; };
7833 class Z : public virtual X {};
7834</pre></td></tr>
7835
7836
7837<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>
7838<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7839elidable constructor and other corresponding bookkeeping nodes.
7840
7841In C++17, elidable copy constructors are no longer being generated in the
7842AST as it is not permitted by the standard. They are, however, part of the
7843AST in C++14 and earlier. So, a matcher must abstract over these differences
7844to work in all language modes. This matcher skips elidable constructor-call
7845AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7846various implicit nodes inside the constructor calls, all of which will not
7847appear in the C++17 AST.
7848
7849Given
7850
7851struct H {};
7852H G();
7853void f() {
7854  H D = G();
7855}
7856
7857``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7858matches ``H D = G()`` in C++11 through C++17 (and beyond).
7859</pre></td></tr>
7860
7861
7862<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>
7863<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7864are stripped off.
7865
7866Parentheses and explicit casts are not discarded.
7867Given
7868  int arr[5];
7869  int a = 0;
7870  char b = 0;
7871  const int c = a;
7872  int *d = arr;
7873  long e = (long) 0l;
7874The matchers
7875   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7876   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7877would match the declarations for a, b, c, and d, but not e.
7878While
7879   varDecl(hasInitializer(integerLiteral()))
7880   varDecl(hasInitializer(declRefExpr()))
7881only match the declarations for a.
7882</pre></td></tr>
7883
7884
7885<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>
7886<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7887nodes are stripped off.
7888
7889Parentheses and explicit casts are not discarded.
7890Given
7891  class C {};
7892  C a = C();
7893  C b;
7894  C c = b;
7895The matchers
7896   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7897would match the declarations for a, b, and c.
7898While
7899   varDecl(hasInitializer(cxxConstructExpr()))
7900only match the declarations for b and c.
7901</pre></td></tr>
7902
7903
7904<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>
7905<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7906casts are stripped off.
7907
7908Implicit and non-C Style casts are also discarded.
7909Given
7910  int a = 0;
7911  char b = (0);
7912  void* c = reinterpret_cast&lt;char*&gt;(0);
7913  char d = char(0);
7914The matcher
7915   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7916would match the declarations for a, b, c, and d.
7917while
7918   varDecl(hasInitializer(integerLiteral()))
7919only match the declaration for a.
7920</pre></td></tr>
7921
7922
7923<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>
7924<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7925parentheses are stripped off.
7926
7927Explicit casts are not discarded.
7928Given
7929  int arr[5];
7930  int a = 0;
7931  char b = (0);
7932  const int c = a;
7933  int *d = (arr);
7934  long e = ((long) 0l);
7935The matchers
7936   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7937   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7938would match the declarations for a, b, c, and d, but not e.
7939while
7940   varDecl(hasInitializer(integerLiteral()))
7941   varDecl(hasInitializer(declRefExpr()))
7942would only match the declaration for a.
7943</pre></td></tr>
7944
7945
7946<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>
7947<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7948
7949Given
7950  const char* str = ("my-string");
7951The matcher
7952  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7953would match the implicit cast resulting from the assignment.
7954</pre></td></tr>
7955
7956
7957<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>
7958<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7959
7960Given
7961  class C {
7962    int a = 2;
7963    int b = 3;
7964    int c;
7965  };
7966fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7967  matches 'int a;' but not 'int b;'.
7968fieldDecl(hasInClassInitializer(anything()))
7969  matches 'int a;' and 'int b;' but not 'int c;'.
7970</pre></td></tr>
7971
7972
7973<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>
7974<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7975
7976
7977<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>
7978<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7979switch statement or conditional operator.
7980
7981Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7982  if (true) {}
7983</pre></td></tr>
7984
7985
7986<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>
7987<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7988
7989Example:
7990    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7991matches '++x' in
7992    for (x; x &lt; N; ++x) { }
7993</pre></td></tr>
7994
7995
7996<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>
7997<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7998
7999Example:
8000    forStmt(hasLoopInit(declStmt()))
8001matches 'int x = 0' in
8002    for (int x = 0; x &lt; N; ++x) { }
8003</pre></td></tr>
8004
8005
8006<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>
8007<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
8008declaration's type.
8009
8010In case of a value declaration (for example a variable declaration),
8011this resolves one layer of indirection. For example, in the value
8012declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
8013X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
8014declaration of x.
8015
8016Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8017            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8018            and friend class X (matcher = friendDecl(hasType("X"))
8019            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8020                                              cxxRecordDecl(hasName("X"))))
8021 class X {};
8022 void y(X &amp;x) { x; X z; }
8023 class Y { friend class X; };
8024 class Z : public virtual X {};
8025
8026Example matches class Derived
8027(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
8028class Base {};
8029class Derived : Base {};
8030
8031Usable 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;,
8032Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
8033</pre></td></tr>
8034
8035
8036<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>
8037<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
8038matcher.
8039
8040Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
8041            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
8042            and U (matcher = typedefDecl(hasType(asString("int")))
8043            and friend class X (matcher = friendDecl(hasType("X"))
8044            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8045                                              asString("class X")))
8046 class X {};
8047 void y(X &amp;x) { x; X z; }
8048 typedef int U;
8049 class Y { friend class X; };
8050 class Z : public virtual X {};
8051</pre></td></tr>
8052
8053
8054<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>
8055<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
8056Note that this matcher matches all the declarations of a function whose
8057body is present in the AST.
8058
8059Given
8060  void f();
8061  void f() {}
8062  void g();
8063functionDecl(hasAnyBody(compoundStmt()))
8064  matches both 'void f();'
8065  and 'void f() {}'
8066with compoundStmt()
8067  matching '{}'
8068  but does not match 'void g();'
8069</pre></td></tr>
8070
8071
8072<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>
8073<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
8074block.
8075
8076Does not match the 'this' parameter of a method.
8077
8078Given
8079  class X { void f(int x, int y, int z) {} };
8080cxxMethodDecl(hasAnyParameter(hasName("y")))
8081  matches f(int x, int y, int z) {}
8082with hasAnyParameter(...)
8083  matching int y
8084
8085For ObjectiveC, given
8086  @interface I - (void) f:(int) y; @end
8087
8088the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8089matches the declaration of method f with hasParameter
8090matching y.
8091
8092For blocks, given
8093  b = ^(int y) { printf("%d", y) };
8094
8095the matcher blockDecl(hasAnyParameter(hasName("y")))
8096matches the declaration of the block b with hasParameter
8097matching y.
8098</pre></td></tr>
8099
8100
8101<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('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>
8102<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8103functionDecl that have at least one TemplateArgument matching the given
8104InnerMatcher.
8105
8106Given
8107  template&lt;typename T&gt; class A {};
8108  template&lt;&gt; class A&lt;double&gt; {};
8109  A&lt;int&gt; a;
8110
8111  template&lt;typename T&gt; f() {};
8112  void func() { f&lt;int&gt;(); };
8113
8114classTemplateSpecializationDecl(hasAnyTemplateArgument(
8115    refersToType(asString("int"))))
8116  matches the specialization A&lt;int&gt;
8117
8118functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8119  matches the specialization f&lt;int&gt;
8120</pre></td></tr>
8121
8122
8123<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>
8124<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
8125
8126
8127<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>
8128<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
8129declaration.
8130
8131Given
8132  template&lt;bool b&gt;
8133  struct S {
8134    S(int); // #1
8135    explicit S(double); // #2
8136    operator int(); // #3
8137    explicit operator bool(); // #4
8138    explicit(false) S(bool) // # 7
8139    explicit(true) S(char) // # 8
8140    explicit(b) S(S) // # 9
8141  };
8142  S(int) -&gt; S&lt;true&gt; // #5
8143  explicit S(double) -&gt; S&lt;false&gt; // #6
8144cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8145cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8146cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8147</pre></td></tr>
8148
8149
8150<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>
8151<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
8152declaration or a block.
8153
8154Given
8155  class X { void f(int x) {} };
8156cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8157  matches f(int x) {}
8158with hasParameter(...)
8159  matching int x
8160
8161For ObjectiveC, given
8162  @interface I - (void) f:(int) y; @end
8163
8164the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8165matches the declaration of method f with hasParameter
8166matching y.
8167</pre></td></tr>
8168
8169
8170<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>
8171<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`.
8172
8173Given
8174  int f() { return 5; }
8175  void g() {}
8176functionDecl(hasReturnTypeLoc(loc(asString("int"))))
8177  matches the declaration of `f`, but not `g`.
8178</pre></td></tr>
8179
8180
8181<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>
8182<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8183functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8184
8185Given
8186  template&lt;typename T, typename U&gt; class A {};
8187  A&lt;bool, int&gt; b;
8188  A&lt;int, bool&gt; c;
8189
8190  template&lt;typename T&gt; void f() {}
8191  void func() { f&lt;int&gt;(); };
8192classTemplateSpecializationDecl(hasTemplateArgument(
8193    1, refersToType(asString("int"))))
8194  matches the specialization A&lt;bool, int&gt;
8195
8196functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8197  matches the specialization f&lt;int&gt;
8198</pre></td></tr>
8199
8200
8201<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>
8202<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8203
8204Given:
8205  class X { int f() { return 1; } };
8206cxxMethodDecl(returns(asString("int")))
8207  matches int f() { return 1; }
8208</pre></td></tr>
8209
8210
8211<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>
8212<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8213switch statement or conditional operator.
8214
8215Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8216  if (true) {}
8217</pre></td></tr>
8218
8219
8220<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>
8221<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8222
8223Given
8224  if (A* a = GetAPointer()) {}
8225hasConditionVariableStatement(...)
8226  matches 'A* a = GetAPointer()'.
8227</pre></td></tr>
8228
8229
8230<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>
8231<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8232
8233Examples matches the if statement
8234  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8235  if (false) false; else true;
8236</pre></td></tr>
8237
8238
8239<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>
8240<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8241
8242Given:
8243 void foo() {
8244   if (int i = foobar(); i &gt; 0) {}
8245   switch (int i = foobar(); i) {}
8246   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8247 }
8248 void bar() {
8249   if (foobar() &gt; 0) {}
8250   switch (foobar()) {}
8251   for (auto&amp; x : get_range()) {}
8252 }
8253ifStmt(hasInitStatement(anything()))
8254  matches the if statement in foo but not in bar.
8255switchStmt(hasInitStatement(anything()))
8256  matches the switch statement in foo but not in bar.
8257cxxForRangeStmt(hasInitStatement(anything()))
8258  matches the range for statement in foo but not in bar.
8259</pre></td></tr>
8260
8261
8262<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;</td><td class="name" onclick="toggle('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>
8263<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8264
8265Examples matches the if statement
8266  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8267  if (false) true; else false;
8268</pre></td></tr>
8269
8270
8271<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>
8272<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8273matcher.
8274
8275FIXME: Unit test this matcher
8276</pre></td></tr>
8277
8278
8279<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>
8280<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8281
8282Example matches y.
8283    (matcher = initListExpr(hasInit(0, expr())))
8284  int x{y}.
8285</pre></td></tr>
8286
8287
8288<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>
8289<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8290(if expression have it).
8291</pre></td></tr>
8292
8293
8294<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>
8295<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8296matches the given matcher.
8297
8298The associated declaration is:
8299- for type nodes, the declaration of the underlying type
8300- for CallExpr, the declaration of the callee
8301- for MemberExpr, the declaration of the referenced member
8302- for CXXConstructExpr, the declaration of the constructor
8303- for CXXNewExpr, the declaration of the operator new
8304- for ObjCIvarExpr, the declaration of the ivar
8305
8306For type nodes, hasDeclaration will generally match the declaration of the
8307sugared type. Given
8308  class X {};
8309  typedef X Y;
8310  Y y;
8311in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8312typedefDecl. A common use case is to match the underlying, desugared type.
8313This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8314  varDecl(hasType(hasUnqualifiedDesugaredType(
8315      recordType(hasDeclaration(decl())))))
8316In this matcher, the decl will match the CXXRecordDecl of class X.
8317
8318Usable 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;,
8319  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;,
8320  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;,
8321  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;,
8322  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;,
8323  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;,
8324  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8325</pre></td></tr>
8326
8327
8328<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>
8329<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8330matches the given matcher.
8331
8332The associated declaration is:
8333- for type nodes, the declaration of the underlying type
8334- for CallExpr, the declaration of the callee
8335- for MemberExpr, the declaration of the referenced member
8336- for CXXConstructExpr, the declaration of the constructor
8337- for CXXNewExpr, the declaration of the operator new
8338- for ObjCIvarExpr, the declaration of the ivar
8339
8340For type nodes, hasDeclaration will generally match the declaration of the
8341sugared type. Given
8342  class X {};
8343  typedef X Y;
8344  Y y;
8345in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8346typedefDecl. A common use case is to match the underlying, desugared type.
8347This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8348  varDecl(hasType(hasUnqualifiedDesugaredType(
8349      recordType(hasDeclaration(decl())))))
8350In this matcher, the decl will match the CXXRecordDecl of class X.
8351
8352Usable 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;,
8353  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;,
8354  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;,
8355  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;,
8356  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;,
8357  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;,
8358  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8359</pre></td></tr>
8360
8361
8362<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>
8363<tr><td colspan="4" class="doc" id="capturesVar0"><pre>Matches a `LambdaCapture` that refers to the specified `VarDecl`. The
8364`VarDecl` can be a separate variable that is captured by value or
8365reference, or a synthesized variable if the capture has an initializer.
8366
8367Given
8368  void foo() {
8369    int x;
8370    auto f = [x](){};
8371    auto g = [x = 1](){};
8372  }
8373In the matcher
8374lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x")))),
8375capturesVar(hasName("x")) matches `x` and `x = 1`.
8376</pre></td></tr>
8377
8378
8379<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('forEachLambdaCapture0')"><a name="forEachLambdaCapture0Anchor">forEachLambdaCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8380<tr><td colspan="4" class="doc" id="forEachLambdaCapture0"><pre>Matches each lambda capture in a lambda expression.
8381
8382Given
8383  int main() {
8384    int x, y;
8385    float z;
8386    auto f = [=]() { return x + y + z; };
8387  }
8388lambdaExpr(forEachLambdaCapture(
8389    lambdaCapture(capturesVar(varDecl(hasType(isInteger()))))))
8390will trigger two matches, binding for 'x' and 'y' respectively.
8391</pre></td></tr>
8392
8393
8394<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaCapture.html">LambdaCapture</a>&gt; InnerMatcher</td></tr>
8395<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture in a lambda expression.
8396
8397Given
8398  void foo() {
8399    int t = 5;
8400    auto f = [=](){ return t; };
8401  }
8402lambdaExpr(hasAnyCapture(lambdaCapture())) and
8403lambdaExpr(hasAnyCapture(lambdaCapture(refersToVarDecl(hasName("t")))))
8404  both match `[=](){ return t; }`.
8405</pre></td></tr>
8406
8407
8408<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8409<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8410matches the given matcher.
8411
8412The associated declaration is:
8413- for type nodes, the declaration of the underlying type
8414- for CallExpr, the declaration of the callee
8415- for MemberExpr, the declaration of the referenced member
8416- for CXXConstructExpr, the declaration of the constructor
8417- for CXXNewExpr, the declaration of the operator new
8418- for ObjCIvarExpr, the declaration of the ivar
8419
8420For type nodes, hasDeclaration will generally match the declaration of the
8421sugared type. Given
8422  class X {};
8423  typedef X Y;
8424  Y y;
8425in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8426typedefDecl. A common use case is to match the underlying, desugared type.
8427This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8428  varDecl(hasType(hasUnqualifiedDesugaredType(
8429      recordType(hasDeclaration(decl())))))
8430In this matcher, the decl will match the CXXRecordDecl of class X.
8431
8432Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8433  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8434  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8435  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8436  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8437  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8438  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8439</pre></td></tr>
8440
8441
8442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression0')"><a name="hasObjectExpression0Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8443<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8444given matcher. Implicit object expressions are included; that is, it matches
8445use of implicit `this`.
8446
8447Given
8448  struct X {
8449    int m;
8450    int f(X x) { x.m; return m; }
8451  };
8452memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8453  matches `x.m`, but not `m`; however,
8454memberExpr(hasObjectExpression(hasType(pointsTo(
8455     cxxRecordDecl(hasName("X"))))))
8456  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8457</pre></td></tr>
8458
8459
8460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('member0')"><a name="member0Anchor">member</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
8461<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8462given matcher.
8463
8464Given
8465  struct { int first, second; } first, second;
8466  int i(second.first);
8467  int j(first.second);
8468memberExpr(member(hasName("first")))
8469  matches second.first
8470  but not first.second (because the member name there is "second").
8471</pre></td></tr>
8472
8473
8474<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;</td><td class="name" onclick="toggle('pointee1')"><a name="pointee1Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8475<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8476pointee matches a given matcher.
8477
8478Given
8479  int *a;
8480  int const *b;
8481  float const *f;
8482pointerType(pointee(isConstQualified(), isInteger()))
8483  matches "int const *b"
8484
8485Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
8486  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
8487</pre></td></tr>
8488
8489
8490<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasUnderlyingDecl0')"><a name="hasUnderlyingDecl0Anchor">hasUnderlyingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
8491<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8492matcher.
8493
8494Given
8495  namespace N { template&lt;class T&gt; void f(T t); }
8496  template &lt;class T&gt; void g() { using N::f; f(T()); }
8497unresolvedLookupExpr(hasAnyDeclaration(
8498    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8499  matches the use of f in g() .
8500</pre></td></tr>
8501
8502
8503<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('hasPrefix1')"><a name="hasPrefix1Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt; InnerMatcher</td></tr>
8504<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8505
8506Given
8507  struct A { struct B { struct C {}; }; };
8508  A::B::C c;
8509nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8510  matches "A::"
8511</pre></td></tr>
8512
8513
8514<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
8515<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8516NestedNameSpecifier-matcher matches.
8517</pre></td></tr>
8518
8519
8520<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('specifiesTypeLoc0')"><a name="specifiesTypeLoc0Anchor">specifiesTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
8521<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8522given TypeLoc.
8523
8524Given
8525  struct A { struct B { struct C {}; }; };
8526  A::B::C c;
8527nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8528  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8529  matches "A::"
8530</pre></td></tr>
8531
8532
8533<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('hasPrefix0')"><a name="hasPrefix0Anchor">hasPrefix</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
8534<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8535
8536Given
8537  struct A { struct B { struct C {}; }; };
8538  A::B::C c;
8539nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8540  matches "A::"
8541</pre></td></tr>
8542
8543
8544<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesNamespace0')"><a name="specifiesNamespace0Anchor">specifiesNamespace</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt; InnerMatcher</td></tr>
8545<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8546given namespace matcher.
8547
8548Given
8549  namespace ns { struct A {}; }
8550  ns::A a;
8551nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8552  matches "ns::"
8553</pre></td></tr>
8554
8555
8556<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('specifiesType0')"><a name="specifiesType0Anchor">specifiesType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8557<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8558given QualType matcher without qualifiers.
8559
8560Given
8561  struct A { struct B { struct C {}; }; };
8562  A::B::C c;
8563nestedNameSpecifier(specifiesType(
8564  hasDeclaration(cxxRecordDecl(hasName("A")))
8565))
8566  matches "A::"
8567</pre></td></tr>
8568
8569
8570<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasAnyClause0')"><a name="hasAnyClause0Anchor">hasAnyClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt; InnerMatcher</td></tr>
8571<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8572
8573Given
8574
8575  #pragma omp parallel
8576  #pragma omp parallel default(none)
8577
8578``ompExecutableDirective(hasAnyClause(anything()))`` matches
8579``omp parallel default(none)``.
8580</pre></td></tr>
8581
8582
8583<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('hasStructuredBlock0')"><a name="hasStructuredBlock0Anchor">hasStructuredBlock</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
8584<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8585
8586Prerequisite: the executable directive must not be standalone directive.
8587If it is, it will never match.
8588
8589Given
8590
8591   #pragma omp parallel
8592   ;
8593   #pragma omp parallel
8594   {}
8595
8596``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8597</pre></td></tr>
8598
8599
8600<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
8601<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8602matching Base, or Objective-C classes that directly or indirectly
8603subclass a class matching Base.
8604
8605Note that a class is not considered to be derived from itself.
8606
8607Example matches Y, Z, C (Base == hasName("X"))
8608  class X;
8609  class Y : public X {};  // directly derived
8610  class Z : public Y {};  // indirectly derived
8611  typedef X A;
8612  typedef A B;
8613  class C : public B {};  // derived from a typedef of X
8614
8615In the following example, Bar matches isDerivedFrom(hasName("X")):
8616  class Foo;
8617  typedef Foo X;
8618  class Bar : public Foo {};  // derived from a type that X is a typedef of
8619
8620In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8621  @interface NSObject @end
8622  @interface Bar : NSObject @end
8623
8624Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;
8625</pre></td></tr>
8626
8627
8628<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
8629<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8630matching Base.
8631
8632Note that a class is not considered to be derived from itself.
8633
8634Example matches Y, C (Base == hasName("X"))
8635  class X;
8636  class Y : public X {};  // directly derived
8637  class Z : public Y {};  // indirectly derived
8638  typedef X A;
8639  typedef A B;
8640  class C : public B {};  // derived from a typedef of X
8641
8642In the following example, Bar matches isDerivedFrom(hasName("X")):
8643  class Foo;
8644  typedef Foo X;
8645  class Bar : public Foo {};  // derived from a type that X is a typedef of
8646</pre></td></tr>
8647
8648
8649<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
8650<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8651match Base.
8652</pre></td></tr>
8653
8654
8655<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyArgument3')"><a name="hasAnyArgument3Anchor">hasAnyArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8656<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8657expression, or an ObjC-message-send expression.
8658
8659Given
8660  void x(int, int, int) { int y; x(1, y, 42); }
8661callExpr(hasAnyArgument(declRefExpr()))
8662  matches x(1, y, 42)
8663with hasAnyArgument(...)
8664  matching y
8665
8666For ObjectiveC, given
8667  @interface I - (void) f:(int) y; @end
8668  void foo(I *i) { [i f:12]; }
8669objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8670  matches [i f:12]
8671</pre></td></tr>
8672
8673
8674<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument3')"><a name="hasArgument3Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8675<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8676call expression.
8677
8678Example matches y in x(y)
8679    (matcher = callExpr(hasArgument(0, declRefExpr())))
8680  void x(int) { int y; x(y); }
8681</pre></td></tr>
8682
8683
8684<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiver0')"><a name="hasReceiver0Anchor">hasReceiver</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8685<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8686and the inner matcher matches on that instance.
8687
8688For example the method call in
8689  NSString *x = @"hello";
8690  [x containsString:@"h"];
8691is matched by
8692objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8693</pre></td></tr>
8694
8695
8696<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasReceiverType0')"><a name="hasReceiverType0Anchor">hasReceiverType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8697<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8698
8699Example
8700matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8701matches the [webView ...] message invocation.
8702  NSString *webViewJavaScript = ...
8703  UIWebView *webView = ...
8704  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8705</pre></td></tr>
8706
8707
8708<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyParameter1')"><a name="hasAnyParameter1Anchor">hasAnyParameter</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
8709<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8710block.
8711
8712Does not match the 'this' parameter of a method.
8713
8714Given
8715  class X { void f(int x, int y, int z) {} };
8716cxxMethodDecl(hasAnyParameter(hasName("y")))
8717  matches f(int x, int y, int z) {}
8718with hasAnyParameter(...)
8719  matching int y
8720
8721For ObjectiveC, given
8722  @interface I - (void) f:(int) y; @end
8723
8724the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8725matches the declaration of method f with hasParameter
8726matching y.
8727
8728For blocks, given
8729  b = ^(int y) { printf("%d", y) };
8730
8731the matcher blockDecl(hasAnyParameter(hasName("y")))
8732matches the declaration of the block b with hasParameter
8733matching y.
8734</pre></td></tr>
8735
8736
8737<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;</td><td class="name" onclick="toggle('hasParameter1')"><a name="hasParameter1Anchor">hasParameter</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
8738<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8739declaration or a block.
8740
8741Given
8742  class X { void f(int x) {} };
8743cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8744  matches f(int x) {}
8745with hasParameter(...)
8746  matching int x
8747
8748For ObjectiveC, given
8749  @interface I - (void) f:(int) y; @end
8750
8751the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8752matches the declaration of method f with hasParameter
8753matching y.
8754</pre></td></tr>
8755
8756
8757<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc11')"><a name="hasTypeLoc11Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
8758<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8759
8760Examples:
8761  int x;
8762declaratorDecl(hasTypeLoc(loc(asString("int"))))
8763  matches int x
8764
8765auto x = int(3);
8766cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8767  matches int(3)
8768
8769struct Foo { Foo(int, int); };
8770auto x = Foo(1, 2);
8771cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8772  matches Foo(1, 2)
8773
8774Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
8775  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
8776  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
8777  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8778  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
8779  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
8780  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
8781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8782</pre></td></tr>
8783
8784
8785<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;</td><td class="name" onclick="toggle('hasSourceExpression1')"><a name="hasSourceExpression1Anchor">hasSourceExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
8786<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8787or opaque value's source expression matches the given matcher.
8788
8789Example 1: matches "a string"
8790(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8791class URL { URL(string); };
8792URL url = "a string";
8793
8794Example 2: matches 'b' (matcher =
8795opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8796int a = b ?: 1;
8797</pre></td></tr>
8798
8799
8800<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OverloadExpr.html">OverloadExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyDeclaration0')"><a name="hasAnyDeclaration0Anchor">hasAnyDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
8801<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8802overloads matches the given matcher.
8803
8804Given
8805  template &lt;typename T&gt; void foo(T);
8806  template &lt;typename T&gt; void bar(T);
8807  template &lt;typename T&gt; void baz(T t) {
8808    foo(t);
8809    bar(t);
8810  }
8811unresolvedLookupExpr(hasAnyDeclaration(
8812    functionTemplateDecl(hasName("foo"))))
8813  matches foo in foo(t); but not bar in bar(t);
8814</pre></td></tr>
8815
8816
8817<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;</td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8818<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8819
8820Given
8821  int (*ptr_to_array)[4];
8822  int (*ptr_to_func)(int);
8823
8824varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8825ptr_to_func but not ptr_to_array.
8826
8827Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8828</pre></td></tr>
8829
8830
8831<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasPointeeLoc0')"><a name="hasPointeeLoc0Anchor">hasPointeeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; PointeeMatcher</td></tr>
8832<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
8833`PointeeMatcher`.
8834
8835Given
8836  int* x;
8837pointerTypeLoc(hasPointeeLoc(loc(asString("int"))))
8838  matches `int*`.
8839</pre></td></tr>
8840
8841
8842<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;</td><td class="name" onclick="toggle('pointee2')"><a name="pointee2Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
8843<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8844pointee matches a given matcher.
8845
8846Given
8847  int *a;
8848  int const *b;
8849  float const *f;
8850pointerType(pointee(isConstQualified(), isInteger()))
8851  matches "int const *b"
8852
8853Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
8854  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
8855</pre></td></tr>
8856
8857
8858<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasCanonicalType0')"><a name="hasCanonicalType0Anchor">hasCanonicalType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8859<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8860
8861Given:
8862  typedef int &amp;int_ref;
8863  int a;
8864  int_ref b = a;
8865
8866varDecl(hasType(qualType(referenceType()))))) will not match the
8867declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8868</pre></td></tr>
8869
8870
8871<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8872<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8873matches the given matcher.
8874
8875The associated declaration is:
8876- for type nodes, the declaration of the underlying type
8877- for CallExpr, the declaration of the callee
8878- for MemberExpr, the declaration of the referenced member
8879- for CXXConstructExpr, the declaration of the constructor
8880- for CXXNewExpr, the declaration of the operator new
8881- for ObjCIvarExpr, the declaration of the ivar
8882
8883For type nodes, hasDeclaration will generally match the declaration of the
8884sugared type. Given
8885  class X {};
8886  typedef X Y;
8887  Y y;
8888in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8889typedefDecl. A common use case is to match the underlying, desugared type.
8890This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8891  varDecl(hasType(hasUnqualifiedDesugaredType(
8892      recordType(hasDeclaration(decl())))))
8893In this matcher, the decl will match the CXXRecordDecl of class X.
8894
8895Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8896  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8897  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8898  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8899  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8900  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8901  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8902</pre></td></tr>
8903
8904
8905<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('ignoringParens0')"><a name="ignoringParens0Anchor">ignoringParens</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8906<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8907
8908Given
8909  void (*fp)(void);
8910The matcher
8911  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8912would match the declaration for fp.
8913</pre></td></tr>
8914
8915
8916<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo1')"><a name="pointsTo1Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
8917<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8918</pre></td></tr>
8919
8920
8921<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('pointsTo0')"><a name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8922<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8923matches the specified matcher.
8924
8925Example matches y-&gt;x()
8926  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8927     cxxRecordDecl(hasName("Y")))))))
8928  class Y { public: void x(); };
8929  void z() { Y *y; y-&gt;x(); }
8930</pre></td></tr>
8931
8932
8933<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references1')"><a name="references1Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
8934<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8935</pre></td></tr>
8936
8937
8938<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('references0')"><a name="references0Anchor">references</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
8939<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8940type matches the specified matcher.
8941
8942Example matches X &amp;x and const X &amp;y
8943    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8944  class X {
8945    void a(X b) {
8946      X &amp;x = b;
8947      const X &amp;y = b;
8948    }
8949  };
8950</pre></td></tr>
8951
8952
8953<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualifiedTypeLoc.html">QualifiedTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedLoc0')"><a name="hasUnqualifiedLoc0Anchor">hasUnqualifiedLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
8954<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
8955`InnerMatcher`.
8956
8957Given
8958  int* const x;
8959  const int y;
8960qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
8961  matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
8962</pre></td></tr>
8963
8964
8965<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
8966<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8967matches the given matcher.
8968
8969The associated declaration is:
8970- for type nodes, the declaration of the underlying type
8971- for CallExpr, the declaration of the callee
8972- for MemberExpr, the declaration of the referenced member
8973- for CXXConstructExpr, the declaration of the constructor
8974- for CXXNewExpr, the declaration of the operator new
8975- for ObjCIvarExpr, the declaration of the ivar
8976
8977For type nodes, hasDeclaration will generally match the declaration of the
8978sugared type. Given
8979  class X {};
8980  typedef X Y;
8981  Y y;
8982in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8983typedefDecl. A common use case is to match the underlying, desugared type.
8984This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8985  varDecl(hasType(hasUnqualifiedDesugaredType(
8986      recordType(hasDeclaration(decl())))))
8987In this matcher, the decl will match the CXXRecordDecl of class X.
8988
8989Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
8990  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
8991  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
8992  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
8993  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
8994  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
8995  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8996</pre></td></tr>
8997
8998
8999<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasReferentLoc0')"><a name="hasReferentLoc0Anchor">hasReferentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; ReferentMatcher</td></tr>
9000<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
9001`ReferentMatcher`.
9002
9003Given
9004  int x = 3;
9005  int&amp; xx = x;
9006referenceTypeLoc(hasReferentLoc(loc(asString("int"))))
9007  matches `int&amp;`.
9008</pre></td></tr>
9009
9010
9011<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;</td><td class="name" onclick="toggle('pointee3')"><a name="pointee3Anchor">pointee</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
9012<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
9013pointee matches a given matcher.
9014
9015Given
9016  int *a;
9017  int const *b;
9018  float const *f;
9019pointerType(pointee(isConstQualified(), isInteger()))
9020  matches "int const *b"
9021
9022Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
9023  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
9024</pre></td></tr>
9025
9026
9027<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;</td><td class="name" onclick="toggle('hasReturnValue0')"><a name="hasReturnValue0Anchor">hasReturnValue</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9028<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
9029
9030Given
9031  return a + b;
9032hasReturnValue(binaryOperator())
9033  matches 'return a + b'
9034with binaryOperator()
9035  matching 'a + b'
9036</pre></td></tr>
9037
9038
9039<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySubstatement1')"><a name="hasAnySubstatement1Anchor">hasAnySubstatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
9040<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
9041a given matcher. Also matches StmtExprs that have CompoundStmt as children.
9042
9043Given
9044  { {}; 1+2; }
9045hasAnySubstatement(compoundStmt())
9046  matches '{ {}; 1+2; }'
9047with compoundStmt()
9048  matching '{}'
9049</pre></td></tr>
9050
9051
9052<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
9053<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9054alignof.
9055</pre></td></tr>
9056
9057
9058<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forCallable0')"><a name="forCallable0Anchor">forCallable</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
9059<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
9060belongs to.
9061
9062Given:
9063F&amp; operator=(const F&amp; o) {
9064  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9065  return *this;
9066}
9067returnStmt(forCallable(functionDecl(hasName("operator="))))
9068  matches 'return *this'
9069  but does not match 'return v &gt; 0'
9070
9071Given:
9072-(void) foo {
9073  int x = 1;
9074  dispatch_sync(queue, ^{ int y = 2; });
9075}
9076declStmt(forCallable(objcMethodDecl()))
9077  matches 'int x = 1'
9078  but does not match 'int y = 2'.
9079whereas declStmt(forCallable(blockDecl()))
9080  matches 'int y = 2'
9081  but does not match 'int x = 1'.
9082</pre></td></tr>
9083
9084
9085<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forFunction0')"><a name="forFunction0Anchor">forFunction</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt; InnerMatcher</td></tr>
9086<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
9087
9088Deprecated. Use forCallable() to correctly handle the situation when
9089the declaration is not a function (but a block or an Objective-C method).
9090forFunction() not only fails to take non-functions into account but also
9091may match the wrong declaration in their presence.
9092
9093Given:
9094F&amp; operator=(const F&amp; o) {
9095  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9096  return *this;
9097}
9098returnStmt(forFunction(hasName("operator=")))
9099  matches 'return *this'
9100  but does not match 'return v &gt; 0'
9101</pre></td></tr>
9102
9103
9104<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
9105<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9106sizeof.
9107</pre></td></tr>
9108
9109
9110<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasReplacementType0')"><a name="hasReplacementType0Anchor">hasReplacementType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
9111<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
9112type that matches the provided matcher.
9113
9114Given
9115  template &lt;typename T&gt;
9116  double F(T t);
9117  int i;
9118  double j = F(i);
9119
9120substTemplateTypeParmType(hasReplacementType(type())) matches int
9121</pre></td></tr>
9122
9123
9124<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('forEachSwitchCase0')"><a name="forEachSwitchCase0Anchor">forEachSwitchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
9125<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
9126statement. This matcher may produce multiple matches.
9127
9128Given
9129  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9130switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
9131  matches four times, with "c" binding each of "case 1:", "case 2:",
9132"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
9133"switch (1)", "switch (2)" and "switch (2)".
9134</pre></td></tr>
9135
9136
9137<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9138<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
9139switch statement or conditional operator.
9140
9141Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9142  if (true) {}
9143</pre></td></tr>
9144
9145
9146<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('hasInitStatement1')"><a name="hasInitStatement1Anchor">hasInitStatement</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
9147<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
9148
9149Given:
9150 void foo() {
9151   if (int i = foobar(); i &gt; 0) {}
9152   switch (int i = foobar(); i) {}
9153   for (auto&amp; a = get_range(); auto&amp; x : a) {}
9154 }
9155 void bar() {
9156   if (foobar() &gt; 0) {}
9157   switch (foobar()) {}
9158   for (auto&amp; x : get_range()) {}
9159 }
9160ifStmt(hasInitStatement(anything()))
9161  matches the if statement in foo but not in bar.
9162switchStmt(hasInitStatement(anything()))
9163  matches the switch statement in foo but not in bar.
9164cxxForRangeStmt(hasInitStatement(anything()))
9165  matches the range for statement in foo but not in bar.
9166</pre></td></tr>
9167
9168
9169<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9170<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
9171matches the given matcher.
9172
9173The associated declaration is:
9174- for type nodes, the declaration of the underlying type
9175- for CallExpr, the declaration of the callee
9176- for MemberExpr, the declaration of the referenced member
9177- for CXXConstructExpr, the declaration of the constructor
9178- for CXXNewExpr, the declaration of the operator new
9179- for ObjCIvarExpr, the declaration of the ivar
9180
9181For type nodes, hasDeclaration will generally match the declaration of the
9182sugared type. Given
9183  class X {};
9184  typedef X Y;
9185  Y y;
9186in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9187typedefDecl. A common use case is to match the underlying, desugared type.
9188This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9189  varDecl(hasType(hasUnqualifiedDesugaredType(
9190      recordType(hasDeclaration(decl())))))
9191In this matcher, the decl will match the CXXRecordDecl of class X.
9192
9193Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9194  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9195  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9196  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9197  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9198  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9199  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9200</pre></td></tr>
9201
9202
9203<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc12')"><a name="hasTypeLoc12Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
9204<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
9205
9206Examples:
9207  int x;
9208declaratorDecl(hasTypeLoc(loc(asString("int"))))
9209  matches int x
9210
9211auto x = int(3);
9212cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9213  matches int(3)
9214
9215struct Foo { Foo(int, int); };
9216auto x = Foo(1, 2);
9217cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9218  matches Foo(1, 2)
9219
9220Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
9221  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
9222  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
9223  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9224  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
9225  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
9226  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
9227  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9228</pre></td></tr>
9229
9230
9231<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('isExpr0')"><a name="isExpr0Anchor">isExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9232<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
9233
9234Given
9235  struct B { int next; };
9236  template&lt;int(B::*next_ptr)&gt; struct A {};
9237  A&lt;&amp;B::next&gt; a;
9238templateSpecializationType(hasAnyTemplateArgument(
9239  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
9240  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9241    B::next
9242</pre></td></tr>
9243
9244
9245<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToDeclaration0')"><a name="refersToDeclaration0Anchor">refersToDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
9246<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9247declaration.
9248
9249Given
9250  struct B { int next; };
9251  template&lt;int(B::*next_ptr)&gt; struct A {};
9252  A&lt;&amp;B::next&gt; a;
9253classTemplateSpecializationDecl(hasAnyTemplateArgument(
9254    refersToDeclaration(fieldDecl(hasName("next")))))
9255  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9256    B::next
9257</pre></td></tr>
9258
9259
9260<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToIntegralType0')"><a name="refersToIntegralType0Anchor">refersToIntegralType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9261<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9262
9263Given
9264  template&lt;int T&gt; struct C {};
9265  C&lt;42&gt; c;
9266classTemplateSpecializationDecl(
9267  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9268  matches the implicit instantiation of C in C&lt;42&gt;.
9269</pre></td></tr>
9270
9271
9272<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt; InnerMatcher</td></tr>
9273<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9274
9275Given
9276  template&lt;template &lt;typename&gt; class S&gt; class X {};
9277  template&lt;typename T&gt; class Y {};
9278  X&lt;Y&gt; xi;
9279classTemplateSpecializationDecl(hasAnyTemplateArgument(
9280    refersToTemplate(templateName())))
9281  matches the specialization X&lt;Y&gt;
9282</pre></td></tr>
9283
9284
9285<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9286<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9287
9288Given
9289  struct X {};
9290  template&lt;typename T&gt; struct A {};
9291  A&lt;X&gt; a;
9292classTemplateSpecializationDecl(hasAnyTemplateArgument(
9293    refersToType(class(hasName("X")))))
9294  matches the specialization A&lt;X&gt;
9295</pre></td></tr>
9296
9297
9298<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgumentLoc0')"><a name="hasAnyTemplateArgumentLoc0Anchor">hasAnyTemplateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9299<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one
9300`TemplateArgumentLoc` matching the given `InnerMatcher`.
9301
9302Given
9303  template&lt;typename T&gt; class A {};
9304  A&lt;int&gt; a;
9305varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
9306  hasTypeLoc(loc(asString("int")))))))
9307  matches `A&lt;int&gt; a`.
9308</pre></td></tr>
9309
9310
9311<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationTypeLoc.html">TemplateSpecializationTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgumentLoc1')"><a name="hasTemplateArgumentLoc1Anchor">hasTemplateArgumentLoc</a></td><td>unsigned Index, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt; InnerMatcher</td></tr>
9312<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th
9313`TemplateArgumentLoc` matches the given `InnerMatcher`.
9314
9315Given
9316  template&lt;typename T, typename U&gt; class A {};
9317  A&lt;double, int&gt; b;
9318  A&lt;int, double&gt; c;
9319varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
9320  hasTypeLoc(loc(asString("double")))))))
9321  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
9322</pre></td></tr>
9323
9324
9325<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasAnyTemplateArgument1')"><a name="hasAnyTemplateArgument1Anchor">hasAnyTemplateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
9326<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9327functionDecl that have at least one TemplateArgument matching the given
9328InnerMatcher.
9329
9330Given
9331  template&lt;typename T&gt; class A {};
9332  template&lt;&gt; class A&lt;double&gt; {};
9333  A&lt;int&gt; a;
9334
9335  template&lt;typename T&gt; f() {};
9336  void func() { f&lt;int&gt;(); };
9337
9338classTemplateSpecializationDecl(hasAnyTemplateArgument(
9339    refersToType(asString("int"))))
9340  matches the specialization A&lt;int&gt;
9341
9342functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9343  matches the specialization f&lt;int&gt;
9344</pre></td></tr>
9345
9346
9347<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9348<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9349matches the given matcher.
9350
9351The associated declaration is:
9352- for type nodes, the declaration of the underlying type
9353- for CallExpr, the declaration of the callee
9354- for MemberExpr, the declaration of the referenced member
9355- for CXXConstructExpr, the declaration of the constructor
9356- for CXXNewExpr, the declaration of the operator new
9357- for ObjCIvarExpr, the declaration of the ivar
9358
9359For type nodes, hasDeclaration will generally match the declaration of the
9360sugared type. Given
9361  class X {};
9362  typedef X Y;
9363  Y y;
9364in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9365typedefDecl. A common use case is to match the underlying, desugared type.
9366This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9367  varDecl(hasType(hasUnqualifiedDesugaredType(
9368      recordType(hasDeclaration(decl())))))
9369In this matcher, the decl will match the CXXRecordDecl of class X.
9370
9371Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9372  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9373  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9374  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9375  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9376  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9377  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9378</pre></td></tr>
9379
9380
9381<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasTemplateArgument1')"><a name="hasTemplateArgument1Anchor">hasTemplateArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
9382<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9383functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9384
9385Given
9386  template&lt;typename T, typename U&gt; class A {};
9387  A&lt;bool, int&gt; b;
9388  A&lt;int, bool&gt; c;
9389
9390  template&lt;typename T&gt; void f() {}
9391  void func() { f&lt;int&gt;(); };
9392classTemplateSpecializationDecl(hasTemplateArgument(
9393    1, refersToType(asString("int"))))
9394  matches the specialization A&lt;bool, int&gt;
9395
9396functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9397  matches the specialization f&lt;int&gt;
9398</pre></td></tr>
9399
9400
9401<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9402<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9403matches the given matcher.
9404
9405The associated declaration is:
9406- for type nodes, the declaration of the underlying type
9407- for CallExpr, the declaration of the callee
9408- for MemberExpr, the declaration of the referenced member
9409- for CXXConstructExpr, the declaration of the constructor
9410- for CXXNewExpr, the declaration of the operator new
9411- for ObjCIvarExpr, the declaration of the ivar
9412
9413For type nodes, hasDeclaration will generally match the declaration of the
9414sugared type. Given
9415  class X {};
9416  typedef X Y;
9417  Y y;
9418in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9419typedefDecl. A common use case is to match the underlying, desugared type.
9420This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9421  varDecl(hasType(hasUnqualifiedDesugaredType(
9422      recordType(hasDeclaration(decl())))))
9423In this matcher, the decl will match the CXXRecordDecl of class X.
9424
9425Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9426  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9427  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9428  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9429  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9430  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9431  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9432</pre></td></tr>
9433
9434
9435<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9436<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9437QualType-matcher matches.
9438</pre></td></tr>
9439
9440
9441<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasTypeLoc13')"><a name="hasTypeLoc13Anchor">hasTypeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
9442<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9443
9444Examples:
9445  int x;
9446declaratorDecl(hasTypeLoc(loc(asString("int"))))
9447  matches int x
9448
9449auto x = int(3);
9450cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9451  matches int(3)
9452
9453struct Foo { Foo(int, int); };
9454auto x = Foo(1, 2);
9455cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9456  matches Foo(1, 2)
9457
9458Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;,
9459  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;,
9460  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;,
9461  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9462  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;,
9463  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;,
9464  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;,
9465  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9466</pre></td></tr>
9467
9468
9469<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9470<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9471matcher.
9472
9473Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9474            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9475            and U (matcher = typedefDecl(hasType(asString("int")))
9476            and friend class X (matcher = friendDecl(hasType("X"))
9477            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9478                                              asString("class X")))
9479 class X {};
9480 void y(X &amp;x) { x; X z; }
9481 typedef int U;
9482 class Y { friend class X; };
9483 class Z : public virtual X {};
9484</pre></td></tr>
9485
9486
9487<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9488<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9489matches the given matcher.
9490
9491The associated declaration is:
9492- for type nodes, the declaration of the underlying type
9493- for CallExpr, the declaration of the callee
9494- for MemberExpr, the declaration of the referenced member
9495- for CXXConstructExpr, the declaration of the constructor
9496- for CXXNewExpr, the declaration of the operator new
9497- for ObjCIvarExpr, the declaration of the ivar
9498
9499For type nodes, hasDeclaration will generally match the declaration of the
9500sugared type. Given
9501  class X {};
9502  typedef X Y;
9503  Y y;
9504in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9505typedefDecl. A common use case is to match the underlying, desugared type.
9506This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9507  varDecl(hasType(hasUnqualifiedDesugaredType(
9508      recordType(hasDeclaration(decl())))))
9509In this matcher, the decl will match the CXXRecordDecl of class X.
9510
9511Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9512  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9513  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9514  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9515  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9516  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9517  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9518</pre></td></tr>
9519
9520
9521<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('hasUnqualifiedDesugaredType0')"><a name="hasUnqualifiedDesugaredType0Anchor">hasUnqualifiedDesugaredType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt; InnerMatcher</td></tr>
9522<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9523type of the matched node.
9524
9525For example, in:
9526  class A {};
9527  using B = A;
9528The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9529both B and A.
9530</pre></td></tr>
9531
9532
9533<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgumentOfType0')"><a name="hasArgumentOfType0Anchor">hasArgumentOfType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9534<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9535
9536Given
9537  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9538unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9539  matches sizeof(a) and alignof(c)
9540</pre></td></tr>
9541
9542
9543<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasUnaryOperand0')"><a name="hasUnaryOperand0Anchor">hasUnaryOperand</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9544<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9545
9546Example matches true (matcher = hasUnaryOperand(
9547                                  cxxBoolLiteral(equals(true))))
9548  !true
9549</pre></td></tr>
9550
9551
9552<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasObjectExpression1')"><a name="hasObjectExpression1Anchor">hasObjectExpression</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9553<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9554given matcher. Implicit object expressions are included; that is, it matches
9555use of implicit `this`.
9556
9557Given
9558  struct X {
9559    int m;
9560    int f(X x) { x.m; return m; }
9561  };
9562memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9563  matches `x.m`, but not `m`; however,
9564memberExpr(hasObjectExpression(hasType(pointsTo(
9565     cxxRecordDecl(hasName("X"))))))
9566  matches `m` (aka. `this-&gt;m`), but not `x.m`.
9567</pre></td></tr>
9568
9569
9570<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
9571<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9572matches the given matcher.
9573
9574The associated declaration is:
9575- for type nodes, the declaration of the underlying type
9576- for CallExpr, the declaration of the callee
9577- for MemberExpr, the declaration of the referenced member
9578- for CXXConstructExpr, the declaration of the constructor
9579- for CXXNewExpr, the declaration of the operator new
9580- for ObjCIvarExpr, the declaration of the ivar
9581
9582For type nodes, hasDeclaration will generally match the declaration of the
9583sugared type. Given
9584  class X {};
9585  typedef X Y;
9586  Y y;
9587in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9588typedefDecl. A common use case is to match the underlying, desugared type.
9589This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9590  varDecl(hasType(hasUnqualifiedDesugaredType(
9591      recordType(hasDeclaration(decl())))))
9592In this matcher, the decl will match the CXXRecordDecl of class X.
9593
9594Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
9595  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
9596  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
9597  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
9598  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
9599  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
9600  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9601</pre></td></tr>
9602
9603
9604<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt;</td><td class="name" onclick="toggle('hasTargetDecl0')"><a name="hasTargetDecl0Anchor">hasTargetDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
9605<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9606matched by the given matcher.
9607
9608Given
9609  namespace X { int a; void b(); }
9610  using X::a;
9611  using X::b;
9612usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9613  matches using X::b but not using X::a </pre></td></tr>
9614
9615
9616<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType7')"><a name="hasType7Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
9617<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9618declaration's type.
9619
9620In case of a value declaration (for example a variable declaration),
9621this resolves one layer of indirection. For example, in the value
9622declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9623X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9624declaration of x.
9625
9626Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9627            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9628            and friend class X (matcher = friendDecl(hasType("X"))
9629            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9630                                              cxxRecordDecl(hasName("X"))))
9631 class X {};
9632 void y(X &amp;x) { x; X z; }
9633 class Y { friend class X; };
9634 class Z : public virtual X {};
9635
9636Example matches class Derived
9637(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9638class Base {};
9639class Derived : Base {};
9640
9641Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;,
9642Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
9643</pre></td></tr>
9644
9645
9646<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType3')"><a name="hasType3Anchor">hasType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
9647<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9648matcher.
9649
9650Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9651            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9652            and U (matcher = typedefDecl(hasType(asString("int")))
9653            and friend class X (matcher = friendDecl(hasType("X"))
9654            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9655                                              asString("class X")))
9656 class X {};
9657 void y(X &amp;x) { x; X z; }
9658 typedef int U;
9659 class Y { friend class X; };
9660 class Z : public virtual X {};
9661</pre></td></tr>
9662
9663
9664<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasInitializer0')"><a name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9665<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9666that matches the given matcher.
9667
9668Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9669  bool y() { return true; }
9670  bool x = y();
9671</pre></td></tr>
9672
9673
9674<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSizeExpr0')"><a name="hasSizeExpr0Anchor">hasSizeExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9675<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9676expression.
9677
9678Given
9679  void f(int b) {
9680    int a[b];
9681  }
9682variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9683  varDecl(hasName("b")))))))
9684  matches "int a[b]"
9685</pre></td></tr>
9686
9687
9688<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasBody2')"><a name="hasBody2Anchor">hasBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
9689<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9690
9691
9692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;</td><td class="name" onclick="toggle('hasCondition2')"><a name="hasCondition2Anchor">hasCondition</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
9693<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9694switch statement or conditional operator.
9695
9696Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9697  if (true) {}
9698</pre></td></tr>
9699
9700<!--END_TRAVERSAL_MATCHERS -->
9701</table>
9702
9703</div>
9704</body>
9705</html>
9706
9707
9708