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