1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20span.mono { font-family: monospace; }
21
22.traverse_compare, .traverse_compare td, .traverse_compare th {
23  border: 1px solid black;
24  border-collapse: collapse;
25}
26</style>
27<script type="text/javascript">
28function toggle(id) {
29  if (!id) return;
30  row = document.getElementById(id);
31  if (row.style.display != 'table-cell')
32    row.style.display = 'table-cell';
33  else
34    row.style.display = 'none';
35}
36</script>
37</head>
38<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
39
40<!--#include virtual="../menu.html.incl"-->
41
42<div id="content">
43
44<h1>AST Matcher Reference</h1>
45
46<p>This document shows all currently implemented matchers. The matchers are grouped
47by category and node type they match. You can click on matcher names to show the
48matcher's source documentation.</p>
49
50<p>There are three different basic categories of matchers:
51<ul>
52<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
53<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
54<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
55</ul>
56</p>
57
58<p>Within each category the matchers are ordered by node type they match on.
59Note that if a matcher can match multiple node types, it will appear
60multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
61find all matchers that can be used to match on Stmt nodes.</p>
62
63<p>The exception to that rule are matchers that can match on any node. Those
64are marked with a * and are listed in the beginning of each category.</p>
65
66<p>Note that the categorization of matchers is a great help when you combine
67them into matcher expressions. You will usually want to form matcher expressions
68that read like english sentences by alternating between node matchers and
69narrowing or traversal matchers, like this:
70<pre>
71recordDecl(hasDescendant(
72    ifStmt(hasTrueExpression(
73        expr(hasDescendant(
74            ifStmt()))))))
75</pre>
76</p>
77
78<!-- ======================================================================= -->
79<h2 id="traverse-mode">Traverse Mode</h2>
80<!-- ======================================================================= -->
81
82<p>The default mode of operation of AST Matchers visits all nodes in the AST,
83even if they are not spelled in the source. This is
84<span class="mono">AsIs</span> mode.  This mode requires writing AST matchers
85that explicitly traverse or ignore implicit nodes, such as parentheses
86surrounding an expression or expressions with cleanups.  These implicit
87nodes are not always obvious from the syntax of the source code, and so this
88mode requires careful consideration and testing to get the desired behavior
89from an AST matcher.
90</p>
91
92<p>In addition, because template instantiations are matched in the default mode,
93transformations can be accidentally made to template declarations. Finally,
94because implicit nodes are matched by default, transformations can be made on
95entirely incorrect places in the code.</p>
96
97<p>For these reasons, it is possible to ignore AST nodes which are not spelled
98in the source using the <span class="mono">IgnoreUnlessSpelledInSource</span>
99mode. This is likely to be far less error-prone for users who are not already
100very familiar with where implicit nodes appear in the AST. It is also likely
101to be less error-prone for experienced AST users, as difficult cases do not
102need to be encountered and matcher expressions adjusted for these cases.</p>
103
104<p>In clang-query, the mode can be changed with
105<pre>
106set traversal IgnoreUnlessSpelledInSource
107</pre>
108</p>
109This affects both matchers and AST dump output in results.
110
111<p>When using the C++ API such as in clang-tidy checks, the
112<span class="mono">traverse()</span> matcher is used to set the mode:
113<pre>
114Finder->addMatcher(traverse(TK_IgnoreUnlessSpelledInSource,
115  returnStmt(hasReturnArgument(integerLiteral(equals(0))))
116  ), this);
117</pre>
118</p>
119<p>The following table compares the <span class="mono">AsIs</span> mode with
120the <span class="mono">IgnoreUnlessSpelledInSource</span> mode:</p>
121
122<table class="traverse_compare">
123<tr>
124<th></th>
125<th><span class="mono">AsIs</span></th>
126<th><span class="mono">IgnoreUnlessSpelledInSource</span></th>
127</tr>
128<tr>
129  <td>AST dump of <span class="mono">func1</span>:
130<pre>
131struct B {
132  B(int);
133};
134
135B func1() { return 42; }
136</pre>
137
138  </td>
139  <td>
140C++98 dialect:
141<pre>
142FunctionDecl
143`-CompoundStmt
144  `-ReturnStmt
145    `-ExprWithCleanups
146      `-CXXConstructExpr
147        `-MaterializeTemporaryExpr
148          `-ImplicitCastExpr
149            `-ImplicitCastExpr
150              `-CXXConstructExpr
151                `-IntegerLiteral 'int' 42
152</pre>
153C++11, C++14 dialect:
154<pre>
155FunctionDecl
156`-CompoundStmt
157  `-ReturnStmt
158    `-ExprWithCleanups
159      `-CXXConstructExpr
160        `-MaterializeTemporaryExpr
161          `-ImplicitCastExpr
162            `-CXXConstructExpr
163              `-IntegerLiteral 'int' 42
164</pre>
165C++17, C++20 dialect:
166<pre>
167FunctionDecl
168`-CompoundStmt
169  `-ReturnStmt
170    `-ImplicitCastExpr
171      `-CXXConstructExpr
172        `-IntegerLiteral 'int' 42
173</pre>
174</td>
175  <td>
176All dialects:
177    <pre>
178FunctionDecl
179`-CompoundStmt
180  `-ReturnStmt
181    `-IntegerLiteral 'int' 42
182</pre></td>
183</tr>
184
185<tr>
186<td>Matcher for returned <span class="mono">42</span>:
187<pre>
188struct B {
189  B(int);
190};
191
192B func1() { return 42; }
193</pre>
194
195  </td>
196  <td>
197All dialects:
198<pre>
199returnStmt(hasReturnValue(
200    ignoringImplicit(
201        ignoringElidableConstructorCall(
202            ignoringImplicit(
203                cxxConstructExpr(hasArgument(0,
204                    ignoringImplicit(
205                        integerLiteral().bind("returnVal")
206                        )
207                    ))
208                )
209            )
210        )
211    ))
212</pre></td>
213  <td>
214All dialects:
215<pre>
216returnStmt(hasReturnValue(
217    integerLiteral().bind("returnVal")
218))
219</pre></td>
220</tr>
221<tr>
222<td>Match result for
223<pre>implicitCastExpr()</pre>
224given:
225<pre>
226struct B {
227  B(int);
228};
229
230B func1() { return 42; }
231</pre>
232
233</td>
234<td>
235Match found.</td>
236  <td>
237No match.</td>
238</tr>
239<tr>
240  <td>Match result for:
241<pre>
242cxxConstructorDecl(
243  isCopyConstructor()
244  ).bind("prepend_explicit")
245</pre>
246given:
247<pre>
248struct Other {};
249struct Copyable {
250  Other m_o;
251  Copyable();
252};
253</pre>
254</td>
255<td>
256Match found. Insertion produces incorrect output:
257<pre>
258struct Other {};
259struct explicit Copyable {
260  Other m_o;
261  Copyable();
262};
263</pre>
264</td>
265<td>
266No match found. Incorrect replacement not possible.
267</td>
268</tr>
269<tr>
270  <td>Replacement of <span class="mono">begin()</span>
271    with <span class="mono">cbegin()</span>:
272<pre>
273cxxMemberCallExpr(
274  on(ConstContainerExpr),
275  callee(cxxMethodDecl(hasName("begin")))
276  ).bind("replace_with_cbegin")
277</pre>
278given:
279<pre>
280void foo() {
281  const Container c;
282  c.begin();
283
284  for (auto i : c) {
285  }
286}
287</pre>
288</td>
289<td>
2902 matches found. Replacement produces incorrect output:
291<pre>
292void foo() {
293  const Container c;
294  c.cbegin();
295
296  for (auto i :.cbegin() c) {
297  }
298}
299</pre>
300</td>
301<td>
3021 match found. Replacement produces correct output:
303<pre>
304void foo() {
305  const Container c;
306  c.cbegin();
307
308  for (auto i : c) {
309  }
310}
311</pre>
312</td>
313</tr>
314<tr>
315  <td>Replacement of <span class="mono">int</span> member
316    with <span class="mono">safe_int</span>:
317<pre>
318fieldDecl(
319  hasType(asString("int"))
320  ).bind("use_safe_int")
321</pre>
322given:
323<pre>
324struct S {
325  int m_i;
326};
327
328template &lt;typename T&gt; struct TemplStruct {
329  TemplStruct() {}
330  ~TemplStruct() {}
331
332private:
333  T m_t;
334};
335
336void instantiate() { TemplStruct&lt;int&gt; ti; }
337</pre>
338</td>
339<td>
3402 matches found. Replacement produces incorrect output:
341<pre>
342struct S {
343  safe_int m_i;
344};
345
346template &lt;typename T&gt; struct TemplStruct {
347  TemplStruct() {}
348  ~TemplStruct() {}
349
350private:
351  safe_int m_t;
352};
353
354void instantiate() { TemplStruct&lt;int&gt; ti; }
355</pre>
356</td>
357<td>
3581 match found. Replacement produces correct output:
359<pre>
360struct S {
361  safe_int m_i;
362};
363
364template &lt;typename T&gt; struct TemplStruct {
365  TemplStruct() {}
366  ~TemplStruct() {}
367
368private:
369  T m_t;
370};
371
372void instantiate() { TemplStruct&lt;int&gt; ti; }
373</pre>
374</td>
375</tr>
376<tr>
377  <td>Add prefix to member initializer
378<pre>
379cxxCtorInitializer(
380  forField(fieldDecl())
381  ).bind("add_prefix")
382</pre>
383given:
384<pre>
385struct Simple {};
386
387struct Record {
388  Record() : i(42) {}
389private:
390  int i;
391  Simple s;
392};
393</pre>
394</td>
395<td>
3962 matches found. Replacement produces incorrect output:
397<pre>
398struct Simple {};
399
400struct Record {
401  m_Record() : m_i(42) {}
402private:
403  int i;
404  Simple s;
405};
406</pre>
407</td>
408<td>
4091 match found. Replacement produces correct output:
410<pre>
411struct Simple {};
412
413struct Record {
414  Record() : m_i(42) {}
415private:
416  int i;
417  Simple s;
418};
419</pre>
420</td>
421</tr>
422<tr>
423  <td>Ignored default arguments
424<pre>
425callExpr(
426  callee(functionDecl(
427    hasName("hasDefaultArg")
428    )),
429  argumentCountIs(1)
430  ).bind("add_prefix")
431</pre>
432given:
433<pre>
434void hasDefaultArg(int i, int j = 0) {}
435void callDefaultArg() { hasDefaultArg(42); }
436</pre>
437</td>
438<td>
439No match.
440</td>
441<td>
4421 match found.
443</td>
444</tr>
445<tr>
446  <td>Lambda fields
447<pre>
448fieldDecl(
449  hasType(asString("int"))
450  ).bind("make_safe")
451</pre>
452given:
453<pre>
454struct S {
455  int m_i;
456};
457
458void func() {
459  int a = 0;
460  int c = 0;
461
462  auto l = [a, b = c](int d) { int e = d; };
463  l(43);
464}
465</pre>
466</td>
467<td>
4682 matches found. Replacement produces incorrect output:
469<pre>
470struct S {
471  safe_int m_i;
472};
473
474void func() {
475  int a = 0;
476  int c = 0;
477
478  auto l = [safe_a, safe_b = c](int d) { int e = d; };
479  l(43);
480}
481</pre>
482</td>
483<td>
4841 match found. Replacement produces correct output:
485<pre>
486struct S {
487  safe_int m_i;
488};
489
490void func() {
491  int a = 0;
492  int c = 0;
493
494  auto l = [a, b = c](int d) { int e = d; };
495  l(43);
496}
497</pre>
498</td>
499
500</tr>
501
502
503
504
505
506<tr>
507  <td>Rewritten binary operators
508<pre>
509binaryOperator(
510  hasOperatorName("&lt;"),
511  hasRHS(hasDescendant(integerLiteral(equals(0))))
512  )
513</pre>
514given:
515<pre>
516#include &lt;compare&gt;
517
518class HasSpaceship {
519public:
520   int x;
521   bool operator==(const HasSpaceship&) const = default;
522   std::strong_ordering operator<=>(const HasSpaceship&) const = default;
523};
524
525bool isLess(const HasSpaceship& a, const HasSpaceship& b) {
526   return a < b;
527}
528</pre>
529</td>
530<td>
5311 match found.
532
533<pre>
534   return a < b;
535          ^~~~~
536</pre>
537
538</td>
539<td>
540No match found.
541</td>
542</tr>
543</table>
544
545<!-- ======================================================================= -->
546<h2 id="decl-matchers">Node Matchers</h2>
547<!-- ======================================================================= -->
548
549<p>Node matchers are at the core of matcher expressions - they specify the type
550of node that is expected. Every match expression starts with a node matcher,
551which can then be further refined with a narrowing or traversal matcher. All
552traversal matchers take node matchers as their arguments.</p>
553
554<p>For convenience, all node matchers take an arbitrary number of arguments
555and implicitly act as allOf matchers.</p>
556
557<p>Node matchers are the only matchers that support the bind("id") call to
558bind the matched node to the given string, to be later retrieved from the
559match callback.</p>
560
561<p>It is important to remember that the arguments to node matchers are
562predicates on the same node, just with additional information about the type.
563This is often useful to make matcher expression more readable by inlining bind
564calls into redundant node matchers inside another node matcher:
565<pre>
566// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
567// the same node.
568recordDecl(decl().bind("id"), hasName("::MyClass"))
569</pre>
570</p>
571
572<table>
573<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
574<!-- START_DECL_MATCHERS -->
575
576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;</td><td class="name" onclick="toggle('attr0')"><a name="attr0Anchor">attr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Attr.html">Attr</a>&gt;...</td></tr>
577<tr><td colspan="4" class="doc" id="attr0"><pre>Matches attributes.
578Attributes may be attached with a variety of different syntaxes (including
579keywords, C++11 attributes, GNU ``__attribute``` and MSVC `__declspec``,
580and ``#pragma``s). They may also be implicit.
581
582Given
583  struct [[nodiscard]] Foo{};
584  void bar(int * __attribute__((nonnull)) );
585  __declspec(noinline) void baz();
586
587  #pragma omp declare simd
588  int min();
589attr()
590  matches "nodiscard", "nonnull", "noinline", and the whole "#pragma" line.
591</pre></td></tr>
592
593
594<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('cxxBaseSpecifier0')"><a name="cxxBaseSpecifier0Anchor">cxxBaseSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;...</td></tr>
595<tr><td colspan="4" class="doc" id="cxxBaseSpecifier0"><pre>Matches class bases.
596
597Examples matches public virtual B.
598  class B {};
599  class C : public virtual B {};
600</pre></td></tr>
601
602
603<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
604<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
605
606Examples matches i(42).
607  class C {
608    C() : i(42) {}
609    int i;
610  };
611</pre></td></tr>
612
613
614<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
615<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
616
617Given
618  class C {
619  public:
620    int a;
621  };
622accessSpecDecl()
623  matches 'public:'
624</pre></td></tr>
625
626
627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('bindingDecl0')"><a name="bindingDecl0Anchor">bindingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BindingDecl.html">BindingDecl</a>&gt;...</td></tr>
628<tr><td colspan="4" class="doc" id="bindingDecl0"><pre>Matches binding declarations
629Example matches foo and bar
630(matcher = bindingDecl()
631
632  auto [foo, bar] = std::make_pair{42, 42};
633</pre></td></tr>
634
635
636<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
637<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
638
639Example matches the declaration of the nameless block printing an input
640integer.
641
642  myFunc(^(int p) {
643    printf("%d", p);
644  })
645</pre></td></tr>
646
647
648<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
649<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
650
651Example matches Z
652  template&lt;class T&gt; class Z {};
653</pre></td></tr>
654
655
656<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
657<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
658
659Given
660  template&lt;class T1, class T2, int I&gt;
661  class A {};
662
663  template&lt;class T, int I&gt;
664  class A&lt;T, T*, I&gt; {};
665
666  template&lt;&gt;
667  class A&lt;int, int, 1&gt; {};
668classTemplatePartialSpecializationDecl()
669  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
670</pre></td></tr>
671
672
673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
674<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
675
676Given
677  template&lt;typename T&gt; class A {};
678  template&lt;&gt; class A&lt;double&gt; {};
679  A&lt;int&gt; a;
680classTemplateSpecializationDecl()
681  matches the specializations A&lt;int&gt; and A&lt;double&gt;
682</pre></td></tr>
683
684
685<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
686<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
687
688Example matches Foo::Foo() and Foo::Foo(int)
689  class Foo {
690   public:
691    Foo();
692    Foo(int);
693    int DoSomething();
694  };
695</pre></td></tr>
696
697
698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
699<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
700
701Example matches the operator.
702  class X { operator int() const; };
703</pre></td></tr>
704
705
706<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
707<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
708
709Example matches the deduction guide.
710  template&lt;typename T&gt;
711  class X { X(int) };
712  X(int) -&gt; X&lt;int&gt;;
713</pre></td></tr>
714
715
716<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
717<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
718
719Example matches Foo::~Foo()
720  class Foo {
721   public:
722    virtual ~Foo();
723  };
724</pre></td></tr>
725
726
727<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
728<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
729
730Example matches y
731  class X { void y(); };
732</pre></td></tr>
733
734
735<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
736<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
737
738Example matches X, Z
739  class X;
740  template&lt;class T&gt; class Z {};
741</pre></td></tr>
742
743
744<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
745<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
746
747Examples matches X, C, and the friend declaration inside C;
748  void X();
749  class C {
750    friend X;
751  };
752</pre></td></tr>
753
754
755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
756<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
757and non-type template parameter declarations).
758
759Given
760  class X { int y; };
761declaratorDecl()
762  matches int y.
763</pre></td></tr>
764
765
766<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
767<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
768
769Examples matches the declaration node with foo and bar, but not
770number.
771(matcher = declStmt(has(decompositionDecl())))
772
773  int number = 42;
774  auto [foo, bar] = std::make_pair{42, 42};
775</pre></td></tr>
776
777
778<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
779<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
780
781Example matches A, B, C
782  enum X {
783    A, B, C
784  };
785</pre></td></tr>
786
787
788<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
789<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
790
791Example matches X
792  enum X {
793    A, B, C
794  };
795</pre></td></tr>
796
797
798<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
799<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
800
801Given
802  class X { int m; };
803fieldDecl()
804  matches 'm'.
805</pre></td></tr>
806
807
808<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
809<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
810
811Given
812  class X { friend void foo(); };
813friendDecl()
814  matches 'friend void foo()'.
815</pre></td></tr>
816
817
818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
819<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
820
821Example matches f
822  void f();
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
827<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
828
829Example matches f
830  template&lt;class T&gt; void f(T t) {}
831</pre></td></tr>
832
833
834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
835<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
836
837Given
838  struct X { struct { int a; }; };
839indirectFieldDecl()
840  matches 'a'.
841</pre></td></tr>
842
843
844<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
845<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
846
847Given
848  goto FOO;
849  FOO: bar();
850labelDecl()
851  matches 'FOO:'
852</pre></td></tr>
853
854
855<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
856<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
857
858Given
859  extern "C" {}
860linkageSpecDecl()
861  matches "extern "C" {}"
862</pre></td></tr>
863
864
865<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
866<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
867
868Example matches X, S, the anonymous union type, i, and U;
869  typedef int X;
870  struct S {
871    union {
872      int i;
873    } U;
874  };
875</pre></td></tr>
876
877
878<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
879<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
880
881Given
882  namespace test {}
883  namespace alias = ::test;
884namespaceAliasDecl()
885  matches "namespace alias" but not "namespace test"
886</pre></td></tr>
887
888
889<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
890<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
891
892Given
893  namespace {}
894  namespace test {}
895namespaceDecl()
896  matches "namespace {}" and "namespace test {}"
897</pre></td></tr>
898
899
900<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
901<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
902
903Given
904  template &lt;typename T, int N&gt; struct C {};
905nonTypeTemplateParmDecl()
906  matches 'N', but not 'T'.
907</pre></td></tr>
908
909
910<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
911<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
912
913Example matches Foo (Additions)
914  @interface Foo (Additions)
915  @end
916</pre></td></tr>
917
918
919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
920<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
921
922Example matches Foo (Additions)
923  @implementation Foo (Additions)
924  @end
925</pre></td></tr>
926
927
928<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
929<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
930
931Example matches Foo
932  @implementation Foo
933  @end
934</pre></td></tr>
935
936
937<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
938<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
939
940Example matches Foo
941  @interface Foo
942  @end
943</pre></td></tr>
944
945
946<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
947<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
948
949Example matches _enabled
950  @implementation Foo {
951    BOOL _enabled;
952  }
953  @end
954</pre></td></tr>
955
956
957<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
958<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
959
960Example matches both declaration and definition of -[Foo method]
961  @interface Foo
962  - (void)method;
963  @end
964
965  @implementation Foo
966  - (void)method {}
967  @end
968</pre></td></tr>
969
970
971<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
972<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
973
974Example matches enabled
975  @interface Foo
976  @property BOOL enabled;
977  @end
978</pre></td></tr>
979
980
981<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
982<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
983
984Example matches FooDelegate
985  @protocol FooDelegate
986  @end
987</pre></td></tr>
988
989
990<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
991<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
992
993Given
994  void f(int x);
995parmVarDecl()
996  matches int x.
997</pre></td></tr>
998
999
1000<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
1001<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
1002
1003Example matches X, Z, U, and S
1004  class X;
1005  template&lt;class T&gt; class Z {};
1006  struct S {};
1007  union U {};
1008</pre></td></tr>
1009
1010
1011<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
1012<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
1013
1014Example:
1015  staticAssertExpr()
1016matches
1017  static_assert(sizeof(S) == sizeof(int))
1018in
1019  struct S {
1020    int x;
1021  };
1022  static_assert(sizeof(S) == sizeof(int));
1023</pre></td></tr>
1024
1025
1026<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
1027<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
1028
1029Example matches X, Z, U, S, E
1030  class X;
1031  template&lt;class T&gt; class Z {};
1032  struct S {};
1033  union U {};
1034  enum E {
1035    A, B, C
1036  };
1037</pre></td></tr>
1038
1039
1040<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
1041<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
1042
1043Given
1044  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
1045templateTypeParmDecl()
1046  matches 'Z', but not 'N'.
1047</pre></td></tr>
1048
1049
1050<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
1051<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
1052
1053Given
1054  template &lt;typename T, int N&gt; struct C {};
1055templateTypeParmDecl()
1056  matches 'T', but not 'N'.
1057</pre></td></tr>
1058
1059
1060<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
1061<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
1062
1063Given
1064  int X;
1065  namespace NS {
1066  int Y;
1067  }  // namespace NS
1068decl(hasDeclContext(translationUnitDecl()))
1069  matches "int X", but not "int Y".
1070</pre></td></tr>
1071
1072
1073<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
1074<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
1075
1076Given
1077  typedef int X;
1078  using Y = int;
1079typeAliasDecl()
1080  matches "using Y = int", but not "typedef int X"
1081</pre></td></tr>
1082
1083
1084<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
1085<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
1086
1087typeAliasTemplateDecl() matches
1088  template &lt;typename T&gt;
1089  using Y = X&lt;T&gt;;
1090</pre></td></tr>
1091
1092
1093<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
1094<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
1095
1096Given
1097  typedef int X;
1098  using Y = int;
1099typedefDecl()
1100  matches "typedef int X", but not "using Y = int"
1101</pre></td></tr>
1102
1103
1104<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
1105<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
1106
1107Given
1108  typedef int X;
1109  using Y = int;
1110typedefNameDecl()
1111  matches "typedef int X" and "using Y = int"
1112</pre></td></tr>
1113
1114
1115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
1116<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
1117typename.
1118
1119Given
1120  template &lt;typename T&gt;
1121  struct Base { typedef T Foo; };
1122
1123  template&lt;typename T&gt;
1124  struct S : private Base&lt;T&gt; {
1125    using typename Base&lt;T&gt;::Foo;
1126  };
1127unresolvedUsingTypenameDecl()
1128  matches using Base&lt;T&gt;::Foo </pre></td></tr>
1129
1130
1131<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
1132<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
1133
1134Given
1135  template&lt;typename X&gt;
1136  class C : private X {
1137    using X::x;
1138  };
1139unresolvedUsingValueDecl()
1140  matches using X::x </pre></td></tr>
1141
1142
1143<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
1144<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
1145
1146Given
1147  namespace X { int x; }
1148  using X::x;
1149usingDecl()
1150  matches using X::x </pre></td></tr>
1151
1152
1153<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
1154<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
1155
1156Given
1157  namespace X { int x; }
1158  using namespace X;
1159usingDirectiveDecl()
1160  matches using namespace X </pre></td></tr>
1161
1162
1163<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingEnumDecl0')"><a name="usingEnumDecl0Anchor">usingEnumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingEnumDecl.html">UsingEnumDecl</a>&gt;...</td></tr>
1164<tr><td colspan="4" class="doc" id="usingEnumDecl0"><pre>Matches using-enum declarations.
1165
1166Given
1167  namespace X { enum x {...}; }
1168  using enum X::x;
1169usingEnumDecl()
1170  matches using enum X::x </pre></td></tr>
1171
1172
1173<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
1174<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
1175
1176Example matches A, B, C and F
1177  enum X { A, B, C };
1178  void F();
1179</pre></td></tr>
1180
1181
1182<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
1183<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
1184
1185Note: this does not match declarations of member variables, which are
1186"field" declarations in Clang parlance.
1187
1188Example matches a
1189  int a;
1190</pre></td></tr>
1191
1192
1193<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
1194<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
1195</pre></td></tr>
1196
1197
1198<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>
1199<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
1200
1201Given
1202  namespace ns {
1203    struct A { static void f(); };
1204    void A::f() {}
1205    void g() { A::f(); }
1206  }
1207  ns::A a;
1208nestedNameSpecifier()
1209  matches "ns::" and both "A::"
1210</pre></td></tr>
1211
1212
1213<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>
1214<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
1215
1216Given
1217
1218  #pragma omp parallel default(none)
1219  #pragma omp parallel default(shared)
1220  #pragma omp parallel default(firstprivate)
1221  #pragma omp parallel
1222
1223``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
1224``default(firstprivate)``
1225</pre></td></tr>
1226
1227
1228<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>
1229<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
1230</pre></td></tr>
1231
1232
1233<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>
1234<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
1235
1236Given
1237  FOO: bar();
1238  void *ptr = &amp;&amp;FOO;
1239  goto *bar;
1240addrLabelExpr()
1241  matches '&amp;&amp;FOO'
1242</pre></td></tr>
1243
1244
1245<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1246<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
1247
1248Given
1249  int i = a[1];
1250arraySubscriptExpr()
1251  matches "a[1]"
1252</pre></td></tr>
1253
1254
1255<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1256<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
1257
1258 int i = 100;
1259  __asm("mov al, 2");
1260asmStmt()
1261  matches '__asm("mov al, 2")'
1262</pre></td></tr>
1263
1264
1265<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>
1266<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
1267Example matches __atomic_load_n(ptr, 1)
1268  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
1269</pre></td></tr>
1270
1271
1272<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>
1273<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
1274
1275Given
1276  @autoreleasepool {
1277    int x = 0;
1278  }
1279autoreleasePoolStmt(stmt()) matches the declaration of "x"
1280inside the autorelease pool.
1281</pre></td></tr>
1282
1283
1284<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>
1285<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
1286
1287Example matches a ?: b
1288  (a ?: b) + 42;
1289</pre></td></tr>
1290
1291
1292<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>
1293<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
1294
1295Example matches a || b
1296  !(a || b)
1297See also the binaryOperation() matcher for more-general matching.
1298</pre></td></tr>
1299
1300
1301<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>
1302<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
1303
1304Example: matches "^{}":
1305  void f() { ^{}(); }
1306</pre></td></tr>
1307
1308
1309<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1310<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
1311
1312Given
1313  while (true) { break; }
1314breakStmt()
1315  matches 'break'
1316</pre></td></tr>
1317
1318
1319<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>
1320<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
1321
1322Example: Matches (int) 2.2f in
1323  int i = (int) 2.2f;
1324</pre></td></tr>
1325
1326
1327<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1328<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
1329
1330Example matches x.y() and y()
1331  X x;
1332  x.y();
1333  y();
1334</pre></td></tr>
1335
1336
1337<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1338<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
1339
1340Given
1341  switch(a) { case 42: break; default: break; }
1342caseStmt()
1343  matches 'case 42:'.
1344</pre></td></tr>
1345
1346
1347<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>
1348<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
1349
1350Example: castExpr() matches each of the following:
1351  (int) 3;
1352  const_cast&lt;Expr *&gt;(SubExpr);
1353  char c = 0;
1354but does not match
1355  int i = (0);
1356  int k = 0;
1357</pre></td></tr>
1358
1359
1360<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>
1361<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
1362
1363Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
1364though.
1365
1366Example matches 'a', L'a'
1367  char ch = 'a';
1368  wchar_t chw = L'a';
1369</pre></td></tr>
1370
1371
1372<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>
1373<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
1374</pre></td></tr>
1375
1376
1377<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1378<tr><td colspan="4" class="doc" id="coawaitExpr0"><pre>Matches co_await expressions.
1379
1380Given
1381  co_await 1;
1382coawaitExpr()
1383  matches 'co_await 1'
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('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>
1388<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
1389
1390Example match: {1}, (1, 2)
1391  int array[4] = {1};
1392  vector int myvec = (vector int)(1, 2);
1393</pre></td></tr>
1394
1395
1396<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>
1397<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
1398
1399Example matches '{}' and '{{}}' in 'for (;;) {{}}'
1400  for (;;) {{}}
1401</pre></td></tr>
1402
1403
1404<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>
1405<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
1406
1407Example matches a ? b : c
1408  (a ? b : c) + 42
1409</pre></td></tr>
1410
1411
1412<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>
1413<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
1414
1415Example matches the constant in the case statement:
1416    (matcher = constantExpr())
1417  switch (a) {
1418  case 37: break;
1419  }
1420</pre></td></tr>
1421
1422
1423<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1424<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
1425
1426Given
1427  while (true) { continue; }
1428continueStmt()
1429  matches 'continue'
1430</pre></td></tr>
1431
1432
1433<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1434<tr><td colspan="4" class="doc" id="coreturnStmt0"><pre>Matches co_return statements.
1435
1436Given
1437  while (true) { co_return; }
1438coreturnStmt()
1439  matches 'co_return'
1440</pre></td></tr>
1441
1442
1443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1444<tr><td colspan="4" class="doc" id="coyieldExpr0"><pre>Matches co_yield expressions.
1445
1446Given
1447  co_yield 1;
1448coyieldExpr()
1449  matches 'co_yield 1'
1450</pre></td></tr>
1451
1452
1453<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>
1454<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
1455
1456Example matches,
1457  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
1458</pre></td></tr>
1459
1460
1461<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1462<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
1463
1464Example matches FunctionTakesString(GetStringByValue())
1465    (matcher = cxxBindTemporaryExpr())
1466  FunctionTakesString(GetStringByValue());
1467  FunctionTakesStringByPointer(GetStringPointer());
1468</pre></td></tr>
1469
1470
1471<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>
1472<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
1473
1474Example matches true
1475  true
1476</pre></td></tr>
1477
1478
1479<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>
1480<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
1481
1482  try {} catch(int i) {}
1483cxxCatchStmt()
1484  matches 'catch(int i)'
1485</pre></td></tr>
1486
1487
1488<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1489<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
1490
1491Example: Matches const_cast&lt;int*&gt;(&amp;r) in
1492  int n = 42;
1493  const int &amp;r(n);
1494  int* p = const_cast&lt;int*&gt;(&amp;r);
1495</pre></td></tr>
1496
1497
1498<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>
1499<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
1500
1501Example matches string(ptr, n) and ptr within arguments of f
1502    (matcher = cxxConstructExpr())
1503  void f(const string &amp;a, const string &amp;b);
1504  char *ptr;
1505  int n;
1506  f(string(ptr, n), ptr);
1507</pre></td></tr>
1508
1509
1510<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>
1511<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
1512
1513Example matches the CXXDefaultArgExpr placeholder inserted for the
1514    default value of the second parameter in the call expression f(42)
1515    (matcher = cxxDefaultArgExpr())
1516  void f(int x, int y = 0);
1517  f(42);
1518</pre></td></tr>
1519
1520
1521<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1522<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
1523
1524Given
1525  delete X;
1526cxxDeleteExpr()
1527  matches 'delete X'.
1528</pre></td></tr>
1529
1530
1531<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>
1532<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
1533resolved because the base expression or the member name was dependent.
1534
1535Given
1536  template &lt;class T&gt; void f() { T t; t.g(); }
1537cxxDependentScopeMemberExpr()
1538  matches t.g
1539</pre></td></tr>
1540
1541
1542<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>
1543<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
1544
1545Example:
1546  cxxDynamicCastExpr()
1547matches
1548  dynamic_cast&lt;D*&gt;(&amp;b);
1549in
1550  struct B { virtual ~B() {} }; struct D : B {};
1551  B b;
1552  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1553</pre></td></tr>
1554
1555
1556<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1557<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1558
1559cxxForRangeStmt() matches 'for (auto a : i)'
1560  int i[] =  {1, 2, 3}; for (auto a : i);
1561  for(int j = 0; j &lt; 5; ++j);
1562</pre></td></tr>
1563
1564
1565<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1566<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1567
1568Example: Matches Foo(bar);
1569  Foo f = bar;
1570  Foo g = (Foo) bar;
1571  Foo h = Foo(bar);
1572</pre></td></tr>
1573
1574
1575<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>
1576<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1577
1578Example matches x.y()
1579  X x;
1580  x.y();
1581</pre></td></tr>
1582
1583
1584<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1585<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1586
1587Given
1588  new X;
1589cxxNewExpr()
1590  matches 'new X'.
1591</pre></td></tr>
1592
1593
1594<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>
1595<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1596
1597Given
1598  bool a() noexcept;
1599  bool b() noexcept(true);
1600  bool c() noexcept(false);
1601  bool d() noexcept(noexcept(a()));
1602  bool e = noexcept(b()) || noexcept(c());
1603cxxNoexceptExpr()
1604  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1605  doesn't match the noexcept specifier in the declarations a, b, c or d.
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('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>
1610<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1611</pre></td></tr>
1612
1613
1614<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>
1615<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1616
1617Note that if an operator isn't overloaded, it won't match. Instead, use
1618binaryOperator matcher.
1619Currently it does not match operators such as new delete.
1620FIXME: figure out why these do not match?
1621
1622Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1623    (matcher = cxxOperatorCallExpr())
1624  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1625  ostream &amp;o; int b = 1, c = 1;
1626  o &lt;&lt; b &lt;&lt; c;
1627See also the binaryOperation() matcher for more-general matching of binary
1628uses of this AST node.
1629</pre></td></tr>
1630
1631
1632<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>
1633<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1634
1635Either the source expression or the destination type can be matched
1636using has(), but hasDestinationType() is more specific and can be
1637more readable.
1638
1639Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1640  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1641</pre></td></tr>
1642
1643
1644<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>
1645<tr><td colspan="4" class="doc" id="cxxRewrittenBinaryOperator0"><pre>Matches rewritten binary operators
1646
1647Example matches use of "&lt;":
1648  #include &lt;compare&gt;
1649  struct HasSpaceshipMem {
1650    int a;
1651    constexpr auto operator&lt;=&gt;(const HasSpaceshipMem&amp;) const = default;
1652  };
1653  void compare() {
1654    HasSpaceshipMem hs1, hs2;
1655    if (hs1 &lt; hs2)
1656        return;
1657  }
1658See also the binaryOperation() matcher for more-general matching
1659of this AST node.
1660</pre></td></tr>
1661
1662
1663<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>
1664<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1665
1666See also: hasDestinationType
1667See also: reinterpretCast
1668
1669Example:
1670  cxxStaticCastExpr()
1671matches
1672  static_cast&lt;long&gt;(8)
1673in
1674  long eight(static_cast&lt;long&gt;(8));
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('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>
1679<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1680
1681Given
1682  std::vector&lt;int&gt; a({ 1, 2, 3 });
1683  std::vector&lt;int&gt; b = { 4, 5 };
1684  int c[] = { 6, 7 };
1685  std::pair&lt;int, int&gt; d = { 8, 9 };
1686cxxStdInitializerListExpr()
1687  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1688</pre></td></tr>
1689
1690
1691<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>
1692<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1693
1694Example: Matches Foo(bar, bar)
1695  Foo h = Foo(bar, bar);
1696</pre></td></tr>
1697
1698
1699<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>
1700<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1701
1702Example matches the implicit this expression in "return i".
1703    (matcher = cxxThisExpr())
1704struct foo {
1705  int i;
1706  int f() { return i; }
1707};
1708</pre></td></tr>
1709
1710
1711<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>
1712<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1713
1714  try { throw 5; } catch(int i) {}
1715cxxThrowExpr()
1716  matches 'throw 5'
1717</pre></td></tr>
1718
1719
1720<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>
1721<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1722
1723  try {} catch(int i) {}
1724cxxTryStmt()
1725  matches 'try {}'
1726</pre></td></tr>
1727
1728
1729<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1730<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1731
1732Example matches T(t) in return statement of f
1733    (matcher = cxxUnresolvedConstructExpr())
1734  template &lt;typename T&gt;
1735  void f(const T&amp; t) { return T(t); }
1736</pre></td></tr>
1737
1738
1739<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>
1740<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1741
1742Example matches x in if (x)
1743  bool x;
1744  if (x) {}
1745</pre></td></tr>
1746
1747
1748<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1749<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1750
1751Given
1752  int a;
1753declStmt()
1754  matches 'int a'.
1755</pre></td></tr>
1756
1757
1758<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1759<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1760
1761Given
1762  switch(a) { case 42: break; default: break; }
1763defaultStmt()
1764  matches 'default:'.
1765</pre></td></tr>
1766
1767
1768<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>
1769<tr><td colspan="4" class="doc" id="dependentCoawaitExpr0"><pre>Matches co_await expressions where the type of the promise is dependent
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('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>
1774<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1775
1776Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1777  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1778</pre></td></tr>
1779
1780
1781<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1782<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1783
1784Given
1785  do {} while (true);
1786doStmt()
1787  matches 'do {} while(true)'
1788</pre></td></tr>
1789
1790
1791<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>
1792<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1793
1794Matches any cast expression written in user code, whether it be a
1795C-style cast, a functional-style cast, or a keyword cast.
1796
1797Does not match implicit conversions.
1798
1799Note: the name "explicitCast" is chosen to match Clang's terminology, as
1800Clang uses the term "cast" to apply to implicit conversions as well as to
1801actual cast expressions.
1802
1803See also: hasDestinationType.
1804
1805Example: matches all five of the casts in
1806  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1807but does not match the implicit conversion in
1808  long ell = 42;
1809</pre></td></tr>
1810
1811
1812<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>
1813<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1814
1815Example matches x()
1816  void f() { x(); }
1817</pre></td></tr>
1818
1819
1820<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>
1821<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1822of the sub-expression's evaluation.
1823
1824Example matches std::string()
1825  const std::string str = std::string();
1826</pre></td></tr>
1827
1828
1829<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>
1830<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1831</pre></td></tr>
1832
1833
1834<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1835<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
18361.0, 1.0f, 1.0L and 1e10.
1837
1838Does not match implicit conversions such as
1839  float a = 10;
1840</pre></td></tr>
1841
1842
1843<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1844<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1845
1846Example matches 'for (;;) {}'
1847  for (;;) {}
1848  int i[] =  {1, 2, 3}; for (auto a : i);
1849</pre></td></tr>
1850
1851
1852<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1853<tr><td colspan="4" class="doc" id="genericSelectionExpr0"><pre>Matches C11 _Generic expression.
1854</pre></td></tr>
1855
1856
1857<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1858<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1859</pre></td></tr>
1860
1861
1862<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>
1863<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1864
1865Given
1866  goto FOO;
1867  FOO: bar();
1868gotoStmt()
1869  matches 'goto FOO'
1870</pre></td></tr>
1871
1872
1873<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>
1874<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1875
1876Example matches 'if (x) {}'
1877  if (x) {}
1878</pre></td></tr>
1879
1880
1881<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>
1882<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1883point literals e.g.: 1i, 1.0i
1884</pre></td></tr>
1885
1886
1887<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1888<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1889
1890This matches many different places, including function call return value
1891eliding, as well as any type conversions.
1892</pre></td></tr>
1893
1894
1895<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1896<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1897
1898Given
1899  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1900implicitValueInitExpr()
1901  matches "[0].y" (implicitly)
1902</pre></td></tr>
1903
1904
1905<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>
1906<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1907
1908Given
1909  int a[] = { 1, 2 };
1910  struct B { int x, y; };
1911  B b = { 5, 6 };
1912initListExpr()
1913  matches "{ 1, 2 }" and "{ 5, 6 }"
1914</pre></td></tr>
1915
1916
1917<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>
1918<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
19191, 1L, 0x1 and 1U.
1920
1921Does not match character-encoded integers such as L'a'.
1922</pre></td></tr>
1923
1924
1925<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>
1926<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1927
1928Given
1929  goto FOO;
1930  FOO: bar();
1931labelStmt()
1932  matches 'FOO:'
1933</pre></td></tr>
1934
1935
1936<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>
1937<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1938
1939Example matches [&amp;](){return 5;}
1940  [&amp;](){return 5;}
1941</pre></td></tr>
1942
1943
1944<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>
1945<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1946
1947Example: Given
1948  struct T {void func();};
1949  T f();
1950  void g(T);
1951materializeTemporaryExpr() matches 'f()' in these statements
1952  T u(f());
1953  g(f());
1954  f().func();
1955but does not match
1956  f();
1957</pre></td></tr>
1958
1959
1960<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>
1961<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1962
1963Given
1964  class Y {
1965    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1966    int a; static int b;
1967  };
1968memberExpr()
1969  matches this-&gt;x, x, y.x, a, this-&gt;b
1970</pre></td></tr>
1971
1972
1973<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>
1974<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1975
1976  foo();;
1977nullStmt()
1978  matches the second ';'
1979</pre></td></tr>
1980
1981
1982<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>
1983<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1984
1985Example matches @catch
1986  @try {}
1987  @catch (...) {}
1988</pre></td></tr>
1989
1990
1991<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>
1992<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1993
1994Example matches @finally
1995  @try {}
1996  @finally {}
1997</pre></td></tr>
1998
1999
2000<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>
2001<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
2002
2003Example: matches "a" in "init" method:
2004@implementation A {
2005  NSString *a;
2006}
2007- (void) init {
2008  a = @"hello";
2009}
2010</pre></td></tr>
2011
2012
2013<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>
2014<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
2015
2016The innermost message send invokes the "alloc" class method on the
2017NSString class, while the outermost message send invokes the
2018"initWithString" instance method on the object returned from
2019NSString's "alloc". This matcher should match both message sends.
2020  [[NSString alloc] initWithString:@"Hello"]
2021</pre></td></tr>
2022
2023
2024<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>
2025<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
2026
2027Example matches @throw obj;
2028</pre></td></tr>
2029
2030
2031<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>
2032<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
2033
2034Example matches @try
2035  @try {}
2036  @catch (...) {}
2037</pre></td></tr>
2038
2039
2040<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>
2041<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
2042
2043Given
2044
2045  #pragma omp parallel
2046  #pragma omp parallel default(none)
2047  #pragma omp taskyield
2048
2049``ompExecutableDirective()`` matches ``omp parallel``,
2050``omp parallel default(none)`` and ``omp taskyield``.
2051</pre></td></tr>
2052
2053
2054<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
2055<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
2056to reference another expressions and can be met
2057in BinaryConditionalOperators, for example.
2058
2059Example matches 'a'
2060  (a ?: c) + 42;
2061</pre></td></tr>
2062
2063
2064<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>
2065<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
2066
2067Example matches (foo() + 1)
2068  int foo() { return 1; }
2069  int a = (foo() + 1);
2070</pre></td></tr>
2071
2072
2073<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>
2074<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
2075ParenListExprs don't have a predefined type and are used for late parsing.
2076In the final AST, they can be met in template declarations.
2077
2078Given
2079  template&lt;typename T&gt; class X {
2080    void f() {
2081      X x(*this);
2082      int a = 0, b = 1; int i = (a, b);
2083    }
2084  };
2085parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
2086has a predefined type and is a ParenExpr, not a ParenListExpr.
2087</pre></td></tr>
2088
2089
2090<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>
2091<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
2092
2093Example: Matches __func__
2094  printf("%s", __func__);
2095</pre></td></tr>
2096
2097
2098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
2099<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
2100
2101Given
2102  return 1;
2103returnStmt()
2104  matches 'return 1'
2105</pre></td></tr>
2106
2107
2108<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
2109<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
2110
2111Given
2112  { ++a; }
2113stmt()
2114  matches both the compound statement '{ ++a; }' and '++a'.
2115</pre></td></tr>
2116
2117
2118<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>
2119<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
2120
2121Example match: ({ int X = 4; X; })
2122  int C = ({ int X = 4; X; });
2123</pre></td></tr>
2124
2125
2126<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>
2127<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
2128
2129Example matches "abcd", L"abcd"
2130  char *s = "abcd";
2131  wchar_t *ws = L"abcd";
2132</pre></td></tr>
2133
2134
2135<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>
2136<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
2137
2138Given
2139  template &lt;int N&gt;
2140  struct A { static const int n = N; };
2141  struct B : public A&lt;42&gt; {};
2142substNonTypeTemplateParmExpr()
2143  matches "N" in the right-hand side of "static const int n = N;"
2144</pre></td></tr>
2145
2146
2147<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
2148<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
2149
2150Given
2151  switch(a) { case 42: break; default: break; }
2152switchCase()
2153  matches 'case 42:' and 'default:'.
2154</pre></td></tr>
2155
2156
2157<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
2158<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
2159
2160Given
2161  switch(a) { case 42: break; default: break; }
2162switchStmt()
2163  matches 'switch(a)'.
2164</pre></td></tr>
2165
2166
2167<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>
2168<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
2169
2170Given
2171  Foo x = bar;
2172  int y = sizeof(x) + alignof(x);
2173unaryExprOrTypeTraitExpr()
2174  matches sizeof(x) and alignof(x)
2175</pre></td></tr>
2176
2177
2178<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>
2179<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
2180
2181Example matches !a
2182  !a || b
2183</pre></td></tr>
2184
2185
2186<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>
2187<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
2188but could not be resolved to a specific declaration.
2189
2190Given
2191  template&lt;typename T&gt;
2192  T foo() { T a; return a; }
2193  template&lt;typename T&gt;
2194  void bar() {
2195    foo&lt;T&gt;();
2196  }
2197unresolvedLookupExpr()
2198  matches foo&lt;T&gt;() </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('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>
2202<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
2203
2204Given
2205  struct X {
2206    template &lt;class T&gt; void f();
2207    void g();
2208  };
2209  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
2210unresolvedMemberExpr()
2211  matches x.f&lt;T&gt;
2212</pre></td></tr>
2213
2214
2215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
2216<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
2217
2218Example match: "foo"_suffix
2219</pre></td></tr>
2220
2221
2222<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>
2223<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
2224
2225Given
2226  while (true) {}
2227whileStmt()
2228  matches 'while (true) {}'.
2229</pre></td></tr>
2230
2231
2232<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>
2233<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
2234
2235Given
2236  template &lt;typename T&gt; struct C {};
2237  C&lt;int&gt; c;
2238templateArgumentLoc()
2239  matches 'int' in C&lt;int&gt;.
2240</pre></td></tr>
2241
2242
2243<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>
2244<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
2245
2246Given
2247  template &lt;typename T&gt; struct C {};
2248  C&lt;int&gt; c;
2249templateArgument()
2250  matches 'int' in C&lt;int&gt;.
2251</pre></td></tr>
2252
2253
2254<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>
2255<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
2256
2257Given
2258  template &lt;typename T&gt; class X { };
2259  X&lt;int&gt; xi;
2260templateName()
2261  matches 'X' in X&lt;int&gt;.
2262</pre></td></tr>
2263
2264
2265<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>
2266<tr><td colspan="4" class="doc" id="elaboratedTypeLoc0"><pre>Matches C or C++ elaborated `TypeLoc`s.
2267
2268Given
2269  struct s {};
2270  struct s ss;
2271elaboratedTypeLoc()
2272  matches the `TypeLoc` of the variable declaration of `ss`.
2273</pre></td></tr>
2274
2275
2276<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>
2277<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
2278
2279Given
2280  int* x;
2281pointerTypeLoc()
2282  matches `int*`.
2283</pre></td></tr>
2284
2285
2286<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>
2287<tr><td colspan="4" class="doc" id="qualifiedTypeLoc0"><pre>Matches `QualifiedTypeLoc`s in the clang AST.
2288
2289Given
2290  const int x = 0;
2291qualifiedTypeLoc()
2292  matches `const int`.
2293</pre></td></tr>
2294
2295
2296<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>
2297<tr><td colspan="4" class="doc" id="referenceTypeLoc0"><pre>Matches reference `TypeLoc`s.
2298
2299Given
2300  int x = 3;
2301  int&amp; l = x;
2302  int&amp;&amp; r = 3;
2303referenceTypeLoc()
2304  matches `int&amp;` and `int&amp;&amp;`.
2305</pre></td></tr>
2306
2307
2308<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>
2309<tr><td colspan="4" class="doc" id="templateSpecializationTypeLoc0"><pre>Matches template specialization `TypeLoc`s.
2310
2311Given
2312  template &lt;typename T&gt; class C {};
2313  C&lt;char&gt; var;
2314varDecl(hasTypeLoc(templateSpecializationTypeLoc(typeLoc())))
2315  matches `C&lt;char&gt; var`.
2316</pre></td></tr>
2317
2318
2319<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>
2320<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
2321</pre></td></tr>
2322
2323
2324<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>
2325<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
2326
2327Given
2328  int a[] = { 2, 3 };
2329  int b[4];
2330  void f() { int c[a[0]]; }
2331arrayType()
2332  matches "int a[]", "int b[4]" and "int c[a[0]]";
2333</pre></td></tr>
2334
2335
2336<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>
2337<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
2338
2339Given
2340  _Atomic(int) i;
2341atomicType()
2342  matches "_Atomic(int) i"
2343</pre></td></tr>
2344
2345
2346<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>
2347<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
2348
2349Given:
2350  auto n = 4;
2351  int v[] = { 2, 3 }
2352  for (auto i : v) { }
2353autoType()
2354  matches "auto n" and "auto i"
2355</pre></td></tr>
2356
2357
2358<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>
2359<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
2360"void (^)(int)".
2361
2362The pointee is always required to be a FunctionType.
2363</pre></td></tr>
2364
2365
2366<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>
2367<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
2368
2369Given
2370  struct A {};
2371  A a;
2372  int b;
2373  float c;
2374  bool d;
2375builtinType()
2376  matches "int b", "float c" and "bool d"
2377</pre></td></tr>
2378
2379
2380<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2381<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
2382
2383Given
2384  _Complex float f;
2385complexType()
2386  matches "_Complex float f"
2387</pre></td></tr>
2388
2389
2390<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>
2391<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
2392
2393Given
2394  void() {
2395    int a[2];
2396    int b[] = { 2, 3 };
2397    int c[b[0]];
2398  }
2399constantArrayType()
2400  matches "int a[2]"
2401</pre></td></tr>
2402
2403
2404<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2405<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
2406Example matches i[] in declaration of f.
2407    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
2408Example matches i[1].
2409    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
2410  void f(int i[]) {
2411    i[1] = 0;
2412  }
2413</pre></td></tr>
2414
2415
2416<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>
2417<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
2418
2419Given:
2420  short i = 1;
2421  int j = 42;
2422  decltype(i + j) result = i + j;
2423decltypeType()
2424  matches "decltype(i + j)"
2425</pre></td></tr>
2426
2427
2428<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>
2429<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
2430template types.
2431
2432Given
2433  template &lt;typename T&gt;
2434  class C { public: C(T); };
2435
2436  C c(123);
2437deducedTemplateSpecializationType() matches the type in the declaration
2438of the variable c.
2439</pre></td></tr>
2440
2441
2442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2443<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
2444
2445Given
2446  template&lt;typename T, int Size&gt;
2447  class array {
2448    T data[Size];
2449  };
2450dependentSizedArrayType
2451  matches "T data[Size]"
2452</pre></td></tr>
2453
2454
2455<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>
2456<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
2457qualified name.
2458
2459Given
2460  namespace N {
2461    namespace M {
2462      class D {};
2463    }
2464  }
2465  class C {};
2466
2467  class C c;
2468  N::M::D d;
2469
2470elaboratedType() matches the type of the variable declarations of both
2471c and d.
2472</pre></td></tr>
2473
2474
2475<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>
2476<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
2477
2478Given
2479  enum C { Green };
2480  enum class S { Red };
2481
2482  C c;
2483  S s;
2484
2485enumType() matches the type of the variable declarations of both c and
2486s.
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('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>
2491<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
2492
2493Given
2494  int (*f)(int);
2495  void g();
2496functionProtoType()
2497  matches "int (*f)(int)" and the type of "g" in C++ mode.
2498  In C mode, "g" is not matched because it does not contain a prototype.
2499</pre></td></tr>
2500
2501
2502<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>
2503<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
2504
2505Given
2506  int (*f)(int);
2507  void g();
2508functionType()
2509  matches "int (*f)(int)" and the type of "g".
2510</pre></td></tr>
2511
2512
2513<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>
2514<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
2515
2516Given
2517  int a[] = { 2, 3 };
2518  int b[42];
2519  void f(int c[]) { int d[a[0]]; };
2520incompleteArrayType()
2521  matches "int a[]" and "int c[]"
2522</pre></td></tr>
2523
2524
2525<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>
2526<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
2527
2528Example matches S s, but not S&lt;T&gt; s.
2529    (matcher = parmVarDecl(hasType(injectedClassNameType())))
2530  template &lt;typename T&gt; struct S {
2531    void f(S s);
2532    void g(S&lt;T&gt; s);
2533  };
2534</pre></td></tr>
2535
2536
2537<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>
2538<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
2539
2540Given:
2541  int *a;
2542  int &amp;b = *a;
2543  int &amp;&amp;c = 1;
2544  auto &amp;d = b;
2545  auto &amp;&amp;e = c;
2546  auto &amp;&amp;f = 2;
2547  int g = 5;
2548
2549lValueReferenceType() matches the types of b, d, and e. e is
2550matched since the type is deduced as int&amp; by reference collapsing rules.
2551</pre></td></tr>
2552
2553
2554<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>
2555<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
2556Given
2557  struct A { int i; }
2558  A::* ptr = A::i;
2559memberPointerType()
2560  matches "A::* ptr"
2561</pre></td></tr>
2562
2563
2564<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>
2565<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
2566a pointer type, despite being syntactically similar.
2567
2568Given
2569  int *a;
2570
2571  @interface Foo
2572  @end
2573  Foo *f;
2574pointerType()
2575  matches "Foo *f", but does not match "int *a".
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('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>
2580<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
2581
2582Given
2583  int (*ptr_to_array)[4];
2584  int *array_of_ptrs[4];
2585
2586varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
2587array_of_ptrs.
2588</pre></td></tr>
2589
2590
2591<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>
2592<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
2593types.
2594
2595Given
2596  int *a;
2597  int &amp;b = *a;
2598  int c = 5;
2599
2600  @interface Foo
2601  @end
2602  Foo *f;
2603pointerType()
2604  matches "int *a", but does not match "Foo *f".
2605</pre></td></tr>
2606
2607
2608<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>
2609<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
2610
2611Given:
2612  int *a;
2613  int &amp;b = *a;
2614  int &amp;&amp;c = 1;
2615  auto &amp;d = b;
2616  auto &amp;&amp;e = c;
2617  auto &amp;&amp;f = 2;
2618  int g = 5;
2619
2620rValueReferenceType() matches the types of c and f. e is not
2621matched as it is deduced to int&amp; by reference collapsing rules.
2622</pre></td></tr>
2623
2624
2625<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>
2626<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
2627
2628Given
2629  class C {};
2630  struct S {};
2631
2632  C c;
2633  S s;
2634
2635recordType() matches the type of the variable declarations of both c
2636and s.
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('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>
2641<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2642
2643Given
2644  int *a;
2645  int &amp;b = *a;
2646  int &amp;&amp;c = 1;
2647  auto &amp;d = b;
2648  auto &amp;&amp;e = c;
2649  auto &amp;&amp;f = 2;
2650  int g = 5;
2651
2652referenceType() matches the types of b, c, d, e, and f.
2653</pre></td></tr>
2654
2655
2656<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>
2657<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2658template type parameter.
2659
2660Given
2661  template &lt;typename T&gt;
2662  void F(T t) {
2663    int i = 1 + t;
2664  }
2665
2666substTemplateTypeParmType() matches the type of 't' but not '1'
2667</pre></td></tr>
2668
2669
2670<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2671<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2672
2673Given
2674  enum E {};
2675  class C {};
2676
2677  E e;
2678  C c;
2679
2680tagType() matches the type of the variable declarations of both e
2681and c.
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('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>
2686<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2687
2688Given
2689  template &lt;typename T&gt;
2690  class C { };
2691
2692  template class C&lt;int&gt;;  // A
2693  C&lt;char&gt; var;            // B
2694
2695templateSpecializationType() matches the type of the explicit
2696instantiation in A and the type of the variable declaration in B.
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('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>
2701<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2702
2703Example matches T, but not int.
2704    (matcher = templateTypeParmType())
2705  template &lt;typename T&gt; void f(int i);
2706</pre></td></tr>
2707
2708
2709<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>
2710<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2711</pre></td></tr>
2712
2713
2714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('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>
2715<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2716
2717Given
2718  typedef int X;
2719typedefType()
2720  matches "typedef int X"
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('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>
2725<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2726
2727Given:
2728  typedef __underlying_type(T) type;
2729unaryTransformType()
2730  matches "__underlying_type(T)"
2731</pre></td></tr>
2732
2733
2734<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>
2735<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2736integer-constant-expression.
2737
2738Given
2739  void f() {
2740    int a[] = { 2, 3 }
2741    int b[42];
2742    int c[a[0]];
2743  }
2744variableArrayType()
2745  matches "int c[a[0]]"
2746</pre></td></tr>
2747
2748<!--END_DECL_MATCHERS -->
2749</table>
2750
2751<!-- ======================================================================= -->
2752<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2753<!-- ======================================================================= -->
2754
2755<p>Narrowing matchers match certain attributes on the current node, thus
2756narrowing down the set of nodes of the current type to match on.</p>
2757
2758<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2759which allow users to create more powerful match expressions.</p>
2760
2761<table>
2762<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2763<!-- START_NARROWING_MATCHERS -->
2764
2765<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>
2766<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2767
2768Usable as: Any Matcher
2769</pre></td></tr>
2770
2771
2772<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>
2773<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2774
2775Usable as: Any Matcher
2776</pre></td></tr>
2777
2778
2779<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2780<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2781
2782Useful when another matcher requires a child matcher, but there's no
2783additional constraint. This will often be used with an explicit conversion
2784to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2785
2786Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2787"int* p" and "void f()" in
2788  int* p;
2789  void f();
2790
2791Usable as: Any Matcher
2792</pre></td></tr>
2793
2794
2795<tr><td><em>unspecified</em></td><td class="name" onclick="toggle('mapAnyOf0')"><a name="mapAnyOf0Anchor">mapAnyOf</a></td><td>nodeMatcherFunction...</td></tr>
2796<tr><td colspan="4" class="doc" id="mapAnyOf0"><pre>Matches any of the NodeMatchers with InnerMatchers nested within
2797
2798Given
2799  if (true);
2800  for (; true; );
2801with the matcher
2802  mapAnyOf(ifStmt, forStmt).with(
2803    hasCondition(cxxBoolLiteralExpr(equals(true)))
2804    ).bind("trueCond")
2805matches the if and the for. It is equivalent to:
2806  auto trueCond = hasCondition(cxxBoolLiteralExpr(equals(true)));
2807  anyOf(
2808    ifStmt(trueCond).bind("trueCond"),
2809    forStmt(trueCond).bind("trueCond")
2810    );
2811
2812The with() chain-call accepts zero or more matchers which are combined
2813as-if with allOf() in each of the node matchers.
2814Usable as: Any Matcher
2815</pre></td></tr>
2816
2817
2818<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2819<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2820
2821Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2822  class X {};
2823  class Y {};
2824
2825Usable as: Any Matcher
2826</pre></td></tr>
2827
2828
2829<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>
2830<tr><td colspan="4" class="doc" id="isImplicit1"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
2831implicit default/copy constructors).
2832</pre></td></tr>
2833
2834
2835<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>
2836<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2837specified names.
2838
2839   hasAnyOperatorName("+", "-")
2840 Is equivalent to
2841   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2842</pre></td></tr>
2843
2844
2845<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>
2846<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2847unary).
2848
2849Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2850  !(a || b)
2851</pre></td></tr>
2852
2853
2854<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>
2855<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2856
2857Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2858  if (a == b)
2859    a += b;
2860
2861Example 2: matches s1 = s2
2862           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2863  struct S { S&amp; operator=(const S&amp;); };
2864  void x() { S s1, s2; s1 = s2; }
2865</pre></td></tr>
2866
2867
2868<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2869<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2870
2871Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2872  if (a == b)
2873    a += b;
2874
2875Example 2: matches s1 &lt; s2
2876           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2877  struct S { bool operator&lt;(const S&amp; other); };
2878  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2879</pre></td></tr>
2880
2881
2882<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>
2883<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2884inheritance.
2885
2886Examples:
2887  class C {
2888  public:    int a;
2889  protected: int b;
2890  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2891  };
2892
2893  struct Base {};
2894  struct Derived1 : private Base {}; // matches 'Base'
2895  class Derived2 : Base {}; // matches 'Base'
2896</pre></td></tr>
2897
2898
2899<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>
2900<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2901protected inheritance.
2902
2903Examples:
2904  class C {
2905  public:    int a;
2906  protected: int b; // fieldDecl(isProtected()) matches 'b'
2907  private:   int c;
2908  };
2909
2910  class Base {};
2911  class Derived : protected Base {}; // matches 'Base'
2912</pre></td></tr>
2913
2914
2915<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>
2916<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2917inheritance.
2918
2919Examples:
2920  class C {
2921  public:    int a; // fieldDecl(isPublic()) matches 'a'
2922  protected: int b;
2923  private:   int c;
2924  };
2925
2926  class Base {};
2927  class Derived1 : public Base {}; // matches 'Base'
2928  struct Derived2 : Base {}; // matches 'Base'
2929</pre></td></tr>
2930
2931
2932<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>
2933<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2934virtual inheritance.
2935
2936Example:
2937  class A {
2938   public:
2939    virtual void x(); // matches x
2940  };
2941
2942Example:
2943  class Base {};
2944  class DirectlyDerived : virtual Base {}; // matches Base
2945  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2946
2947Usable 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;
2948</pre></td></tr>
2949
2950
2951<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>
2952<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2953
2954
2955<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2956<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2957
2958Given
2959  f('false, 3.14, 42);
2960characterLiteral(equals(0))
2961  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2962  match false
2963floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2964  match 3.14
2965integerLiteral(equals(42))
2966  matches 42
2967
2968Note that you cannot directly match a negative numeric literal because the
2969minus sign is not part of the literal: It is a unary operator whose operand
2970is the positive numeric literal. Instead, you must use a unaryOperator()
2971matcher to match the minus sign:
2972
2973unaryOperator(hasOperatorName("-"),
2974              hasUnaryOperand(integerLiteral(equals(13))))
2975
2976Usable 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;,
2977           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;
2978</pre></td></tr>
2979
2980
2981<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>
2982<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2983
2984
2985<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2986<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2987
2988
2989<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>
2990<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2991
2992Given
2993  try {
2994    // ...
2995  } catch (int) {
2996    // ...
2997  } catch (...) {
2998    // ...
2999  }
3000cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
3001</pre></td></tr>
3002
3003
3004<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>
3005<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
3006a specific number of arguments (including absent default arguments).
3007
3008Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3009  void f(int x, int y);
3010  f(0, 0);
3011</pre></td></tr>
3012
3013
3014<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>
3015<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
3016</pre></td></tr>
3017
3018
3019<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>
3020<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
3021zero initialization.
3022
3023Given
3024void foo() {
3025  struct point { double x; double y; };
3026  point pt[2] = { { 1.0, 2.0 } };
3027}
3028initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
3029will match the implicit array filler for pt[1].
3030</pre></td></tr>
3031
3032
3033<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>
3034<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
3035
3036Given
3037  struct S {
3038    S(); // #1
3039    S(const S &amp;); // #2
3040    S(S &amp;&amp;); // #3
3041  };
3042cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
3043</pre></td></tr>
3044
3045
3046<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>
3047<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
3048
3049Given
3050  struct S {
3051    S(); // #1
3052    S(const S &amp;); // #2
3053    S(S &amp;&amp;); // #3
3054  };
3055cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
3056</pre></td></tr>
3057
3058
3059<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>
3060<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
3061
3062Given
3063  struct S {
3064    S(); // #1
3065    S(int) {} // #2
3066    S(S &amp;&amp;) : S() {} // #3
3067  };
3068  S::S() : S(0) {} // #4
3069cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
3070#1 or #2.
3071</pre></td></tr>
3072
3073
3074<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>
3075<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
3076that have an explicit specifier if this explicit specifier is resolved to
3077true.
3078
3079Given
3080  template&lt;bool b&gt;
3081  struct S {
3082    S(int); // #1
3083    explicit S(double); // #2
3084    operator int(); // #3
3085    explicit operator bool(); // #4
3086    explicit(false) S(bool) // # 7
3087    explicit(true) S(char) // # 8
3088    explicit(b) S(S) // # 9
3089  };
3090  S(int) -&gt; S&lt;true&gt; // #5
3091  explicit S(double) -&gt; S&lt;false&gt; // #6
3092cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3093cxxConversionDecl(isExplicit()) will match #4, but not #3.
3094cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3095</pre></td></tr>
3096
3097
3098<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>
3099<tr><td colspan="4" class="doc" id="isInheritingConstructor0"><pre></pre></td></tr>
3100
3101
3102<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
3103<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
3104
3105Given
3106  struct S {
3107    S(); // #1
3108    S(const S &amp;); // #2
3109    S(S &amp;&amp;); // #3
3110  };
3111cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
3112</pre></td></tr>
3113
3114
3115<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>
3116<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
3117that have an explicit specifier if this explicit specifier is resolved to
3118true.
3119
3120Given
3121  template&lt;bool b&gt;
3122  struct S {
3123    S(int); // #1
3124    explicit S(double); // #2
3125    operator int(); // #3
3126    explicit operator bool(); // #4
3127    explicit(false) S(bool) // # 7
3128    explicit(true) S(char) // # 8
3129    explicit(b) S(S) // # 9
3130  };
3131  S(int) -&gt; S&lt;true&gt; // #5
3132  explicit S(double) -&gt; S&lt;false&gt; // #6
3133cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3134cxxConversionDecl(isExplicit()) will match #4, but not #3.
3135cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3136</pre></td></tr>
3137
3138
3139<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>
3140<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
3141opposed to a member.
3142
3143Given
3144  struct B {};
3145  struct D : B {
3146    int I;
3147    D(int i) : I(i) {}
3148  };
3149  struct E : B {
3150    E() : B() {}
3151  };
3152cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
3153  will match E(), but not match D(int).
3154</pre></td></tr>
3155
3156
3157<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>
3158<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
3159opposed to a base.
3160
3161Given
3162  struct B {};
3163  struct D : B {
3164    int I;
3165    D(int i) : I(i) {}
3166  };
3167  struct E : B {
3168    E() : B() {}
3169  };
3170cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
3171  will match D(int), but not match E().
3172</pre></td></tr>
3173
3174
3175<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>
3176<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
3177code (as opposed to implicitly added by the compiler).
3178
3179Given
3180  struct Foo {
3181    Foo() { }
3182    Foo(int) : foo_("A") { }
3183    string foo_;
3184  };
3185cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
3186  will match Foo(int), but not Foo()
3187</pre></td></tr>
3188
3189
3190<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>
3191<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
3192that have an explicit specifier if this explicit specifier is resolved to
3193true.
3194
3195Given
3196  template&lt;bool b&gt;
3197  struct S {
3198    S(int); // #1
3199    explicit S(double); // #2
3200    operator int(); // #3
3201    explicit operator bool(); // #4
3202    explicit(false) S(bool) // # 7
3203    explicit(true) S(char) // # 8
3204    explicit(b) S(S) // # 9
3205  };
3206  S(int) -&gt; S&lt;true&gt; // #5
3207  explicit S(double) -&gt; S&lt;false&gt; // #6
3208cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
3209cxxConversionDecl(isExplicit()) will match #4, but not #3.
3210cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
3211</pre></td></tr>
3212
3213
3214<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>
3215<tr><td colspan="4" class="doc" id="hasMemberName0"><pre>Matches template-dependent, but known, member names.
3216
3217In template declarations, dependent members are not resolved and so can
3218not be matched to particular named declarations.
3219
3220This matcher allows to match on the known name of members.
3221
3222Given
3223  template &lt;typename T&gt;
3224  struct S {
3225      void mem();
3226  };
3227  template &lt;typename T&gt;
3228  void x() {
3229      S&lt;T&gt; s;
3230      s.mem();
3231  }
3232cxxDependentScopeMemberExpr(hasMemberName("mem")) matches `s.mem()`
3233</pre></td></tr>
3234
3235
3236<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>
3237<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
3238to '.'.
3239
3240Member calls on the implicit this pointer match as called with '-&gt;'.
3241
3242Given
3243  class Y {
3244    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3245    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3246    int a;
3247    static int b;
3248  };
3249  template &lt;class T&gt;
3250  class Z {
3251    void x() { this-&gt;m; }
3252  };
3253memberExpr(isArrow())
3254  matches this-&gt;x, x, y.x, a, this-&gt;b
3255cxxDependentScopeMemberExpr(isArrow())
3256  matches this-&gt;m
3257unresolvedMemberExpr(isArrow())
3258  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3259</pre></td></tr>
3260
3261
3262<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>
3263<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
3264node
3265
3266In template declarations, dependent members are not resolved and so can
3267not be matched to particular named declarations.
3268
3269This matcher allows to match on the name of already-bound VarDecl, FieldDecl
3270and CXXMethodDecl nodes.
3271
3272Given
3273  template &lt;typename T&gt;
3274  struct S {
3275      void mem();
3276  };
3277  template &lt;typename T&gt;
3278  void x() {
3279      S&lt;T&gt; s;
3280      s.mem();
3281  }
3282The matcher
3283@code
3284cxxDependentScopeMemberExpr(
3285  hasObjectExpression(declRefExpr(hasType(templateSpecializationType(
3286      hasDeclaration(classTemplateDecl(has(cxxRecordDecl(has(
3287          cxxMethodDecl(hasName("mem")).bind("templMem")
3288          )))))
3289      )))),
3290  memberHasSameNameAsBoundNode("templMem")
3291  )
3292@endcode
3293first matches and binds the @c mem member of the @c S template, then
3294compares its name to the usage in @c s.mem() in the @c x function template
3295</pre></td></tr>
3296
3297
3298<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>
3299<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
3300
3301Given
3302struct A {
3303  void foo() const;
3304  void bar();
3305};
3306
3307cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
3308</pre></td></tr>
3309
3310
3311<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>
3312<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
3313operator.
3314
3315Given
3316struct A {
3317  A &amp;operator=(const A &amp;);
3318  A &amp;operator=(A &amp;&amp;);
3319};
3320
3321cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
3322the second one.
3323</pre></td></tr>
3324
3325
3326<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>
3327<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
3328
3329Given:
3330  class A final {};
3331
3332  struct B {
3333    virtual void f();
3334  };
3335
3336  struct C : B {
3337    void f() final;
3338  };
3339matches A and C::f, but not B, C, or B::f
3340</pre></td></tr>
3341
3342
3343<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>
3344<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
3345operator.
3346
3347Given
3348struct A {
3349  A &amp;operator=(const A &amp;);
3350  A &amp;operator=(A &amp;&amp;);
3351};
3352
3353cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
3354the first one.
3355</pre></td></tr>
3356
3357
3358<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>
3359<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
3360
3361Given
3362  class A {
3363   public:
3364    virtual void x();
3365  };
3366  class B : public A {
3367   public:
3368    virtual void x();
3369  };
3370  matches B::x
3371</pre></td></tr>
3372
3373
3374<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>
3375<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
3376
3377Given
3378  class A {
3379   public:
3380    virtual void x() = 0;
3381  };
3382  matches A::x
3383</pre></td></tr>
3384
3385
3386<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>
3387<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
3388
3389Given
3390  struct S {
3391    S(); // #1
3392    S(const S &amp;) = default; // #2
3393    S(S &amp;&amp;) = delete; // #3
3394  };
3395cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
3396</pre></td></tr>
3397
3398
3399<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>
3400<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
3401virtual inheritance.
3402
3403Example:
3404  class A {
3405   public:
3406    virtual void x(); // matches x
3407  };
3408
3409Example:
3410  class Base {};
3411  class DirectlyDerived : virtual Base {}; // matches Base
3412  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
3413
3414Usable 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;
3415</pre></td></tr>
3416
3417
3418<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>
3419<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
3420
3421Given
3422  class A {
3423   public:
3424    virtual void x();
3425  };
3426  class B : public A {
3427   public:
3428    void x();
3429  };
3430  matches A::x but not B::x
3431</pre></td></tr>
3432
3433
3434<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>
3435<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
3436
3437Given:
3438  MyClass *p1 = new MyClass[10];
3439cxxNewExpr(isArray())
3440  matches the expression 'new MyClass[10]'.
3441</pre></td></tr>
3442
3443
3444<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>
3445<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
3446specified names.
3447
3448   hasAnyOperatorName("+", "-")
3449 Is equivalent to
3450   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3451</pre></td></tr>
3452
3453
3454<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>
3455<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
3456
3457Matches overloaded operator names specified in strings without the
3458"operator" prefix: e.g. "&lt;&lt;".
3459
3460  hasAnyOverloadedOperatorName("+", "-")
3461Is equivalent to
3462  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3463</pre></td></tr>
3464
3465
3466<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>
3467<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
3468unary).
3469
3470Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3471  !(a || b)
3472</pre></td></tr>
3473
3474
3475<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>
3476<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
3477
3478Matches overloaded operator names specified in strings without the
3479"operator" prefix: e.g. "&lt;&lt;".
3480
3481Given:
3482  class A { int operator*(); };
3483  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3484  A a;
3485  a &lt;&lt; a;   // &lt;-- This matches
3486
3487cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3488specified line and
3489cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3490matches the declaration of A.
3491
3492Usable 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;
3493</pre></td></tr>
3494
3495
3496<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>
3497<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
3498
3499Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3500  if (a == b)
3501    a += b;
3502
3503Example 2: matches s1 = s2
3504           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3505  struct S { S&amp; operator=(const S&amp;); };
3506  void x() { S s1, s2; s1 = s2; }
3507</pre></td></tr>
3508
3509
3510<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
3511<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
3512
3513Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3514  if (a == b)
3515    a += b;
3516
3517Example 2: matches s1 &lt; s2
3518           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3519  struct S { bool operator&lt;(const S&amp; other); };
3520  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3521</pre></td></tr>
3522
3523
3524<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>
3525<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
3526
3527Example matches x (matcher = cxxRecordDecl(hasDefinition()))
3528class x {};
3529class y;
3530</pre></td></tr>
3531
3532
3533<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>
3534<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3535</pre></td></tr>
3536
3537
3538<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
3539<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3540</pre></td></tr>
3541
3542
3543<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>
3544<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
3545static member variable template instantiations.
3546
3547Given
3548  template&lt;typename T&gt; void A(T t) { }
3549  template&lt;&gt; void A(int N) { }
3550functionDecl(isExplicitTemplateSpecialization())
3551  matches the specialization A&lt;int&gt;().
3552
3553Usable 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;
3554</pre></td></tr>
3555
3556
3557<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
3558<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
3559
3560Given:
3561  class A final {};
3562
3563  struct B {
3564    virtual void f();
3565  };
3566
3567  struct C : B {
3568    void f() final;
3569  };
3570matches A and C::f, but not B, C, or B::f
3571</pre></td></tr>
3572
3573
3574<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>
3575<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
3576
3577Given:
3578  auto x = []{};
3579
3580cxxRecordDecl(isLambda()) matches the implicit class declaration of
3581decltype(x)
3582</pre></td></tr>
3583
3584
3585<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>
3586<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
3587isSameOrDerivedFrom(hasName(...)).
3588</pre></td></tr>
3589
3590
3591<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>
3592<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
3593member variable template instantiations.
3594
3595Given
3596  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3597or
3598  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3599or
3600  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3601cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3602  matches the template instantiation of X&lt;A&gt;.
3603
3604But given
3605  template &lt;typename T&gt;  class X {}; class A {};
3606  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3607cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3608  does not match, as X&lt;A&gt; is an explicit template specialization.
3609
3610Usable 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;
3611</pre></td></tr>
3612
3613
3614<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>
3615<tr><td colspan="4" class="doc" id="hasAnyOperatorName2"><pre>Matches operator expressions (binary or unary) that have any of the
3616specified names.
3617
3618   hasAnyOperatorName("+", "-")
3619 Is equivalent to
3620   anyOf(hasOperatorName("+"), hasOperatorName("-"))
3621</pre></td></tr>
3622
3623
3624<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>
3625<tr><td colspan="4" class="doc" id="hasOperatorName2"><pre>Matches the operator Name of operator expressions (binary or
3626unary).
3627
3628Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
3629  !(a || b)
3630</pre></td></tr>
3631
3632
3633<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>
3634<tr><td colspan="4" class="doc" id="isAssignmentOperator2"><pre>Matches all kinds of assignment operators.
3635
3636Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
3637  if (a == b)
3638    a += b;
3639
3640Example 2: matches s1 = s2
3641           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
3642  struct S { S&amp; operator=(const S&amp;); };
3643  void x() { S s1, s2; s1 = s2; }
3644</pre></td></tr>
3645
3646
3647<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRewrittenBinaryOperator.html">CXXRewrittenBinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator2')"><a name="isComparisonOperator2Anchor">isComparisonOperator</a></td><td></td></tr>
3648<tr><td colspan="4" class="doc" id="isComparisonOperator2"><pre>Matches comparison operators.
3649
3650Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
3651  if (a == b)
3652    a += b;
3653
3654Example 2: matches s1 &lt; s2
3655           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
3656  struct S { bool operator&lt;(const S&amp; other); };
3657  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
3658</pre></td></tr>
3659
3660
3661<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>
3662<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3663a specific number of arguments (including absent default arguments).
3664
3665Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3666  void f(int x, int y);
3667  f(0, 0);
3668</pre></td></tr>
3669
3670
3671<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>
3672<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
3673a specific number of arguments (including absent default arguments).
3674
3675Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3676  void f(int x, int y);
3677  f(0, 0);
3678</pre></td></tr>
3679
3680
3681<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>
3682<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
3683
3684Example matches y(x) but not y(42) or NS::y(x).
3685  namespace NS {
3686    struct X {};
3687    void y(X);
3688  }
3689
3690  void y(...);
3691
3692  void test() {
3693    NS::X x;
3694    y(x); // Matches
3695    NS::y(x); // Doesn't match
3696    y(42); // Doesn't match
3697    using NS::y;
3698    y(x); // Found by both unqualified lookup and ADL, doesn't match
3699   }
3700</pre></td></tr>
3701
3702
3703<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>
3704<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
3705
3706Example: matches the implicit cast around 0
3707(matcher = castExpr(hasCastKind(CK_NullToPointer)))
3708  int *p = 0;
3709
3710If the matcher is use from clang-query, CastKind parameter
3711should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
3712</pre></td></tr>
3713
3714
3715<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>
3716<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
3717
3718
3719<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
3720<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
3721
3722Given
3723  f('false, 3.14, 42);
3724characterLiteral(equals(0))
3725  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3726  match false
3727floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3728  match 3.14
3729integerLiteral(equals(42))
3730  matches 42
3731
3732Note that you cannot directly match a negative numeric literal because the
3733minus sign is not part of the literal: It is a unary operator whose operand
3734is the positive numeric literal. Instead, you must use a unaryOperator()
3735matcher to match the minus sign:
3736
3737unaryOperator(hasOperatorName("-"),
3738              hasUnaryOperand(integerLiteral(equals(13))))
3739
3740Usable 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;,
3741           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;
3742</pre></td></tr>
3743
3744
3745<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>
3746<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
3747
3748
3749<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
3750<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
3751
3752
3753<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>
3754<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
3755
3756Given
3757  template&lt;typename T&gt; struct C {};
3758  C&lt;int&gt; c;
3759classTemplateSpecializationDecl(templateArgumentCountIs(1))
3760  matches C&lt;int&gt;.
3761</pre></td></tr>
3762
3763
3764<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>
3765<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
3766child statements.
3767
3768Example: Given
3769  { for (;;) {} }
3770compoundStmt(statementCountIs(0)))
3771  matches '{}'
3772  but does not match the outer compound statement.
3773</pre></td></tr>
3774
3775
3776<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>
3777<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
3778
3779Given
3780  int a[42];
3781  int b[2 * 21];
3782  int c[41], d[43];
3783  char *s = "abcd";
3784  wchar_t *ws = L"abcd";
3785  char *w = "a";
3786constantArrayType(hasSize(42))
3787  matches "int a[42]" and "int b[2 * 21]"
3788stringLiteral(hasSize(4))
3789  matches "abcd", L"abcd"
3790</pre></td></tr>
3791
3792
3793<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>
3794<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
3795declarations.
3796
3797Example: Given
3798  int a, b;
3799  int c;
3800  int d = 2, e;
3801declCountIs(2)
3802  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3803</pre></td></tr>
3804
3805
3806<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3807<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3808
3809Matches a node if it equals the node previously bound to ID.
3810
3811Given
3812  class X { int a; int b; };
3813cxxRecordDecl(
3814    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3815    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3816  matches the class X, as a and b have the same type.
3817
3818Note that when multiple matches are involved via forEach* matchers,
3819equalsBoundNodes acts as a filter.
3820For example:
3821compoundStmt(
3822    forEachDescendant(varDecl().bind("d")),
3823    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3824will trigger a match for each combination of variable declaration
3825and reference to that variable declaration within a compound statement.
3826</pre></td></tr>
3827
3828
3829<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>
3830<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3831
3832Decl has pointer identity in the AST.
3833</pre></td></tr>
3834
3835
3836<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>
3837<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3838
3839Given
3840  __attribute__((device)) void f() { ... }
3841decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3842f. If the matcher is used from clang-query, attr::Kind parameter should be
3843passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3844</pre></td></tr>
3845
3846
3847<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>
3848<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3849Does not match if only part of the statement is expanded from that macro or
3850if different parts of the statement are expanded from different
3851appearances of the macro.
3852</pre></td></tr>
3853
3854
3855<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>
3856<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3857partially matching a given regex.
3858
3859Example matches Y but not X
3860    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3861  #include "ASTMatcher.h"
3862  class X {};
3863ASTMatcher.h:
3864  class Y {};
3865
3866Usable 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;
3867
3868If the matcher is used in clang-query, RegexFlags parameter
3869should be passed as a quoted string. e.g: "NoFlags".
3870Flags can be combined with '|' example "IgnoreCase | BasicRegex"
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('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
3875<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3876
3877Example matches X but not Y
3878  (matcher = cxxRecordDecl(isExpansionInMainFile())
3879  #include &lt;Y.h&gt;
3880  class X {};
3881Y.h:
3882  class Y {};
3883
3884Usable 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;
3885</pre></td></tr>
3886
3887
3888<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3889<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3890
3891Example matches Y but not X
3892    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3893  #include &lt;SystemHeader.h&gt;
3894  class X {};
3895SystemHeader.h:
3896  class Y {};
3897
3898Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3899</pre></td></tr>
3900
3901
3902<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3903<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches an entity that has been implicitly added by the compiler (e.g.
3904implicit default/copy constructors).
3905</pre></td></tr>
3906
3907
3908<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>
3909<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3910
3911Given
3912  class vector {};
3913  namespace foo {
3914    class vector {};
3915    namespace std {
3916      class vector {};
3917    }
3918  }
3919  namespace std {
3920    inline namespace __1 {
3921      class vector {}; // #1
3922      namespace experimental {
3923        class vector {};
3924      }
3925    }
3926  }
3927cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3928</pre></td></tr>
3929
3930
3931<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>
3932<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3933template instantiations.
3934
3935Given
3936  template&lt;typename T&gt; void A(T t) { T i; }
3937  A(0);
3938  A(0U);
3939functionDecl(isInstantiated())
3940  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3941</pre></td></tr>
3942
3943
3944<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>
3945<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3946inheritance.
3947
3948Examples:
3949  class C {
3950  public:    int a;
3951  protected: int b;
3952  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3953  };
3954
3955  struct Base {};
3956  struct Derived1 : private Base {}; // matches 'Base'
3957  class Derived2 : Base {}; // matches 'Base'
3958</pre></td></tr>
3959
3960
3961<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>
3962<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3963protected inheritance.
3964
3965Examples:
3966  class C {
3967  public:    int a;
3968  protected: int b; // fieldDecl(isProtected()) matches 'b'
3969  private:   int c;
3970  };
3971
3972  class Base {};
3973  class Derived : protected Base {}; // matches 'Base'
3974</pre></td></tr>
3975
3976
3977<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>
3978<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3979inheritance.
3980
3981Examples:
3982  class C {
3983  public:    int a; // fieldDecl(isPublic()) matches 'a'
3984  protected: int b;
3985  private:   int c;
3986  };
3987
3988  class Base {};
3989  class Derived1 : public Base {}; // matches 'Base'
3990  struct Derived2 : Base {}; // matches 'Base'
3991</pre></td></tr>
3992
3993
3994<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>
3995<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3996a specific number of designators.
3997
3998Example: Given
3999  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
4000  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
4001designatorCountIs(2)
4002  matches '{ [2].y = 1.0, [0].x = 1.0 }',
4003  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
4004</pre></td></tr>
4005
4006
4007<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>
4008<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
4009
4010Example matches Y (matcher = enumDecl(isScoped()))
4011enum X {};
4012enum class Y {};
4013</pre></td></tr>
4014
4015
4016<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>
4017<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
4018neither type- nor value-dependent.
4019
4020In the following example, the expression sizeof(sizeof(T() + T()))
4021is instantiation-dependent (since it involves a template parameter T),
4022but is neither type- nor value-dependent, since the type of the inner
4023sizeof is known (std::size_t) and therefore the size of the outer
4024sizeof is known.
4025  template&lt;typename T&gt;
4026  void f(T x, T y) { sizeof(sizeof(T() + T()); }
4027expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
4028</pre></td></tr>
4029
4030
4031<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>
4032<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
4033is not yet instantiated.
4034
4035For example, the expressions "x" and "x + y" are type-dependent in
4036the following code, but "y" is not type-dependent:
4037  template&lt;typename T&gt;
4038  void add(T x, int y) {
4039    x + y;
4040  }
4041expr(isTypeDependent()) matches x + y
4042</pre></td></tr>
4043
4044
4045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
4046<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
4047non-type template parameter.
4048
4049For example, the array bound of "Chars" in the following example is
4050value-dependent.
4051  template&lt;int Size&gt; int f() { return Size; }
4052expr(isValueDependent()) matches return Size
4053</pre></td></tr>
4054
4055
4056<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>
4057<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4058GNU's __null, C++11's nullptr, or C's NULL macro.
4059
4060Given:
4061  void *v1 = NULL;
4062  void *v2 = nullptr;
4063  void *v3 = __null; // GNU extension
4064  char *cp = (char *)0;
4065  int *ip = 0;
4066  int i = 0;
4067expr(nullPointerConstant())
4068  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4069  initializer for i.
4070</pre></td></tr>
4071
4072
4073<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>
4074<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
4075bit width.
4076
4077Given
4078  class C {
4079    int a : 2;
4080    int b : 4;
4081    int c : 2;
4082  };
4083fieldDecl(hasBitWidth(2))
4084  matches 'int a;' and 'int c;' but not 'int b;'.
4085</pre></td></tr>
4086
4087
4088<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>
4089<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
4090
4091Given
4092  class C {
4093    int a : 2;
4094    int b;
4095  };
4096fieldDecl(isBitField())
4097  matches 'int a;' but not 'int b;'.
4098</pre></td></tr>
4099
4100
4101<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>
4102<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
4103
4104Given
4105  f('false, 3.14, 42);
4106characterLiteral(equals(0))
4107  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4108  match false
4109floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4110  match 3.14
4111integerLiteral(equals(42))
4112  matches 42
4113
4114Note that you cannot directly match a negative numeric literal because the
4115minus sign is not part of the literal: It is a unary operator whose operand
4116is the positive numeric literal. Instead, you must use a unaryOperator()
4117matcher to match the minus sign:
4118
4119unaryOperator(hasOperatorName("-"),
4120              hasUnaryOperand(integerLiteral(equals(13))))
4121
4122Usable 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;,
4123           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;
4124</pre></td></tr>
4125
4126
4127<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>
4128<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
4129
4130
4131<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>
4132<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
4133
4134Matches overloaded operator names specified in strings without the
4135"operator" prefix: e.g. "&lt;&lt;".
4136
4137  hasAnyOverloadedOperatorName("+", "-")
4138Is equivalent to
4139  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
4140</pre></td></tr>
4141
4142
4143<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>
4144<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
4145
4146Given:
4147  void f();
4148  void g() noexcept;
4149  void h() noexcept(true);
4150  void i() noexcept(false);
4151  void j() throw();
4152  void k() throw(int);
4153  void l() throw(...);
4154functionDecl(hasDynamicExceptionSpec()) and
4155  functionProtoType(hasDynamicExceptionSpec())
4156  match the declarations of j, k, and l, but not f, g, h, or i.
4157</pre></td></tr>
4158
4159
4160<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>
4161<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
4162
4163Matches overloaded operator names specified in strings without the
4164"operator" prefix: e.g. "&lt;&lt;".
4165
4166Given:
4167  class A { int operator*(); };
4168  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
4169  A a;
4170  a &lt;&lt; a;   // &lt;-- This matches
4171
4172cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
4173specified line and
4174cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
4175matches the declaration of A.
4176
4177Usable 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;
4178</pre></td></tr>
4179
4180
4181<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>
4182<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
4183
4184Example matches Y (matcher = functionDecl(hasTrailingReturn()))
4185int X() {}
4186auto Y() -&gt; int {}
4187</pre></td></tr>
4188
4189
4190<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>
4191<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
4192       and if constexpr.
4193
4194Given:
4195  constexpr int foo = 42;
4196  constexpr int bar();
4197  void baz() { if constexpr(1 &gt; 0) {} }
4198varDecl(isConstexpr())
4199  matches the declaration of foo.
4200functionDecl(isConstexpr())
4201  matches the declaration of bar.
4202ifStmt(isConstexpr())
4203  matches the if statement in baz.
4204</pre></td></tr>
4205
4206
4207<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>
4208<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
4209
4210Given:
4211  class A { ~A(); };
4212  class B { ~B() = default; };
4213functionDecl(isDefaulted())
4214  matches the declaration of ~B, but not ~A.
4215</pre></td></tr>
4216
4217
4218<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>
4219<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
4220
4221Example matches A, va, fa
4222  class A {};
4223  class B;  // Doesn't match, as it has no body.
4224  int va;
4225  extern int vb;  // Doesn't match, as it doesn't define the variable.
4226  void fa() {}
4227  void fb();  // Doesn't match, as it has no body.
4228  @interface X
4229  - (void)ma; // Doesn't match, interface is declaration.
4230  @end
4231  @implementation X
4232  - (void)ma {}
4233  @end
4234
4235Usable 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;,
4236  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4237</pre></td></tr>
4238
4239
4240<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>
4241<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
4242
4243Given:
4244  void Func();
4245  void DeletedFunc() = delete;
4246functionDecl(isDeleted())
4247  matches the declaration of DeletedFunc, but not Func.
4248</pre></td></tr>
4249
4250
4251<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>
4252<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
4253static member variable template instantiations.
4254
4255Given
4256  template&lt;typename T&gt; void A(T t) { }
4257  template&lt;&gt; void A(int N) { }
4258functionDecl(isExplicitTemplateSpecialization())
4259  matches the specialization A&lt;int&gt;().
4260
4261Usable 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;
4262</pre></td></tr>
4263
4264
4265<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
4266<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
4267
4268Given:
4269  extern "C" void f() {}
4270  extern "C" { void g() {} }
4271  void h() {}
4272  extern "C" int x = 1;
4273  extern "C" int y = 2;
4274  int z = 3;
4275functionDecl(isExternC())
4276  matches the declaration of f and g, but not the declaration of h.
4277varDecl(isExternC())
4278  matches the declaration of x and y, but not the declaration of z.
4279</pre></td></tr>
4280
4281
4282<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>
4283<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
4284the inline keyword.
4285
4286Given
4287  inline void f();
4288  void g();
4289  namespace n {
4290  inline namespace m {}
4291  }
4292functionDecl(isInline()) will match ::f().
4293namespaceDecl(isInline()) will match n::m.
4294</pre></td></tr>
4295
4296
4297<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>
4298<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
4299into an executable program.
4300</pre></td></tr>
4301
4302
4303<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>
4304<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
4305
4306Given
4307  void nope();
4308  [[noreturn]] void a();
4309  __attribute__((noreturn)) void b();
4310  struct c { [[noreturn]] c(); };
4311functionDecl(isNoReturn())
4312  matches all of those except
4313  void nope();
4314</pre></td></tr>
4315
4316
4317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
4318<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
4319
4320Given:
4321  void f();
4322  void g() noexcept;
4323  void h() throw();
4324  void i() throw(int);
4325  void j() noexcept(false);
4326functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4327  match the declarations of g, and h, but not f, i or j.
4328</pre></td></tr>
4329
4330
4331<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
4332<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
4333class specifier ("static" keyword) written in the source.
4334
4335Given:
4336  static void f() {}
4337  static int i = 0;
4338  extern int j;
4339  int k;
4340functionDecl(isStaticStorageClass())
4341  matches the function declaration f.
4342varDecl(isStaticStorageClass())
4343  matches the variable declaration i.
4344</pre></td></tr>
4345
4346
4347<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
4348<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
4349member variable template instantiations.
4350
4351Given
4352  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4353or
4354  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4355or
4356  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4357cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4358  matches the template instantiation of X&lt;A&gt;.
4359
4360But given
4361  template &lt;typename T&gt;  class X {}; class A {};
4362  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4363cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4364  does not match, as X&lt;A&gt; is an explicit template specialization.
4365
4366Usable 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;
4367</pre></td></tr>
4368
4369
4370<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>
4371<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
4372
4373Example matches f, but not g or h. The function i will not match, even when
4374compiled in C mode.
4375  void f(...);
4376  void g(int);
4377  template &lt;typename... Ts&gt; void h(Ts...);
4378  void i();
4379</pre></td></tr>
4380
4381
4382<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>
4383<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
4384
4385Given:
4386  void foo() __attribute__((__weakref__("__foo")));
4387  void bar();
4388functionDecl(isWeak())
4389  matches the weak declaration "foo", but not "bar".
4390</pre></td></tr>
4391
4392
4393<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>
4394<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4395specific parameter count.
4396
4397Given
4398  void f(int i) {}
4399  void g(int i, int j) {}
4400  void h(int i, int j);
4401  void j(int i);
4402  void k(int x, int y, int z, ...);
4403functionDecl(parameterCountIs(2))
4404  matches g and h
4405functionProtoType(parameterCountIs(2))
4406  matches g and h
4407functionProtoType(parameterCountIs(3))
4408  matches k
4409</pre></td></tr>
4410
4411
4412<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>
4413<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
4414
4415Given:
4416  void f();
4417  void g() noexcept;
4418  void h() noexcept(true);
4419  void i() noexcept(false);
4420  void j() throw();
4421  void k() throw(int);
4422  void l() throw(...);
4423functionDecl(hasDynamicExceptionSpec()) and
4424  functionProtoType(hasDynamicExceptionSpec())
4425  match the declarations of j, k, and l, but not f, g, h, or i.
4426</pre></td></tr>
4427
4428
4429<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>
4430<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
4431
4432Given:
4433  void f();
4434  void g() noexcept;
4435  void h() throw();
4436  void i() throw(int);
4437  void j() noexcept(false);
4438functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
4439  match the declarations of g, and h, but not f, i or j.
4440</pre></td></tr>
4441
4442
4443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
4444<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
4445specific parameter count.
4446
4447Given
4448  void f(int i) {}
4449  void g(int i, int j) {}
4450  void h(int i, int j);
4451  void j(int i);
4452  void k(int x, int y, int z, ...);
4453functionDecl(parameterCountIs(2))
4454  matches g and h
4455functionProtoType(parameterCountIs(2))
4456  matches g and h
4457functionProtoType(parameterCountIs(3))
4458  matches k
4459</pre></td></tr>
4460
4461
4462<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>
4463<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
4464       and if constexpr.
4465
4466Given:
4467  constexpr int foo = 42;
4468  constexpr int bar();
4469  void baz() { if constexpr(1 &gt; 0) {} }
4470varDecl(isConstexpr())
4471  matches the declaration of foo.
4472functionDecl(isConstexpr())
4473  matches the declaration of bar.
4474ifStmt(isConstexpr())
4475  matches the if statement in baz.
4476</pre></td></tr>
4477
4478
4479<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>
4480<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
4481
4482
4483<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr>
4484<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
4485
4486Given
4487  f('false, 3.14, 42);
4488characterLiteral(equals(0))
4489  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
4490  match false
4491floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
4492  match 3.14
4493integerLiteral(equals(42))
4494  matches 42
4495
4496Note that you cannot directly match a negative numeric literal because the
4497minus sign is not part of the literal: It is a unary operator whose operand
4498is the positive numeric literal. Instead, you must use a unaryOperator()
4499matcher to match the minus sign:
4500
4501unaryOperator(hasOperatorName("-"),
4502              hasUnaryOperand(integerLiteral(equals(13))))
4503
4504Usable 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;,
4505           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;
4506</pre></td></tr>
4507
4508
4509<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>
4510<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
4511
4512
4513<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;</td><td class="name" onclick="toggle('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
4514<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
4515
4516
4517<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>
4518<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
4519to '.'.
4520
4521Member calls on the implicit this pointer match as called with '-&gt;'.
4522
4523Given
4524  class Y {
4525    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4526    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4527    int a;
4528    static int b;
4529  };
4530  template &lt;class T&gt;
4531  class Z {
4532    void x() { this-&gt;m; }
4533  };
4534memberExpr(isArrow())
4535  matches this-&gt;x, x, y.x, a, this-&gt;b
4536cxxDependentScopeMemberExpr(isArrow())
4537  matches this-&gt;m
4538unresolvedMemberExpr(isArrow())
4539  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4540</pre></td></tr>
4541
4542
4543<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>
4544<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4545
4546This matcher is only provided as a performance optimization of hasName.
4547    hasAnyName(a, b, c)
4548 is equivalent to, but faster than
4549    anyOf(hasName(a), hasName(b), hasName(c))
4550</pre></td></tr>
4551
4552
4553<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>
4554<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
4555
4556Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
4557void f() {
4558  int x;
4559  static int y;
4560}
4561int z;
4562
4563Example matches f() because it has external formal linkage despite being
4564unique to the translation unit as though it has internal likage
4565(matcher = functionDecl(hasExternalFormalLinkage()))
4566
4567namespace {
4568void f() {}
4569}
4570</pre></td></tr>
4571
4572
4573<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>
4574<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
4575
4576Supports specifying enclosing namespaces or classes by prefixing the name
4577with '&lt;enclosing&gt;::'.
4578Does not match typedefs of an underlying type with the given name.
4579
4580Example matches X (Name == "X")
4581  class X;
4582
4583Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
4584  namespace a { namespace b { class X; } }
4585</pre></td></tr>
4586
4587
4588<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>
4589<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
4590a substring matched by the given RegExp.
4591
4592Supports specifying enclosing namespaces or classes by
4593prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
4594of an underlying type with the given name.
4595
4596Example matches X (regexp == "::X")
4597  class X;
4598
4599Example matches X (regexp is one of "::X", "^foo::.*X", among others)
4600  namespace foo { namespace bar { class X; } }
4601
4602If the matcher is used in clang-query, RegexFlags parameter
4603should be passed as a quoted string. e.g: "NoFlags".
4604Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4605</pre></td></tr>
4606
4607
4608<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>
4609<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
4610
4611Given
4612  namespace n {
4613  namespace {} // #1
4614  }
4615namespaceDecl(isAnonymous()) will match #1 but not ::n.
4616</pre></td></tr>
4617
4618
4619<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>
4620<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
4621the inline keyword.
4622
4623Given
4624  inline void f();
4625  void g();
4626  namespace n {
4627  inline namespace m {}
4628  }
4629functionDecl(isInline()) will match ::f().
4630namespaceDecl(isInline()) will match n::m.
4631</pre></td></tr>
4632
4633
4634<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>
4635<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
4636specified.
4637
4638Given
4639
4640  #pragma omp parallel
4641  #pragma omp parallel default(none)
4642  #pragma omp parallel default(shared)
4643  #pragma omp parallel default(firstprivate)
4644
4645``ompDefaultClause(isFirstPrivateKind())`` matches only
4646``default(firstprivate)``.
4647</pre></td></tr>
4648
4649
4650<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>
4651<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
4652
4653Given
4654
4655  #pragma omp parallel
4656  #pragma omp parallel default(none)
4657  #pragma omp parallel default(shared)
4658  #pragma omp parallel default(firstprivate)
4659
4660``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
4661</pre></td></tr>
4662
4663
4664<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>
4665<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
4666
4667Given
4668
4669  #pragma omp parallel
4670  #pragma omp parallel default(none)
4671  #pragma omp parallel default(shared)
4672  #pragma omp parallel default(firstprivate)
4673
4674``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
4675</pre></td></tr>
4676
4677
4678<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>
4679<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
4680clause kind.
4681
4682Given
4683
4684  #pragma omp parallel
4685  #pragma omp parallel for
4686  #pragma omp          for
4687
4688`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
4689``omp parallel`` and ``omp parallel for``.
4690
4691If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
4692should be passed as a quoted string. e.g.,
4693``isAllowedToContainClauseKind("OMPC_default").``
4694</pre></td></tr>
4695
4696
4697<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>
4698<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
4699i.e., directives that can't have a structured block.
4700
4701Given
4702
4703  #pragma omp parallel
4704  {}
4705  #pragma omp taskyield
4706
4707``ompExecutableDirective(isStandaloneDirective()))`` matches
4708``omp taskyield``.
4709</pre></td></tr>
4710
4711
4712<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>
4713<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
4714</pre></td></tr>
4715
4716
4717<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>
4718<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
4719</pre></td></tr>
4720
4721
4722<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>
4723<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
4724isSameOrDerivedFrom(hasName(...)).
4725</pre></td></tr>
4726
4727
4728<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>
4729<tr><td colspan="4" class="doc" id="argumentCountIs3"><pre>Checks that a call expression or a constructor call expression has
4730a specific number of arguments (including absent default arguments).
4731
4732Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
4733  void f(int x, int y);
4734  f(0, 0);
4735</pre></td></tr>
4736
4737
4738<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>
4739<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4740Selector.getAsString()
4741
4742 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4743 matches both of the expressions below:
4744    [myObj methodA:argA];
4745    [myObj methodB:argB];
4746</pre></td></tr>
4747
4748
4749<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
4750<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
4751
4752objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
4753message expression in
4754
4755  UIWebView *webView = ...;
4756  CGRect bodyFrame = webView.frame;
4757  bodyFrame.size.height = self.bodyContentHeight;
4758  webView.frame = bodyFrame;
4759  //     ^---- matches here
4760</pre></td></tr>
4761
4762
4763<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>
4764<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
4765
4766Matches only when the selector of the objCMessageExpr is NULL. This may
4767represent an error condition in the tree!
4768</pre></td></tr>
4769
4770
4771<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>
4772<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
4773
4774 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
4775 matches the outer message expr in the code below, but NOT the message
4776 invocation for self.bodyView.
4777    [self.bodyView loadHTMLString:html baseURL:NULL];
4778</pre></td></tr>
4779
4780
4781<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>
4782<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
4783
4784 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
4785 matches self.bodyView in the code below, but NOT the outer message
4786 invocation of "loadHTMLString:baseURL:".
4787    [self.bodyView loadHTMLString:html baseURL:NULL];
4788</pre></td></tr>
4789
4790
4791<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>
4792<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
4793
4794Example
4795matcher = objcMessageExpr(isClassMessage())
4796matches
4797  [NSString stringWithFormat:@"format"];
4798but not
4799  NSString *x = @"hello";
4800  [x containsString:@"h"];
4801</pre></td></tr>
4802
4803
4804<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>
4805<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4806
4807Example
4808matcher = objcMessageExpr(isInstanceMessage())
4809matches
4810  NSString *x = @"hello";
4811  [x containsString:@"h"];
4812but not
4813  [NSString stringWithFormat:@"format"];
4814</pre></td></tr>
4815
4816
4817<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4818<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4819a substring matched by the given RegExp.
4820 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4821 invocation for self.bodyView.
4822    [self.bodyView loadHTMLString:html baseURL:NULL];
4823
4824If the matcher is used in clang-query, RegexFlags parameter
4825should be passed as a quoted string. e.g: "NoFlags".
4826Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4827</pre></td></tr>
4828
4829
4830<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>
4831<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4832
4833 matcher = objCMessageExpr(numSelectorArgs(0));
4834 matches self.bodyView in the code below
4835
4836 matcher = objCMessageExpr(numSelectorArgs(2));
4837 matches the invocation of "loadHTMLString:baseURL:" but not that
4838 of self.bodyView
4839    [self.bodyView loadHTMLString:html baseURL:NULL];
4840</pre></td></tr>
4841
4842
4843<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>
4844<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4845
4846Example
4847matcher = objcMethodDecl(isClassMethod())
4848matches
4849@interface I + (void)foo; @end
4850but not
4851@interface I - (void)bar; @end
4852</pre></td></tr>
4853
4854
4855<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>
4856<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4857
4858Example matches A, va, fa
4859  class A {};
4860  class B;  // Doesn't match, as it has no body.
4861  int va;
4862  extern int vb;  // Doesn't match, as it doesn't define the variable.
4863  void fa() {}
4864  void fb();  // Doesn't match, as it has no body.
4865  @interface X
4866  - (void)ma; // Doesn't match, interface is declaration.
4867  @end
4868  @implementation X
4869  - (void)ma {}
4870  @end
4871
4872Usable 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;,
4873  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4874</pre></td></tr>
4875
4876
4877<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>
4878<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4879
4880Example
4881matcher = objcMethodDecl(isInstanceMethod())
4882matches
4883@interface I - (void)bar; @end
4884but not
4885@interface I + (void)foo; @end
4886</pre></td></tr>
4887
4888
4889<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>
4890<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4891
4892Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4893void x(int val) {}
4894void y(int val = 0) {}
4895
4896Deprecated. Use hasInitializer() instead to be able to
4897match on the contents of the default argument.  For example:
4898
4899void x(int val = 7) {}
4900void y(int val = 42) {}
4901parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4902  matches the parameter of y
4903
4904A matcher such as
4905  parmVarDecl(hasInitializer(anything()))
4906is equivalent to parmVarDecl(hasDefaultArgument()).
4907</pre></td></tr>
4908
4909
4910<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>
4911<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4912list. The parameter list could be that of either a block, function, or
4913objc-method.
4914
4915
4916Given
4917
4918void f(int a, int b, int c) {
4919}
4920
4921``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4922
4923``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4924</pre></td></tr>
4925
4926
4927<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>
4928<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4929
4930Given
4931  class Y { public: void x(); };
4932  void z() { Y* y; y-&gt;x(); }
4933cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4934  matches y-&gt;x()
4935</pre></td></tr>
4936
4937
4938<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4939<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4940
4941Matches a node if it equals the node previously bound to ID.
4942
4943Given
4944  class X { int a; int b; };
4945cxxRecordDecl(
4946    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4947    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4948  matches the class X, as a and b have the same type.
4949
4950Note that when multiple matches are involved via forEach* matchers,
4951equalsBoundNodes acts as a filter.
4952For example:
4953compoundStmt(
4954    forEachDescendant(varDecl().bind("d")),
4955    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4956will trigger a match for each combination of variable declaration
4957and reference to that variable declaration within a compound statement.
4958</pre></td></tr>
4959
4960
4961<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>
4962<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4963the node, not hidden within a typedef.
4964
4965Given
4966  typedef const int const_int;
4967  const_int i;
4968  int *const j;
4969  int *volatile k;
4970  int m;
4971varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4972i is const-qualified but the qualifier is not local.
4973</pre></td></tr>
4974
4975
4976<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>
4977<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4978
4979Given
4980  void a(char);
4981  void b(wchar_t);
4982  void c(double);
4983functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4984matches "a(char)", "b(wchar_t)", but not "c(double)".
4985</pre></td></tr>
4986
4987
4988<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>
4989<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4990the Objective-C object pointer type, which is different despite being
4991syntactically similar.
4992
4993Given
4994  int *i = nullptr;
4995
4996  @interface Foo
4997  @end
4998  Foo *f;
4999
5000  int j;
5001varDecl(hasType(isAnyPointer()))
5002  matches "int *i" and "Foo *f", but not "int j".
5003</pre></td></tr>
5004
5005
5006<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
5007<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
5008include "top-level" const.
5009
5010Given
5011  void a(int);
5012  void b(int const);
5013  void c(const int);
5014  void d(const int*);
5015  void e(int const) {};
5016functionDecl(hasAnyParameter(hasType(isConstQualified())))
5017  matches "void b(int const)", "void c(const int)" and
5018  "void e(int const) {}". It does not match d as there
5019  is no top-level const on the parameter type "const int *".
5020</pre></td></tr>
5021
5022
5023<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>
5024<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
5025
5026Given
5027  void a(int);
5028  void b(long);
5029  void c(double);
5030functionDecl(hasAnyParameter(hasType(isInteger())))
5031matches "a(int)", "b(long)", but not "c(double)".
5032</pre></td></tr>
5033
5034
5035<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>
5036<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
5037
5038Given
5039  void a(int);
5040  void b(unsigned long);
5041  void c(double);
5042functionDecl(hasAnyParameter(hasType(isSignedInteger())))
5043matches "a(int)", but not "b(unsigned long)" and "c(double)".
5044</pre></td></tr>
5045
5046
5047<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>
5048<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
5049
5050Given
5051  void a(int);
5052  void b(unsigned long);
5053  void c(double);
5054functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
5055matches "b(unsigned long)", but not "a(int)" and "c(double)".
5056</pre></td></tr>
5057
5058
5059<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
5060<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
5061include "top-level" volatile.
5062
5063Given
5064  void a(int);
5065  void b(int volatile);
5066  void c(volatile int);
5067  void d(volatile int*);
5068  void e(int volatile) {};
5069functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
5070  matches "void b(int volatile)", "void c(volatile int)" and
5071  "void e(int volatile) {}". It does not match d as there
5072  is no top-level volatile on the parameter type "volatile int *".
5073</pre></td></tr>
5074
5075
5076<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>
5077<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
5078
5079Matches a node if it equals the node previously bound to ID.
5080
5081Given
5082  class X { int a; int b; };
5083cxxRecordDecl(
5084    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5085    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5086  matches the class X, as a and b have the same type.
5087
5088Note that when multiple matches are involved via forEach* matchers,
5089equalsBoundNodes acts as a filter.
5090For example:
5091compoundStmt(
5092    forEachDescendant(varDecl().bind("d")),
5093    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5094will trigger a match for each combination of variable declaration
5095and reference to that variable declaration within a compound statement.
5096</pre></td></tr>
5097
5098
5099<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>
5100<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
5101
5102Stmt has pointer identity in the AST.
5103</pre></td></tr>
5104
5105
5106<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>
5107<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
5108Does not match if only part of the statement is expanded from that macro or
5109if different parts of the statement are expanded from different
5110appearances of the macro.
5111</pre></td></tr>
5112
5113
5114<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>
5115<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
5116partially matching a given regex.
5117
5118Example matches Y but not X
5119    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5120  #include "ASTMatcher.h"
5121  class X {};
5122ASTMatcher.h:
5123  class Y {};
5124
5125Usable 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;
5126
5127If the matcher is used in clang-query, RegexFlags parameter
5128should be passed as a quoted string. e.g: "NoFlags".
5129Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5130</pre></td></tr>
5131
5132
5133<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>
5134<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
5135
5136Example matches X but not Y
5137  (matcher = cxxRecordDecl(isExpansionInMainFile())
5138  #include &lt;Y.h&gt;
5139  class X {};
5140Y.h:
5141  class Y {};
5142
5143Usable 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;
5144</pre></td></tr>
5145
5146
5147<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>
5148<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
5149
5150Example matches Y but not X
5151    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5152  #include &lt;SystemHeader.h&gt;
5153  class X {};
5154SystemHeader.h:
5155  class Y {};
5156
5157Usable 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;
5158</pre></td></tr>
5159
5160
5161<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>
5162<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
5163
5164Given
5165  int j;
5166  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
5167  A(0);
5168  A(0U);
5169declStmt(isInTemplateInstantiation())
5170  matches 'int i;' and 'unsigned i'.
5171unless(stmt(isInTemplateInstantiation()))
5172  will NOT match j += 42; as it's shared between the template definition and
5173  instantiation.
5174</pre></td></tr>
5175
5176
5177<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>
5178<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
5179
5180Given
5181  int a[42];
5182  int b[2 * 21];
5183  int c[41], d[43];
5184  char *s = "abcd";
5185  wchar_t *ws = L"abcd";
5186  char *w = "a";
5187constantArrayType(hasSize(42))
5188  matches "int a[42]" and "int b[2 * 21]"
5189stringLiteral(hasSize(4))
5190  matches "abcd", L"abcd"
5191</pre></td></tr>
5192
5193
5194<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>
5195<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
5196
5197Example matches C, but not S, U or E.
5198  struct S {};
5199  class C {};
5200  union U {};
5201  enum E {};
5202</pre></td></tr>
5203
5204
5205<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>
5206<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
5207
5208Example matches A, va, fa
5209  class A {};
5210  class B;  // Doesn't match, as it has no body.
5211  int va;
5212  extern int vb;  // Doesn't match, as it doesn't define the variable.
5213  void fa() {}
5214  void fb();  // Doesn't match, as it has no body.
5215  @interface X
5216  - (void)ma; // Doesn't match, interface is declaration.
5217  @end
5218  @implementation X
5219  - (void)ma {}
5220  @end
5221
5222Usable 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;,
5223  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5224</pre></td></tr>
5225
5226
5227<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>
5228<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
5229
5230Example matches E, but not C, S or U.
5231  struct S {};
5232  class C {};
5233  union U {};
5234  enum E {};
5235</pre></td></tr>
5236
5237
5238<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>
5239<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
5240
5241Example matches S, but not C, U or E.
5242  struct S {};
5243  class C {};
5244  union U {};
5245  enum E {};
5246</pre></td></tr>
5247
5248
5249<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>
5250<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
5251
5252Example matches U, but not C, S or E.
5253  struct S {};
5254  class C {};
5255  union U {};
5256  enum E {};
5257</pre></td></tr>
5258
5259
5260<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>
5261<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
5262
5263Note that 'Value' is a string as the template argument's value is
5264an arbitrary precision integer. 'Value' must be euqal to the canonical
5265representation of that integral value in base 10.
5266
5267Given
5268  template&lt;int T&gt; struct C {};
5269  C&lt;42&gt; c;
5270classTemplateSpecializationDecl(
5271  hasAnyTemplateArgument(equalsIntegralValue("42")))
5272  matches the implicit instantiation of C in C&lt;42&gt;.
5273</pre></td></tr>
5274
5275
5276<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>
5277<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
5278
5279Given
5280  template&lt;int T&gt; struct C {};
5281  C&lt;42&gt; c;
5282classTemplateSpecializationDecl(
5283  hasAnyTemplateArgument(isIntegral()))
5284  matches the implicit instantiation of C in C&lt;42&gt;
5285  with isIntegral() matching 42.
5286</pre></td></tr>
5287
5288
5289<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>
5290<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
5291
5292Given
5293  template&lt;typename T&gt; struct C {};
5294  C&lt;int&gt; c;
5295classTemplateSpecializationDecl(templateArgumentCountIs(1))
5296  matches C&lt;int&gt;.
5297</pre></td></tr>
5298
5299
5300<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>
5301<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
5302Does not match if only part of the statement is expanded from that macro or
5303if different parts of the statement are expanded from different
5304appearances of the macro.
5305</pre></td></tr>
5306
5307
5308<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>
5309<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
5310partially matching a given regex.
5311
5312Example matches Y but not X
5313    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
5314  #include "ASTMatcher.h"
5315  class X {};
5316ASTMatcher.h:
5317  class Y {};
5318
5319Usable 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;
5320
5321If the matcher is used in clang-query, RegexFlags parameter
5322should be passed as a quoted string. e.g: "NoFlags".
5323Flags can be combined with '|' example "IgnoreCase | BasicRegex"
5324</pre></td></tr>
5325
5326
5327<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>
5328<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
5329
5330Example matches X but not Y
5331  (matcher = cxxRecordDecl(isExpansionInMainFile())
5332  #include &lt;Y.h&gt;
5333  class X {};
5334Y.h:
5335  class Y {};
5336
5337Usable 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;
5338</pre></td></tr>
5339
5340
5341<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>
5342<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
5343
5344Example matches Y but not X
5345    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
5346  #include &lt;SystemHeader.h&gt;
5347  class X {};
5348SystemHeader.h:
5349  class Y {};
5350
5351Usable 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;
5352</pre></td></tr>
5353
5354
5355<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>
5356<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
5357
5358Given
5359 struct S { bool func(); };
5360functionDecl(returns(booleanType()))
5361  matches "bool func();"
5362</pre></td></tr>
5363
5364
5365<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>
5366<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
5367
5368Matches a node if it equals the node previously bound to ID.
5369
5370Given
5371  class X { int a; int b; };
5372cxxRecordDecl(
5373    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
5374    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
5375  matches the class X, as a and b have the same type.
5376
5377Note that when multiple matches are involved via forEach* matchers,
5378equalsBoundNodes acts as a filter.
5379For example:
5380compoundStmt(
5381    forEachDescendant(varDecl().bind("d")),
5382    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
5383will trigger a match for each combination of variable declaration
5384and reference to that variable declaration within a compound statement.
5385</pre></td></tr>
5386
5387
5388<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>
5389<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
5390
5391Type has pointer identity in the AST.
5392</pre></td></tr>
5393
5394
5395<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
5396<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
5397
5398Given
5399  int i;
5400  float f;
5401realFloatingPointType()
5402  matches "float f" but not "int i"
5403</pre></td></tr>
5404
5405
5406<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>
5407<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
5408
5409Given
5410 struct S { void func(); };
5411functionDecl(returns(voidType()))
5412  matches "void func();"
5413</pre></td></tr>
5414
5415
5416<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>
5417<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
5418
5419Given
5420  int x;
5421  int s = sizeof(x) + alignof(x)
5422unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
5423  matches sizeof(x)
5424
5425If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
5426should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
5427</pre></td></tr>
5428
5429
5430<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>
5431<tr><td colspan="4" class="doc" id="hasAnyOperatorName3"><pre>Matches operator expressions (binary or unary) that have any of the
5432specified names.
5433
5434   hasAnyOperatorName("+", "-")
5435 Is equivalent to
5436   anyOf(hasOperatorName("+"), hasOperatorName("-"))
5437</pre></td></tr>
5438
5439
5440<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>
5441<tr><td colspan="4" class="doc" id="hasOperatorName3"><pre>Matches the operator Name of operator expressions (binary or
5442unary).
5443
5444Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
5445  !(a || b)
5446</pre></td></tr>
5447
5448
5449<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>
5450<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
5451to '.'.
5452
5453Member calls on the implicit this pointer match as called with '-&gt;'.
5454
5455Given
5456  class Y {
5457    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
5458    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
5459    int a;
5460    static int b;
5461  };
5462  template &lt;class T&gt;
5463  class Z {
5464    void x() { this-&gt;m; }
5465  };
5466memberExpr(isArrow())
5467  matches this-&gt;x, x, y.x, a, this-&gt;b
5468cxxDependentScopeMemberExpr(isArrow())
5469  matches this-&gt;m
5470unresolvedMemberExpr(isArrow())
5471  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
5472</pre></td></tr>
5473
5474
5475<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>
5476<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
5477
5478Example matches x, but not y, z, or a.
5479(matcher = varDecl(hasAutomaticStorageDuration())
5480void f() {
5481  int x;
5482  static int y;
5483  thread_local int z;
5484}
5485int a;
5486</pre></td></tr>
5487
5488
5489<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>
5490<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
5491
5492Example matches y and z (matcher = varDecl(hasGlobalStorage())
5493void f() {
5494  int x;
5495  static int y;
5496}
5497int z;
5498</pre></td></tr>
5499
5500
5501<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>
5502<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
5503non-static local variable.
5504
5505Example matches x (matcher = varDecl(hasLocalStorage())
5506void f() {
5507  int x;
5508  static int y;
5509}
5510int z;
5511</pre></td></tr>
5512
5513
5514<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>
5515<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
5516It includes the variable declared at namespace scope and those declared
5517with "static" and "extern" storage class specifiers.
5518
5519void f() {
5520  int x;
5521  static int y;
5522  thread_local int z;
5523}
5524int a;
5525static int b;
5526extern int c;
5527varDecl(hasStaticStorageDuration())
5528  matches the function declaration y, a, b and c.
5529</pre></td></tr>
5530
5531
5532<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>
5533<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
5534
5535Example matches z, but not x, z, or a.
5536(matcher = varDecl(hasThreadStorageDuration())
5537void f() {
5538  int x;
5539  static int y;
5540  thread_local int z;
5541}
5542int a;
5543</pre></td></tr>
5544
5545
5546<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>
5547<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
5548       and if constexpr.
5549
5550Given:
5551  constexpr int foo = 42;
5552  constexpr int bar();
5553  void baz() { if constexpr(1 &gt; 0) {} }
5554varDecl(isConstexpr())
5555  matches the declaration of foo.
5556functionDecl(isConstexpr())
5557  matches the declaration of bar.
5558ifStmt(isConstexpr())
5559  matches the if statement in baz.
5560</pre></td></tr>
5561
5562
5563<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>
5564<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
5565
5566Example matches A, va, fa
5567  class A {};
5568  class B;  // Doesn't match, as it has no body.
5569  int va;
5570  extern int vb;  // Doesn't match, as it doesn't define the variable.
5571  void fa() {}
5572  void fb();  // Doesn't match, as it has no body.
5573  @interface X
5574  - (void)ma; // Doesn't match, interface is declaration.
5575  @end
5576  @implementation X
5577  - (void)ma {}
5578  @end
5579
5580Usable 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;,
5581  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
5582</pre></td></tr>
5583
5584
5585<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>
5586<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
5587a C++ catch block, or an Objective-C statement.
5588
5589Example matches x (matcher = varDecl(isExceptionVariable())
5590void f(int y) {
5591  try {
5592  } catch (int x) {
5593  }
5594}
5595</pre></td></tr>
5596
5597
5598<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>
5599<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
5600static member variable template instantiations.
5601
5602Given
5603  template&lt;typename T&gt; void A(T t) { }
5604  template&lt;&gt; void A(int N) { }
5605functionDecl(isExplicitTemplateSpecialization())
5606  matches the specialization A&lt;int&gt;().
5607
5608Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
5609</pre></td></tr>
5610
5611
5612<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>
5613<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
5614
5615Given:
5616  extern "C" void f() {}
5617  extern "C" { void g() {} }
5618  void h() {}
5619  extern "C" int x = 1;
5620  extern "C" int y = 2;
5621  int z = 3;
5622functionDecl(isExternC())
5623  matches the declaration of f and g, but not the declaration of h.
5624varDecl(isExternC())
5625  matches the declaration of x and y, but not the declaration of z.
5626</pre></td></tr>
5627
5628
5629<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>
5630<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
5631
5632Example matches y (matcher = varDecl(isStaticLocal()))
5633void f() {
5634  int x;
5635  static int y;
5636}
5637static int z;
5638</pre></td></tr>
5639
5640
5641<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>
5642<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
5643class specifier ("static" keyword) written in the source.
5644
5645Given:
5646  static void f() {}
5647  static int i = 0;
5648  extern int j;
5649  int k;
5650functionDecl(isStaticStorageClass())
5651  matches the function declaration f.
5652varDecl(isStaticStorageClass())
5653  matches the variable declaration i.
5654</pre></td></tr>
5655
5656
5657<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>
5658<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
5659member variable template instantiations.
5660
5661Given
5662  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
5663or
5664  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
5665or
5666  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
5667cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5668  matches the template instantiation of X&lt;A&gt;.
5669
5670But given
5671  template &lt;typename T&gt;  class X {}; class A {};
5672  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
5673cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
5674  does not match, as X&lt;A&gt; is an explicit template specialization.
5675
5676Usable 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;
5677</pre></td></tr>
5678
5679<!--END_NARROWING_MATCHERS -->
5680</table>
5681
5682<!-- ======================================================================= -->
5683<h2 id="traversal-matchers">AST Traversal Matchers</h2>
5684<!-- ======================================================================= -->
5685
5686<p>Traversal matchers specify the relationship to other nodes that are
5687reachable from the current node.</p>
5688
5689<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
5690forEachDescendant) which work on all nodes and allow users to write more generic
5691match expressions.</p>
5692
5693<table>
5694<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
5695<!-- START_TRAVERSAL_MATCHERS -->
5696
5697<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>
5698<tr><td colspan="4" class="doc" id="binaryOperation0"><pre>Matches nodes which can be used with binary operators.
5699
5700The code
5701  var1 != var2;
5702might be represented in the clang AST as a binaryOperator, a
5703cxxOperatorCallExpr or a cxxRewrittenBinaryOperator, depending on
5704
5705* whether the types of var1 and var2 are fundamental (binaryOperator) or at
5706  least one is a class type (cxxOperatorCallExpr)
5707* whether the code appears in a template declaration, if at least one of the
5708  vars is a dependent-type (binaryOperator)
5709* whether the code relies on a rewritten binary operator, such as a
5710spaceship operator or an inverted equality operator
5711(cxxRewrittenBinaryOperator)
5712
5713This matcher elides details in places where the matchers for the nodes are
5714compatible.
5715
5716Given
5717  binaryOperation(
5718    hasOperatorName("!="),
5719    hasLHS(expr().bind("lhs")),
5720    hasRHS(expr().bind("rhs"))
5721  )
5722matches each use of "!=" in:
5723  struct S{
5724      bool operator!=(const S&amp;) const;
5725  };
5726
5727  void foo()
5728  {
5729     1 != 2;
5730     S() != S();
5731  }
5732
5733  template&lt;typename T&gt;
5734  void templ()
5735  {
5736     1 != 2;
5737     T() != S();
5738  }
5739  struct HasOpEq
5740  {
5741      bool operator==(const HasOpEq &amp;) const;
5742  };
5743
5744  void inverse()
5745  {
5746      HasOpEq s1;
5747      HasOpEq s2;
5748      if (s1 != s2)
5749          return;
5750  }
5751
5752  struct HasSpaceship
5753  {
5754      bool operator&lt;=&gt;(const HasOpEq &amp;) const;
5755  };
5756
5757  void use_spaceship()
5758  {
5759      HasSpaceship s1;
5760      HasSpaceship s2;
5761      if (s1 != s2)
5762          return;
5763  }
5764</pre></td></tr>
5765
5766
5767<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>
5768<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
5769
5770Unlike anyOf, eachOf will generate a match result for each
5771matching submatcher.
5772
5773For example, in:
5774  class A { int a; int b; };
5775The matcher:
5776  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
5777                       has(fieldDecl(hasName("b")).bind("v"))))
5778will generate two results binding "v", the first of which binds
5779the field declaration of a, the second the field declaration of
5780b.
5781
5782Usable as: Any Matcher
5783</pre></td></tr>
5784
5785
5786<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>
5787<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
5788
5789Generates results for each match.
5790
5791For example, in:
5792  class A { class B {}; class C {}; };
5793The matcher:
5794  cxxRecordDecl(hasName("::A"),
5795                findAll(cxxRecordDecl(isDefinition()).bind("m")))
5796will generate results for A, B and C.
5797
5798Usable as: Any Matcher
5799</pre></td></tr>
5800
5801
5802<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5803<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5804provided matcher.
5805
5806Example matches X, A, A::X, B, B::C, B::C::X
5807  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
5808  class X {};
5809  class A { class X {}; };  // Matches A, because A::X is a class of name
5810                            // X inside A.
5811  class B { class C { class X {}; }; };
5812
5813DescendantT must be an AST base type.
5814
5815As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
5816each result that matches instead of only on the first one.
5817
5818Note: Recursively combined ForEachDescendant can cause many matches:
5819  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
5820    forEachDescendant(cxxRecordDecl())
5821  )))
5822will match 10 times (plus injected class name matches) on:
5823  class A { class B { class C { class D { class E {}; }; }; }; };
5824
5825Usable as: Any Matcher
5826</pre></td></tr>
5827
5828
5829<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
5830<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
5831provided matcher.
5832
5833Example matches X, Y, Y::X, Z::Y, Z::Y::X
5834  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
5835  class X {};
5836  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
5837                            // inside Y.
5838  class Z { class Y { class X {}; }; };  // Does not match Z.
5839
5840ChildT must be an AST base type.
5841
5842As opposed to 'has', 'forEach' will cause a match for each result that
5843matches instead of only on the first one.
5844
5845Usable as: Any Matcher
5846</pre></td></tr>
5847
5848
5849<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
5850<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
5851matcher.
5852
5853Given
5854void f() { if (true) { int x = 42; } }
5855void g() { for (;;) { int x = 43; } }
5856expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
5857
5858Usable as: Any Matcher
5859</pre></td></tr>
5860
5861
5862<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
5863<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
5864provided matcher.
5865
5866Example matches X, Y, Z
5867    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
5868  class X {};  // Matches X, because X::X is a class of name X inside X.
5869  class Y { class X {}; };
5870  class Z { class Y { class X {}; }; };
5871
5872DescendantT must be an AST base type.
5873
5874Usable as: Any Matcher
5875</pre></td></tr>
5876
5877
5878<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5879<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5880provided matcher.
5881
5882Example matches X, Y
5883  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5884  class X {};  // Matches X, because X::X is a class of name X inside X.
5885  class Y { class X {}; };
5886  class Z { class Y { class X {}; }; };  // Does not match Z.
5887
5888ChildT must be an AST base type.
5889
5890Usable as: Any Matcher
5891Note that has is direct matcher, so it also matches things like implicit
5892casts and paren casts. If you are matching with expr then you should
5893probably consider using ignoringParenImpCasts like:
5894has(ignoringParenImpCasts(expr())).
5895</pre></td></tr>
5896
5897
5898<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5899<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5900matcher.
5901
5902Given
5903void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5904compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5905
5906Usable as: Any Matcher
5907</pre></td></tr>
5908
5909
5910<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>
5911<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls
5912
5913Because CallExpr and CXXConstructExpr do not share a common
5914base class with API accessing arguments etc, AST Matchers for code
5915which should match both are typically duplicated. This matcher
5916removes the need for duplication.
5917
5918Given code
5919struct ConstructorTakesInt
5920{
5921  ConstructorTakesInt(int i) {}
5922};
5923
5924void callTakesInt(int i)
5925{
5926}
5927
5928void doCall()
5929{
5930  callTakesInt(42);
5931}
5932
5933void doConstruct()
5934{
5935  ConstructorTakesInt cti(42);
5936}
5937
5938The matcher
5939invocation(hasArgument(0, integerLiteral(equals(42))))
5940matches the expression in both doCall and doConstruct
5941</pre></td></tr>
5942
5943
5944<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
5945<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5946
5947However, optionally will retain any bindings generated by the submatcher.
5948Useful when additional information which may or may not present about a main
5949matching node is desired.
5950
5951For example, in:
5952  class Foo {
5953    int bar;
5954  }
5955The matcher:
5956  cxxRecordDecl(
5957    optionally(has(
5958      fieldDecl(hasName("bar")).bind("var")
5959  ))).bind("record")
5960will produce a result binding for both "record" and "var".
5961The matcher will produce a "record" binding for even if there is no data
5962member named "bar" in that class.
5963
5964Usable as: Any Matcher
5965</pre></td></tr>
5966
5967
5968<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>
5969<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5970
5971Given
5972  void foo()
5973  {
5974      int i = 3.0;
5975  }
5976The matcher
5977  traverse(TK_IgnoreUnlessSpelledInSource,
5978    varDecl(hasInitializer(floatLiteral().bind("init")))
5979  )
5980matches the variable declaration with "init" bound to the "3.0".
5981</pre></td></tr>
5982
5983
5984<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>
5985<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5986switch statement or conditional operator.
5987
5988Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5989  if (true) {}
5990</pre></td></tr>
5991
5992
5993<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>
5994<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5995(binary or ternary).
5996
5997Example matches b
5998  condition ? a : b
5999  condition ?: b
6000</pre></td></tr>
6001
6002
6003<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>
6004<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
6005
6006Example 1 (conditional ternary operator): matches a
6007  condition ? a : b
6008
6009Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
6010  condition ?: b
6011</pre></td></tr>
6012
6013
6014<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>
6015<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
6016matches the given matcher.
6017
6018The associated declaration is:
6019- for type nodes, the declaration of the underlying type
6020- for CallExpr, the declaration of the callee
6021- for MemberExpr, the declaration of the referenced member
6022- for CXXConstructExpr, the declaration of the constructor
6023- for CXXNewExpr, the declaration of the operator new
6024- for ObjCIvarExpr, the declaration of the ivar
6025
6026For type nodes, hasDeclaration will generally match the declaration of the
6027sugared type. Given
6028  class X {};
6029  typedef X Y;
6030  Y y;
6031in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6032typedefDecl. A common use case is to match the underlying, desugared type.
6033This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6034  varDecl(hasType(hasUnqualifiedDesugaredType(
6035      recordType(hasDeclaration(decl())))))
6036In this matcher, the decl will match the CXXRecordDecl of class X.
6037
6038Usable 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;,
6039  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;,
6040  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;,
6041  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;,
6042  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;,
6043  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;,
6044  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6045</pre></td></tr>
6046
6047
6048<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>
6049<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
6050
6051Given
6052  int i[5];
6053  void f() { i[1] = 42; }
6054arraySubscriptExpression(hasBase(implicitCastExpr(
6055    hasSourceExpression(declRefExpr()))))
6056  matches i[1] with the declRefExpr() matching i
6057</pre></td></tr>
6058
6059
6060<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>
6061<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
6062
6063Given
6064  int i[5];
6065  void f() { i[1] = 42; }
6066arraySubscriptExpression(hasIndex(integerLiteral()))
6067  matches i[1] with the integerLiteral() matching 1
6068</pre></td></tr>
6069
6070
6071<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>
6072<tr><td colspan="4" class="doc" id="hasLHS3"><pre>Matches the left hand side of binary operator expressions.
6073
6074Example matches a (matcher = binaryOperator(hasLHS()))
6075  a || b
6076</pre></td></tr>
6077
6078
6079<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>
6080<tr><td colspan="4" class="doc" id="hasRHS3"><pre>Matches the right hand side of binary operator expressions.
6081
6082Example matches b (matcher = binaryOperator(hasRHS()))
6083  a || b
6084</pre></td></tr>
6085
6086
6087<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>
6088<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
6089type.
6090
6091Given
6092  struct A {};
6093  A a[7];
6094  int b[7];
6095arrayType(hasElementType(builtinType()))
6096  matches "int b[7]"
6097
6098Usable 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;
6099</pre></td></tr>
6100
6101
6102<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>
6103<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
6104
6105Given
6106  _Atomic(int) i;
6107  _Atomic(float) f;
6108atomicType(hasValueType(isInteger()))
6109 matches "_Atomic(int) i"
6110
6111Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
6112</pre></td></tr>
6113
6114
6115<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>
6116<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
6117
6118Note: There is no TypeLoc for the deduced type and thus no
6119getDeducedLoc() matcher.
6120
6121Given
6122  auto a = 1;
6123  auto b = 2.0;
6124autoType(hasDeducedType(isInteger()))
6125  matches "auto a"
6126
6127Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
6128</pre></td></tr>
6129
6130
6131<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>
6132<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
6133
6134Given
6135  namespace X { void b(); }
6136  using X::b;
6137usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
6138  matches using X::b </pre></td></tr>
6139
6140
6141<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>
6142<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
6143binary operator matches.
6144</pre></td></tr>
6145
6146
6147<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>
6148<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
6149
6150Example matches a (matcher = binaryOperator(hasLHS()))
6151  a || b
6152</pre></td></tr>
6153
6154
6155<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>
6156<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
6157
6158Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6159                                             integerLiteral(equals(2)))
6160  1 + 2 // Match
6161  2 + 1 // Match
6162  1 + 1 // No match
6163  2 + 2 // No match
6164</pre></td></tr>
6165
6166
6167<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>
6168<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
6169
6170Example matches b (matcher = binaryOperator(hasRHS()))
6171  a || b
6172</pre></td></tr>
6173
6174
6175<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>
6176<tr><td colspan="4" class="doc" id="forDecomposition0"><pre>Matches the DecompositionDecl the binding belongs to.
6177
6178For example, in:
6179void foo()
6180{
6181    int arr[3];
6182    auto &amp;[f, s, t] = arr;
6183
6184    f = 42;
6185}
6186The matcher:
6187  bindingDecl(hasName("f"),
6188                forDecomposition(decompositionDecl())
6189matches 'f' in 'auto &amp;[f, s, t]'.
6190</pre></td></tr>
6191
6192
6193<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>
6194<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
6195block.
6196
6197Does not match the 'this' parameter of a method.
6198
6199Given
6200  class X { void f(int x, int y, int z) {} };
6201cxxMethodDecl(hasAnyParameter(hasName("y")))
6202  matches f(int x, int y, int z) {}
6203with hasAnyParameter(...)
6204  matching int y
6205
6206For ObjectiveC, given
6207  @interface I - (void) f:(int) y; @end
6208
6209the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6210matches the declaration of method f with hasParameter
6211matching y.
6212
6213For blocks, given
6214  b = ^(int y) { printf("%d", y) };
6215
6216the matcher blockDecl(hasAnyParameter(hasName("y")))
6217matches the declaration of the block b with hasParameter
6218matching y.
6219</pre></td></tr>
6220
6221
6222<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>
6223<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
6224declaration or a block.
6225
6226Given
6227  class X { void f(int x) {} };
6228cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6229  matches f(int x) {}
6230with hasParameter(...)
6231  matching int x
6232
6233For ObjectiveC, given
6234  @interface I - (void) f:(int) y; @end
6235
6236the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6237matches the declaration of method f with hasParameter
6238matching y.
6239</pre></td></tr>
6240
6241
6242<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>
6243<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of a node matches the inner matcher.
6244
6245Examples:
6246  int x;
6247declaratorDecl(hasTypeLoc(loc(asString("int"))))
6248  matches int x
6249
6250auto x = int(3);
6251cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6252  matches int(3)
6253
6254struct Foo { Foo(int, int); };
6255auto x = Foo(1, 2);
6256cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6257  matches Foo(1, 2)
6258
6259Usable 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;,
6260  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;,
6261  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;,
6262  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6263  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;,
6264  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;,
6265  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;,
6266  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6267</pre></td></tr>
6268
6269
6270<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>
6271<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
6272pointee matches a given matcher.
6273
6274Given
6275  int *a;
6276  int const *b;
6277  float const *f;
6278pointerType(pointee(isConstQualified(), isInteger()))
6279  matches "int const *b"
6280
6281Usable 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;,
6282  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;
6283</pre></td></tr>
6284
6285
6286<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>
6287<tr><td colspan="4" class="doc" id="hasTypeLoc1"><pre>Matches if the type location of a node matches the inner matcher.
6288
6289Examples:
6290  int x;
6291declaratorDecl(hasTypeLoc(loc(asString("int"))))
6292  matches int x
6293
6294auto x = int(3);
6295cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6296  matches int(3)
6297
6298struct Foo { Foo(int, int); };
6299auto x = Foo(1, 2);
6300cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6301  matches Foo(1, 2)
6302
6303Usable 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;,
6304  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;,
6305  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;,
6306  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6307  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;,
6308  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;,
6309  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;,
6310  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6311</pre></td></tr>
6312
6313
6314<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>
6315<tr><td colspan="4" class="doc" id="hasType8"><pre>Overloaded to match the declaration of the expression's or value
6316declaration's type.
6317
6318In case of a value declaration (for example a variable declaration),
6319this resolves one layer of indirection. For example, in the value
6320declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6321X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6322declaration of x.
6323
6324Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6325            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6326            and friend class X (matcher = friendDecl(hasType("X"))
6327            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6328                                              cxxRecordDecl(hasName("X"))))
6329 class X {};
6330 void y(X &amp;x) { x; X z; }
6331 class Y { friend class X; };
6332 class Z : public virtual X {};
6333
6334Example matches class Derived
6335(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6336class Base {};
6337class Derived : Base {};
6338
6339Usable 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;,
6340Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6341</pre></td></tr>
6342
6343
6344<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>
6345<tr><td colspan="4" class="doc" id="hasType4"><pre>Matches if the expression's or declaration's type matches a type
6346matcher.
6347
6348Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6349            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6350            and U (matcher = typedefDecl(hasType(asString("int")))
6351            and friend class X (matcher = friendDecl(hasType("X"))
6352            and public virtual X (matcher = cxxBaseSpecifier(hasType(
6353                                              asString("class X")))
6354 class X {};
6355 void y(X &amp;x) { x; X z; }
6356 typedef int U;
6357 class Y { friend class X; };
6358 class Z : public virtual X {};
6359</pre></td></tr>
6360
6361
6362<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>
6363<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
6364
6365Given
6366  void f(int i);
6367  int y;
6368  f(y);
6369callExpr(
6370  forEachArgumentWithParam(
6371    declRefExpr(to(varDecl(hasName("y")))),
6372    parmVarDecl(hasType(isInteger()))
6373))
6374  matches f(y);
6375with declRefExpr(...)
6376  matching int y
6377and parmVarDecl(...)
6378  matching int i
6379</pre></td></tr>
6380
6381
6382<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>
6383<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
6384CXXConstructExpr. It is very similar to forEachArgumentWithParam but
6385it works on calls through function pointers as well.
6386
6387The difference is, that function pointers do not provide access to a
6388ParmVarDecl, but only the QualType for each argument.
6389
6390Given
6391  void f(int i);
6392  int y;
6393  f(y);
6394  void (*f_ptr)(int) = f;
6395  f_ptr(y);
6396callExpr(
6397  forEachArgumentWithParamType(
6398    declRefExpr(to(varDecl(hasName("y")))),
6399    qualType(isInteger()).bind("type)
6400))
6401  matches f(y) and f_ptr(y)
6402with declRefExpr(...)
6403  matching int y
6404and qualType(...)
6405  matching int
6406</pre></td></tr>
6407
6408
6409<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>
6410<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
6411expression, or an ObjC-message-send expression.
6412
6413Given
6414  void x(int, int, int) { int y; x(1, y, 42); }
6415callExpr(hasAnyArgument(declRefExpr()))
6416  matches x(1, y, 42)
6417with hasAnyArgument(...)
6418  matching y
6419
6420For ObjectiveC, given
6421  @interface I - (void) f:(int) y; @end
6422  void foo(I *i) { [i f:12]; }
6423objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6424  matches [i f:12]
6425</pre></td></tr>
6426
6427
6428<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>
6429<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
6430call expression.
6431
6432Example matches y in x(y)
6433    (matcher = callExpr(hasArgument(0, declRefExpr())))
6434  void x(int) { int y; x(y); }
6435</pre></td></tr>
6436
6437
6438<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>
6439<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
6440matches the given matcher.
6441
6442The associated declaration is:
6443- for type nodes, the declaration of the underlying type
6444- for CallExpr, the declaration of the callee
6445- for MemberExpr, the declaration of the referenced member
6446- for CXXConstructExpr, the declaration of the constructor
6447- for CXXNewExpr, the declaration of the operator new
6448- for ObjCIvarExpr, the declaration of the ivar
6449
6450For type nodes, hasDeclaration will generally match the declaration of the
6451sugared type. Given
6452  class X {};
6453  typedef X Y;
6454  Y y;
6455in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6456typedefDecl. A common use case is to match the underlying, desugared type.
6457This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6458  varDecl(hasType(hasUnqualifiedDesugaredType(
6459      recordType(hasDeclaration(decl())))))
6460In this matcher, the decl will match the CXXRecordDecl of class X.
6461
6462Usable 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;,
6463  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;,
6464  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;,
6465  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;,
6466  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;,
6467  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;,
6468  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6469</pre></td></tr>
6470
6471
6472<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>
6473<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
6474
6475Given
6476  class A { A() : i(42), j(42) {} int i; int j; };
6477cxxConstructorDecl(forEachConstructorInitializer(
6478  forField(decl().bind("x"))
6479))
6480  will trigger two matches, binding for 'i' and 'j' respectively.
6481</pre></td></tr>
6482
6483
6484<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>
6485<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
6486
6487Given
6488  struct Foo {
6489    Foo() : foo_(1) { }
6490    int foo_;
6491  };
6492cxxRecordDecl(has(cxxConstructorDecl(
6493  hasAnyConstructorInitializer(anything())
6494)))
6495  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
6496</pre></td></tr>
6497
6498
6499<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>
6500<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
6501
6502Given
6503  struct Foo {
6504    Foo() : foo_(1) { }
6505    int foo_;
6506  };
6507cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6508    forField(hasName("foo_"))))))
6509  matches Foo
6510with forField matching foo_
6511</pre></td></tr>
6512
6513
6514<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>
6515<tr><td colspan="4" class="doc" id="hasTypeLoc2"><pre>Matches if the type location of a node matches the inner matcher.
6516
6517Examples:
6518  int x;
6519declaratorDecl(hasTypeLoc(loc(asString("int"))))
6520  matches int x
6521
6522auto x = int(3);
6523cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6524  matches int(3)
6525
6526struct Foo { Foo(int, int); };
6527auto x = Foo(1, 2);
6528cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6529  matches Foo(1, 2)
6530
6531Usable 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;,
6532  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;,
6533  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;,
6534  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6535  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;,
6536  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;,
6537  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;,
6538  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6539</pre></td></tr>
6540
6541
6542<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>
6543<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
6544
6545Given
6546  struct Foo {
6547    Foo() : foo_(1) { }
6548    int foo_;
6549  };
6550cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
6551    withInitializer(integerLiteral(equals(1)))))))
6552  matches Foo
6553with withInitializer matching (1)
6554</pre></td></tr>
6555
6556
6557<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>
6558<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
6559given matcher. Implicit object expressions are included; that is, it matches
6560use of implicit `this`.
6561
6562Given
6563  struct X {
6564    int m;
6565    int f(X x) { x.m; return m; }
6566  };
6567memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6568  matches `x.m`, but not `m`; however,
6569memberExpr(hasObjectExpression(hasType(pointsTo(
6570     cxxRecordDecl(hasName("X"))))))
6571  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6572</pre></td></tr>
6573
6574
6575<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>
6576<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
6577
6578
6579<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>
6580<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
6581
6582Given:
6583 void foo() {
6584   if (int i = foobar(); i &gt; 0) {}
6585   switch (int i = foobar(); i) {}
6586   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6587 }
6588 void bar() {
6589   if (foobar() &gt; 0) {}
6590   switch (foobar()) {}
6591   for (auto&amp; x : get_range()) {}
6592 }
6593ifStmt(hasInitStatement(anything()))
6594  matches the if statement in foo but not in bar.
6595switchStmt(hasInitStatement(anything()))
6596  matches the switch statement in foo but not in bar.
6597cxxForRangeStmt(hasInitStatement(anything()))
6598  matches the range for statement in foo but not in bar.
6599</pre></td></tr>
6600
6601
6602<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>
6603<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
6604
6605Example:
6606    forStmt(hasLoopVariable(anything()))
6607matches 'int x' in
6608    for (int x : a) { }
6609</pre></td></tr>
6610
6611
6612<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>
6613<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
6614
6615Example:
6616    forStmt(hasRangeInit(anything()))
6617matches 'a' in
6618    for (int x : a) { }
6619</pre></td></tr>
6620
6621
6622<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>
6623<tr><td colspan="4" class="doc" id="hasTypeLoc3"><pre>Matches if the type location of a node matches the inner matcher.
6624
6625Examples:
6626  int x;
6627declaratorDecl(hasTypeLoc(loc(asString("int"))))
6628  matches int x
6629
6630auto x = int(3);
6631cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6632  matches int(3)
6633
6634struct Foo { Foo(int, int); };
6635auto x = Foo(1, 2);
6636cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6637  matches Foo(1, 2)
6638
6639Usable 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;,
6640  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;,
6641  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;,
6642  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6643  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;,
6644  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;,
6645  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;,
6646  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6647</pre></td></tr>
6648
6649
6650<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>
6651<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
6652`on`, matches the argument directly without stripping away anything.
6653
6654Given
6655  class Y { public: void m(); };
6656  Y g();
6657  class X : public Y { void g(); };
6658  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
6659cxxMemberCallExpr(onImplicitObjectArgument(hasType(
6660    cxxRecordDecl(hasName("Y")))))
6661  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
6662cxxMemberCallExpr(on(callExpr()))
6663  does not match `(g()).m()`, because the parens are not ignored.
6664
6665FIXME: Overload to allow directly matching types?
6666</pre></td></tr>
6667
6668
6669<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>
6670<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
6671stripping off any parentheses or implicit casts.
6672
6673Given
6674  class Y { public: void m(); };
6675  Y g();
6676  class X : public Y {};
6677  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
6678cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
6679  matches `y.m()` and `(g()).m()`.
6680cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
6681  matches `x.m()`.
6682cxxMemberCallExpr(on(callExpr()))
6683  matches `(g()).m()`.
6684
6685FIXME: Overload to allow directly matching types?
6686</pre></td></tr>
6687
6688
6689<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>
6690<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
6691</pre></td></tr>
6692
6693
6694<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>
6695<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
6696matches the InnerMatcher, or is a pointer to a type that matches the
6697InnerMatcher.
6698
6699Given
6700  class Y { public: void m(); };
6701  class X : public Y { void g(); };
6702  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
6703cxxMemberCallExpr(thisPointerType(hasDeclaration(
6704    cxxRecordDecl(hasName("Y")))))
6705  matches `y.m()`, `p-&gt;m()` and `x.m()`.
6706cxxMemberCallExpr(thisPointerType(hasDeclaration(
6707    cxxRecordDecl(hasName("X")))))
6708  matches `x.g()`.
6709</pre></td></tr>
6710
6711
6712<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>
6713<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
6714produce multiple matches.
6715
6716Given
6717  class A { virtual void f(); };
6718  class B : public A { void f(); };
6719  class C : public B { void f(); };
6720cxxMethodDecl(ofClass(hasName("C")),
6721              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6722  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
6723  that B::f is not overridden by C::f).
6724
6725The check can produce multiple matches in case of multiple inheritance, e.g.
6726  class A1 { virtual void f(); };
6727  class A2 { virtual void f(); };
6728  class C : public A1, public A2 { void f(); };
6729cxxMethodDecl(ofClass(hasName("C")),
6730              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
6731  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
6732  once with "b" binding "A2::f" and "d" binding "C::f".
6733</pre></td></tr>
6734
6735
6736<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>
6737<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
6738belongs to.
6739
6740FIXME: Generalize this for other kinds of declarations.
6741FIXME: What other kind of declarations would we need to generalize
6742this to?
6743
6744Example matches A() in the last line
6745    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
6746        ofClass(hasName("A"))))))
6747  class A {
6748   public:
6749    A();
6750  };
6751  A a = A();
6752</pre></td></tr>
6753
6754
6755<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>
6756<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
6757
6758Given:
6759  MyClass *p1 = new (Storage) MyClass();
6760cxxNewExpr(hasAnyPlacementArg(anything()))
6761  matches the expression 'new (Storage, 16) MyClass()'.
6762</pre></td></tr>
6763
6764
6765<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>
6766<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
6767
6768Given:
6769  MyClass *p1 = new MyClass[10];
6770cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
6771  matches the expression 'new MyClass[10]'.
6772</pre></td></tr>
6773
6774
6775<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>
6776<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
6777matches the given matcher.
6778
6779The associated declaration is:
6780- for type nodes, the declaration of the underlying type
6781- for CallExpr, the declaration of the callee
6782- for MemberExpr, the declaration of the referenced member
6783- for CXXConstructExpr, the declaration of the constructor
6784- for CXXNewExpr, the declaration of the operator new
6785- for ObjCIvarExpr, the declaration of the ivar
6786
6787For type nodes, hasDeclaration will generally match the declaration of the
6788sugared type. Given
6789  class X {};
6790  typedef X Y;
6791  Y y;
6792in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6793typedefDecl. A common use case is to match the underlying, desugared type.
6794This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6795  varDecl(hasType(hasUnqualifiedDesugaredType(
6796      recordType(hasDeclaration(decl())))))
6797In this matcher, the decl will match the CXXRecordDecl of class X.
6798
6799Usable 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;,
6800  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;,
6801  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;,
6802  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;,
6803  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;,
6804  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;,
6805  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6806</pre></td></tr>
6807
6808
6809<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>
6810<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
6811
6812Given:
6813  MyClass *p1 = new (Storage, 16) MyClass();
6814cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
6815  matches the expression 'new (Storage, 16) MyClass()'.
6816</pre></td></tr>
6817
6818
6819<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>
6820<tr><td colspan="4" class="doc" id="hasTypeLoc4"><pre>Matches if the type location of a node matches the inner matcher.
6821
6822Examples:
6823  int x;
6824declaratorDecl(hasTypeLoc(loc(asString("int"))))
6825  matches int x
6826
6827auto x = int(3);
6828cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
6829  matches int(3)
6830
6831struct Foo { Foo(int, int); };
6832auto x = Foo(1, 2);
6833cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
6834  matches Foo(1, 2)
6835
6836Usable 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;,
6837  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;,
6838  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;,
6839  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
6840  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;,
6841  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;,
6842  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;,
6843  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
6844</pre></td></tr>
6845
6846
6847<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>
6848<tr><td colspan="4" class="doc" id="hasEitherOperand1"><pre>Matches if either the left hand side or the right hand side of a
6849binary operator matches.
6850</pre></td></tr>
6851
6852
6853<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>
6854<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
6855
6856Example matches a (matcher = binaryOperator(hasLHS()))
6857  a || b
6858</pre></td></tr>
6859
6860
6861<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>
6862<tr><td colspan="4" class="doc" id="hasOperands1"><pre>Matches if both matchers match with opposite sides of the binary operator.
6863
6864Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
6865                                             integerLiteral(equals(2)))
6866  1 + 2 // Match
6867  2 + 1 // Match
6868  1 + 1 // No match
6869  2 + 2 // No match
6870</pre></td></tr>
6871
6872
6873<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>
6874<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
6875
6876Example matches b (matcher = binaryOperator(hasRHS()))
6877  a || b
6878</pre></td></tr>
6879
6880
6881<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>
6882<tr><td colspan="4" class="doc" id="hasUnaryOperand1"><pre>Matches if the operand of a unary operator matches.
6883
6884Example matches true (matcher = hasUnaryOperand(
6885                                  cxxBoolLiteral(equals(true))))
6886  !true
6887</pre></td></tr>
6888
6889
6890<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>
6891<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
6892
6893Example:
6894matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6895  class Foo;
6896  class Bar : Foo {};
6897  class Baz : Bar {};
6898  class SpecialBase;
6899  class Proxy : SpecialBase {};  // matches Proxy
6900  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
6901
6902FIXME: Refactor this and isDerivedFrom to reuse implementation.
6903</pre></td></tr>
6904
6905
6906<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>
6907<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
6908
6909Example:
6910matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
6911  class Foo;
6912  class Bar : Foo {};
6913  class Baz : Bar {};
6914  class SpecialBase;
6915  class Proxy : SpecialBase {};  // matches Proxy
6916  class IndirectlyDerived : Proxy {};  // doesn't match
6917</pre></td></tr>
6918
6919
6920<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>
6921<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
6922
6923Given:
6924  class A { void func(); };
6925  class B { void member(); };
6926
6927cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
6928A but not B.
6929</pre></td></tr>
6930
6931
6932<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>
6933<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
6934matching Base, or Objective-C classes that directly or indirectly
6935subclass a class matching Base.
6936
6937Note that a class is not considered to be derived from itself.
6938
6939Example matches Y, Z, C (Base == hasName("X"))
6940  class X;
6941  class Y : public X {};  // directly derived
6942  class Z : public Y {};  // indirectly derived
6943  typedef X A;
6944  typedef A B;
6945  class C : public B {};  // derived from a typedef of X
6946
6947In the following example, Bar matches isDerivedFrom(hasName("X")):
6948  class Foo;
6949  typedef Foo X;
6950  class Bar : public Foo {};  // derived from a type that X is a typedef of
6951
6952In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6953  @interface NSObject @end
6954  @interface Bar : NSObject @end
6955
6956Usable 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;
6957</pre></td></tr>
6958
6959
6960<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('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>
6961<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6962matching Base.
6963
6964Note that a class is not considered to be derived from itself.
6965
6966Example matches Y, C (Base == hasName("X"))
6967  class X;
6968  class Y : public X {};  // directly derived
6969  class Z : public Y {};  // indirectly derived
6970  typedef X A;
6971  typedef A B;
6972  class C : public B {};  // derived from a typedef of X
6973
6974In the following example, Bar matches isDerivedFrom(hasName("X")):
6975  class Foo;
6976  typedef Foo X;
6977  class Bar : public Foo {};  // derived from a type that X is a typedef of
6978</pre></td></tr>
6979
6980
6981<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>
6982<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6983match Base.
6984</pre></td></tr>
6985
6986
6987<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>
6988<tr><td colspan="4" class="doc" id="hasEitherOperand2"><pre>Matches if either the left hand side or the right hand side of a
6989binary operator matches.
6990</pre></td></tr>
6991
6992
6993<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>
6994<tr><td colspan="4" class="doc" id="hasLHS2"><pre>Matches the left hand side of binary operator expressions.
6995
6996Example matches a (matcher = binaryOperator(hasLHS()))
6997  a || b
6998</pre></td></tr>
6999
7000
7001<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>
7002<tr><td colspan="4" class="doc" id="hasOperands2"><pre>Matches if both matchers match with opposite sides of the binary operator.
7003
7004Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
7005                                             integerLiteral(equals(2)))
7006  1 + 2 // Match
7007  2 + 1 // Match
7008  1 + 1 // No match
7009  2 + 2 // No match
7010</pre></td></tr>
7011
7012
7013<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>
7014<tr><td colspan="4" class="doc" id="hasRHS2"><pre>Matches the right hand side of binary operator expressions.
7015
7016Example matches b (matcher = binaryOperator(hasRHS()))
7017  a || b
7018</pre></td></tr>
7019
7020
7021<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>
7022<tr><td colspan="4" class="doc" id="hasTypeLoc5"><pre>Matches if the type location of a node matches the inner matcher.
7023
7024Examples:
7025  int x;
7026declaratorDecl(hasTypeLoc(loc(asString("int"))))
7027  matches int x
7028
7029auto x = int(3);
7030cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7031  matches int(3)
7032
7033struct Foo { Foo(int, int); };
7034auto x = Foo(1, 2);
7035cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7036  matches Foo(1, 2)
7037
7038Usable 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;,
7039  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;,
7040  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;,
7041  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7042  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;,
7043  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;,
7044  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;,
7045  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7046</pre></td></tr>
7047
7048
7049<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>
7050<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
7051expression, or an ObjC-message-send expression.
7052
7053Given
7054  void x(int, int, int) { int y; x(1, y, 42); }
7055callExpr(hasAnyArgument(declRefExpr()))
7056  matches x(1, y, 42)
7057with hasAnyArgument(...)
7058  matching y
7059
7060For ObjectiveC, given
7061  @interface I - (void) f:(int) y; @end
7062  void foo(I *i) { [i f:12]; }
7063objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7064  matches [i f:12]
7065</pre></td></tr>
7066
7067
7068<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>
7069<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7070call expression.
7071
7072Example matches y in x(y)
7073    (matcher = callExpr(hasArgument(0, declRefExpr())))
7074  void x(int) { int y; x(y); }
7075</pre></td></tr>
7076
7077
7078<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>
7079<tr><td colspan="4" class="doc" id="hasTypeLoc6"><pre>Matches if the type location of a node matches the inner matcher.
7080
7081Examples:
7082  int x;
7083declaratorDecl(hasTypeLoc(loc(asString("int"))))
7084  matches int x
7085
7086auto x = int(3);
7087cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7088  matches int(3)
7089
7090struct Foo { Foo(int, int); };
7091auto x = Foo(1, 2);
7092cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7093  matches Foo(1, 2)
7094
7095Usable 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;,
7096  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;,
7097  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;,
7098  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7099  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;,
7100  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;,
7101  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;,
7102  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7103</pre></td></tr>
7104
7105
7106<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>
7107<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
7108given matcher.
7109
7110Example matches y.x() (matcher = callExpr(callee(
7111                                   cxxMethodDecl(hasName("x")))))
7112  class Y { public: void x(); };
7113  void z() { Y y; y.x(); }
7114</pre></td></tr>
7115
7116
7117<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>
7118<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
7119
7120Given
7121  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
7122  void f() { f(); }
7123callExpr(callee(expr()))
7124  matches this-&gt;x(), x(), y.x(), f()
7125with callee(...)
7126  matching this-&gt;x, x, y.x, f respectively
7127
7128Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
7129because this introduces ambiguous overloads with calls to Callee taking a
7130internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
7131implemented in terms of implicit casts.
7132</pre></td></tr>
7133
7134
7135<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>
7136<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
7137
7138Given
7139  void f(int i);
7140  int y;
7141  f(y);
7142callExpr(
7143  forEachArgumentWithParam(
7144    declRefExpr(to(varDecl(hasName("y")))),
7145    parmVarDecl(hasType(isInteger()))
7146))
7147  matches f(y);
7148with declRefExpr(...)
7149  matching int y
7150and parmVarDecl(...)
7151  matching int i
7152</pre></td></tr>
7153
7154
7155<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>
7156<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
7157CXXConstructExpr. It is very similar to forEachArgumentWithParam but
7158it works on calls through function pointers as well.
7159
7160The difference is, that function pointers do not provide access to a
7161ParmVarDecl, but only the QualType for each argument.
7162
7163Given
7164  void f(int i);
7165  int y;
7166  f(y);
7167  void (*f_ptr)(int) = f;
7168  f_ptr(y);
7169callExpr(
7170  forEachArgumentWithParamType(
7171    declRefExpr(to(varDecl(hasName("y")))),
7172    qualType(isInteger()).bind("type)
7173))
7174  matches f(y) and f_ptr(y)
7175with declRefExpr(...)
7176  matching int y
7177and qualType(...)
7178  matching int
7179</pre></td></tr>
7180
7181
7182<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>
7183<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
7184expression, or an ObjC-message-send expression.
7185
7186Given
7187  void x(int, int, int) { int y; x(1, y, 42); }
7188callExpr(hasAnyArgument(declRefExpr()))
7189  matches x(1, y, 42)
7190with hasAnyArgument(...)
7191  matching y
7192
7193For ObjectiveC, given
7194  @interface I - (void) f:(int) y; @end
7195  void foo(I *i) { [i f:12]; }
7196objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7197  matches [i f:12]
7198</pre></td></tr>
7199
7200
7201<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>
7202<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
7203call expression.
7204
7205Example matches y in x(y)
7206    (matcher = callExpr(hasArgument(0, declRefExpr())))
7207  void x(int) { int y; x(y); }
7208</pre></td></tr>
7209
7210
7211<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>
7212<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
7213matches the given matcher.
7214
7215The associated declaration is:
7216- for type nodes, the declaration of the underlying type
7217- for CallExpr, the declaration of the callee
7218- for MemberExpr, the declaration of the referenced member
7219- for CXXConstructExpr, the declaration of the constructor
7220- for CXXNewExpr, the declaration of the operator new
7221- for ObjCIvarExpr, the declaration of the ivar
7222
7223For type nodes, hasDeclaration will generally match the declaration of the
7224sugared type. Given
7225  class X {};
7226  typedef X Y;
7227  Y y;
7228in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7229typedefDecl. A common use case is to match the underlying, desugared type.
7230This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7231  varDecl(hasType(hasUnqualifiedDesugaredType(
7232      recordType(hasDeclaration(decl())))))
7233In this matcher, the decl will match the CXXRecordDecl of class X.
7234
7235Usable 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;,
7236  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;,
7237  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;,
7238  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;,
7239  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;,
7240  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;,
7241  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7242</pre></td></tr>
7243
7244
7245<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>
7246<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
7247extension, matches the constant given in the statement.
7248
7249Given
7250  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
7251caseStmt(hasCaseConstant(integerLiteral()))
7252  matches "case 1:"
7253</pre></td></tr>
7254
7255
7256<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>
7257<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
7258or opaque value's source expression matches the given matcher.
7259
7260Example 1: matches "a string"
7261(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7262class URL { URL(string); };
7263URL url = "a string";
7264
7265Example 2: matches 'b' (matcher =
7266opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7267int a = b ?: 1;
7268</pre></td></tr>
7269
7270
7271<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>
7272<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7273functionDecl that have at least one TemplateArgument matching the given
7274InnerMatcher.
7275
7276Given
7277  template&lt;typename T&gt; class A {};
7278  template&lt;&gt; class A&lt;double&gt; {};
7279  A&lt;int&gt; a;
7280
7281  template&lt;typename T&gt; f() {};
7282  void func() { f&lt;int&gt;(); };
7283
7284classTemplateSpecializationDecl(hasAnyTemplateArgument(
7285    refersToType(asString("int"))))
7286  matches the specialization A&lt;int&gt;
7287
7288functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7289  matches the specialization f&lt;int&gt;
7290</pre></td></tr>
7291
7292
7293<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>
7294<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
7295
7296Given
7297  template&lt;typename T&gt; class A {}; #1
7298  template&lt;&gt; class A&lt;int&gt; {}; #2
7299classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
7300  matches '#2' with classTemplateDecl() matching the class template
7301  declaration of 'A' at #1.
7302</pre></td></tr>
7303
7304
7305<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>
7306<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7307functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7308
7309Given
7310  template&lt;typename T, typename U&gt; class A {};
7311  A&lt;bool, int&gt; b;
7312  A&lt;int, bool&gt; c;
7313
7314  template&lt;typename T&gt; void f() {}
7315  void func() { f&lt;int&gt;(); };
7316classTemplateSpecializationDecl(hasTemplateArgument(
7317    1, refersToType(asString("int"))))
7318  matches the specialization A&lt;bool, int&gt;
7319
7320functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7321  matches the specialization f&lt;int&gt;
7322</pre></td></tr>
7323
7324
7325<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>
7326<tr><td colspan="4" class="doc" id="hasTypeLoc7"><pre>Matches if the type location of a node matches the inner matcher.
7327
7328Examples:
7329  int x;
7330declaratorDecl(hasTypeLoc(loc(asString("int"))))
7331  matches int x
7332
7333auto x = int(3);
7334cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7335  matches int(3)
7336
7337struct Foo { Foo(int, int); };
7338auto x = Foo(1, 2);
7339cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7340  matches Foo(1, 2)
7341
7342Usable 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;,
7343  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;,
7344  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;,
7345  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7346  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;,
7347  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;,
7348  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;,
7349  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7350</pre></td></tr>
7351
7352
7353<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>
7354<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
7355type.
7356
7357Given
7358  struct A {};
7359  A a[7];
7360  int b[7];
7361arrayType(hasElementType(builtinType()))
7362  matches "int b[7]"
7363
7364Usable 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;
7365</pre></td></tr>
7366
7367
7368<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>
7369<tr><td colspan="4" class="doc" id="hasTypeLoc8"><pre>Matches if the type location of a node matches the inner matcher.
7370
7371Examples:
7372  int x;
7373declaratorDecl(hasTypeLoc(loc(asString("int"))))
7374  matches int x
7375
7376auto x = int(3);
7377cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7378  matches int(3)
7379
7380struct Foo { Foo(int, int); };
7381auto x = Foo(1, 2);
7382cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7383  matches Foo(1, 2)
7384
7385Usable 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;,
7386  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;,
7387  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;,
7388  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7389  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;,
7390  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;,
7391  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;,
7392  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7393</pre></td></tr>
7394
7395
7396<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>
7397<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
7398a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7399
7400Given
7401  { {}; 1+2; }
7402hasAnySubstatement(compoundStmt())
7403  matches '{ {}; 1+2; }'
7404with compoundStmt()
7405  matching '{}'
7406</pre></td></tr>
7407
7408
7409<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>
7410<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
7411</pre></td></tr>
7412
7413
7414<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>
7415<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
7416matches the given matcher.
7417
7418The associated declaration is:
7419- for type nodes, the declaration of the underlying type
7420- for CallExpr, the declaration of the callee
7421- for MemberExpr, the declaration of the referenced member
7422- for CXXConstructExpr, the declaration of the constructor
7423- for CXXNewExpr, the declaration of the operator new
7424- for ObjCIvarExpr, the declaration of the ivar
7425
7426For type nodes, hasDeclaration will generally match the declaration of the
7427sugared type. Given
7428  class X {};
7429  typedef X Y;
7430  Y y;
7431in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7432typedefDecl. A common use case is to match the underlying, desugared type.
7433This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7434  varDecl(hasType(hasUnqualifiedDesugaredType(
7435      recordType(hasDeclaration(decl())))))
7436In this matcher, the decl will match the CXXRecordDecl of class X.
7437
7438Usable 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;,
7439  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;,
7440  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;,
7441  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;,
7442  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;,
7443  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;,
7444  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7445</pre></td></tr>
7446
7447
7448<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>
7449<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s where the n'th
7450`TemplateArgumentLoc` matches the given `InnerMatcher`.
7451
7452Given
7453  template&lt;typename T, typename U&gt; class A {};
7454  A&lt;double, int&gt; b;
7455  A&lt;int, double&gt; c;
7456varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
7457  hasTypeLoc(loc(asString("double")))))))
7458  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
7459</pre></td></tr>
7460
7461
7462<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('throughUsingDecl0')"><a name="throughUsingDecl0Anchor">throughUsingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
7463<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
7464specific using shadow declaration.
7465
7466Given
7467  namespace a { void f() {} }
7468  using a::f;
7469  void g() {
7470    f();     // Matches this ..
7471    a::f();  // .. but not this.
7472  }
7473declRefExpr(throughUsingDecl(anything()))
7474  matches f()
7475</pre></td></tr>
7476
7477
7478<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>
7479<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
7480specified matcher.
7481
7482Example matches x in if(x)
7483    (matcher = declRefExpr(to(varDecl(hasName("x")))))
7484  bool x;
7485  if (x) {}
7486</pre></td></tr>
7487
7488
7489<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>
7490<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
7491
7492Note that this does not work for global declarations because the AST
7493breaks up multiple-declaration DeclStmt's into multiple single-declaration
7494DeclStmt's.
7495Example: Given non-global declarations
7496  int a, b = 0;
7497  int c;
7498  int d = 2, e;
7499declStmt(containsDeclaration(
7500      0, varDecl(hasInitializer(anything()))))
7501  matches only 'int d = 2, e;', and
7502declStmt(containsDeclaration(1, varDecl()))
7503  matches 'int a, b = 0' as well as 'int d = 2, e;'
7504  but 'int c;' is not matched.
7505</pre></td></tr>
7506
7507
7508<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>
7509<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
7510
7511Given
7512  int a, b;
7513  int c;
7514declStmt(hasSingleDecl(anything()))
7515  matches 'int c;' but not 'int a, b;'.
7516</pre></td></tr>
7517
7518
7519<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>
7520<tr><td colspan="4" class="doc" id="hasTypeLoc9"><pre>Matches if the type location of a node matches the inner matcher.
7521
7522Examples:
7523  int x;
7524declaratorDecl(hasTypeLoc(loc(asString("int"))))
7525  matches int x
7526
7527auto x = int(3);
7528cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7529  matches int(3)
7530
7531struct Foo { Foo(int, int); };
7532auto x = Foo(1, 2);
7533cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7534  matches Foo(1, 2)
7535
7536Usable 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;,
7537  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;,
7538  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;,
7539  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7540  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;,
7541  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;,
7542  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;,
7543  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7544</pre></td></tr>
7545
7546
7547<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>
7548<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
7549Decl, matches InnerMatcher.
7550
7551Given
7552  namespace N {
7553    namespace M {
7554      class D {};
7555    }
7556  }
7557
7558cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
7559declaration of class D.
7560</pre></td></tr>
7561
7562
7563<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>
7564<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
7565
7566Given
7567  decltype(1) a = 1;
7568  decltype(2.0) b = 2.0;
7569decltypeType(hasUnderlyingType(isInteger()))
7570  matches the type of "a"
7571
7572Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
7573</pre></td></tr>
7574
7575
7576<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>
7577<tr><td colspan="4" class="doc" id="hasAnyBinding0"><pre>Matches any binding of a DecompositionDecl.
7578
7579For example, in:
7580void foo()
7581{
7582    int arr[3];
7583    auto &amp;[f, s, t] = arr;
7584
7585    f = 42;
7586}
7587The matcher:
7588  decompositionDecl(hasAnyBinding(bindingDecl(hasName("f").bind("fBinding"))))
7589matches the decomposition decl with 'f' bound to "fBinding".
7590</pre></td></tr>
7591
7592
7593<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>
7594<tr><td colspan="4" class="doc" id="hasBinding0"><pre>Matches the Nth binding of a DecompositionDecl.
7595
7596For example, in:
7597void foo()
7598{
7599    int arr[3];
7600    auto &amp;[f, s, t] = arr;
7601
7602    f = 42;
7603}
7604The matcher:
7605  decompositionDecl(hasBinding(0,
7606  bindingDecl(hasName("f").bind("fBinding"))))
7607matches the decomposition decl with 'f' bound to "fBinding".
7608</pre></td></tr>
7609
7610
7611<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>
7612<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
7613
7614
7615<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>
7616<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
7617switch statement or conditional operator.
7618
7619Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7620  if (true) {}
7621</pre></td></tr>
7622
7623
7624<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>
7625<tr><td colspan="4" class="doc" id="hasNamedTypeLoc0"><pre>Matches elaborated `TypeLoc`s that have a named `TypeLoc` matching
7626`InnerMatcher`.
7627
7628Given
7629  template &lt;typename T&gt;
7630  class C {};
7631  class C&lt;int&gt; c;
7632
7633  class D {};
7634  class D d;
7635elaboratedTypeLoc(hasNamedTypeLoc(templateSpecializationTypeLoc()));
7636  matches the `TypeLoc` of the variable declaration of `c`, but not `d`.
7637</pre></td></tr>
7638
7639
7640<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>
7641<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
7642matches InnerMatcher if the qualifier exists.
7643
7644Given
7645  namespace N {
7646    namespace M {
7647      class D {};
7648    }
7649  }
7650  N::M::D d;
7651
7652elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
7653matches the type of the variable declaration of d.
7654</pre></td></tr>
7655
7656
7657<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>
7658<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
7659
7660Given
7661  namespace N {
7662    namespace M {
7663      class D {};
7664    }
7665  }
7666  N::M::D d;
7667
7668elaboratedType(namesType(recordType(
7669hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
7670declaration of d.
7671</pre></td></tr>
7672
7673
7674<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>
7675<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
7676matches the given matcher.
7677
7678The associated declaration is:
7679- for type nodes, the declaration of the underlying type
7680- for CallExpr, the declaration of the callee
7681- for MemberExpr, the declaration of the referenced member
7682- for CXXConstructExpr, the declaration of the constructor
7683- for CXXNewExpr, the declaration of the operator new
7684- for ObjCIvarExpr, the declaration of the ivar
7685
7686For type nodes, hasDeclaration will generally match the declaration of the
7687sugared type. Given
7688  class X {};
7689  typedef X Y;
7690  Y y;
7691in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7692typedefDecl. A common use case is to match the underlying, desugared type.
7693This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7694  varDecl(hasType(hasUnqualifiedDesugaredType(
7695      recordType(hasDeclaration(decl())))))
7696In this matcher, the decl will match the CXXRecordDecl of class X.
7697
7698Usable 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;,
7699  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;,
7700  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;,
7701  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;,
7702  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;,
7703  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;,
7704  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7705</pre></td></tr>
7706
7707
7708<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>
7709<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
7710
7711(Note: Clang's AST refers to other conversions as "casts" too, and calls
7712actual casts "explicit" casts.)
7713</pre></td></tr>
7714
7715
7716<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>
7717<tr><td colspan="4" class="doc" id="hasTypeLoc10"><pre>Matches if the type location of a node matches the inner matcher.
7718
7719Examples:
7720  int x;
7721declaratorDecl(hasTypeLoc(loc(asString("int"))))
7722  matches int x
7723
7724auto x = int(3);
7725cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
7726  matches int(3)
7727
7728struct Foo { Foo(int, int); };
7729auto x = Foo(1, 2);
7730cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
7731  matches Foo(1, 2)
7732
7733Usable 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;,
7734  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;,
7735  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;,
7736  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
7737  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;,
7738  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;,
7739  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;,
7740  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
7741</pre></td></tr>
7742
7743
7744<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>
7745<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
7746declaration's type.
7747
7748In case of a value declaration (for example a variable declaration),
7749this resolves one layer of indirection. For example, in the value
7750declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7751X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7752declaration of x.
7753
7754Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7755            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7756            and friend class X (matcher = friendDecl(hasType("X"))
7757            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7758                                              cxxRecordDecl(hasName("X"))))
7759 class X {};
7760 void y(X &amp;x) { x; X z; }
7761 class Y { friend class X; };
7762 class Z : public virtual X {};
7763
7764Example matches class Derived
7765(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7766class Base {};
7767class Derived : Base {};
7768
7769Usable 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;,
7770Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7771</pre></td></tr>
7772
7773
7774<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>
7775<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
7776matcher.
7777
7778Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7779            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7780            and U (matcher = typedefDecl(hasType(asString("int")))
7781            and friend class X (matcher = friendDecl(hasType("X"))
7782            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7783                                              asString("class X")))
7784 class X {};
7785 void y(X &amp;x) { x; X z; }
7786 typedef int U;
7787 class Y { friend class X; };
7788 class Z : public virtual X {};
7789</pre></td></tr>
7790
7791
7792<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>
7793<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
7794elidable constructor and other corresponding bookkeeping nodes.
7795
7796In C++17, elidable copy constructors are no longer being generated in the
7797AST as it is not permitted by the standard. They are, however, part of the
7798AST in C++14 and earlier. So, a matcher must abstract over these differences
7799to work in all language modes. This matcher skips elidable constructor-call
7800AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
7801various implicit nodes inside the constructor calls, all of which will not
7802appear in the C++17 AST.
7803
7804Given
7805
7806struct H {};
7807H G();
7808void f() {
7809  H D = G();
7810}
7811
7812``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
7813matches ``H D = G()`` in C++11 through C++17 (and beyond).
7814</pre></td></tr>
7815
7816
7817<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>
7818<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
7819are stripped off.
7820
7821Parentheses and explicit casts are not discarded.
7822Given
7823  int arr[5];
7824  int a = 0;
7825  char b = 0;
7826  const int c = a;
7827  int *d = arr;
7828  long e = (long) 0l;
7829The matchers
7830   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
7831   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
7832would match the declarations for a, b, c, and d, but not e.
7833While
7834   varDecl(hasInitializer(integerLiteral()))
7835   varDecl(hasInitializer(declRefExpr()))
7836only match the declarations for a.
7837</pre></td></tr>
7838
7839
7840<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>
7841<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
7842nodes are stripped off.
7843
7844Parentheses and explicit casts are not discarded.
7845Given
7846  class C {};
7847  C a = C();
7848  C b;
7849  C c = b;
7850The matchers
7851   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
7852would match the declarations for a, b, and c.
7853While
7854   varDecl(hasInitializer(cxxConstructExpr()))
7855only match the declarations for b and c.
7856</pre></td></tr>
7857
7858
7859<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>
7860<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
7861casts are stripped off.
7862
7863Implicit and non-C Style casts are also discarded.
7864Given
7865  int a = 0;
7866  char b = (0);
7867  void* c = reinterpret_cast&lt;char*&gt;(0);
7868  char d = char(0);
7869The matcher
7870   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
7871would match the declarations for a, b, c, and d.
7872while
7873   varDecl(hasInitializer(integerLiteral()))
7874only match the declaration for a.
7875</pre></td></tr>
7876
7877
7878<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>
7879<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
7880parentheses are stripped off.
7881
7882Explicit casts are not discarded.
7883Given
7884  int arr[5];
7885  int a = 0;
7886  char b = (0);
7887  const int c = a;
7888  int *d = (arr);
7889  long e = ((long) 0l);
7890The matchers
7891   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
7892   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
7893would match the declarations for a, b, c, and d, but not e.
7894while
7895   varDecl(hasInitializer(integerLiteral()))
7896   varDecl(hasInitializer(declRefExpr()))
7897would only match the declaration for a.
7898</pre></td></tr>
7899
7900
7901<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>
7902<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
7903
7904Given
7905  const char* str = ("my-string");
7906The matcher
7907  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
7908would match the implicit cast resulting from the assignment.
7909</pre></td></tr>
7910
7911
7912<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>
7913<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
7914
7915Given
7916  class C {
7917    int a = 2;
7918    int b = 3;
7919    int c;
7920  };
7921fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
7922  matches 'int a;' but not 'int b;'.
7923fieldDecl(hasInClassInitializer(anything()))
7924  matches 'int a;' and 'int b;' but not 'int c;'.
7925</pre></td></tr>
7926
7927
7928<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>
7929<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
7930
7931
7932<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>
7933<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
7934switch statement or conditional operator.
7935
7936Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7937  if (true) {}
7938</pre></td></tr>
7939
7940
7941<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>
7942<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
7943
7944Example:
7945    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
7946matches '++x' in
7947    for (x; x &lt; N; ++x) { }
7948</pre></td></tr>
7949
7950
7951<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>
7952<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
7953
7954Example:
7955    forStmt(hasLoopInit(declStmt()))
7956matches 'int x = 0' in
7957    for (int x = 0; x &lt; N; ++x) { }
7958</pre></td></tr>
7959
7960
7961<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>
7962<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7963declaration's type.
7964
7965In case of a value declaration (for example a variable declaration),
7966this resolves one layer of indirection. For example, in the value
7967declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7968X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7969declaration of x.
7970
7971Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7972            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7973            and friend class X (matcher = friendDecl(hasType("X"))
7974            and public virtual X (matcher = cxxBaseSpecifier(hasType(
7975                                              cxxRecordDecl(hasName("X"))))
7976 class X {};
7977 void y(X &amp;x) { x; X z; }
7978 class Y { friend class X; };
7979 class Z : public virtual X {};
7980
7981Example matches class Derived
7982(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7983class Base {};
7984class Derived : Base {};
7985
7986Usable 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;,
7987Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7988</pre></td></tr>
7989
7990
7991<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>
7992<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
7993matcher.
7994
7995Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7996            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7997            and U (matcher = typedefDecl(hasType(asString("int")))
7998            and friend class X (matcher = friendDecl(hasType("X"))
7999            and public virtual X (matcher = cxxBaseSpecifier(hasType(
8000                                              asString("class X")))
8001 class X {};
8002 void y(X &amp;x) { x; X z; }
8003 typedef int U;
8004 class Y { friend class X; };
8005 class Z : public virtual X {};
8006</pre></td></tr>
8007
8008
8009<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>
8010<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
8011Note that this matcher matches all the declarations of a function whose
8012body is present in the AST.
8013
8014Given
8015  void f();
8016  void f() {}
8017  void g();
8018functionDecl(hasAnyBody(compoundStmt()))
8019  matches both 'void f();'
8020  and 'void f() {}'
8021with compoundStmt()
8022  matching '{}'
8023  but does not match 'void g();'
8024</pre></td></tr>
8025
8026
8027<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>
8028<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
8029block.
8030
8031Does not match the 'this' parameter of a method.
8032
8033Given
8034  class X { void f(int x, int y, int z) {} };
8035cxxMethodDecl(hasAnyParameter(hasName("y")))
8036  matches f(int x, int y, int z) {}
8037with hasAnyParameter(...)
8038  matching int y
8039
8040For ObjectiveC, given
8041  @interface I - (void) f:(int) y; @end
8042
8043the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8044matches the declaration of method f with hasParameter
8045matching y.
8046
8047For blocks, given
8048  b = ^(int y) { printf("%d", y) };
8049
8050the matcher blockDecl(hasAnyParameter(hasName("y")))
8051matches the declaration of the block b with hasParameter
8052matching y.
8053</pre></td></tr>
8054
8055
8056<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>
8057<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8058functionDecl that have at least one TemplateArgument matching the given
8059InnerMatcher.
8060
8061Given
8062  template&lt;typename T&gt; class A {};
8063  template&lt;&gt; class A&lt;double&gt; {};
8064  A&lt;int&gt; a;
8065
8066  template&lt;typename T&gt; f() {};
8067  void func() { f&lt;int&gt;(); };
8068
8069classTemplateSpecializationDecl(hasAnyTemplateArgument(
8070    refersToType(asString("int"))))
8071  matches the specialization A&lt;int&gt;
8072
8073functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
8074  matches the specialization f&lt;int&gt;
8075</pre></td></tr>
8076
8077
8078<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>
8079<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
8080
8081
8082<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>
8083<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
8084declaration.
8085
8086Given
8087  template&lt;bool b&gt;
8088  struct S {
8089    S(int); // #1
8090    explicit S(double); // #2
8091    operator int(); // #3
8092    explicit operator bool(); // #4
8093    explicit(false) S(bool) // # 7
8094    explicit(true) S(char) // # 8
8095    explicit(b) S(S) // # 9
8096  };
8097  S(int) -&gt; S&lt;true&gt; // #5
8098  explicit S(double) -&gt; S&lt;false&gt; // #6
8099cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
8100cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
8101cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
8102</pre></td></tr>
8103
8104
8105<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>
8106<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
8107declaration or a block.
8108
8109Given
8110  class X { void f(int x) {} };
8111cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8112  matches f(int x) {}
8113with hasParameter(...)
8114  matching int x
8115
8116For ObjectiveC, given
8117  @interface I - (void) f:(int) y; @end
8118
8119the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8120matches the declaration of method f with hasParameter
8121matching y.
8122</pre></td></tr>
8123
8124
8125<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>
8126<tr><td colspan="4" class="doc" id="hasReturnTypeLoc0"><pre>Matches a function declared with the specified return `TypeLoc`.
8127
8128Given
8129  int f() { return 5; }
8130  void g() {}
8131functionDecl(hasReturnTypeLoc(loc(asString("int"))))
8132  matches the declaration of `f`, but not `g`.
8133</pre></td></tr>
8134
8135
8136<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>
8137<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
8138functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
8139
8140Given
8141  template&lt;typename T, typename U&gt; class A {};
8142  A&lt;bool, int&gt; b;
8143  A&lt;int, bool&gt; c;
8144
8145  template&lt;typename T&gt; void f() {}
8146  void func() { f&lt;int&gt;(); };
8147classTemplateSpecializationDecl(hasTemplateArgument(
8148    1, refersToType(asString("int"))))
8149  matches the specialization A&lt;bool, int&gt;
8150
8151functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
8152  matches the specialization f&lt;int&gt;
8153</pre></td></tr>
8154
8155
8156<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>
8157<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
8158
8159Given:
8160  class X { int f() { return 1; } };
8161cxxMethodDecl(returns(asString("int")))
8162  matches int f() { return 1; }
8163</pre></td></tr>
8164
8165
8166<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>
8167<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
8168switch statement or conditional operator.
8169
8170Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8171  if (true) {}
8172</pre></td></tr>
8173
8174
8175<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>
8176<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
8177
8178Given
8179  if (A* a = GetAPointer()) {}
8180hasConditionVariableStatement(...)
8181  matches 'A* a = GetAPointer()'.
8182</pre></td></tr>
8183
8184
8185<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>
8186<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
8187
8188Examples matches the if statement
8189  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
8190  if (false) false; else true;
8191</pre></td></tr>
8192
8193
8194<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>
8195<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
8196
8197Given:
8198 void foo() {
8199   if (int i = foobar(); i &gt; 0) {}
8200   switch (int i = foobar(); i) {}
8201   for (auto&amp; a = get_range(); auto&amp; x : a) {}
8202 }
8203 void bar() {
8204   if (foobar() &gt; 0) {}
8205   switch (foobar()) {}
8206   for (auto&amp; x : get_range()) {}
8207 }
8208ifStmt(hasInitStatement(anything()))
8209  matches the if statement in foo but not in bar.
8210switchStmt(hasInitStatement(anything()))
8211  matches the switch statement in foo but not in bar.
8212cxxForRangeStmt(hasInitStatement(anything()))
8213  matches the range for statement in foo but not in bar.
8214</pre></td></tr>
8215
8216
8217<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>
8218<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
8219
8220Examples matches the if statement
8221  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
8222  if (false) true; else false;
8223</pre></td></tr>
8224
8225
8226<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>
8227<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
8228matcher.
8229
8230FIXME: Unit test this matcher
8231</pre></td></tr>
8232
8233
8234<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>
8235<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
8236
8237Example matches y.
8238    (matcher = initListExpr(hasInit(0, expr())))
8239  int x{y}.
8240</pre></td></tr>
8241
8242
8243<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>
8244<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
8245(if expression have it).
8246</pre></td></tr>
8247
8248
8249<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>
8250<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
8251matches the given matcher.
8252
8253The associated declaration is:
8254- for type nodes, the declaration of the underlying type
8255- for CallExpr, the declaration of the callee
8256- for MemberExpr, the declaration of the referenced member
8257- for CXXConstructExpr, the declaration of the constructor
8258- for CXXNewExpr, the declaration of the operator new
8259- for ObjCIvarExpr, the declaration of the ivar
8260
8261For type nodes, hasDeclaration will generally match the declaration of the
8262sugared type. Given
8263  class X {};
8264  typedef X Y;
8265  Y y;
8266in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8267typedefDecl. A common use case is to match the underlying, desugared type.
8268This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8269  varDecl(hasType(hasUnqualifiedDesugaredType(
8270      recordType(hasDeclaration(decl())))))
8271In this matcher, the decl will match the CXXRecordDecl of class X.
8272
8273Usable 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;,
8274  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;,
8275  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;,
8276  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;,
8277  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;,
8278  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;,
8279  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8280</pre></td></tr>
8281
8282
8283<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>
8284<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
8285matches the given matcher.
8286
8287The associated declaration is:
8288- for type nodes, the declaration of the underlying type
8289- for CallExpr, the declaration of the callee
8290- for MemberExpr, the declaration of the referenced member
8291- for CXXConstructExpr, the declaration of the constructor
8292- for CXXNewExpr, the declaration of the operator new
8293- for ObjCIvarExpr, the declaration of the ivar
8294
8295For type nodes, hasDeclaration will generally match the declaration of the
8296sugared type. Given
8297  class X {};
8298  typedef X Y;
8299  Y y;
8300in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8301typedefDecl. A common use case is to match the underlying, desugared type.
8302This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8303  varDecl(hasType(hasUnqualifiedDesugaredType(
8304      recordType(hasDeclaration(decl())))))
8305In this matcher, the decl will match the CXXRecordDecl of class X.
8306
8307Usable 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;,
8308  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;,
8309  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;,
8310  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;,
8311  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;,
8312  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;,
8313  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8314</pre></td></tr>
8315
8316
8317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture1')"><a name="hasAnyCapture1Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt; InnerMatcher</td></tr>
8318<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
8319
8320Given
8321  struct foo {
8322    void bar() {
8323      auto f = [this](){};
8324    }
8325  }
8326lambdaExpr(hasAnyCapture(cxxThisExpr()))
8327  matches [this](){};
8328</pre></td></tr>
8329
8330
8331<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyCapture0')"><a name="hasAnyCapture0Anchor">hasAnyCapture</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
8332<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
8333
8334Given
8335  void foo() {
8336    int x;
8337    auto f = [x](){};
8338  }
8339lambdaExpr(hasAnyCapture(anything()))
8340  matches [x](){};
8341</pre></td></tr>
8342
8343
8344<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>
8345<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
8346matches the given matcher.
8347
8348The associated declaration is:
8349- for type nodes, the declaration of the underlying type
8350- for CallExpr, the declaration of the callee
8351- for MemberExpr, the declaration of the referenced member
8352- for CXXConstructExpr, the declaration of the constructor
8353- for CXXNewExpr, the declaration of the operator new
8354- for ObjCIvarExpr, the declaration of the ivar
8355
8356For type nodes, hasDeclaration will generally match the declaration of the
8357sugared type. Given
8358  class X {};
8359  typedef X Y;
8360  Y y;
8361in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8362typedefDecl. A common use case is to match the underlying, desugared type.
8363This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8364  varDecl(hasType(hasUnqualifiedDesugaredType(
8365      recordType(hasDeclaration(decl())))))
8366In this matcher, the decl will match the CXXRecordDecl of class X.
8367
8368Usable 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;,
8369  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;,
8370  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;,
8371  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;,
8372  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;,
8373  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;,
8374  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8375</pre></td></tr>
8376
8377
8378<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>
8379<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
8380given matcher. Implicit object expressions are included; that is, it matches
8381use of implicit `this`.
8382
8383Given
8384  struct X {
8385    int m;
8386    int f(X x) { x.m; return m; }
8387  };
8388memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
8389  matches `x.m`, but not `m`; however,
8390memberExpr(hasObjectExpression(hasType(pointsTo(
8391     cxxRecordDecl(hasName("X"))))))
8392  matches `m` (aka. `this-&gt;m`), but not `x.m`.
8393</pre></td></tr>
8394
8395
8396<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>
8397<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
8398given matcher.
8399
8400Given
8401  struct { int first, second; } first, second;
8402  int i(second.first);
8403  int j(first.second);
8404memberExpr(member(hasName("first")))
8405  matches second.first
8406  but not first.second (because the member name there is "second").
8407</pre></td></tr>
8408
8409
8410<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>
8411<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
8412pointee matches a given matcher.
8413
8414Given
8415  int *a;
8416  int const *b;
8417  float const *f;
8418pointerType(pointee(isConstQualified(), isInteger()))
8419  matches "int const *b"
8420
8421Usable 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;,
8422  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;
8423</pre></td></tr>
8424
8425
8426<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>
8427<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
8428matcher.
8429
8430Given
8431  namespace N { template&lt;class T&gt; void f(T t); }
8432  template &lt;class T&gt; void g() { using N::f; f(T()); }
8433unresolvedLookupExpr(hasAnyDeclaration(
8434    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
8435  matches the use of f in g() .
8436</pre></td></tr>
8437
8438
8439<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>
8440<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
8441
8442Given
8443  struct A { struct B { struct C {}; }; };
8444  A::B::C c;
8445nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
8446  matches "A::"
8447</pre></td></tr>
8448
8449
8450<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>
8451<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
8452NestedNameSpecifier-matcher matches.
8453</pre></td></tr>
8454
8455
8456<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>
8457<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
8458given TypeLoc.
8459
8460Given
8461  struct A { struct B { struct C {}; }; };
8462  A::B::C c;
8463nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
8464  hasDeclaration(cxxRecordDecl(hasName("A")))))))
8465  matches "A::"
8466</pre></td></tr>
8467
8468
8469<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>
8470<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
8471
8472Given
8473  struct A { struct B { struct C {}; }; };
8474  A::B::C c;
8475nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
8476  matches "A::"
8477</pre></td></tr>
8478
8479
8480<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>
8481<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
8482given namespace matcher.
8483
8484Given
8485  namespace ns { struct A {}; }
8486  ns::A a;
8487nestedNameSpecifier(specifiesNamespace(hasName("ns")))
8488  matches "ns::"
8489</pre></td></tr>
8490
8491
8492<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>
8493<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
8494given QualType matcher without qualifiers.
8495
8496Given
8497  struct A { struct B { struct C {}; }; };
8498  A::B::C c;
8499nestedNameSpecifier(specifiesType(
8500  hasDeclaration(cxxRecordDecl(hasName("A")))
8501))
8502  matches "A::"
8503</pre></td></tr>
8504
8505
8506<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>
8507<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
8508
8509Given
8510
8511  #pragma omp parallel
8512  #pragma omp parallel default(none)
8513
8514``ompExecutableDirective(hasAnyClause(anything()))`` matches
8515``omp parallel default(none)``.
8516</pre></td></tr>
8517
8518
8519<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>
8520<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
8521
8522Prerequisite: the executable directive must not be standalone directive.
8523If it is, it will never match.
8524
8525Given
8526
8527   #pragma omp parallel
8528   ;
8529   #pragma omp parallel
8530   {}
8531
8532``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
8533</pre></td></tr>
8534
8535
8536<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>
8537<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
8538matching Base, or Objective-C classes that directly or indirectly
8539subclass a class matching Base.
8540
8541Note that a class is not considered to be derived from itself.
8542
8543Example matches Y, Z, C (Base == hasName("X"))
8544  class X;
8545  class Y : public X {};  // directly derived
8546  class Z : public Y {};  // indirectly derived
8547  typedef X A;
8548  typedef A B;
8549  class C : public B {};  // derived from a typedef of X
8550
8551In the following example, Bar matches isDerivedFrom(hasName("X")):
8552  class Foo;
8553  typedef Foo X;
8554  class Bar : public Foo {};  // derived from a type that X is a typedef of
8555
8556In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
8557  @interface NSObject @end
8558  @interface Bar : NSObject @end
8559
8560Usable 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;
8561</pre></td></tr>
8562
8563
8564<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>
8565<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
8566matching Base.
8567
8568Note that a class is not considered to be derived from itself.
8569
8570Example matches Y, C (Base == hasName("X"))
8571  class X;
8572  class Y : public X {};  // directly derived
8573  class Z : public Y {};  // indirectly derived
8574  typedef X A;
8575  typedef A B;
8576  class C : public B {};  // derived from a typedef of X
8577
8578In the following example, Bar matches isDerivedFrom(hasName("X")):
8579  class Foo;
8580  typedef Foo X;
8581  class Bar : public Foo {};  // derived from a type that X is a typedef of
8582</pre></td></tr>
8583
8584
8585<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>
8586<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
8587match Base.
8588</pre></td></tr>
8589
8590
8591<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>
8592<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
8593expression, or an ObjC-message-send expression.
8594
8595Given
8596  void x(int, int, int) { int y; x(1, y, 42); }
8597callExpr(hasAnyArgument(declRefExpr()))
8598  matches x(1, y, 42)
8599with hasAnyArgument(...)
8600  matching y
8601
8602For ObjectiveC, given
8603  @interface I - (void) f:(int) y; @end
8604  void foo(I *i) { [i f:12]; }
8605objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
8606  matches [i f:12]
8607</pre></td></tr>
8608
8609
8610<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>
8611<tr><td colspan="4" class="doc" id="hasArgument3"><pre>Matches the n'th argument of a call expression or a constructor
8612call expression.
8613
8614Example matches y in x(y)
8615    (matcher = callExpr(hasArgument(0, declRefExpr())))
8616  void x(int) { int y; x(y); }
8617</pre></td></tr>
8618
8619
8620<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>
8621<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
8622and the inner matcher matches on that instance.
8623
8624For example the method call in
8625  NSString *x = @"hello";
8626  [x containsString:@"h"];
8627is matched by
8628objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
8629</pre></td></tr>
8630
8631
8632<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>
8633<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
8634
8635Example
8636matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
8637matches the [webView ...] message invocation.
8638  NSString *webViewJavaScript = ...
8639  UIWebView *webView = ...
8640  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
8641</pre></td></tr>
8642
8643
8644<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>
8645<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
8646block.
8647
8648Does not match the 'this' parameter of a method.
8649
8650Given
8651  class X { void f(int x, int y, int z) {} };
8652cxxMethodDecl(hasAnyParameter(hasName("y")))
8653  matches f(int x, int y, int z) {}
8654with hasAnyParameter(...)
8655  matching int y
8656
8657For ObjectiveC, given
8658  @interface I - (void) f:(int) y; @end
8659
8660the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
8661matches the declaration of method f with hasParameter
8662matching y.
8663
8664For blocks, given
8665  b = ^(int y) { printf("%d", y) };
8666
8667the matcher blockDecl(hasAnyParameter(hasName("y")))
8668matches the declaration of the block b with hasParameter
8669matching y.
8670</pre></td></tr>
8671
8672
8673<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>
8674<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
8675declaration or a block.
8676
8677Given
8678  class X { void f(int x) {} };
8679cxxMethodDecl(hasParameter(0, hasType(varDecl())))
8680  matches f(int x) {}
8681with hasParameter(...)
8682  matching int x
8683
8684For ObjectiveC, given
8685  @interface I - (void) f:(int) y; @end
8686
8687the matcher objcMethodDecl(hasParameter(0, hasName("y")))
8688matches the declaration of method f with hasParameter
8689matching y.
8690</pre></td></tr>
8691
8692
8693<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>
8694<tr><td colspan="4" class="doc" id="hasTypeLoc11"><pre>Matches if the type location of a node matches the inner matcher.
8695
8696Examples:
8697  int x;
8698declaratorDecl(hasTypeLoc(loc(asString("int"))))
8699  matches int x
8700
8701auto x = int(3);
8702cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
8703  matches int(3)
8704
8705struct Foo { Foo(int, int); };
8706auto x = Foo(1, 2);
8707cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
8708  matches Foo(1, 2)
8709
8710Usable 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;,
8711  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;,
8712  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;,
8713  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
8714  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;,
8715  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;,
8716  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;,
8717  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
8718</pre></td></tr>
8719
8720
8721<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>
8722<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
8723or opaque value's source expression matches the given matcher.
8724
8725Example 1: matches "a string"
8726(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
8727class URL { URL(string); };
8728URL url = "a string";
8729
8730Example 2: matches 'b' (matcher =
8731opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
8732int a = b ?: 1;
8733</pre></td></tr>
8734
8735
8736<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>
8737<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
8738overloads matches the given matcher.
8739
8740Given
8741  template &lt;typename T&gt; void foo(T);
8742  template &lt;typename T&gt; void bar(T);
8743  template &lt;typename T&gt; void baz(T t) {
8744    foo(t);
8745    bar(t);
8746  }
8747unresolvedLookupExpr(hasAnyDeclaration(
8748    functionTemplateDecl(hasName("foo"))))
8749  matches foo in foo(t); but not bar in bar(t);
8750</pre></td></tr>
8751
8752
8753<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>
8754<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
8755
8756Given
8757  int (*ptr_to_array)[4];
8758  int (*ptr_to_func)(int);
8759
8760varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
8761ptr_to_func but not ptr_to_array.
8762
8763Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
8764</pre></td></tr>
8765
8766
8767<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>
8768<tr><td colspan="4" class="doc" id="hasPointeeLoc0"><pre>Matches pointer `TypeLoc`s that have a pointee `TypeLoc` matching
8769`PointeeMatcher`.
8770
8771Given
8772  int* x;
8773pointerTypeLoc(hasPointeeLoc(loc(asString("int"))))
8774  matches `int*`.
8775</pre></td></tr>
8776
8777
8778<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>
8779<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
8780pointee matches a given matcher.
8781
8782Given
8783  int *a;
8784  int const *b;
8785  float const *f;
8786pointerType(pointee(isConstQualified(), isInteger()))
8787  matches "int const *b"
8788
8789Usable 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;,
8790  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;
8791</pre></td></tr>
8792
8793
8794<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>
8795<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
8796
8797Given:
8798  typedef int &amp;int_ref;
8799  int a;
8800  int_ref b = a;
8801
8802varDecl(hasType(qualType(referenceType()))))) will not match the
8803declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
8804</pre></td></tr>
8805
8806
8807<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>
8808<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
8809matches the given matcher.
8810
8811The associated declaration is:
8812- for type nodes, the declaration of the underlying type
8813- for CallExpr, the declaration of the callee
8814- for MemberExpr, the declaration of the referenced member
8815- for CXXConstructExpr, the declaration of the constructor
8816- for CXXNewExpr, the declaration of the operator new
8817- for ObjCIvarExpr, the declaration of the ivar
8818
8819For type nodes, hasDeclaration will generally match the declaration of the
8820sugared type. Given
8821  class X {};
8822  typedef X Y;
8823  Y y;
8824in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8825typedefDecl. A common use case is to match the underlying, desugared type.
8826This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8827  varDecl(hasType(hasUnqualifiedDesugaredType(
8828      recordType(hasDeclaration(decl())))))
8829In this matcher, the decl will match the CXXRecordDecl of class X.
8830
8831Usable 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;,
8832  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;,
8833  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;,
8834  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;,
8835  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;,
8836  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;,
8837  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8838</pre></td></tr>
8839
8840
8841<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>
8842<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
8843
8844Given
8845  void (*fp)(void);
8846The matcher
8847  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
8848would match the declaration for fp.
8849</pre></td></tr>
8850
8851
8852<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>
8853<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
8854</pre></td></tr>
8855
8856
8857<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>
8858<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
8859matches the specified matcher.
8860
8861Example matches y-&gt;x()
8862  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
8863     cxxRecordDecl(hasName("Y")))))))
8864  class Y { public: void x(); };
8865  void z() { Y *y; y-&gt;x(); }
8866</pre></td></tr>
8867
8868
8869<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>
8870<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
8871</pre></td></tr>
8872
8873
8874<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>
8875<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
8876type matches the specified matcher.
8877
8878Example matches X &amp;x and const X &amp;y
8879    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
8880  class X {
8881    void a(X b) {
8882      X &amp;x = b;
8883      const X &amp;y = b;
8884    }
8885  };
8886</pre></td></tr>
8887
8888
8889<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>
8890<tr><td colspan="4" class="doc" id="hasUnqualifiedLoc0"><pre>Matches `QualifiedTypeLoc`s that have an unqualified `TypeLoc` matching
8891`InnerMatcher`.
8892
8893Given
8894  int* const x;
8895  const int y;
8896qualifiedTypeLoc(hasUnqualifiedLoc(pointerTypeLoc()))
8897  matches the `TypeLoc` of the variable declaration of `x`, but not `y`.
8898</pre></td></tr>
8899
8900
8901<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>
8902<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
8903matches the given matcher.
8904
8905The associated declaration is:
8906- for type nodes, the declaration of the underlying type
8907- for CallExpr, the declaration of the callee
8908- for MemberExpr, the declaration of the referenced member
8909- for CXXConstructExpr, the declaration of the constructor
8910- for CXXNewExpr, the declaration of the operator new
8911- for ObjCIvarExpr, the declaration of the ivar
8912
8913For type nodes, hasDeclaration will generally match the declaration of the
8914sugared type. Given
8915  class X {};
8916  typedef X Y;
8917  Y y;
8918in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
8919typedefDecl. A common use case is to match the underlying, desugared type.
8920This can be achieved by using the hasUnqualifiedDesugaredType matcher:
8921  varDecl(hasType(hasUnqualifiedDesugaredType(
8922      recordType(hasDeclaration(decl())))))
8923In this matcher, the decl will match the CXXRecordDecl of class X.
8924
8925Usable 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;,
8926  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;,
8927  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;,
8928  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;,
8929  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;,
8930  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;,
8931  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
8932</pre></td></tr>
8933
8934
8935<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>
8936<tr><td colspan="4" class="doc" id="hasReferentLoc0"><pre>Matches reference `TypeLoc`s that have a referent `TypeLoc` matching
8937`ReferentMatcher`.
8938
8939Given
8940  int x = 3;
8941  int&amp; xx = x;
8942referenceTypeLoc(hasReferentLoc(loc(asString("int"))))
8943  matches `int&amp;`.
8944</pre></td></tr>
8945
8946
8947<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>
8948<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
8949pointee matches a given matcher.
8950
8951Given
8952  int *a;
8953  int const *b;
8954  float const *f;
8955pointerType(pointee(isConstQualified(), isInteger()))
8956  matches "int const *b"
8957
8958Usable 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;,
8959  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;
8960</pre></td></tr>
8961
8962
8963<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>
8964<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
8965
8966Given
8967  return a + b;
8968hasReturnValue(binaryOperator())
8969  matches 'return a + b'
8970with binaryOperator()
8971  matching 'a + b'
8972</pre></td></tr>
8973
8974
8975<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>
8976<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
8977a given matcher. Also matches StmtExprs that have CompoundStmt as children.
8978
8979Given
8980  { {}; 1+2; }
8981hasAnySubstatement(compoundStmt())
8982  matches '{ {}; 1+2; }'
8983with compoundStmt()
8984  matching '{}'
8985</pre></td></tr>
8986
8987
8988<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>
8989<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
8990alignof.
8991</pre></td></tr>
8992
8993
8994<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>
8995<tr><td colspan="4" class="doc" id="forCallable0"><pre>Matches declaration of the function, method, or block the statement
8996belongs to.
8997
8998Given:
8999F&amp; operator=(const F&amp; o) {
9000  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9001  return *this;
9002}
9003returnStmt(forCallable(functionDecl(hasName("operator="))))
9004  matches 'return *this'
9005  but does not match 'return v &gt; 0'
9006
9007Given:
9008-(void) foo {
9009  int x = 1;
9010  dispatch_sync(queue, ^{ int y = 2; });
9011}
9012declStmt(forCallable(objcMethodDecl()))
9013  matches 'int x = 1'
9014  but does not match 'int y = 2'.
9015whereas declStmt(forCallable(blockDecl()))
9016  matches 'int y = 2'
9017  but does not match 'int x = 1'.
9018</pre></td></tr>
9019
9020
9021<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>
9022<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to.
9023
9024Deprecated. Use forCallable() to correctly handle the situation when
9025the declaration is not a function (but a block or an Objective-C method).
9026forFunction() not only fails to take non-functions into account but also
9027may match the wrong declaration in their presence.
9028
9029Given:
9030F&amp; operator=(const F&amp; o) {
9031  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
9032  return *this;
9033}
9034returnStmt(forFunction(hasName("operator=")))
9035  matches 'return *this'
9036  but does not match 'return v &gt; 0'
9037</pre></td></tr>
9038
9039
9040<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>
9041<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
9042sizeof.
9043</pre></td></tr>
9044
9045
9046<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>
9047<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
9048type that matches the provided matcher.
9049
9050Given
9051  template &lt;typename T&gt;
9052  double F(T t);
9053  int i;
9054  double j = F(i);
9055
9056substTemplateTypeParmType(hasReplacementType(type())) matches int
9057</pre></td></tr>
9058
9059
9060<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>
9061<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
9062statement. This matcher may produce multiple matches.
9063
9064Given
9065  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
9066switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
9067  matches four times, with "c" binding each of "case 1:", "case 2:",
9068"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
9069"switch (1)", "switch (2)" and "switch (2)".
9070</pre></td></tr>
9071
9072
9073<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>
9074<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
9075switch statement or conditional operator.
9076
9077Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9078  if (true) {}
9079</pre></td></tr>
9080
9081
9082<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>
9083<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
9084
9085Given:
9086 void foo() {
9087   if (int i = foobar(); i &gt; 0) {}
9088   switch (int i = foobar(); i) {}
9089   for (auto&amp; a = get_range(); auto&amp; x : a) {}
9090 }
9091 void bar() {
9092   if (foobar() &gt; 0) {}
9093   switch (foobar()) {}
9094   for (auto&amp; x : get_range()) {}
9095 }
9096ifStmt(hasInitStatement(anything()))
9097  matches the if statement in foo but not in bar.
9098switchStmt(hasInitStatement(anything()))
9099  matches the switch statement in foo but not in bar.
9100cxxForRangeStmt(hasInitStatement(anything()))
9101  matches the range for statement in foo but not in bar.
9102</pre></td></tr>
9103
9104
9105<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>
9106<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
9107matches the given matcher.
9108
9109The associated declaration is:
9110- for type nodes, the declaration of the underlying type
9111- for CallExpr, the declaration of the callee
9112- for MemberExpr, the declaration of the referenced member
9113- for CXXConstructExpr, the declaration of the constructor
9114- for CXXNewExpr, the declaration of the operator new
9115- for ObjCIvarExpr, the declaration of the ivar
9116
9117For type nodes, hasDeclaration will generally match the declaration of the
9118sugared type. Given
9119  class X {};
9120  typedef X Y;
9121  Y y;
9122in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9123typedefDecl. A common use case is to match the underlying, desugared type.
9124This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9125  varDecl(hasType(hasUnqualifiedDesugaredType(
9126      recordType(hasDeclaration(decl())))))
9127In this matcher, the decl will match the CXXRecordDecl of class X.
9128
9129Usable 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;,
9130  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;,
9131  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;,
9132  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;,
9133  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;,
9134  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;,
9135  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9136</pre></td></tr>
9137
9138
9139<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>
9140<tr><td colspan="4" class="doc" id="hasTypeLoc12"><pre>Matches if the type location of a node matches the inner matcher.
9141
9142Examples:
9143  int x;
9144declaratorDecl(hasTypeLoc(loc(asString("int"))))
9145  matches int x
9146
9147auto x = int(3);
9148cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9149  matches int(3)
9150
9151struct Foo { Foo(int, int); };
9152auto x = Foo(1, 2);
9153cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9154  matches Foo(1, 2)
9155
9156Usable 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;,
9157  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;,
9158  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;,
9159  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9160  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;,
9161  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;,
9162  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;,
9163  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9164</pre></td></tr>
9165
9166
9167<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>
9168<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
9169
9170Given
9171  struct B { int next; };
9172  template&lt;int(B::*next_ptr)&gt; struct A {};
9173  A&lt;&amp;B::next&gt; a;
9174templateSpecializationType(hasAnyTemplateArgument(
9175  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
9176  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9177    B::next
9178</pre></td></tr>
9179
9180
9181<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>
9182<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
9183declaration.
9184
9185Given
9186  struct B { int next; };
9187  template&lt;int(B::*next_ptr)&gt; struct A {};
9188  A&lt;&amp;B::next&gt; a;
9189classTemplateSpecializationDecl(hasAnyTemplateArgument(
9190    refersToDeclaration(fieldDecl(hasName("next")))))
9191  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
9192    B::next
9193</pre></td></tr>
9194
9195
9196<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>
9197<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
9198
9199Given
9200  template&lt;int T&gt; struct C {};
9201  C&lt;42&gt; c;
9202classTemplateSpecializationDecl(
9203  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
9204  matches the implicit instantiation of C in C&lt;42&gt;.
9205</pre></td></tr>
9206
9207
9208<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>
9209<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
9210
9211Given
9212  template&lt;template &lt;typename&gt; class S&gt; class X {};
9213  template&lt;typename T&gt; class Y {};
9214  X&lt;Y&gt; xi;
9215classTemplateSpecializationDecl(hasAnyTemplateArgument(
9216    refersToTemplate(templateName())))
9217  matches the specialization X&lt;Y&gt;
9218</pre></td></tr>
9219
9220
9221<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>
9222<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
9223
9224Given
9225  struct X {};
9226  template&lt;typename T&gt; struct A {};
9227  A&lt;X&gt; a;
9228classTemplateSpecializationDecl(hasAnyTemplateArgument(
9229    refersToType(class(hasName("X")))))
9230  matches the specialization A&lt;X&gt;
9231</pre></td></tr>
9232
9233
9234<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>
9235<tr><td colspan="4" class="doc" id="hasAnyTemplateArgumentLoc0"><pre>Matches template specialization `TypeLoc`s that have at least one
9236`TemplateArgumentLoc` matching the given `InnerMatcher`.
9237
9238Given
9239  template&lt;typename T&gt; class A {};
9240  A&lt;int&gt; a;
9241varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasAnyTemplateArgumentLoc(
9242  hasTypeLoc(loc(asString("int")))))))
9243  matches `A&lt;int&gt; a`.
9244</pre></td></tr>
9245
9246
9247<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>
9248<tr><td colspan="4" class="doc" id="hasTemplateArgumentLoc1"><pre>Matches template specialization `TypeLoc`s where the n'th
9249`TemplateArgumentLoc` matches the given `InnerMatcher`.
9250
9251Given
9252  template&lt;typename T, typename U&gt; class A {};
9253  A&lt;double, int&gt; b;
9254  A&lt;int, double&gt; c;
9255varDecl(hasTypeLoc(templateSpecializationTypeLoc(hasTemplateArgumentLoc(0,
9256  hasTypeLoc(loc(asString("double")))))))
9257  matches `A&lt;double, int&gt; b`, but not `A&lt;int, double&gt; c`.
9258</pre></td></tr>
9259
9260
9261<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>
9262<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9263functionDecl that have at least one TemplateArgument matching the given
9264InnerMatcher.
9265
9266Given
9267  template&lt;typename T&gt; class A {};
9268  template&lt;&gt; class A&lt;double&gt; {};
9269  A&lt;int&gt; a;
9270
9271  template&lt;typename T&gt; f() {};
9272  void func() { f&lt;int&gt;(); };
9273
9274classTemplateSpecializationDecl(hasAnyTemplateArgument(
9275    refersToType(asString("int"))))
9276  matches the specialization A&lt;int&gt;
9277
9278functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
9279  matches the specialization f&lt;int&gt;
9280</pre></td></tr>
9281
9282
9283<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>
9284<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
9285matches the given matcher.
9286
9287The associated declaration is:
9288- for type nodes, the declaration of the underlying type
9289- for CallExpr, the declaration of the callee
9290- for MemberExpr, the declaration of the referenced member
9291- for CXXConstructExpr, the declaration of the constructor
9292- for CXXNewExpr, the declaration of the operator new
9293- for ObjCIvarExpr, the declaration of the ivar
9294
9295For type nodes, hasDeclaration will generally match the declaration of the
9296sugared type. Given
9297  class X {};
9298  typedef X Y;
9299  Y y;
9300in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9301typedefDecl. A common use case is to match the underlying, desugared type.
9302This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9303  varDecl(hasType(hasUnqualifiedDesugaredType(
9304      recordType(hasDeclaration(decl())))))
9305In this matcher, the decl will match the CXXRecordDecl of class X.
9306
9307Usable 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;,
9308  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;,
9309  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;,
9310  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;,
9311  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;,
9312  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;,
9313  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9314</pre></td></tr>
9315
9316
9317<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>
9318<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
9319functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
9320
9321Given
9322  template&lt;typename T, typename U&gt; class A {};
9323  A&lt;bool, int&gt; b;
9324  A&lt;int, bool&gt; c;
9325
9326  template&lt;typename T&gt; void f() {}
9327  void func() { f&lt;int&gt;(); };
9328classTemplateSpecializationDecl(hasTemplateArgument(
9329    1, refersToType(asString("int"))))
9330  matches the specialization A&lt;bool, int&gt;
9331
9332functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
9333  matches the specialization f&lt;int&gt;
9334</pre></td></tr>
9335
9336
9337<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>
9338<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
9339matches the given matcher.
9340
9341The associated declaration is:
9342- for type nodes, the declaration of the underlying type
9343- for CallExpr, the declaration of the callee
9344- for MemberExpr, the declaration of the referenced member
9345- for CXXConstructExpr, the declaration of the constructor
9346- for CXXNewExpr, the declaration of the operator new
9347- for ObjCIvarExpr, the declaration of the ivar
9348
9349For type nodes, hasDeclaration will generally match the declaration of the
9350sugared type. Given
9351  class X {};
9352  typedef X Y;
9353  Y y;
9354in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9355typedefDecl. A common use case is to match the underlying, desugared type.
9356This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9357  varDecl(hasType(hasUnqualifiedDesugaredType(
9358      recordType(hasDeclaration(decl())))))
9359In this matcher, the decl will match the CXXRecordDecl of class X.
9360
9361Usable 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;,
9362  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;,
9363  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;,
9364  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;,
9365  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;,
9366  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;,
9367  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9368</pre></td></tr>
9369
9370
9371<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>
9372<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
9373QualType-matcher matches.
9374</pre></td></tr>
9375
9376
9377<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>
9378<tr><td colspan="4" class="doc" id="hasTypeLoc13"><pre>Matches if the type location of a node matches the inner matcher.
9379
9380Examples:
9381  int x;
9382declaratorDecl(hasTypeLoc(loc(asString("int"))))
9383  matches int x
9384
9385auto x = int(3);
9386cxxTemporaryObjectExpr(hasTypeLoc(loc(asString("int"))))
9387  matches int(3)
9388
9389struct Foo { Foo(int, int); };
9390auto x = Foo(1, 2);
9391cxxFunctionalCastExpr(hasTypeLoc(loc(asString("struct Foo"))))
9392  matches Foo(1, 2)
9393
9394Usable 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;,
9395  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;,
9396  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;,
9397  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;,
9398  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;,
9399  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;,
9400  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;,
9401  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;
9402</pre></td></tr>
9403
9404
9405<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>
9406<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
9407matcher.
9408
9409Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9410            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9411            and U (matcher = typedefDecl(hasType(asString("int")))
9412            and friend class X (matcher = friendDecl(hasType("X"))
9413            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9414                                              asString("class X")))
9415 class X {};
9416 void y(X &amp;x) { x; X z; }
9417 typedef int U;
9418 class Y { friend class X; };
9419 class Z : public virtual X {};
9420</pre></td></tr>
9421
9422
9423<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>
9424<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
9425matches the given matcher.
9426
9427The associated declaration is:
9428- for type nodes, the declaration of the underlying type
9429- for CallExpr, the declaration of the callee
9430- for MemberExpr, the declaration of the referenced member
9431- for CXXConstructExpr, the declaration of the constructor
9432- for CXXNewExpr, the declaration of the operator new
9433- for ObjCIvarExpr, the declaration of the ivar
9434
9435For type nodes, hasDeclaration will generally match the declaration of the
9436sugared type. Given
9437  class X {};
9438  typedef X Y;
9439  Y y;
9440in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9441typedefDecl. A common use case is to match the underlying, desugared type.
9442This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9443  varDecl(hasType(hasUnqualifiedDesugaredType(
9444      recordType(hasDeclaration(decl())))))
9445In this matcher, the decl will match the CXXRecordDecl of class X.
9446
9447Usable 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;,
9448  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;,
9449  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;,
9450  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;,
9451  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;,
9452  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;,
9453  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9454</pre></td></tr>
9455
9456
9457<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>
9458<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
9459type of the matched node.
9460
9461For example, in:
9462  class A {};
9463  using B = A;
9464The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
9465both B and A.
9466</pre></td></tr>
9467
9468
9469<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>
9470<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
9471
9472Given
9473  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
9474unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
9475  matches sizeof(a) and alignof(c)
9476</pre></td></tr>
9477
9478
9479<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>
9480<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
9481
9482Example matches true (matcher = hasUnaryOperand(
9483                                  cxxBoolLiteral(equals(true))))
9484  !true
9485</pre></td></tr>
9486
9487
9488<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>
9489<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
9490given matcher. Implicit object expressions are included; that is, it matches
9491use of implicit `this`.
9492
9493Given
9494  struct X {
9495    int m;
9496    int f(X x) { x.m; return m; }
9497  };
9498memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
9499  matches `x.m`, but not `m`; however,
9500memberExpr(hasObjectExpression(hasType(pointsTo(
9501     cxxRecordDecl(hasName("X"))))))
9502  matches `m` (aka. `this-&gt;m`), but not `x.m`.
9503</pre></td></tr>
9504
9505
9506<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>
9507<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
9508matches the given matcher.
9509
9510The associated declaration is:
9511- for type nodes, the declaration of the underlying type
9512- for CallExpr, the declaration of the callee
9513- for MemberExpr, the declaration of the referenced member
9514- for CXXConstructExpr, the declaration of the constructor
9515- for CXXNewExpr, the declaration of the operator new
9516- for ObjCIvarExpr, the declaration of the ivar
9517
9518For type nodes, hasDeclaration will generally match the declaration of the
9519sugared type. Given
9520  class X {};
9521  typedef X Y;
9522  Y y;
9523in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
9524typedefDecl. A common use case is to match the underlying, desugared type.
9525This can be achieved by using the hasUnqualifiedDesugaredType matcher:
9526  varDecl(hasType(hasUnqualifiedDesugaredType(
9527      recordType(hasDeclaration(decl())))))
9528In this matcher, the decl will match the CXXRecordDecl of class X.
9529
9530Usable 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;,
9531  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;,
9532  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;,
9533  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;,
9534  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;,
9535  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;,
9536  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
9537</pre></td></tr>
9538
9539
9540<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>
9541<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
9542matched by the given matcher.
9543
9544Given
9545  namespace X { int a; void b(); }
9546  using X::a;
9547  using X::b;
9548usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
9549  matches using X::b but not using X::a </pre></td></tr>
9550
9551
9552<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>
9553<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
9554declaration's type.
9555
9556In case of a value declaration (for example a variable declaration),
9557this resolves one layer of indirection. For example, in the value
9558declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
9559X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
9560declaration of x.
9561
9562Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9563            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9564            and friend class X (matcher = friendDecl(hasType("X"))
9565            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9566                                              cxxRecordDecl(hasName("X"))))
9567 class X {};
9568 void y(X &amp;x) { x; X z; }
9569 class Y { friend class X; };
9570 class Z : public virtual X {};
9571
9572Example matches class Derived
9573(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
9574class Base {};
9575class Derived : Base {};
9576
9577Usable 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;,
9578Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
9579</pre></td></tr>
9580
9581
9582<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('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>
9583<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
9584matcher.
9585
9586Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
9587            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
9588            and U (matcher = typedefDecl(hasType(asString("int")))
9589            and friend class X (matcher = friendDecl(hasType("X"))
9590            and public virtual X (matcher = cxxBaseSpecifier(hasType(
9591                                              asString("class X")))
9592 class X {};
9593 void y(X &amp;x) { x; X z; }
9594 typedef int U;
9595 class Y { friend class X; };
9596 class Z : public virtual X {};
9597</pre></td></tr>
9598
9599
9600<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>
9601<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
9602that matches the given matcher.
9603
9604Example matches x (matcher = varDecl(hasInitializer(callExpr())))
9605  bool y() { return true; }
9606  bool x = y();
9607</pre></td></tr>
9608
9609
9610<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>
9611<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
9612expression.
9613
9614Given
9615  void f(int b) {
9616    int a[b];
9617  }
9618variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
9619  varDecl(hasName("b")))))))
9620  matches "int a[b]"
9621</pre></td></tr>
9622
9623
9624<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>
9625<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
9626
9627
9628<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>
9629<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
9630switch statement or conditional operator.
9631
9632Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
9633  if (true) {}
9634</pre></td></tr>
9635
9636<!--END_TRAVERSAL_MATCHERS -->
9637</table>
9638
9639</div>
9640</body>
9641</html>
9642
9643
9644