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}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23  if (!id) return;
24  row = document.getElementById(id);
25  if (row.style.display != 'table-cell')
26    row.style.display = 'table-cell';
27  else
28    row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66    ifStmt(hasTrueExpression(
67        expr(hasDescendant(
68            ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
103<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>
104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107  class C {
108    C() : i(42) {}
109    int i;
110  };
111</pre></td></tr>
112
113
114<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>
115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118  class C {
119  public:
120    int a;
121  };
122accessSpecDecl()
123  matches 'public:'
124</pre></td></tr>
125
126
127<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>
128<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
129
130Example matches the declaration of the nameless block printing an input
131integer.
132
133  myFunc(^(int p) {
134    printf("%d", p);
135  })
136</pre></td></tr>
137
138
139<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>
140<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
141
142Example matches Z
143  template&lt;class T&gt; class Z {};
144</pre></td></tr>
145
146
147<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>
148<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
149
150Given
151  template&lt;class T1, class T2, int I&gt;
152  class A {};
153
154  template&lt;class T, int I&gt;
155  class A&lt;T, T*, I&gt; {};
156
157  template&lt;&gt;
158  class A&lt;int, int, 1&gt; {};
159classTemplatePartialSpecializationDecl()
160  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
161</pre></td></tr>
162
163
164<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>
165<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
166
167Given
168  template&lt;typename T&gt; class A {};
169  template&lt;&gt; class A&lt;double&gt; {};
170  A&lt;int&gt; a;
171classTemplateSpecializationDecl()
172  matches the specializations A&lt;int&gt; and A&lt;double&gt;
173</pre></td></tr>
174
175
176<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>
177<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
178
179Example matches Foo::Foo() and Foo::Foo(int)
180  class Foo {
181   public:
182    Foo();
183    Foo(int);
184    int DoSomething();
185  };
186</pre></td></tr>
187
188
189<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>
190<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
191
192Example matches the operator.
193  class X { operator int() const; };
194</pre></td></tr>
195
196
197<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>
198<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
199
200Example matches the deduction guide.
201  template&lt;typename T&gt;
202  class X { X(int) };
203  X(int) -&gt; X&lt;int&gt;;
204</pre></td></tr>
205
206
207<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>
208<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
209
210Example matches Foo::~Foo()
211  class Foo {
212   public:
213    virtual ~Foo();
214  };
215</pre></td></tr>
216
217
218<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>
219<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
220
221Example matches y
222  class X { void y(); };
223</pre></td></tr>
224
225
226<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>
227<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
228
229Example matches X, Z
230  class X;
231  template&lt;class T&gt; class Z {};
232</pre></td></tr>
233
234
235<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>
236<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
237
238Examples matches X, C, and the friend declaration inside C;
239  void X();
240  class C {
241    friend X;
242  };
243</pre></td></tr>
244
245
246<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>
247<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
248and non-type template parameter declarations).
249
250Given
251  class X { int y; };
252declaratorDecl()
253  matches int y.
254</pre></td></tr>
255
256
257<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>
258<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
259
260Example matches A, B, C
261  enum X {
262    A, B, C
263  };
264</pre></td></tr>
265
266
267<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>
268<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
269
270Example matches X
271  enum X {
272    A, B, C
273  };
274</pre></td></tr>
275
276
277<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>
278<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
279
280Given
281  class X { int m; };
282fieldDecl()
283  matches 'm'.
284</pre></td></tr>
285
286
287<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>
288<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
289
290Given
291  class X { friend void foo(); };
292friendDecl()
293  matches 'friend void foo()'.
294</pre></td></tr>
295
296
297<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>
298<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
299
300Example matches f
301  void f();
302</pre></td></tr>
303
304
305<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>
306<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
307
308Example matches f
309  template&lt;class T&gt; void f(T t) {}
310</pre></td></tr>
311
312
313<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>
314<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
315
316Given
317  struct X { struct { int a; }; };
318indirectFieldDecl()
319  matches 'a'.
320</pre></td></tr>
321
322
323<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>
324<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
325
326Given
327  goto FOO;
328  FOO: bar();
329labelDecl()
330  matches 'FOO:'
331</pre></td></tr>
332
333
334<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>
335<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
336
337Given
338  extern "C" {}
339linkageSpecDecl()
340  matches "extern "C" {}"
341</pre></td></tr>
342
343
344<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>
345<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
346
347Example matches X, S, the anonymous union type, i, and U;
348  typedef int X;
349  struct S {
350    union {
351      int i;
352    } U;
353  };
354</pre></td></tr>
355
356
357<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>
358<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
359
360Given
361  namespace test {}
362  namespace alias = ::test;
363namespaceAliasDecl()
364  matches "namespace alias" but not "namespace test"
365</pre></td></tr>
366
367
368<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>
369<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
370
371Given
372  namespace {}
373  namespace test {}
374namespaceDecl()
375  matches "namespace {}" and "namespace test {}"
376</pre></td></tr>
377
378
379<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>
380<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
381
382Given
383  template &lt;typename T, int N&gt; struct C {};
384nonTypeTemplateParmDecl()
385  matches 'N', but not 'T'.
386</pre></td></tr>
387
388
389<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>
390<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
391
392Example matches Foo (Additions)
393  @interface Foo (Additions)
394  @end
395</pre></td></tr>
396
397
398<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>
399<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
400
401Example matches Foo (Additions)
402  @implementation Foo (Additions)
403  @end
404</pre></td></tr>
405
406
407<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>
408<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
409
410Example matches Foo
411  @implementation Foo
412  @end
413</pre></td></tr>
414
415
416<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>
417<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
418
419Example matches Foo
420  @interface Foo
421  @end
422</pre></td></tr>
423
424
425<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>
426<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
427
428Example matches _enabled
429  @implementation Foo {
430    BOOL _enabled;
431  }
432  @end
433</pre></td></tr>
434
435
436<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>
437<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
438
439Example matches both declaration and definition of -[Foo method]
440  @interface Foo
441  - (void)method;
442  @end
443
444  @implementation Foo
445  - (void)method {}
446  @end
447</pre></td></tr>
448
449
450<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>
451<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
452
453Example matches enabled
454  @interface Foo
455  @property BOOL enabled;
456  @end
457</pre></td></tr>
458
459
460<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>
461<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
462
463Example matches FooDelegate
464  @protocol FooDelegate
465  @end
466</pre></td></tr>
467
468
469<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>
470<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
471
472Given
473  void f(int x);
474parmVarDecl()
475  matches int x.
476</pre></td></tr>
477
478
479<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>
480<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
481
482Example matches X, Z, U, and S
483  class X;
484  template&lt;class T&gt; class Z {};
485  struct S {};
486  union U {};
487</pre></td></tr>
488
489
490<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>
491<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
492
493Example:
494  staticAssertExpr()
495matches
496  static_assert(sizeof(S) == sizeof(int))
497in
498  struct S {
499    int x;
500  };
501  static_assert(sizeof(S) == sizeof(int));
502</pre></td></tr>
503
504
505<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>
506<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
507
508Example matches X, Z, U, S, E
509  class X;
510  template&lt;class T&gt; class Z {};
511  struct S {};
512  union U {};
513  enum E {
514    A, B, C
515  };
516</pre></td></tr>
517
518
519<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>
520<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
521
522Given
523  template &lt;typename T, int N&gt; struct C {};
524templateTypeParmDecl()
525  matches 'T', but not 'N'.
526</pre></td></tr>
527
528
529<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>
530<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
531
532Given
533  int X;
534  namespace NS {
535  int Y;
536  }  // namespace NS
537decl(hasDeclContext(translationUnitDecl()))
538  matches "int X", but not "int Y".
539</pre></td></tr>
540
541
542<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>
543<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
544
545Given
546  typedef int X;
547  using Y = int;
548typeAliasDecl()
549  matches "using Y = int", but not "typedef int X"
550</pre></td></tr>
551
552
553<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>
554<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
555
556typeAliasTemplateDecl() matches
557  template &lt;typename T&gt;
558  using Y = X&lt;T&gt;;
559</pre></td></tr>
560
561
562<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>
563<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
564
565Given
566  typedef int X;
567  using Y = int;
568typedefDecl()
569  matches "typedef int X", but not "using Y = int"
570</pre></td></tr>
571
572
573<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>
574<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
575
576Given
577  typedef int X;
578  using Y = int;
579typedefNameDecl()
580  matches "typedef int X" and "using Y = int"
581</pre></td></tr>
582
583
584<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>
585<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
586typename.
587
588Given
589  template &lt;typename T&gt;
590  struct Base { typedef T Foo; };
591
592  template&lt;typename T&gt;
593  struct S : private Base&lt;T&gt; {
594    using typename Base&lt;T&gt;::Foo;
595  };
596unresolvedUsingTypenameDecl()
597  matches using Base&lt;T&gt;::Foo </pre></td></tr>
598
599
600<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>
601<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
602
603Given
604  template&lt;typename X&gt;
605  class C : private X {
606    using X::x;
607  };
608unresolvedUsingValueDecl()
609  matches using X::x </pre></td></tr>
610
611
612<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>
613<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
614
615Given
616  namespace X { int x; }
617  using X::x;
618usingDecl()
619  matches using X::x </pre></td></tr>
620
621
622<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>
623<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
624
625Given
626  namespace X { int x; }
627  using namespace X;
628usingDirectiveDecl()
629  matches using namespace X </pre></td></tr>
630
631
632<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>
633<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
634
635Example matches A, B, C and F
636  enum X { A, B, C };
637  void F();
638</pre></td></tr>
639
640
641<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>
642<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
643
644Note: this does not match declarations of member variables, which are
645"field" declarations in Clang parlance.
646
647Example matches a
648  int a;
649</pre></td></tr>
650
651
652<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>
653<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
654</pre></td></tr>
655
656
657<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>
658<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
659
660Given
661  namespace ns {
662    struct A { static void f(); };
663    void A::f() {}
664    void g() { A::f(); }
665  }
666  ns::A a;
667nestedNameSpecifier()
668  matches "ns::" and both "A::"
669</pre></td></tr>
670
671
672<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>
673<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
674
675Given
676
677  #pragma omp parallel default(none)
678  #pragma omp parallel default(shared)
679  #pragma omp parallel
680
681``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
682</pre></td></tr>
683
684
685<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>
686<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
687</pre></td></tr>
688
689
690<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>
691<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
692
693Given
694  FOO: bar();
695  void *ptr = &amp;&amp;FOO;
696  goto *bar;
697addrLabelExpr()
698  matches '&amp;&amp;FOO'
699</pre></td></tr>
700
701
702<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>
703<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
704
705Given
706  int i = a[1];
707arraySubscriptExpr()
708  matches "a[1]"
709</pre></td></tr>
710
711
712<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>
713<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
714
715 int i = 100;
716  __asm("mov al, 2");
717asmStmt()
718  matches '__asm("mov al, 2")'
719</pre></td></tr>
720
721
722<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>
723<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
724Example matches __atomic_load_n(ptr, 1)
725  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
726</pre></td></tr>
727
728
729<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>
730<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
731
732Given
733  @autoreleasepool {
734    int x = 0;
735  }
736autoreleasePoolStmt(stmt()) matches the declaration of "x"
737inside the autorelease pool.
738</pre></td></tr>
739
740
741<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>
742<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
743
744Example matches a ?: b
745  (a ?: b) + 42;
746</pre></td></tr>
747
748
749<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>
750<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
751
752Example matches a || b
753  !(a || b)
754</pre></td></tr>
755
756
757<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>
758<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
759
760Example: matches "^{}":
761  void f() { ^{}(); }
762</pre></td></tr>
763
764
765<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>
766<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
767
768Given
769  while (true) { break; }
770breakStmt()
771  matches 'break'
772</pre></td></tr>
773
774
775<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>
776<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
777
778Example: Matches (int) 2.2f in
779  int i = (int) 2.2f;
780</pre></td></tr>
781
782
783<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>
784<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
785
786Example matches x.y() and y()
787  X x;
788  x.y();
789  y();
790</pre></td></tr>
791
792
793<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>
794<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
795
796Given
797  switch(a) { case 42: break; default: break; }
798caseStmt()
799  matches 'case 42:'.
800</pre></td></tr>
801
802
803<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>
804<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
805
806Example: castExpr() matches each of the following:
807  (int) 3;
808  const_cast&lt;Expr *&gt;(SubExpr);
809  char c = 0;
810but does not match
811  int i = (0);
812  int k = 0;
813</pre></td></tr>
814
815
816<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>
817<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
818
819Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
820though.
821
822Example matches 'a', L'a'
823  char ch = 'a';
824  wchar_t chw = L'a';
825</pre></td></tr>
826
827
828<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>
829<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
830</pre></td></tr>
831
832
833<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>
834<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
835
836Example match: {1}, (1, 2)
837  int array[4] = {1};
838  vector int myvec = (vector int)(1, 2);
839</pre></td></tr>
840
841
842<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>
843<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
844
845Example matches '{}' and '{{}}' in 'for (;;) {{}}'
846  for (;;) {{}}
847</pre></td></tr>
848
849
850<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>
851<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
852
853Example matches a ? b : c
854  (a ? b : c) + 42
855</pre></td></tr>
856
857
858<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>
859<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
860
861Example matches the constant in the case statement:
862    (matcher = constantExpr())
863  switch (a) {
864  case 37: break;
865  }
866</pre></td></tr>
867
868
869<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>
870<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
871
872Given
873  while (true) { continue; }
874continueStmt()
875  matches 'continue'
876</pre></td></tr>
877
878
879<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>
880<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
881
882Example matches,
883  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
884</pre></td></tr>
885
886
887<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>
888<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
889
890Example matches FunctionTakesString(GetStringByValue())
891    (matcher = cxxBindTemporaryExpr())
892  FunctionTakesString(GetStringByValue());
893  FunctionTakesStringByPointer(GetStringPointer());
894</pre></td></tr>
895
896
897<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>
898<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
899
900Example matches true
901  true
902</pre></td></tr>
903
904
905<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>
906<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
907
908  try {} catch(int i) {}
909cxxCatchStmt()
910  matches 'catch(int i)'
911</pre></td></tr>
912
913
914<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>
915<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
916
917Example: Matches const_cast&lt;int*&gt;(&amp;r) in
918  int n = 42;
919  const int &amp;r(n);
920  int* p = const_cast&lt;int*&gt;(&amp;r);
921</pre></td></tr>
922
923
924<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>
925<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
926
927Example matches string(ptr, n) and ptr within arguments of f
928    (matcher = cxxConstructExpr())
929  void f(const string &amp;a, const string &amp;b);
930  char *ptr;
931  int n;
932  f(string(ptr, n), ptr);
933</pre></td></tr>
934
935
936<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>
937<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
938
939Example matches the CXXDefaultArgExpr placeholder inserted for the
940    default value of the second parameter in the call expression f(42)
941    (matcher = cxxDefaultArgExpr())
942  void f(int x, int y = 0);
943  f(42);
944</pre></td></tr>
945
946
947<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>
948<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
949
950Given
951  delete X;
952cxxDeleteExpr()
953  matches 'delete X'.
954</pre></td></tr>
955
956
957<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>
958<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
959resolved because the base expression or the member name was dependent.
960
961Given
962  template &lt;class T&gt; void f() { T t; t.g(); }
963cxxDependentScopeMemberExpr()
964  matches t.g
965</pre></td></tr>
966
967
968<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>
969<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
970
971Example:
972  cxxDynamicCastExpr()
973matches
974  dynamic_cast&lt;D*&gt;(&amp;b);
975in
976  struct B { virtual ~B() {} }; struct D : B {};
977  B b;
978  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
979</pre></td></tr>
980
981
982<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>
983<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
984
985cxxForRangeStmt() matches 'for (auto a : i)'
986  int i[] =  {1, 2, 3}; for (auto a : i);
987  for(int j = 0; j &lt; 5; ++j);
988</pre></td></tr>
989
990
991<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>
992<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
993
994Example: Matches Foo(bar);
995  Foo f = bar;
996  Foo g = (Foo) bar;
997  Foo h = Foo(bar);
998</pre></td></tr>
999
1000
1001<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>
1002<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1003
1004Example matches x.y()
1005  X x;
1006  x.y();
1007</pre></td></tr>
1008
1009
1010<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>
1011<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1012
1013Given
1014  new X;
1015cxxNewExpr()
1016  matches 'new X'.
1017</pre></td></tr>
1018
1019
1020<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>
1021<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1022
1023Given
1024  bool a() noexcept;
1025  bool b() noexcept(true);
1026  bool c() noexcept(false);
1027  bool d() noexcept(noexcept(a()));
1028  bool e = noexcept(b()) || noexcept(c());
1029cxxNoexceptExpr()
1030  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1031  doesn't match the noexcept specifier in the declarations a, b, c or d.
1032</pre></td></tr>
1033
1034
1035<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>
1036<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1037</pre></td></tr>
1038
1039
1040<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>
1041<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1042
1043Note that if an operator isn't overloaded, it won't match. Instead, use
1044binaryOperator matcher.
1045Currently it does not match operators such as new delete.
1046FIXME: figure out why these do not match?
1047
1048Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1049    (matcher = cxxOperatorCallExpr())
1050  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1051  ostream &amp;o; int b = 1, c = 1;
1052  o &lt;&lt; b &lt;&lt; c;
1053</pre></td></tr>
1054
1055
1056<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>
1057<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1058
1059Either the source expression or the destination type can be matched
1060using has(), but hasDestinationType() is more specific and can be
1061more readable.
1062
1063Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1064  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1065</pre></td></tr>
1066
1067
1068<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>
1069<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1070
1071See also: hasDestinationType
1072See also: reinterpretCast
1073
1074Example:
1075  cxxStaticCastExpr()
1076matches
1077  static_cast&lt;long&gt;(8)
1078in
1079  long eight(static_cast&lt;long&gt;(8));
1080</pre></td></tr>
1081
1082
1083<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>
1084<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1085
1086Given
1087  std::vector&lt;int&gt; a({ 1, 2, 3 });
1088  std::vector&lt;int&gt; b = { 4, 5 };
1089  int c[] = { 6, 7 };
1090  std::pair&lt;int, int&gt; d = { 8, 9 };
1091cxxStdInitializerListExpr()
1092  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1093</pre></td></tr>
1094
1095
1096<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>
1097<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1098
1099Example: Matches Foo(bar, bar)
1100  Foo h = Foo(bar, bar);
1101</pre></td></tr>
1102
1103
1104<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>
1105<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1106
1107Example matches the implicit this expression in "return i".
1108    (matcher = cxxThisExpr())
1109struct foo {
1110  int i;
1111  int f() { return i; }
1112};
1113</pre></td></tr>
1114
1115
1116<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>
1117<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1118
1119  try { throw 5; } catch(int i) {}
1120cxxThrowExpr()
1121  matches 'throw 5'
1122</pre></td></tr>
1123
1124
1125<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>
1126<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1127
1128  try {} catch(int i) {}
1129cxxTryStmt()
1130  matches 'try {}'
1131</pre></td></tr>
1132
1133
1134<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>
1135<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1136
1137Example matches T(t) in return statement of f
1138    (matcher = cxxUnresolvedConstructExpr())
1139  template &lt;typename T&gt;
1140  void f(const T&amp; t) { return T(t); }
1141</pre></td></tr>
1142
1143
1144<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>
1145<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1146
1147Example matches x in if (x)
1148  bool x;
1149  if (x) {}
1150</pre></td></tr>
1151
1152
1153<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>
1154<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1155
1156Given
1157  int a;
1158declStmt()
1159  matches 'int a'.
1160</pre></td></tr>
1161
1162
1163<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>
1164<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1165
1166Given
1167  switch(a) { case 42: break; default: break; }
1168defaultStmt()
1169  matches 'default:'.
1170</pre></td></tr>
1171
1172
1173<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>
1174<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1175
1176Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1177  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1178</pre></td></tr>
1179
1180
1181<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>
1182<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1183
1184Given
1185  do {} while (true);
1186doStmt()
1187  matches 'do {} while(true)'
1188</pre></td></tr>
1189
1190
1191<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>
1192<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1193
1194Matches any cast expression written in user code, whether it be a
1195C-style cast, a functional-style cast, or a keyword cast.
1196
1197Does not match implicit conversions.
1198
1199Note: the name "explicitCast" is chosen to match Clang's terminology, as
1200Clang uses the term "cast" to apply to implicit conversions as well as to
1201actual cast expressions.
1202
1203See also: hasDestinationType.
1204
1205Example: matches all five of the casts in
1206  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1207but does not match the implicit conversion in
1208  long ell = 42;
1209</pre></td></tr>
1210
1211
1212<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>
1213<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1214
1215Example matches x()
1216  void f() { x(); }
1217</pre></td></tr>
1218
1219
1220<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>
1221<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1222of the sub-expression's evaluation.
1223
1224Example matches std::string()
1225  const std::string str = std::string();
1226</pre></td></tr>
1227
1228
1229<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>
1230<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1231</pre></td></tr>
1232
1233
1234<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>
1235<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
12361.0, 1.0f, 1.0L and 1e10.
1237
1238Does not match implicit conversions such as
1239  float a = 10;
1240</pre></td></tr>
1241
1242
1243<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>
1244<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1245
1246Example matches 'for (;;) {}'
1247  for (;;) {}
1248  int i[] =  {1, 2, 3}; for (auto a : i);
1249</pre></td></tr>
1250
1251
1252<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>
1253<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1254</pre></td></tr>
1255
1256
1257<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>
1258<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1259
1260Given
1261  goto FOO;
1262  FOO: bar();
1263gotoStmt()
1264  matches 'goto FOO'
1265</pre></td></tr>
1266
1267
1268<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>
1269<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1270
1271Example matches 'if (x) {}'
1272  if (x) {}
1273</pre></td></tr>
1274
1275
1276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1277<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1278point literals e.g.: 1i, 1.0i
1279</pre></td></tr>
1280
1281
1282<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>
1283<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1284
1285This matches many different places, including function call return value
1286eliding, as well as any type conversions.
1287</pre></td></tr>
1288
1289
1290<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>
1291<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1292
1293Given
1294  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1295implicitValueInitExpr()
1296  matches "[0].y" (implicitly)
1297</pre></td></tr>
1298
1299
1300<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>
1301<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1302
1303Given
1304  int a[] = { 1, 2 };
1305  struct B { int x, y; };
1306  B b = { 5, 6 };
1307initListExpr()
1308  matches "{ 1, 2 }" and "{ 5, 6 }"
1309</pre></td></tr>
1310
1311
1312<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>
1313<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
13141, 1L, 0x1 and 1U.
1315
1316Does not match character-encoded integers such as L'a'.
1317</pre></td></tr>
1318
1319
1320<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>
1321<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1322
1323Given
1324  goto FOO;
1325  FOO: bar();
1326labelStmt()
1327  matches 'FOO:'
1328</pre></td></tr>
1329
1330
1331<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1332<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1333
1334Example matches [&amp;](){return 5;}
1335  [&amp;](){return 5;}
1336</pre></td></tr>
1337
1338
1339<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>
1340<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1341
1342Example: Given
1343  struct T {void func();};
1344  T f();
1345  void g(T);
1346materializeTemporaryExpr() matches 'f()' in these statements
1347  T u(f());
1348  g(f());
1349  f().func();
1350but does not match
1351  f();
1352</pre></td></tr>
1353
1354
1355<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>
1356<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1357
1358Given
1359  class Y {
1360    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1361    int a; static int b;
1362  };
1363memberExpr()
1364  matches this-&gt;x, x, y.x, a, this-&gt;b
1365</pre></td></tr>
1366
1367
1368<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>
1369<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1370
1371  foo();;
1372nullStmt()
1373  matches the second ';'
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('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>
1378<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1379
1380Example matches @catch
1381  @try {}
1382  @catch (...) {}
1383</pre></td></tr>
1384
1385
1386<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1387<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1388
1389Example matches @finally
1390  @try {}
1391  @finally {}
1392</pre></td></tr>
1393
1394
1395<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>
1396<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1397
1398Example: matches "a" in "init" method:
1399@implementation A {
1400  NSString *a;
1401}
1402- (void) init {
1403  a = @"hello";
1404}
1405</pre></td></tr>
1406
1407
1408<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1409<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1410
1411The innermost message send invokes the "alloc" class method on the
1412NSString class, while the outermost message send invokes the
1413"initWithString" instance method on the object returned from
1414NSString's "alloc". This matcher should match both message sends.
1415  [[NSString alloc] initWithString:@"Hello"]
1416</pre></td></tr>
1417
1418
1419<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1420<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1421
1422Example matches @throw obj;
1423</pre></td></tr>
1424
1425
1426<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1427<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1428
1429Example matches @try
1430  @try {}
1431  @catch (...) {}
1432</pre></td></tr>
1433
1434
1435<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>
1436<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
1437
1438Given
1439
1440  #pragma omp parallel
1441  #pragma omp parallel default(none)
1442  #pragma omp taskyield
1443
1444``ompExecutableDirective()`` matches ``omp parallel``,
1445``omp parallel default(none)`` and ``omp taskyield``.
1446</pre></td></tr>
1447
1448
1449<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>
1450<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1451to reference another expressions and can be met
1452in BinaryConditionalOperators, for example.
1453
1454Example matches 'a'
1455  (a ?: c) + 42;
1456</pre></td></tr>
1457
1458
1459<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>
1460<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1461
1462Example matches (foo() + 1)
1463  int foo() { return 1; }
1464  int a = (foo() + 1);
1465</pre></td></tr>
1466
1467
1468<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1469<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1470ParenListExprs don't have a predefined type and are used for late parsing.
1471In the final AST, they can be met in template declarations.
1472
1473Given
1474  template&lt;typename T&gt; class X {
1475    void f() {
1476      X x(*this);
1477      int a = 0, b = 1; int i = (a, b);
1478    }
1479  };
1480parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1481has a predefined type and is a ParenExpr, not a ParenListExpr.
1482</pre></td></tr>
1483
1484
1485<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1486<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1487
1488Example: Matches __func__
1489  printf("%s", __func__);
1490</pre></td></tr>
1491
1492
1493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1494<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1495
1496Given
1497  return 1;
1498returnStmt()
1499  matches 'return 1'
1500</pre></td></tr>
1501
1502
1503<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1504<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1505
1506Given
1507  { ++a; }
1508stmt()
1509  matches both the compound statement '{ ++a; }' and '++a'.
1510</pre></td></tr>
1511
1512
1513<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('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>
1514<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1515
1516Example match: ({ int X = 4; X; })
1517  int C = ({ int X = 4; X; });
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('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>
1522<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1523
1524Example matches "abcd", L"abcd"
1525  char *s = "abcd";
1526  wchar_t *ws = L"abcd";
1527</pre></td></tr>
1528
1529
1530<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>
1531<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1532
1533Given
1534  template &lt;int N&gt;
1535  struct A { static const int n = N; };
1536  struct B : public A&lt;42&gt; {};
1537substNonTypeTemplateParmExpr()
1538  matches "N" in the right-hand side of "static const int n = N;"
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('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>
1543<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1544
1545Given
1546  switch(a) { case 42: break; default: break; }
1547switchCase()
1548  matches 'case 42:' and 'default:'.
1549</pre></td></tr>
1550
1551
1552<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>
1553<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1554
1555Given
1556  switch(a) { case 42: break; default: break; }
1557switchStmt()
1558  matches 'switch(a)'.
1559</pre></td></tr>
1560
1561
1562<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>
1563<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1564
1565Given
1566  Foo x = bar;
1567  int y = sizeof(x) + alignof(x);
1568unaryExprOrTypeTraitExpr()
1569  matches sizeof(x) and alignof(x)
1570</pre></td></tr>
1571
1572
1573<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>
1574<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1575
1576Example matches !a
1577  !a || b
1578</pre></td></tr>
1579
1580
1581<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>
1582<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1583but could not be resolved to a specific declaration.
1584
1585Given
1586  template&lt;typename T&gt;
1587  T foo() { T a; return a; }
1588  template&lt;typename T&gt;
1589  void bar() {
1590    foo&lt;T&gt;();
1591  }
1592unresolvedLookupExpr()
1593  matches foo&lt;T&gt;() </pre></td></tr>
1594
1595
1596<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>
1597<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
1598
1599Given
1600  struct X {
1601    template &lt;class T&gt; void f();
1602    void g();
1603  };
1604  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
1605unresolvedMemberExpr()
1606  matches x.f&lt;T&gt;
1607</pre></td></tr>
1608
1609
1610<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>
1611<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1612
1613Example match: "foo"_suffix
1614</pre></td></tr>
1615
1616
1617<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>
1618<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1619
1620Given
1621  while (true) {}
1622whileStmt()
1623  matches 'while (true) {}'.
1624</pre></td></tr>
1625
1626
1627<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>
1628<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1629
1630Given
1631  template &lt;typename T&gt; struct C {};
1632  C&lt;int&gt; c;
1633templateArgument()
1634  matches 'int' in C&lt;int&gt;.
1635</pre></td></tr>
1636
1637
1638<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>
1639<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1640
1641Given
1642  template &lt;typename T&gt; class X { };
1643  X&lt;int&gt; xi;
1644templateName()
1645  matches 'X' in X&lt;int&gt;.
1646</pre></td></tr>
1647
1648
1649<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>
1650<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1651</pre></td></tr>
1652
1653
1654<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>
1655<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1656
1657Given
1658  int a[] = { 2, 3 };
1659  int b[4];
1660  void f() { int c[a[0]]; }
1661arrayType()
1662  matches "int a[]", "int b[4]" and "int c[a[0]]";
1663</pre></td></tr>
1664
1665
1666<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>
1667<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1668
1669Given
1670  _Atomic(int) i;
1671atomicType()
1672  matches "_Atomic(int) i"
1673</pre></td></tr>
1674
1675
1676<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>
1677<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1678
1679Given:
1680  auto n = 4;
1681  int v[] = { 2, 3 }
1682  for (auto i : v) { }
1683autoType()
1684  matches "auto n" and "auto i"
1685</pre></td></tr>
1686
1687
1688<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>
1689<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1690"void (^)(int)".
1691
1692The pointee is always required to be a FunctionType.
1693</pre></td></tr>
1694
1695
1696<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>
1697<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1698
1699Given
1700  struct A {};
1701  A a;
1702  int b;
1703  float c;
1704  bool d;
1705builtinType()
1706  matches "int b", "float c" and "bool d"
1707</pre></td></tr>
1708
1709
1710<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>
1711<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1712
1713Given
1714  _Complex float f;
1715complexType()
1716  matches "_Complex float f"
1717</pre></td></tr>
1718
1719
1720<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>
1721<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1722
1723Given
1724  void() {
1725    int a[2];
1726    int b[] = { 2, 3 };
1727    int c[b[0]];
1728  }
1729constantArrayType()
1730  matches "int a[2]"
1731</pre></td></tr>
1732
1733
1734<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>
1735<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1736Example matches i[] in declaration of f.
1737    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1738Example matches i[1].
1739    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1740  void f(int i[]) {
1741    i[1] = 0;
1742  }
1743</pre></td></tr>
1744
1745
1746<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>
1747<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
1748
1749Given:
1750  short i = 1;
1751  int j = 42;
1752  decltype(i + j) result = i + j;
1753decltypeType()
1754  matches "decltype(i + j)"
1755</pre></td></tr>
1756
1757
1758<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>
1759<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
1760template types.
1761
1762Given
1763  template &lt;typename T&gt;
1764  class C { public: C(T); };
1765
1766  C c(123);
1767deducedTemplateSpecializationType() matches the type in the declaration
1768of the variable c.
1769</pre></td></tr>
1770
1771
1772<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>
1773<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1774
1775Given
1776  template&lt;typename T, int Size&gt;
1777  class array {
1778    T data[Size];
1779  };
1780dependentSizedArrayType
1781  matches "T data[Size]"
1782</pre></td></tr>
1783
1784
1785<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>
1786<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1787qualified name.
1788
1789Given
1790  namespace N {
1791    namespace M {
1792      class D {};
1793    }
1794  }
1795  class C {};
1796
1797  class C c;
1798  N::M::D d;
1799
1800elaboratedType() matches the type of the variable declarations of both
1801c and d.
1802</pre></td></tr>
1803
1804
1805<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>
1806<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1807
1808Given
1809  enum C { Green };
1810  enum class S { Red };
1811
1812  C c;
1813  S s;
1814
1815enumType() matches the type of the variable declarations of both c and
1816s.
1817</pre></td></tr>
1818
1819
1820<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>
1821<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1822
1823Given
1824  int (*f)(int);
1825  void g();
1826functionProtoType()
1827  matches "int (*f)(int)" and the type of "g" in C++ mode.
1828  In C mode, "g" is not matched because it does not contain a prototype.
1829</pre></td></tr>
1830
1831
1832<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>
1833<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1834
1835Given
1836  int (*f)(int);
1837  void g();
1838functionType()
1839  matches "int (*f)(int)" and the type of "g".
1840</pre></td></tr>
1841
1842
1843<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>
1844<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1845
1846Given
1847  int a[] = { 2, 3 };
1848  int b[42];
1849  void f(int c[]) { int d[a[0]]; };
1850incompleteArrayType()
1851  matches "int a[]" and "int c[]"
1852</pre></td></tr>
1853
1854
1855<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>
1856<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1857
1858Example matches S s, but not S&lt;T&gt; s.
1859    (matcher = parmVarDecl(hasType(injectedClassNameType())))
1860  template &lt;typename T&gt; struct S {
1861    void f(S s);
1862    void g(S&lt;T&gt; s);
1863  };
1864</pre></td></tr>
1865
1866
1867<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>
1868<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1869
1870Given:
1871  int *a;
1872  int &amp;b = *a;
1873  int &amp;&amp;c = 1;
1874  auto &amp;d = b;
1875  auto &amp;&amp;e = c;
1876  auto &amp;&amp;f = 2;
1877  int g = 5;
1878
1879lValueReferenceType() matches the types of b, d, and e. e is
1880matched since the type is deduced as int&amp; by reference collapsing rules.
1881</pre></td></tr>
1882
1883
1884<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>
1885<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1886Given
1887  struct A { int i; }
1888  A::* ptr = A::i;
1889memberPointerType()
1890  matches "A::* ptr"
1891</pre></td></tr>
1892
1893
1894<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>
1895<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1896a pointer type, despite being syntactically similar.
1897
1898Given
1899  int *a;
1900
1901  @interface Foo
1902  @end
1903  Foo *f;
1904pointerType()
1905  matches "Foo *f", but does not match "int *a".
1906</pre></td></tr>
1907
1908
1909<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>
1910<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1911
1912Given
1913  int (*ptr_to_array)[4];
1914  int *array_of_ptrs[4];
1915
1916varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1917array_of_ptrs.
1918</pre></td></tr>
1919
1920
1921<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>
1922<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1923types.
1924
1925Given
1926  int *a;
1927  int &amp;b = *a;
1928  int c = 5;
1929
1930  @interface Foo
1931  @end
1932  Foo *f;
1933pointerType()
1934  matches "int *a", but does not match "Foo *f".
1935</pre></td></tr>
1936
1937
1938<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>
1939<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1940
1941Given:
1942  int *a;
1943  int &amp;b = *a;
1944  int &amp;&amp;c = 1;
1945  auto &amp;d = b;
1946  auto &amp;&amp;e = c;
1947  auto &amp;&amp;f = 2;
1948  int g = 5;
1949
1950rValueReferenceType() matches the types of c and f. e is not
1951matched as it is deduced to int&amp; by reference collapsing rules.
1952</pre></td></tr>
1953
1954
1955<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>
1956<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1957
1958Given
1959  class C {};
1960  struct S {};
1961
1962  C c;
1963  S s;
1964
1965recordType() matches the type of the variable declarations of both c
1966and s.
1967</pre></td></tr>
1968
1969
1970<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>
1971<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1972
1973Given
1974  int *a;
1975  int &amp;b = *a;
1976  int &amp;&amp;c = 1;
1977  auto &amp;d = b;
1978  auto &amp;&amp;e = c;
1979  auto &amp;&amp;f = 2;
1980  int g = 5;
1981
1982referenceType() matches the types of b, c, d, e, and f.
1983</pre></td></tr>
1984
1985
1986<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>
1987<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1988template type parameter.
1989
1990Given
1991  template &lt;typename T&gt;
1992  void F(T t) {
1993    int i = 1 + t;
1994  }
1995
1996substTemplateTypeParmType() matches the type of 't' but not '1'
1997</pre></td></tr>
1998
1999
2000<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>
2001<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2002
2003Given
2004  enum E {};
2005  class C {};
2006
2007  E e;
2008  C c;
2009
2010tagType() matches the type of the variable declarations of both e
2011and c.
2012</pre></td></tr>
2013
2014
2015<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>
2016<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2017
2018Given
2019  template &lt;typename T&gt;
2020  class C { };
2021
2022  template class C&lt;int&gt;;  // A
2023  C&lt;char&gt; var;            // B
2024
2025templateSpecializationType() matches the type of the explicit
2026instantiation in A and the type of the variable declaration in B.
2027</pre></td></tr>
2028
2029
2030<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>
2031<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2032
2033Example matches T, but not int.
2034    (matcher = templateTypeParmType())
2035  template &lt;typename T&gt; void f(int i);
2036</pre></td></tr>
2037
2038
2039<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>
2040<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2041</pre></td></tr>
2042
2043
2044<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>
2045<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2046
2047Given
2048  typedef int X;
2049typedefType()
2050  matches "typedef int X"
2051</pre></td></tr>
2052
2053
2054<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>
2055<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2056
2057Given:
2058  typedef __underlying_type(T) type;
2059unaryTransformType()
2060  matches "__underlying_type(T)"
2061</pre></td></tr>
2062
2063
2064<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>
2065<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2066integer-constant-expression.
2067
2068Given
2069  void f() {
2070    int a[] = { 2, 3 }
2071    int b[42];
2072    int c[a[0]];
2073  }
2074variableArrayType()
2075  matches "int c[a[0]]"
2076</pre></td></tr>
2077
2078<!--END_DECL_MATCHERS -->
2079</table>
2080
2081<!-- ======================================================================= -->
2082<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2083<!-- ======================================================================= -->
2084
2085<p>Narrowing matchers match certain attributes on the current node, thus
2086narrowing down the set of nodes of the current type to match on.</p>
2087
2088<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2089which allow users to create more powerful match expressions.</p>
2090
2091<table>
2092<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2093<!-- START_NARROWING_MATCHERS -->
2094
2095<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>
2096<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2097
2098Usable as: Any Matcher
2099</pre></td></tr>
2100
2101
2102<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>
2103<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2104
2105Usable as: Any Matcher
2106</pre></td></tr>
2107
2108
2109<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2110<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2111
2112Useful when another matcher requires a child matcher, but there's no
2113additional constraint. This will often be used with an explicit conversion
2114to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2115
2116Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2117"int* p" and "void f()" in
2118  int* p;
2119  void f();
2120
2121Usable as: Any Matcher
2122</pre></td></tr>
2123
2124
2125<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2126<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2127
2128Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2129  class X {};
2130  class Y {};
2131
2132Usable as: Any Matcher
2133</pre></td></tr>
2134
2135
2136<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>
2137<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2138specified names.
2139
2140   hasAnyOperatorName("+", "-")
2141 Is equivalent to
2142   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2143</pre></td></tr>
2144
2145
2146<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>
2147<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2148unary).
2149
2150Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2151  !(a || b)
2152</pre></td></tr>
2153
2154
2155<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>
2156<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2157
2158Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2159  if (a == b)
2160    a += b;
2161
2162Example 2: matches s1 = s2
2163           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2164  struct S { S&amp; operator=(const S&amp;); };
2165  void x() { S s1, s2; s1 = s2; }
2166</pre></td></tr>
2167
2168
2169<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>
2170<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2171
2172Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2173  if (a == b)
2174    a += b;
2175
2176Example 2: matches s1 &lt; s2
2177           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2178  struct S { bool operator&lt;(const S&amp; other); };
2179  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2180</pre></td></tr>
2181
2182
2183<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>
2184<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2185inheritance.
2186
2187Examples:
2188  class C {
2189  public:    int a;
2190  protected: int b;
2191  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2192  };
2193
2194  struct Base {};
2195  struct Derived1 : private Base {}; // matches 'Base'
2196  class Derived2 : Base {}; // matches 'Base'
2197</pre></td></tr>
2198
2199
2200<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>
2201<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2202protected inheritance.
2203
2204Examples:
2205  class C {
2206  public:    int a;
2207  protected: int b; // fieldDecl(isProtected()) matches 'b'
2208  private:   int c;
2209  };
2210
2211  class Base {};
2212  class Derived : protected Base {}; // matches 'Base'
2213</pre></td></tr>
2214
2215
2216<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>
2217<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2218inheritance.
2219
2220Examples:
2221  class C {
2222  public:    int a; // fieldDecl(isPublic()) matches 'a'
2223  protected: int b;
2224  private:   int c;
2225  };
2226
2227  class Base {};
2228  class Derived1 : public Base {}; // matches 'Base'
2229  struct Derived2 : Base {}; // matches 'Base'
2230</pre></td></tr>
2231
2232
2233<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>
2234<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2235virtual inheritance.
2236
2237Example:
2238  class A {
2239   public:
2240    virtual void x(); // matches x
2241  };
2242
2243Example:
2244  class Base {};
2245  class DirectlyDerived : virtual Base {}; // matches Base
2246  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2247
2248Usable 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;
2249</pre></td></tr>
2250
2251
2252<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>
2253<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2254
2255
2256<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>
2257<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2258
2259Given
2260  f('false, 3.14, 42);
2261characterLiteral(equals(0))
2262  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2263  match false
2264floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2265  match 3.14
2266integerLiteral(equals(42))
2267  matches 42
2268
2269Note that you cannot directly match a negative numeric literal because the
2270minus sign is not part of the literal: It is a unary operator whose operand
2271is the positive numeric literal. Instead, you must use a unaryOperator()
2272matcher to match the minus sign:
2273
2274unaryOperator(hasOperatorName("-"),
2275              hasUnaryOperand(integerLiteral(equals(13))))
2276
2277Usable 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;,
2278           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;
2279</pre></td></tr>
2280
2281
2282<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>
2283<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2284
2285
2286<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>
2287<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2288
2289
2290<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>
2291<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2292
2293Given
2294  try {
2295    // ...
2296  } catch (int) {
2297    // ...
2298  } catch (...) {
2299    // ...
2300  }
2301cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2302</pre></td></tr>
2303
2304
2305<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>
2306<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2307a specific number of arguments (including absent default arguments).
2308
2309Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2310  void f(int x, int y);
2311  f(0, 0);
2312</pre></td></tr>
2313
2314
2315<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>
2316<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2317</pre></td></tr>
2318
2319
2320<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>
2321<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2322zero initialization.
2323
2324Given
2325void foo() {
2326  struct point { double x; double y; };
2327  point pt[2] = { { 1.0, 2.0 } };
2328}
2329initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2330will match the implicit array filler for pt[1].
2331</pre></td></tr>
2332
2333
2334<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>
2335<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2336
2337Given
2338  struct S {
2339    S(); // #1
2340    S(const S &amp;); // #2
2341    S(S &amp;&amp;); // #3
2342  };
2343cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2344</pre></td></tr>
2345
2346
2347<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>
2348<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2349
2350Given
2351  struct S {
2352    S(); // #1
2353    S(const S &amp;); // #2
2354    S(S &amp;&amp;); // #3
2355  };
2356cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2357</pre></td></tr>
2358
2359
2360<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>
2361<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2362
2363Given
2364  struct S {
2365    S(); // #1
2366    S(int) {} // #2
2367    S(S &amp;&amp;) : S() {} // #3
2368  };
2369  S::S() : S(0) {} // #4
2370cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2371#1 or #2.
2372</pre></td></tr>
2373
2374
2375<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>
2376<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2377that have an explicit specifier if this explicit specifier is resolved to
2378true.
2379
2380Given
2381  template&lt;bool b&gt;
2382  struct S {
2383    S(int); // #1
2384    explicit S(double); // #2
2385    operator int(); // #3
2386    explicit operator bool(); // #4
2387    explicit(false) S(bool) // # 7
2388    explicit(true) S(char) // # 8
2389    explicit(b) S(S) // # 9
2390  };
2391  S(int) -&gt; S&lt;true&gt; // #5
2392  explicit S(double) -&gt; S&lt;false&gt; // #6
2393cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2394cxxConversionDecl(isExplicit()) will match #4, but not #3.
2395cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2396</pre></td></tr>
2397
2398
2399<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>
2400<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2401
2402Given
2403  struct S {
2404    S(); // #1
2405    S(const S &amp;); // #2
2406    S(S &amp;&amp;); // #3
2407  };
2408cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2409</pre></td></tr>
2410
2411
2412<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>
2413<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
2414that have an explicit specifier if this explicit specifier is resolved to
2415true.
2416
2417Given
2418  template&lt;bool b&gt;
2419  struct S {
2420    S(int); // #1
2421    explicit S(double); // #2
2422    operator int(); // #3
2423    explicit operator bool(); // #4
2424    explicit(false) S(bool) // # 7
2425    explicit(true) S(char) // # 8
2426    explicit(b) S(S) // # 9
2427  };
2428  S(int) -&gt; S&lt;true&gt; // #5
2429  explicit S(double) -&gt; S&lt;false&gt; // #6
2430cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2431cxxConversionDecl(isExplicit()) will match #4, but not #3.
2432cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2433</pre></td></tr>
2434
2435
2436<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>
2437<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2438opposed to a member.
2439
2440Given
2441  struct B {};
2442  struct D : B {
2443    int I;
2444    D(int i) : I(i) {}
2445  };
2446  struct E : B {
2447    E() : B() {}
2448  };
2449cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2450  will match E(), but not match D(int).
2451</pre></td></tr>
2452
2453
2454<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>
2455<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2456opposed to a base.
2457
2458Given
2459  struct B {};
2460  struct D : B {
2461    int I;
2462    D(int i) : I(i) {}
2463  };
2464  struct E : B {
2465    E() : B() {}
2466  };
2467cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2468  will match D(int), but not match E().
2469</pre></td></tr>
2470
2471
2472<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>
2473<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2474code (as opposed to implicitly added by the compiler).
2475
2476Given
2477  struct Foo {
2478    Foo() { }
2479    Foo(int) : foo_("A") { }
2480    string foo_;
2481  };
2482cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2483  will match Foo(int), but not Foo()
2484</pre></td></tr>
2485
2486
2487<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>
2488<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
2489that have an explicit specifier if this explicit specifier is resolved to
2490true.
2491
2492Given
2493  template&lt;bool b&gt;
2494  struct S {
2495    S(int); // #1
2496    explicit S(double); // #2
2497    operator int(); // #3
2498    explicit operator bool(); // #4
2499    explicit(false) S(bool) // # 7
2500    explicit(true) S(char) // # 8
2501    explicit(b) S(S) // # 9
2502  };
2503  S(int) -&gt; S&lt;true&gt; // #5
2504  explicit S(double) -&gt; S&lt;false&gt; // #6
2505cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2506cxxConversionDecl(isExplicit()) will match #4, but not #3.
2507cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2508</pre></td></tr>
2509
2510
2511<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>
2512<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
2513to '.'.
2514
2515Member calls on the implicit this pointer match as called with '-&gt;'.
2516
2517Given
2518  class Y {
2519    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2520    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
2521    int a;
2522    static int b;
2523  };
2524  template &lt;class T&gt;
2525  class Z {
2526    void x() { this-&gt;m; }
2527  };
2528memberExpr(isArrow())
2529  matches this-&gt;x, x, y.x, a, this-&gt;b
2530cxxDependentScopeMemberExpr(isArrow())
2531  matches this-&gt;m
2532unresolvedMemberExpr(isArrow())
2533  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
2534</pre></td></tr>
2535
2536
2537<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>
2538<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2539
2540Given
2541struct A {
2542  void foo() const;
2543  void bar();
2544};
2545
2546cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2547</pre></td></tr>
2548
2549
2550<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>
2551<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2552operator.
2553
2554Given
2555struct A {
2556  A &amp;operator=(const A &amp;);
2557  A &amp;operator=(A &amp;&amp;);
2558};
2559
2560cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2561the second one.
2562</pre></td></tr>
2563
2564
2565<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>
2566<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2567
2568Given:
2569  class A final {};
2570
2571  struct B {
2572    virtual void f();
2573  };
2574
2575  struct C : B {
2576    void f() final;
2577  };
2578matches A and C::f, but not B, C, or B::f
2579</pre></td></tr>
2580
2581
2582<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>
2583<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2584operator.
2585
2586Given
2587struct A {
2588  A &amp;operator=(const A &amp;);
2589  A &amp;operator=(A &amp;&amp;);
2590};
2591
2592cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2593the first one.
2594</pre></td></tr>
2595
2596
2597<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>
2598<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2599
2600Given
2601  class A {
2602   public:
2603    virtual void x();
2604  };
2605  class B : public A {
2606   public:
2607    virtual void x();
2608  };
2609  matches B::x
2610</pre></td></tr>
2611
2612
2613<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>
2614<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2615
2616Given
2617  class A {
2618   public:
2619    virtual void x() = 0;
2620  };
2621  matches A::x
2622</pre></td></tr>
2623
2624
2625<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>
2626<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2627
2628Given
2629  struct S {
2630    S(); // #1
2631    S(const S &amp;) = default; // #2
2632    S(S &amp;&amp;) = delete; // #3
2633  };
2634cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2635</pre></td></tr>
2636
2637
2638<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>
2639<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2640virtual inheritance.
2641
2642Example:
2643  class A {
2644   public:
2645    virtual void x(); // matches x
2646  };
2647
2648Example:
2649  class Base {};
2650  class DirectlyDerived : virtual Base {}; // matches Base
2651  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2652
2653Usable 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;
2654</pre></td></tr>
2655
2656
2657<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>
2658<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2659
2660Given
2661  class A {
2662   public:
2663    virtual void x();
2664  };
2665  class B : public A {
2666   public:
2667    void x();
2668  };
2669  matches A::x but not B::x
2670</pre></td></tr>
2671
2672
2673<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>
2674<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2675
2676Given:
2677  MyClass *p1 = new MyClass[10];
2678cxxNewExpr(isArray())
2679  matches the expression 'new MyClass[10]'.
2680</pre></td></tr>
2681
2682
2683<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>
2684<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
2685
2686Matches overloaded operator names specified in strings without the
2687"operator" prefix: e.g. "&lt;&lt;".
2688
2689  hasAnyOverloadesOperatorName("+", "-")
2690Is equivalent to
2691  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
2692</pre></td></tr>
2693
2694
2695<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>
2696<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2697
2698Matches overloaded operator names specified in strings without the
2699"operator" prefix: e.g. "&lt;&lt;".
2700
2701Given:
2702  class A { int operator*(); };
2703  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2704  A a;
2705  a &lt;&lt; a;   // &lt;-- This matches
2706
2707cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2708specified line and
2709cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2710matches the declaration of A.
2711
2712Usable 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;
2713</pre></td></tr>
2714
2715
2716<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>
2717<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2718
2719Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2720  if (a == b)
2721    a += b;
2722
2723Example 2: matches s1 = s2
2724           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2725  struct S { S&amp; operator=(const S&amp;); };
2726  void x() { S s1, s2; s1 = s2; }
2727</pre></td></tr>
2728
2729
2730<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>
2731<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
2732
2733Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2734  if (a == b)
2735    a += b;
2736
2737Example 2: matches s1 &lt; s2
2738           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2739  struct S { bool operator&lt;(const S&amp; other); };
2740  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2741</pre></td></tr>
2742
2743
2744<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>
2745<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2746
2747Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2748class x {};
2749class y;
2750</pre></td></tr>
2751
2752
2753<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>
2754<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2755</pre></td></tr>
2756
2757
2758<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>
2759<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
2760</pre></td></tr>
2761
2762
2763<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>
2764<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2765static member variable template instantiations.
2766
2767Given
2768  template&lt;typename T&gt; void A(T t) { }
2769  template&lt;&gt; void A(int N) { }
2770functionDecl(isExplicitTemplateSpecialization())
2771  matches the specialization A&lt;int&gt;().
2772
2773Usable 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;
2774</pre></td></tr>
2775
2776
2777<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>
2778<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2779
2780Given:
2781  class A final {};
2782
2783  struct B {
2784    virtual void f();
2785  };
2786
2787  struct C : B {
2788    void f() final;
2789  };
2790matches A and C::f, but not B, C, or B::f
2791</pre></td></tr>
2792
2793
2794<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>
2795<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2796
2797Given:
2798  auto x = []{};
2799
2800cxxRecordDecl(isLambda()) matches the implicit class declaration of
2801decltype(x)
2802</pre></td></tr>
2803
2804
2805<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>
2806<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
2807isSameOrDerivedFrom(hasName(...)).
2808</pre></td></tr>
2809
2810
2811<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>
2812<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2813member variable template instantiations.
2814
2815Given
2816  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2817or
2818  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2819or
2820  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
2821cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2822  matches the template instantiation of X&lt;A&gt;.
2823
2824But given
2825  template &lt;typename T&gt;  class X {}; class A {};
2826  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2827cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2828  does not match, as X&lt;A&gt; is an explicit template specialization.
2829
2830Usable 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;
2831</pre></td></tr>
2832
2833
2834<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>
2835<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2836a specific number of arguments (including absent default arguments).
2837
2838Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2839  void f(int x, int y);
2840  f(0, 0);
2841</pre></td></tr>
2842
2843
2844<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>
2845<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
2846
2847Example matches y(x) but not y(42) or NS::y(x).
2848  namespace NS {
2849    struct X {};
2850    void y(X);
2851  }
2852
2853  void y(...);
2854
2855  void test() {
2856    NS::X x;
2857    y(x); // Matches
2858    NS::y(x); // Doesn't match
2859    y(42); // Doesn't match
2860    using NS::y;
2861    y(x); // Found by both unqualified lookup and ADL, doesn't match
2862   }
2863</pre></td></tr>
2864
2865
2866<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>
2867<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2868
2869Example: matches the implicit cast around 0
2870(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2871  int *p = 0;
2872
2873If the matcher is use from clang-query, CastKind parameter
2874should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
2875</pre></td></tr>
2876
2877
2878<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>
2879<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2880
2881
2882<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>
2883<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2884
2885Given
2886  f('false, 3.14, 42);
2887characterLiteral(equals(0))
2888  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2889  match false
2890floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2891  match 3.14
2892integerLiteral(equals(42))
2893  matches 42
2894
2895Note that you cannot directly match a negative numeric literal because the
2896minus sign is not part of the literal: It is a unary operator whose operand
2897is the positive numeric literal. Instead, you must use a unaryOperator()
2898matcher to match the minus sign:
2899
2900unaryOperator(hasOperatorName("-"),
2901              hasUnaryOperand(integerLiteral(equals(13))))
2902
2903Usable 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;,
2904           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;
2905</pre></td></tr>
2906
2907
2908<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>
2909<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2910
2911
2912<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>
2913<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2914
2915
2916<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>
2917<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2918
2919Given
2920  template&lt;typename T&gt; struct C {};
2921  C&lt;int&gt; c;
2922classTemplateSpecializationDecl(templateArgumentCountIs(1))
2923  matches C&lt;int&gt;.
2924</pre></td></tr>
2925
2926
2927<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>
2928<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2929child statements.
2930
2931Example: Given
2932  { for (;;) {} }
2933compoundStmt(statementCountIs(0)))
2934  matches '{}'
2935  but does not match the outer compound statement.
2936</pre></td></tr>
2937
2938
2939<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>
2940<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2941
2942Given
2943  int a[42];
2944  int b[2 * 21];
2945  int c[41], d[43];
2946  char *s = "abcd";
2947  wchar_t *ws = L"abcd";
2948  char *w = "a";
2949constantArrayType(hasSize(42))
2950  matches "int a[42]" and "int b[2 * 21]"
2951stringLiteral(hasSize(4))
2952  matches "abcd", L"abcd"
2953</pre></td></tr>
2954
2955
2956<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>
2957<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2958declarations.
2959
2960Example: Given
2961  int a, b;
2962  int c;
2963  int d = 2, e;
2964declCountIs(2)
2965  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2966</pre></td></tr>
2967
2968
2969<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>
2970<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2971
2972Matches a node if it equals the node previously bound to ID.
2973
2974Given
2975  class X { int a; int b; };
2976cxxRecordDecl(
2977    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2978    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2979  matches the class X, as a and b have the same type.
2980
2981Note that when multiple matches are involved via forEach* matchers,
2982equalsBoundNodes acts as a filter.
2983For example:
2984compoundStmt(
2985    forEachDescendant(varDecl().bind("d")),
2986    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2987will trigger a match for each combination of variable declaration
2988and reference to that variable declaration within a compound statement.
2989</pre></td></tr>
2990
2991
2992<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>
2993<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2994
2995Decl has pointer identity in the AST.
2996</pre></td></tr>
2997
2998
2999<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>
3000<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3001
3002Given
3003  __attribute__((device)) void f() { ... }
3004decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3005f. If the matcher is used from clang-query, attr::Kind parameter should be
3006passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3007</pre></td></tr>
3008
3009
3010<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>
3011<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3012partially matching a given regex.
3013
3014Example matches Y but not X
3015    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3016  #include "ASTMatcher.h"
3017  class X {};
3018ASTMatcher.h:
3019  class Y {};
3020
3021Usable 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;
3022
3023If the matcher is used in clang-query, RegexFlags parameter
3024should be passed as a quoted string. e.g: "NoFlags".
3025Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3026</pre></td></tr>
3027
3028
3029<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>
3030<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3031
3032Example matches X but not Y
3033  (matcher = cxxRecordDecl(isExpansionInMainFile())
3034  #include &lt;Y.h&gt;
3035  class X {};
3036Y.h:
3037  class Y {};
3038
3039Usable 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;
3040</pre></td></tr>
3041
3042
3043<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>
3044<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3045
3046Example matches Y but not X
3047    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3048  #include &lt;SystemHeader.h&gt;
3049  class X {};
3050SystemHeader.h:
3051  class Y {};
3052
3053Usable 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;
3054</pre></td></tr>
3055
3056
3057<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>
3058<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3059by the compiler (eg. implicit default/copy constructors).
3060</pre></td></tr>
3061
3062
3063<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>
3064<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3065
3066Given
3067  class vector {};
3068  namespace foo {
3069    class vector {};
3070    namespace std {
3071      class vector {};
3072    }
3073  }
3074  namespace std {
3075    inline namespace __1 {
3076      class vector {}; // #1
3077      namespace experimental {
3078        class vector {};
3079      }
3080    }
3081  }
3082cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3083</pre></td></tr>
3084
3085
3086<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>
3087<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3088template instantiations.
3089
3090Given
3091  template&lt;typename T&gt; void A(T t) { T i; }
3092  A(0);
3093  A(0U);
3094functionDecl(isInstantiated())
3095  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3096</pre></td></tr>
3097
3098
3099<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>
3100<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3101inheritance.
3102
3103Examples:
3104  class C {
3105  public:    int a;
3106  protected: int b;
3107  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3108  };
3109
3110  struct Base {};
3111  struct Derived1 : private Base {}; // matches 'Base'
3112  class Derived2 : Base {}; // matches 'Base'
3113</pre></td></tr>
3114
3115
3116<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>
3117<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3118protected inheritance.
3119
3120Examples:
3121  class C {
3122  public:    int a;
3123  protected: int b; // fieldDecl(isProtected()) matches 'b'
3124  private:   int c;
3125  };
3126
3127  class Base {};
3128  class Derived : protected Base {}; // matches 'Base'
3129</pre></td></tr>
3130
3131
3132<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>
3133<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3134inheritance.
3135
3136Examples:
3137  class C {
3138  public:    int a; // fieldDecl(isPublic()) matches 'a'
3139  protected: int b;
3140  private:   int c;
3141  };
3142
3143  class Base {};
3144  class Derived1 : public Base {}; // matches 'Base'
3145  struct Derived2 : Base {}; // matches 'Base'
3146</pre></td></tr>
3147
3148
3149<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>
3150<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3151a specific number of designators.
3152
3153Example: Given
3154  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3155  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3156designatorCountIs(2)
3157  matches '{ [2].y = 1.0, [0].x = 1.0 }',
3158  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3159</pre></td></tr>
3160
3161
3162<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>
3163<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3164
3165Example matches Y (matcher = enumDecl(isScoped()))
3166enum X {};
3167enum class Y {};
3168</pre></td></tr>
3169
3170
3171<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>
3172<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3173neither type- nor value-dependent.
3174
3175In the following example, the expression sizeof(sizeof(T() + T()))
3176is instantiation-dependent (since it involves a template parameter T),
3177but is neither type- nor value-dependent, since the type of the inner
3178sizeof is known (std::size_t) and therefore the size of the outer
3179sizeof is known.
3180  template&lt;typename T&gt;
3181  void f(T x, T y) { sizeof(sizeof(T() + T()); }
3182expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3183</pre></td></tr>
3184
3185
3186<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>
3187<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3188is not yet instantiated.
3189
3190For example, the expressions "x" and "x + y" are type-dependent in
3191the following code, but "y" is not type-dependent:
3192  template&lt;typename T&gt;
3193  void add(T x, int y) {
3194    x + y;
3195  }
3196expr(isTypeDependent()) matches x + y
3197</pre></td></tr>
3198
3199
3200<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>
3201<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3202non-type template parameter.
3203
3204For example, the array bound of "Chars" in the following example is
3205value-dependent.
3206  template&lt;int Size&gt; int f() { return Size; }
3207expr(isValueDependent()) matches return Size
3208</pre></td></tr>
3209
3210
3211<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>
3212<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3213GNU's __null, C++11's nullptr, or C's NULL macro.
3214
3215Given:
3216  void *v1 = NULL;
3217  void *v2 = nullptr;
3218  void *v3 = __null; // GNU extension
3219  char *cp = (char *)0;
3220  int *ip = 0;
3221  int i = 0;
3222expr(nullPointerConstant())
3223  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3224  initializer for i.
3225</pre></td></tr>
3226
3227
3228<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>
3229<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3230bit width.
3231
3232Given
3233  class C {
3234    int a : 2;
3235    int b : 4;
3236    int c : 2;
3237  };
3238fieldDecl(hasBitWidth(2))
3239  matches 'int a;' and 'int c;' but not 'int b;'.
3240</pre></td></tr>
3241
3242
3243<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>
3244<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3245
3246Given
3247  class C {
3248    int a : 2;
3249    int b;
3250  };
3251fieldDecl(isBitField())
3252  matches 'int a;' but not 'int b;'.
3253</pre></td></tr>
3254
3255
3256<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>
3257<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
3258
3259Given
3260  f('false, 3.14, 42);
3261characterLiteral(equals(0))
3262  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3263  match false
3264floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3265  match 3.14
3266integerLiteral(equals(42))
3267  matches 42
3268
3269Note that you cannot directly match a negative numeric literal because the
3270minus sign is not part of the literal: It is a unary operator whose operand
3271is the positive numeric literal. Instead, you must use a unaryOperator()
3272matcher to match the minus sign:
3273
3274unaryOperator(hasOperatorName("-"),
3275              hasUnaryOperand(integerLiteral(equals(13))))
3276
3277Usable 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;,
3278           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;
3279</pre></td></tr>
3280
3281
3282<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>
3283<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3284
3285
3286<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>
3287<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
3288
3289Matches overloaded operator names specified in strings without the
3290"operator" prefix: e.g. "&lt;&lt;".
3291
3292  hasAnyOverloadesOperatorName("+", "-")
3293Is equivalent to
3294  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3295</pre></td></tr>
3296
3297
3298<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>
3299<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3300
3301Given:
3302  void f();
3303  void g() noexcept;
3304  void h() noexcept(true);
3305  void i() noexcept(false);
3306  void j() throw();
3307  void k() throw(int);
3308  void l() throw(...);
3309functionDecl(hasDynamicExceptionSpec()) and
3310  functionProtoType(hasDynamicExceptionSpec())
3311  match the declarations of j, k, and l, but not f, g, h, or i.
3312</pre></td></tr>
3313
3314
3315<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>
3316<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3317
3318Matches overloaded operator names specified in strings without the
3319"operator" prefix: e.g. "&lt;&lt;".
3320
3321Given:
3322  class A { int operator*(); };
3323  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3324  A a;
3325  a &lt;&lt; a;   // &lt;-- This matches
3326
3327cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3328specified line and
3329cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3330matches the declaration of A.
3331
3332Usable 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;
3333</pre></td></tr>
3334
3335
3336<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>
3337<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3338
3339Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3340int X() {}
3341auto Y() -&gt; int {}
3342</pre></td></tr>
3343
3344
3345<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>
3346<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3347       and if constexpr.
3348
3349Given:
3350  constexpr int foo = 42;
3351  constexpr int bar();
3352  void baz() { if constexpr(1 &gt; 0) {} }
3353varDecl(isConstexpr())
3354  matches the declaration of foo.
3355functionDecl(isConstexpr())
3356  matches the declaration of bar.
3357ifStmt(isConstexpr())
3358  matches the if statement in baz.
3359</pre></td></tr>
3360
3361
3362<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>
3363<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3364
3365Given:
3366  class A { ~A(); };
3367  class B { ~B() = default; };
3368functionDecl(isDefaulted())
3369  matches the declaration of ~B, but not ~A.
3370</pre></td></tr>
3371
3372
3373<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>
3374<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
3375
3376Example matches A, va, fa
3377  class A {};
3378  class B;  // Doesn't match, as it has no body.
3379  int va;
3380  extern int vb;  // Doesn't match, as it doesn't define the variable.
3381  void fa() {}
3382  void fb();  // Doesn't match, as it has no body.
3383  @interface X
3384  - (void)ma; // Doesn't match, interface is declaration.
3385  @end
3386  @implementation X
3387  - (void)ma {}
3388  @end
3389
3390Usable 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;,
3391  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3392</pre></td></tr>
3393
3394
3395<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>
3396<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3397
3398Given:
3399  void Func();
3400  void DeletedFunc() = delete;
3401functionDecl(isDeleted())
3402  matches the declaration of DeletedFunc, but not Func.
3403</pre></td></tr>
3404
3405
3406<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>
3407<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3408static member variable template instantiations.
3409
3410Given
3411  template&lt;typename T&gt; void A(T t) { }
3412  template&lt;&gt; void A(int N) { }
3413functionDecl(isExplicitTemplateSpecialization())
3414  matches the specialization A&lt;int&gt;().
3415
3416Usable 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;
3417</pre></td></tr>
3418
3419
3420<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>
3421<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
3422
3423Given:
3424  extern "C" void f() {}
3425  extern "C" { void g() {} }
3426  void h() {}
3427  extern "C" int x = 1;
3428  extern "C" int y = 2;
3429  int z = 3;
3430functionDecl(isExternC())
3431  matches the declaration of f and g, but not the declaration of h.
3432varDecl(isExternC())
3433  matches the declaration of x and y, but not the declaration of z.
3434</pre></td></tr>
3435
3436
3437<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>
3438<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3439the inline keyword.
3440
3441Given
3442  inline void f();
3443  void g();
3444  namespace n {
3445  inline namespace m {}
3446  }
3447functionDecl(isInline()) will match ::f().
3448namespaceDecl(isInline()) will match n::m.
3449</pre></td></tr>
3450
3451
3452<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>
3453<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3454into an executable program.
3455</pre></td></tr>
3456
3457
3458<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>
3459<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3460
3461Given
3462  void nope();
3463  [[noreturn]] void a();
3464  __attribute__((noreturn)) void b();
3465  struct c { [[noreturn]] c(); };
3466functionDecl(isNoReturn())
3467  matches all of those except
3468  void nope();
3469</pre></td></tr>
3470
3471
3472<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>
3473<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3474
3475Given:
3476  void f();
3477  void g() noexcept;
3478  void h() throw();
3479  void i() throw(int);
3480  void j() noexcept(false);
3481functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3482  match the declarations of g, and h, but not f, i or j.
3483</pre></td></tr>
3484
3485
3486<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>
3487<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
3488class specifier ("static" keyword) written in the source.
3489
3490Given:
3491  static void f() {}
3492  static int i = 0;
3493  extern int j;
3494  int k;
3495functionDecl(isStaticStorageClass())
3496  matches the function declaration f.
3497varDecl(isStaticStorageClass())
3498  matches the variable declaration i.
3499</pre></td></tr>
3500
3501
3502<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>
3503<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3504member variable template instantiations.
3505
3506Given
3507  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3508or
3509  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3510or
3511  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3512cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3513  matches the template instantiation of X&lt;A&gt;.
3514
3515But given
3516  template &lt;typename T&gt;  class X {}; class A {};
3517  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3518cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3519  does not match, as X&lt;A&gt; is an explicit template specialization.
3520
3521Usable 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;
3522</pre></td></tr>
3523
3524
3525<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>
3526<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3527
3528Example matches f, but not g or h. The function i will not match, even when
3529compiled in C mode.
3530  void f(...);
3531  void g(int);
3532  template &lt;typename... Ts&gt; void h(Ts...);
3533  void i();
3534</pre></td></tr>
3535
3536
3537<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>
3538<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3539specific parameter count.
3540
3541Given
3542  void f(int i) {}
3543  void g(int i, int j) {}
3544  void h(int i, int j);
3545  void j(int i);
3546  void k(int x, int y, int z, ...);
3547functionDecl(parameterCountIs(2))
3548  matches g and h
3549functionProtoType(parameterCountIs(2))
3550  matches g and h
3551functionProtoType(parameterCountIs(3))
3552  matches k
3553</pre></td></tr>
3554
3555
3556<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>
3557<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3558
3559Given:
3560  void f();
3561  void g() noexcept;
3562  void h() noexcept(true);
3563  void i() noexcept(false);
3564  void j() throw();
3565  void k() throw(int);
3566  void l() throw(...);
3567functionDecl(hasDynamicExceptionSpec()) and
3568  functionProtoType(hasDynamicExceptionSpec())
3569  match the declarations of j, k, and l, but not f, g, h, or i.
3570</pre></td></tr>
3571
3572
3573<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>
3574<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3575
3576Given:
3577  void f();
3578  void g() noexcept;
3579  void h() throw();
3580  void i() throw(int);
3581  void j() noexcept(false);
3582functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3583  match the declarations of g, and h, but not f, i or j.
3584</pre></td></tr>
3585
3586
3587<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>
3588<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3589specific parameter count.
3590
3591Given
3592  void f(int i) {}
3593  void g(int i, int j) {}
3594  void h(int i, int j);
3595  void j(int i);
3596  void k(int x, int y, int z, ...);
3597functionDecl(parameterCountIs(2))
3598  matches g and h
3599functionProtoType(parameterCountIs(2))
3600  matches g and h
3601functionProtoType(parameterCountIs(3))
3602  matches k
3603</pre></td></tr>
3604
3605
3606<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>
3607<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3608       and if constexpr.
3609
3610Given:
3611  constexpr int foo = 42;
3612  constexpr int bar();
3613  void baz() { if constexpr(1 &gt; 0) {} }
3614varDecl(isConstexpr())
3615  matches the declaration of foo.
3616functionDecl(isConstexpr())
3617  matches the declaration of bar.
3618ifStmt(isConstexpr())
3619  matches the if statement in baz.
3620</pre></td></tr>
3621
3622
3623<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>
3624<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3625
3626
3627<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>
3628<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3629
3630Given
3631  f('false, 3.14, 42);
3632characterLiteral(equals(0))
3633  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3634  match false
3635floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3636  match 3.14
3637integerLiteral(equals(42))
3638  matches 42
3639
3640Note that you cannot directly match a negative numeric literal because the
3641minus sign is not part of the literal: It is a unary operator whose operand
3642is the positive numeric literal. Instead, you must use a unaryOperator()
3643matcher to match the minus sign:
3644
3645unaryOperator(hasOperatorName("-"),
3646              hasUnaryOperand(integerLiteral(equals(13))))
3647
3648Usable 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;,
3649           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;
3650</pre></td></tr>
3651
3652
3653<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>
3654<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3655
3656
3657<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>
3658<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3659
3660
3661<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>
3662<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3663to '.'.
3664
3665Member calls on the implicit this pointer match as called with '-&gt;'.
3666
3667Given
3668  class Y {
3669    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3670    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3671    int a;
3672    static int b;
3673  };
3674  template &lt;class T&gt;
3675  class Z {
3676    void x() { this-&gt;m; }
3677  };
3678memberExpr(isArrow())
3679  matches this-&gt;x, x, y.x, a, this-&gt;b
3680cxxDependentScopeMemberExpr(isArrow())
3681  matches this-&gt;m
3682unresolvedMemberExpr(isArrow())
3683  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3684</pre></td></tr>
3685
3686
3687<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>
3688<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3689
3690This matcher is only provided as a performance optimization of hasName.
3691    hasAnyName(a, b, c)
3692 is equivalent to, but faster than
3693    anyOf(hasName(a), hasName(b), hasName(c))
3694</pre></td></tr>
3695
3696
3697<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>
3698<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3699
3700Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3701void f() {
3702  int x;
3703  static int y;
3704}
3705int z;
3706
3707Example matches f() because it has external formal linkage despite being
3708unique to the translation unit as though it has internal likage
3709(matcher = functionDecl(hasExternalFormalLinkage()))
3710
3711namespace {
3712void f() {}
3713}
3714</pre></td></tr>
3715
3716
3717<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>
3718<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3719
3720Supports specifying enclosing namespaces or classes by prefixing the name
3721with '&lt;enclosing&gt;::'.
3722Does not match typedefs of an underlying type with the given name.
3723
3724Example matches X (Name == "X")
3725  class X;
3726
3727Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3728  namespace a { namespace b { class X; } }
3729</pre></td></tr>
3730
3731
3732<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>
3733<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3734a substring matched by the given RegExp.
3735
3736Supports specifying enclosing namespaces or classes by
3737prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3738of an underlying type with the given name.
3739
3740Example matches X (regexp == "::X")
3741  class X;
3742
3743Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3744  namespace foo { namespace bar { class X; } }
3745
3746If the matcher is used in clang-query, RegexFlags parameter
3747should be passed as a quoted string. e.g: "NoFlags".
3748Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3749</pre></td></tr>
3750
3751
3752<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>
3753<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3754
3755Given
3756  namespace n {
3757  namespace {} // #1
3758  }
3759namespaceDecl(isAnonymous()) will match #1 but not ::n.
3760</pre></td></tr>
3761
3762
3763<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>
3764<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3765the inline keyword.
3766
3767Given
3768  inline void f();
3769  void g();
3770  namespace n {
3771  inline namespace m {}
3772  }
3773functionDecl(isInline()) will match ::f().
3774namespaceDecl(isInline()) will match n::m.
3775</pre></td></tr>
3776
3777
3778<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>
3779<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3780
3781Given
3782
3783  #pragma omp parallel
3784  #pragma omp parallel default(none)
3785  #pragma omp parallel default(shared)
3786
3787``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3788</pre></td></tr>
3789
3790
3791<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>
3792<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3793
3794Given
3795
3796  #pragma omp parallel
3797  #pragma omp parallel default(none)
3798  #pragma omp parallel default(shared)
3799
3800``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3801</pre></td></tr>
3802
3803
3804<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>
3805<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3806clause kind.
3807
3808Given
3809
3810  #pragma omp parallel
3811  #pragma omp parallel for
3812  #pragma omp          for
3813
3814`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3815``omp parallel`` and ``omp parallel for``.
3816
3817If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3818should be passed as a quoted string. e.g.,
3819``isAllowedToContainClauseKind("OMPC_default").``
3820</pre></td></tr>
3821
3822
3823<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>
3824<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3825i.e., directives that can't have a structured block.
3826
3827Given
3828
3829  #pragma omp parallel
3830  {}
3831  #pragma omp taskyield
3832
3833``ompExecutableDirective(isStandaloneDirective()))`` matches
3834``omp taskyield``.
3835</pre></td></tr>
3836
3837
3838<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>
3839<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3840</pre></td></tr>
3841
3842
3843<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>
3844<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3845</pre></td></tr>
3846
3847
3848<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>
3849<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
3850isSameOrDerivedFrom(hasName(...)).
3851</pre></td></tr>
3852
3853
3854<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3855<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3856a specific number of arguments (including absent default arguments).
3857
3858Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3859  void f(int x, int y);
3860  f(0, 0);
3861</pre></td></tr>
3862
3863
3864<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>
3865<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
3866Selector.getAsString()
3867
3868 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
3869 matches both of the expressions below:
3870    [myObj methodA:argA];
3871    [myObj methodB:argB];
3872</pre></td></tr>
3873
3874
3875<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>
3876<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3877
3878objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3879message expression in
3880
3881  UIWebView *webView = ...;
3882  CGRect bodyFrame = webView.frame;
3883  bodyFrame.size.height = self.bodyContentHeight;
3884  webView.frame = bodyFrame;
3885  //     ^---- matches here
3886</pre></td></tr>
3887
3888
3889<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>
3890<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3891
3892Matches only when the selector of the objCMessageExpr is NULL. This may
3893represent an error condition in the tree!
3894</pre></td></tr>
3895
3896
3897<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>
3898<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3899
3900 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3901 matches the outer message expr in the code below, but NOT the message
3902 invocation for self.bodyView.
3903    [self.bodyView loadHTMLString:html baseURL:NULL];
3904</pre></td></tr>
3905
3906
3907<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>
3908<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3909
3910 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3911 matches self.bodyView in the code below, but NOT the outer message
3912 invocation of "loadHTMLString:baseURL:".
3913    [self.bodyView loadHTMLString:html baseURL:NULL];
3914</pre></td></tr>
3915
3916
3917<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>
3918<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3919
3920Example
3921matcher = objcMessageExpr(isClassMessage())
3922matches
3923  [NSString stringWithFormat:@"format"];
3924but not
3925  NSString *x = @"hello";
3926  [x containsString:@"h"];
3927</pre></td></tr>
3928
3929
3930<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>
3931<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3932
3933Example
3934matcher = objcMessageExpr(isInstanceMessage())
3935matches
3936  NSString *x = @"hello";
3937  [x containsString:@"h"];
3938but not
3939  [NSString stringWithFormat:@"format"];
3940</pre></td></tr>
3941
3942
3943<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>
3944<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3945a substring matched by the given RegExp.
3946 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3947 invocation for self.bodyView.
3948    [self.bodyView loadHTMLString:html baseURL:NULL];
3949
3950If the matcher is used in clang-query, RegexFlags parameter
3951should be passed as a quoted string. e.g: "NoFlags".
3952Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3953</pre></td></tr>
3954
3955
3956<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>
3957<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3958
3959 matcher = objCMessageExpr(numSelectorArgs(0));
3960 matches self.bodyView in the code below
3961
3962 matcher = objCMessageExpr(numSelectorArgs(2));
3963 matches the invocation of "loadHTMLString:baseURL:" but not that
3964 of self.bodyView
3965    [self.bodyView loadHTMLString:html baseURL:NULL];
3966</pre></td></tr>
3967
3968
3969<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>
3970<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
3971
3972Example
3973matcher = objcMethodDecl(isClassMethod())
3974matches
3975@interface I + (void)foo; @end
3976but not
3977@interface I - (void)bar; @end
3978</pre></td></tr>
3979
3980
3981<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>
3982<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3983
3984Example matches A, va, fa
3985  class A {};
3986  class B;  // Doesn't match, as it has no body.
3987  int va;
3988  extern int vb;  // Doesn't match, as it doesn't define the variable.
3989  void fa() {}
3990  void fb();  // Doesn't match, as it has no body.
3991  @interface X
3992  - (void)ma; // Doesn't match, interface is declaration.
3993  @end
3994  @implementation X
3995  - (void)ma {}
3996  @end
3997
3998Usable 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;,
3999  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4000</pre></td></tr>
4001
4002
4003<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>
4004<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4005
4006Example
4007matcher = objcMethodDecl(isInstanceMethod())
4008matches
4009@interface I - (void)bar; @end
4010but not
4011@interface I + (void)foo; @end
4012</pre></td></tr>
4013
4014
4015<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>
4016<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4017
4018Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4019void x(int val) {}
4020void y(int val = 0) {}
4021
4022Deprecated. Use hasInitializer() instead to be able to
4023match on the contents of the default argument.  For example:
4024
4025void x(int val = 7) {}
4026void y(int val = 42) {}
4027parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4028  matches the parameter of y
4029
4030A matcher such as
4031  parmVarDecl(hasInitializer(anything()))
4032is equivalent to parmVarDecl(hasDefaultArgument()).
4033</pre></td></tr>
4034
4035
4036<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>
4037<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4038list. The parameter list could be that of either a block, function, or
4039objc-method.
4040
4041
4042Given
4043
4044void f(int a, int b, int c) {
4045}
4046
4047``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4048
4049``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4050</pre></td></tr>
4051
4052
4053<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>
4054<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4055
4056Given
4057  class Y { public: void x(); };
4058  void z() { Y* y; y-&gt;x(); }
4059cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4060  matches y-&gt;x()
4061</pre></td></tr>
4062
4063
4064<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>
4065<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4066
4067Matches a node if it equals the node previously bound to ID.
4068
4069Given
4070  class X { int a; int b; };
4071cxxRecordDecl(
4072    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4073    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4074  matches the class X, as a and b have the same type.
4075
4076Note that when multiple matches are involved via forEach* matchers,
4077equalsBoundNodes acts as a filter.
4078For example:
4079compoundStmt(
4080    forEachDescendant(varDecl().bind("d")),
4081    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4082will trigger a match for each combination of variable declaration
4083and reference to that variable declaration within a compound statement.
4084</pre></td></tr>
4085
4086
4087<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>
4088<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4089the node, not hidden within a typedef.
4090
4091Given
4092  typedef const int const_int;
4093  const_int i;
4094  int *const j;
4095  int *volatile k;
4096  int m;
4097varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4098i is const-qualified but the qualifier is not local.
4099</pre></td></tr>
4100
4101
4102<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>
4103<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4104
4105Given
4106  void a(char);
4107  void b(wchar_t);
4108  void c(double);
4109functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4110matches "a(char)", "b(wchar_t)", but not "c(double)".
4111</pre></td></tr>
4112
4113
4114<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>
4115<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4116the Objective-C object pointer type, which is different despite being
4117syntactically similar.
4118
4119Given
4120  int *i = nullptr;
4121
4122  @interface Foo
4123  @end
4124  Foo *f;
4125
4126  int j;
4127varDecl(hasType(isAnyPointer()))
4128  matches "int *i" and "Foo *f", but not "int j".
4129</pre></td></tr>
4130
4131
4132<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>
4133<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4134include "top-level" const.
4135
4136Given
4137  void a(int);
4138  void b(int const);
4139  void c(const int);
4140  void d(const int*);
4141  void e(int const) {};
4142functionDecl(hasAnyParameter(hasType(isConstQualified())))
4143  matches "void b(int const)", "void c(const int)" and
4144  "void e(int const) {}". It does not match d as there
4145  is no top-level const on the parameter type "const int *".
4146</pre></td></tr>
4147
4148
4149<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>
4150<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4151
4152Given
4153  void a(int);
4154  void b(long);
4155  void c(double);
4156functionDecl(hasAnyParameter(hasType(isInteger())))
4157matches "a(int)", "b(long)", but not "c(double)".
4158</pre></td></tr>
4159
4160
4161<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>
4162<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4163
4164Given
4165  void a(int);
4166  void b(unsigned long);
4167  void c(double);
4168functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4169matches "a(int)", but not "b(unsigned long)" and "c(double)".
4170</pre></td></tr>
4171
4172
4173<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>
4174<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4175
4176Given
4177  void a(int);
4178  void b(unsigned long);
4179  void c(double);
4180functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4181matches "b(unsigned long)", but not "a(int)" and "c(double)".
4182</pre></td></tr>
4183
4184
4185<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>
4186<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4187include "top-level" volatile.
4188
4189Given
4190  void a(int);
4191  void b(int volatile);
4192  void c(volatile int);
4193  void d(volatile int*);
4194  void e(int volatile) {};
4195functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4196  matches "void b(int volatile)", "void c(volatile int)" and
4197  "void e(int volatile) {}". It does not match d as there
4198  is no top-level volatile on the parameter type "volatile int *".
4199</pre></td></tr>
4200
4201
4202<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>
4203<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4204
4205Matches a node if it equals the node previously bound to ID.
4206
4207Given
4208  class X { int a; int b; };
4209cxxRecordDecl(
4210    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4211    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4212  matches the class X, as a and b have the same type.
4213
4214Note that when multiple matches are involved via forEach* matchers,
4215equalsBoundNodes acts as a filter.
4216For example:
4217compoundStmt(
4218    forEachDescendant(varDecl().bind("d")),
4219    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4220will trigger a match for each combination of variable declaration
4221and reference to that variable declaration within a compound statement.
4222</pre></td></tr>
4223
4224
4225<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>
4226<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
4227
4228Stmt has pointer identity in the AST.
4229</pre></td></tr>
4230
4231
4232<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>llvm::StringRef MacroName</td></tr>
4233<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
4234Does not match if only part of the statement is expanded from that macro or
4235if different parts of the the statement are expanded from different
4236appearances of the macro.
4237
4238FIXME: Change to be a polymorphic matcher that works on any syntactic
4239node. There's nothing `Stmt`-specific about it.
4240</pre></td></tr>
4241
4242
4243<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>
4244<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
4245partially matching a given regex.
4246
4247Example matches Y but not X
4248    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4249  #include "ASTMatcher.h"
4250  class X {};
4251ASTMatcher.h:
4252  class Y {};
4253
4254Usable 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;
4255
4256If the matcher is used in clang-query, RegexFlags parameter
4257should be passed as a quoted string. e.g: "NoFlags".
4258Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4259</pre></td></tr>
4260
4261
4262<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>
4263<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
4264
4265Example matches X but not Y
4266  (matcher = cxxRecordDecl(isExpansionInMainFile())
4267  #include &lt;Y.h&gt;
4268  class X {};
4269Y.h:
4270  class Y {};
4271
4272Usable 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;
4273</pre></td></tr>
4274
4275
4276<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>
4277<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
4278
4279Example matches Y but not X
4280    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4281  #include &lt;SystemHeader.h&gt;
4282  class X {};
4283SystemHeader.h:
4284  class Y {};
4285
4286Usable 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;
4287</pre></td></tr>
4288
4289
4290<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>
4291<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4292
4293Given
4294  int j;
4295  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4296  A(0);
4297  A(0U);
4298declStmt(isInTemplateInstantiation())
4299  matches 'int i;' and 'unsigned i'.
4300unless(stmt(isInTemplateInstantiation()))
4301  will NOT match j += 42; as it's shared between the template definition and
4302  instantiation.
4303</pre></td></tr>
4304
4305
4306<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>
4307<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4308
4309Given
4310  int a[42];
4311  int b[2 * 21];
4312  int c[41], d[43];
4313  char *s = "abcd";
4314  wchar_t *ws = L"abcd";
4315  char *w = "a";
4316constantArrayType(hasSize(42))
4317  matches "int a[42]" and "int b[2 * 21]"
4318stringLiteral(hasSize(4))
4319  matches "abcd", L"abcd"
4320</pre></td></tr>
4321
4322
4323<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>
4324<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
4325
4326Example matches C, but not S, U or E.
4327  struct S {};
4328  class C {};
4329  union U {};
4330  enum E {};
4331</pre></td></tr>
4332
4333
4334<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>
4335<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4336
4337Example matches A, va, fa
4338  class A {};
4339  class B;  // Doesn't match, as it has no body.
4340  int va;
4341  extern int vb;  // Doesn't match, as it doesn't define the variable.
4342  void fa() {}
4343  void fb();  // Doesn't match, as it has no body.
4344  @interface X
4345  - (void)ma; // Doesn't match, interface is declaration.
4346  @end
4347  @implementation X
4348  - (void)ma {}
4349  @end
4350
4351Usable 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;,
4352  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4353</pre></td></tr>
4354
4355
4356<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>
4357<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
4358
4359Example matches E, but not C, S or U.
4360  struct S {};
4361  class C {};
4362  union U {};
4363  enum E {};
4364</pre></td></tr>
4365
4366
4367<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>
4368<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
4369
4370Example matches S, but not C, U or E.
4371  struct S {};
4372  class C {};
4373  union U {};
4374  enum E {};
4375</pre></td></tr>
4376
4377
4378<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>
4379<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
4380
4381Example matches U, but not C, S or E.
4382  struct S {};
4383  class C {};
4384  union U {};
4385  enum E {};
4386</pre></td></tr>
4387
4388
4389<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>
4390<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4391
4392Note that 'Value' is a string as the template argument's value is
4393an arbitrary precision integer. 'Value' must be euqal to the canonical
4394representation of that integral value in base 10.
4395
4396Given
4397  template&lt;int T&gt; struct C {};
4398  C&lt;42&gt; c;
4399classTemplateSpecializationDecl(
4400  hasAnyTemplateArgument(equalsIntegralValue("42")))
4401  matches the implicit instantiation of C in C&lt;42&gt;.
4402</pre></td></tr>
4403
4404
4405<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>
4406<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4407
4408Given
4409  template&lt;int T&gt; struct C {};
4410  C&lt;42&gt; c;
4411classTemplateSpecializationDecl(
4412  hasAnyTemplateArgument(isIntegral()))
4413  matches the implicit instantiation of C in C&lt;42&gt;
4414  with isIntegral() matching 42.
4415</pre></td></tr>
4416
4417
4418<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>
4419<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4420
4421Given
4422  template&lt;typename T&gt; struct C {};
4423  C&lt;int&gt; c;
4424classTemplateSpecializationDecl(templateArgumentCountIs(1))
4425  matches C&lt;int&gt;.
4426</pre></td></tr>
4427
4428
4429<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>
4430<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4431partially matching a given regex.
4432
4433Example matches Y but not X
4434    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4435  #include "ASTMatcher.h"
4436  class X {};
4437ASTMatcher.h:
4438  class Y {};
4439
4440Usable 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;
4441
4442If the matcher is used in clang-query, RegexFlags parameter
4443should be passed as a quoted string. e.g: "NoFlags".
4444Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4445</pre></td></tr>
4446
4447
4448<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>
4449<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4450
4451Example matches X but not Y
4452  (matcher = cxxRecordDecl(isExpansionInMainFile())
4453  #include &lt;Y.h&gt;
4454  class X {};
4455Y.h:
4456  class Y {};
4457
4458Usable 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;
4459</pre></td></tr>
4460
4461
4462<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>
4463<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4464
4465Example matches Y but not X
4466    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4467  #include &lt;SystemHeader.h&gt;
4468  class X {};
4469SystemHeader.h:
4470  class Y {};
4471
4472Usable 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;
4473</pre></td></tr>
4474
4475
4476<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>
4477<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4478
4479Given
4480 struct S { bool func(); };
4481functionDecl(returns(booleanType()))
4482  matches "bool func();"
4483</pre></td></tr>
4484
4485
4486<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>
4487<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4488
4489Matches a node if it equals the node previously bound to ID.
4490
4491Given
4492  class X { int a; int b; };
4493cxxRecordDecl(
4494    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4495    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4496  matches the class X, as a and b have the same type.
4497
4498Note that when multiple matches are involved via forEach* matchers,
4499equalsBoundNodes acts as a filter.
4500For example:
4501compoundStmt(
4502    forEachDescendant(varDecl().bind("d")),
4503    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4504will trigger a match for each combination of variable declaration
4505and reference to that variable declaration within a compound statement.
4506</pre></td></tr>
4507
4508
4509<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>
4510<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4511
4512Type has pointer identity in the AST.
4513</pre></td></tr>
4514
4515
4516<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>
4517<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4518
4519Given
4520  int i;
4521  float f;
4522realFloatingPointType()
4523  matches "float f" but not "int i"
4524</pre></td></tr>
4525
4526
4527<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>
4528<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4529
4530Given
4531 struct S { void func(); };
4532functionDecl(returns(voidType()))
4533  matches "void func();"
4534</pre></td></tr>
4535
4536
4537<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>
4538<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4539
4540Given
4541  int x;
4542  int s = sizeof(x) + alignof(x)
4543unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4544  matches sizeof(x)
4545
4546If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4547should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4548</pre></td></tr>
4549
4550
4551<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName1')"><a name="hasAnyOperatorName1Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
4552<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
4553specified names.
4554
4555   hasAnyOperatorName("+", "-")
4556 Is equivalent to
4557   anyOf(hasOperatorName("+"), hasOperatorName("-"))
4558</pre></td></tr>
4559
4560
4561<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName1')"><a name="hasOperatorName1Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
4562<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4563unary).
4564
4565Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4566  !(a || b)
4567</pre></td></tr>
4568
4569
4570<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>
4571<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4572to '.'.
4573
4574Member calls on the implicit this pointer match as called with '-&gt;'.
4575
4576Given
4577  class Y {
4578    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4579    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4580    int a;
4581    static int b;
4582  };
4583  template &lt;class T&gt;
4584  class Z {
4585    void x() { this-&gt;m; }
4586  };
4587memberExpr(isArrow())
4588  matches this-&gt;x, x, y.x, a, this-&gt;b
4589cxxDependentScopeMemberExpr(isArrow())
4590  matches this-&gt;m
4591unresolvedMemberExpr(isArrow())
4592  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4593</pre></td></tr>
4594
4595
4596<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>
4597<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4598
4599Example matches x, but not y, z, or a.
4600(matcher = varDecl(hasAutomaticStorageDuration())
4601void f() {
4602  int x;
4603  static int y;
4604  thread_local int z;
4605}
4606int a;
4607</pre></td></tr>
4608
4609
4610<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>
4611<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4612
4613Example matches y and z (matcher = varDecl(hasGlobalStorage())
4614void f() {
4615  int x;
4616  static int y;
4617}
4618int z;
4619</pre></td></tr>
4620
4621
4622<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>
4623<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4624non-static local variable.
4625
4626Example matches x (matcher = varDecl(hasLocalStorage())
4627void f() {
4628  int x;
4629  static int y;
4630}
4631int z;
4632</pre></td></tr>
4633
4634
4635<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>
4636<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4637It includes the variable declared at namespace scope and those declared
4638with "static" and "extern" storage class specifiers.
4639
4640void f() {
4641  int x;
4642  static int y;
4643  thread_local int z;
4644}
4645int a;
4646static int b;
4647extern int c;
4648varDecl(hasStaticStorageDuration())
4649  matches the function declaration y, a, b and c.
4650</pre></td></tr>
4651
4652
4653<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>
4654<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4655
4656Example matches z, but not x, z, or a.
4657(matcher = varDecl(hasThreadStorageDuration())
4658void f() {
4659  int x;
4660  static int y;
4661  thread_local int z;
4662}
4663int a;
4664</pre></td></tr>
4665
4666
4667<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>
4668<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4669       and if constexpr.
4670
4671Given:
4672  constexpr int foo = 42;
4673  constexpr int bar();
4674  void baz() { if constexpr(1 &gt; 0) {} }
4675varDecl(isConstexpr())
4676  matches the declaration of foo.
4677functionDecl(isConstexpr())
4678  matches the declaration of bar.
4679ifStmt(isConstexpr())
4680  matches the if statement in baz.
4681</pre></td></tr>
4682
4683
4684<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>
4685<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4686
4687Example matches A, va, fa
4688  class A {};
4689  class B;  // Doesn't match, as it has no body.
4690  int va;
4691  extern int vb;  // Doesn't match, as it doesn't define the variable.
4692  void fa() {}
4693  void fb();  // Doesn't match, as it has no body.
4694  @interface X
4695  - (void)ma; // Doesn't match, interface is declaration.
4696  @end
4697  @implementation X
4698  - (void)ma {}
4699  @end
4700
4701Usable 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;,
4702  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4703</pre></td></tr>
4704
4705
4706<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>
4707<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4708a C++ catch block, or an Objective-C statement.
4709
4710Example matches x (matcher = varDecl(isExceptionVariable())
4711void f(int y) {
4712  try {
4713  } catch (int x) {
4714  }
4715}
4716</pre></td></tr>
4717
4718
4719<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>
4720<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4721static member variable template instantiations.
4722
4723Given
4724  template&lt;typename T&gt; void A(T t) { }
4725  template&lt;&gt; void A(int N) { }
4726functionDecl(isExplicitTemplateSpecialization())
4727  matches the specialization A&lt;int&gt;().
4728
4729Usable 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;
4730</pre></td></tr>
4731
4732
4733<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>
4734<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4735
4736Given:
4737  extern "C" void f() {}
4738  extern "C" { void g() {} }
4739  void h() {}
4740  extern "C" int x = 1;
4741  extern "C" int y = 2;
4742  int z = 3;
4743functionDecl(isExternC())
4744  matches the declaration of f and g, but not the declaration of h.
4745varDecl(isExternC())
4746  matches the declaration of x and y, but not the declaration of z.
4747</pre></td></tr>
4748
4749
4750<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>
4751<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4752
4753Example matches y (matcher = varDecl(isStaticLocal()))
4754void f() {
4755  int x;
4756  static int y;
4757}
4758static int z;
4759</pre></td></tr>
4760
4761
4762<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>
4763<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4764class specifier ("static" keyword) written in the source.
4765
4766Given:
4767  static void f() {}
4768  static int i = 0;
4769  extern int j;
4770  int k;
4771functionDecl(isStaticStorageClass())
4772  matches the function declaration f.
4773varDecl(isStaticStorageClass())
4774  matches the variable declaration i.
4775</pre></td></tr>
4776
4777
4778<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>
4779<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4780member variable template instantiations.
4781
4782Given
4783  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4784or
4785  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4786or
4787  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4788cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4789  matches the template instantiation of X&lt;A&gt;.
4790
4791But given
4792  template &lt;typename T&gt;  class X {}; class A {};
4793  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4794cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4795  does not match, as X&lt;A&gt; is an explicit template specialization.
4796
4797Usable 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;
4798</pre></td></tr>
4799
4800<!--END_NARROWING_MATCHERS -->
4801</table>
4802
4803<!-- ======================================================================= -->
4804<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4805<!-- ======================================================================= -->
4806
4807<p>Traversal matchers specify the relationship to other nodes that are
4808reachable from the current node.</p>
4809
4810<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4811forEachDescendant) which work on all nodes and allow users to write more generic
4812match expressions.</p>
4813
4814<table>
4815<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4816<!-- START_TRAVERSAL_MATCHERS -->
4817
4818<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>
4819<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4820
4821Unlike anyOf, eachOf will generate a match result for each
4822matching submatcher.
4823
4824For example, in:
4825  class A { int a; int b; };
4826The matcher:
4827  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4828                       has(fieldDecl(hasName("b")).bind("v"))))
4829will generate two results binding "v", the first of which binds
4830the field declaration of a, the second the field declaration of
4831b.
4832
4833Usable as: Any Matcher
4834</pre></td></tr>
4835
4836
4837<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>
4838<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
4839
4840Generates results for each match.
4841
4842For example, in:
4843  class A { class B {}; class C {}; };
4844The matcher:
4845  cxxRecordDecl(hasName("::A"),
4846                findAll(cxxRecordDecl(isDefinition()).bind("m")))
4847will generate results for A, B and C.
4848
4849Usable as: Any Matcher
4850</pre></td></tr>
4851
4852
4853<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4854<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4855provided matcher.
4856
4857Example matches X, A, A::X, B, B::C, B::C::X
4858  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4859  class X {};
4860  class A { class X {}; };  // Matches A, because A::X is a class of name
4861                            // X inside A.
4862  class B { class C { class X {}; }; };
4863
4864DescendantT must be an AST base type.
4865
4866As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4867each result that matches instead of only on the first one.
4868
4869Note: Recursively combined ForEachDescendant can cause many matches:
4870  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4871    forEachDescendant(cxxRecordDecl())
4872  )))
4873will match 10 times (plus injected class name matches) on:
4874  class A { class B { class C { class D { class E {}; }; }; }; };
4875
4876Usable as: Any Matcher
4877</pre></td></tr>
4878
4879
4880<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4881<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4882provided matcher.
4883
4884Example matches X, Y, Y::X, Z::Y, Z::Y::X
4885  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4886  class X {};
4887  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
4888                            // inside Y.
4889  class Z { class Y { class X {}; }; };  // Does not match Z.
4890
4891ChildT must be an AST base type.
4892
4893As opposed to 'has', 'forEach' will cause a match for each result that
4894matches instead of only on the first one.
4895
4896Usable as: Any Matcher
4897</pre></td></tr>
4898
4899
4900<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4901<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4902matcher.
4903
4904Given
4905void f() { if (true) { int x = 42; } }
4906void g() { for (;;) { int x = 43; } }
4907expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4908
4909Usable as: Any Matcher
4910</pre></td></tr>
4911
4912
4913<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4914<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4915provided matcher.
4916
4917Example matches X, Y, Z
4918    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4919  class X {};  // Matches X, because X::X is a class of name X inside X.
4920  class Y { class X {}; };
4921  class Z { class Y { class X {}; }; };
4922
4923DescendantT must be an AST base type.
4924
4925Usable as: Any Matcher
4926</pre></td></tr>
4927
4928
4929<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4930<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4931provided matcher.
4932
4933Example matches X, Y
4934  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4935  class X {};  // Matches X, because X::X is a class of name X inside X.
4936  class Y { class X {}; };
4937  class Z { class Y { class X {}; }; };  // Does not match Z.
4938
4939ChildT must be an AST base type.
4940
4941Usable as: Any Matcher
4942Note that has is direct matcher, so it also matches things like implicit
4943casts and paren casts. If you are matching with expr then you should
4944probably consider using ignoringParenImpCasts like:
4945has(ignoringParenImpCasts(expr())).
4946</pre></td></tr>
4947
4948
4949<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4950<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4951matcher.
4952
4953Given
4954void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4955compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4956
4957Usable as: Any Matcher
4958</pre></td></tr>
4959
4960
4961<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
4962<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
4963
4964However, optionally will retain any bindings generated by the submatcher.
4965Useful when additional information which may or may not present about a main
4966matching node is desired.
4967
4968For example, in:
4969  class Foo {
4970    int bar;
4971  }
4972The matcher:
4973  cxxRecordDecl(
4974    optionally(has(
4975      fieldDecl(hasName("bar")).bind("var")
4976  ))).bind("record")
4977will produce a result binding for both "record" and "var".
4978The matcher will produce a "record" binding for even if there is no data
4979member named "bar" in that class.
4980
4981Usable as: Any Matcher
4982</pre></td></tr>
4983
4984
4985<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>
4986<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
4987
4988Given
4989  void foo()
4990  {
4991      int i = 3.0;
4992  }
4993The matcher
4994  traverse(TK_IgnoreImplicitCastsAndParentheses,
4995    varDecl(hasInitializer(floatLiteral().bind("init")))
4996  )
4997matches the variable declaration with "init" bound to the "3.0".
4998</pre></td></tr>
4999
5000
5001<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>
5002<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5003switch statement or conditional operator.
5004
5005Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5006  if (true) {}
5007</pre></td></tr>
5008
5009
5010<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>
5011<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5012(binary or ternary).
5013
5014Example matches b
5015  condition ? a : b
5016  condition ?: b
5017</pre></td></tr>
5018
5019
5020<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>
5021<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5022
5023Example 1 (conditional ternary operator): matches a
5024  condition ? a : b
5025
5026Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5027  condition ?: b
5028</pre></td></tr>
5029
5030
5031<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>
5032<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5033matches the given matcher.
5034
5035The associated declaration is:
5036- for type nodes, the declaration of the underlying type
5037- for CallExpr, the declaration of the callee
5038- for MemberExpr, the declaration of the referenced member
5039- for CXXConstructExpr, the declaration of the constructor
5040- for CXXNewExpr, the declaration of the operator new
5041- for ObjCIvarExpr, the declaration of the ivar
5042
5043For type nodes, hasDeclaration will generally match the declaration of the
5044sugared type. Given
5045  class X {};
5046  typedef X Y;
5047  Y y;
5048in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5049typedefDecl. A common use case is to match the underlying, desugared type.
5050This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5051  varDecl(hasType(hasUnqualifiedDesugaredType(
5052      recordType(hasDeclaration(decl())))))
5053In this matcher, the decl will match the CXXRecordDecl of class X.
5054
5055Usable 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;,
5056  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;,
5057  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;,
5058  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;,
5059  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;,
5060  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;,
5061  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5062</pre></td></tr>
5063
5064
5065<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>
5066<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5067
5068Given
5069  int i[5];
5070  void f() { i[1] = 42; }
5071arraySubscriptExpression(hasBase(implicitCastExpr(
5072    hasSourceExpression(declRefExpr()))))
5073  matches i[1] with the declRefExpr() matching i
5074</pre></td></tr>
5075
5076
5077<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>
5078<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5079
5080Given
5081  int i[5];
5082  void f() { i[1] = 42; }
5083arraySubscriptExpression(hasIndex(integerLiteral()))
5084  matches i[1] with the integerLiteral() matching 1
5085</pre></td></tr>
5086
5087
5088<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</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>
5089<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
5090
5091Example matches a (matcher = binaryOperator(hasLHS()))
5092  a || b
5093</pre></td></tr>
5094
5095
5096<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</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>
5097<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
5098
5099Example matches b (matcher = binaryOperator(hasRHS()))
5100  a || b
5101</pre></td></tr>
5102
5103
5104<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>
5105<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5106type.
5107
5108Given
5109  struct A {};
5110  A a[7];
5111  int b[7];
5112arrayType(hasElementType(builtinType()))
5113  matches "int b[7]"
5114
5115Usable 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;
5116</pre></td></tr>
5117
5118
5119<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>
5120<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
5121
5122Given
5123  _Atomic(int) i;
5124  _Atomic(float) f;
5125atomicType(hasValueType(isInteger()))
5126 matches "_Atomic(int) i"
5127
5128Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
5129</pre></td></tr>
5130
5131
5132<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>
5133<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
5134
5135Note: There is no TypeLoc for the deduced type and thus no
5136getDeducedLoc() matcher.
5137
5138Given
5139  auto a = 1;
5140  auto b = 2.0;
5141autoType(hasDeducedType(isInteger()))
5142  matches "auto a"
5143
5144Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
5145</pre></td></tr>
5146
5147
5148<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>
5149<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
5150binary operator matches.
5151</pre></td></tr>
5152
5153
5154<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>
5155<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
5156
5157Example matches a (matcher = binaryOperator(hasLHS()))
5158  a || b
5159</pre></td></tr>
5160
5161
5162<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>
5163<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
5164
5165Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
5166                                             integerLiteral(equals(2)))
5167  1 + 2 // Match
5168  2 + 1 // Match
5169  1 + 1 // No match
5170  2 + 2 // No match
5171</pre></td></tr>
5172
5173
5174<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>
5175<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
5176
5177Example matches b (matcher = binaryOperator(hasRHS()))
5178  a || b
5179</pre></td></tr>
5180
5181
5182<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>
5183<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
5184block.
5185
5186Does not match the 'this' parameter of a method.
5187
5188Given
5189  class X { void f(int x, int y, int z) {} };
5190cxxMethodDecl(hasAnyParameter(hasName("y")))
5191  matches f(int x, int y, int z) {}
5192with hasAnyParameter(...)
5193  matching int y
5194
5195For ObjectiveC, given
5196  @interface I - (void) f:(int) y; @end
5197
5198the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5199matches the declaration of method f with hasParameter
5200matching y.
5201
5202For blocks, given
5203  b = ^(int y) { printf("%d", y) };
5204
5205the matcher blockDecl(hasAnyParameter(hasName("y")))
5206matches the declaration of the block b with hasParameter
5207matching y.
5208</pre></td></tr>
5209
5210
5211<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>
5212<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
5213declaration or a block.
5214
5215Given
5216  class X { void f(int x) {} };
5217cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5218  matches f(int x) {}
5219with hasParameter(...)
5220  matching int x
5221
5222For ObjectiveC, given
5223  @interface I - (void) f:(int) y; @end
5224
5225the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5226matches the declaration of method f with hasParameter
5227matching y.
5228</pre></td></tr>
5229
5230
5231<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>
5232<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
5233pointee matches a given matcher.
5234
5235Given
5236  int *a;
5237  int const *b;
5238  float const *f;
5239pointerType(pointee(isConstQualified(), isInteger()))
5240  matches "int const *b"
5241
5242Usable 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;,
5243  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;
5244</pre></td></tr>
5245
5246
5247<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</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>
5248<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
5249declaration's type.
5250
5251In case of a value declaration (for example a variable declaration),
5252this resolves one layer of indirection. For example, in the value
5253declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5254X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5255declaration of x.
5256
5257Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5258            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5259            and friend class X (matcher = friendDecl(hasType("X"))
5260 class X {};
5261 void y(X &amp;x) { x; X z; }
5262 class Y { friend class X; };
5263
5264Example matches class Derived
5265(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
5266class Base {};
5267class Derived : Base {};
5268
5269Usable 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;,
5270Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
5271</pre></td></tr>
5272
5273
5274<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>
5275<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
5276
5277Given
5278  void f(int i);
5279  int y;
5280  f(y);
5281callExpr(
5282  forEachArgumentWithParam(
5283    declRefExpr(to(varDecl(hasName("y")))),
5284    parmVarDecl(hasType(isInteger()))
5285))
5286  matches f(y);
5287with declRefExpr(...)
5288  matching int y
5289and parmVarDecl(...)
5290  matching int i
5291</pre></td></tr>
5292
5293
5294<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>
5295<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
5296expression, or an ObjC-message-send expression.
5297
5298Given
5299  void x(int, int, int) { int y; x(1, y, 42); }
5300callExpr(hasAnyArgument(declRefExpr()))
5301  matches x(1, y, 42)
5302with hasAnyArgument(...)
5303  matching y
5304
5305For ObjectiveC, given
5306  @interface I - (void) f:(int) y; @end
5307  void foo(I *i) { [i f:12]; }
5308objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5309  matches [i f:12]
5310</pre></td></tr>
5311
5312
5313<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>
5314<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
5315call expression.
5316
5317Example matches y in x(y)
5318    (matcher = callExpr(hasArgument(0, declRefExpr())))
5319  void x(int) { int y; x(y); }
5320</pre></td></tr>
5321
5322
5323<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>
5324<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
5325matches the given matcher.
5326
5327The associated declaration is:
5328- for type nodes, the declaration of the underlying type
5329- for CallExpr, the declaration of the callee
5330- for MemberExpr, the declaration of the referenced member
5331- for CXXConstructExpr, the declaration of the constructor
5332- for CXXNewExpr, the declaration of the operator new
5333- for ObjCIvarExpr, the declaration of the ivar
5334
5335For type nodes, hasDeclaration will generally match the declaration of the
5336sugared type. Given
5337  class X {};
5338  typedef X Y;
5339  Y y;
5340in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5341typedefDecl. A common use case is to match the underlying, desugared type.
5342This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5343  varDecl(hasType(hasUnqualifiedDesugaredType(
5344      recordType(hasDeclaration(decl())))))
5345In this matcher, the decl will match the CXXRecordDecl of class X.
5346
5347Usable 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;,
5348  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;,
5349  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;,
5350  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;,
5351  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;,
5352  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;,
5353  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5354</pre></td></tr>
5355
5356
5357<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>
5358<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
5359
5360Given
5361  class A { A() : i(42), j(42) {} int i; int j; };
5362cxxConstructorDecl(forEachConstructorInitializer(
5363  forField(decl().bind("x"))
5364))
5365  will trigger two matches, binding for 'i' and 'j' respectively.
5366</pre></td></tr>
5367
5368
5369<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>
5370<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
5371
5372Given
5373  struct Foo {
5374    Foo() : foo_(1) { }
5375    int foo_;
5376  };
5377cxxRecordDecl(has(cxxConstructorDecl(
5378  hasAnyConstructorInitializer(anything())
5379)))
5380  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5381</pre></td></tr>
5382
5383
5384<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>
5385<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5386
5387Given
5388  struct Foo {
5389    Foo() : foo_(1) { }
5390    int foo_;
5391  };
5392cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5393    forField(hasName("foo_"))))))
5394  matches Foo
5395with forField matching foo_
5396</pre></td></tr>
5397
5398
5399<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>
5400<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5401
5402Given
5403  struct Foo {
5404    Foo() : foo_(1) { }
5405    int foo_;
5406  };
5407cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5408    withInitializer(integerLiteral(equals(1)))))))
5409  matches Foo
5410with withInitializer matching (1)
5411</pre></td></tr>
5412
5413
5414<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>
5415<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5416given matcher. Implicit object expressions are included; that is, it matches
5417use of implicit `this`.
5418
5419Given
5420  struct X {
5421    int m;
5422    int f(X x) { x.m; return m; }
5423  };
5424memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5425  matches `x.m`, but not `m`; however,
5426memberExpr(hasObjectExpression(hasType(pointsTo(
5427     cxxRecordDecl(hasName("X"))))))
5428  matches `m` (aka. `this-&gt;m`), but not `x.m`.
5429</pre></td></tr>
5430
5431
5432<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>
5433<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
5434definition that has a given body.
5435
5436Given
5437  for (;;) {}
5438hasBody(compoundStmt())
5439  matches 'for (;;) {}'
5440with compoundStmt()
5441  matching '{}'
5442</pre></td></tr>
5443
5444
5445<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>
5446<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
5447
5448Given:
5449 void foo() {
5450   if (int i = foobar(); i &gt; 0) {}
5451   switch (int i = foobar(); i) {}
5452   for (auto&amp; a = get_range(); auto&amp; x : a) {}
5453 }
5454 void bar() {
5455   if (foobar() &gt; 0) {}
5456   switch (foobar()) {}
5457   for (auto&amp; x : get_range()) {}
5458 }
5459ifStmt(hasInitStatement(anything()))
5460  matches the if statement in foo but not in bar.
5461switchStmt(hasInitStatement(anything()))
5462  matches the switch statement in foo but not in bar.
5463cxxForRangeStmt(hasInitStatement(anything()))
5464  matches the range for statement in foo but not in bar.
5465</pre></td></tr>
5466
5467
5468<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>
5469<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5470
5471Example:
5472    forStmt(hasLoopVariable(anything()))
5473matches 'int x' in
5474    for (int x : a) { }
5475</pre></td></tr>
5476
5477
5478<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>
5479<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5480
5481Example:
5482    forStmt(hasRangeInit(anything()))
5483matches 'a' in
5484    for (int x : a) { }
5485</pre></td></tr>
5486
5487
5488<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>
5489<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5490`on`, matches the argument directly without stripping away anything.
5491
5492Given
5493  class Y { public: void m(); };
5494  Y g();
5495  class X : public Y { void g(); };
5496  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5497cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5498    cxxRecordDecl(hasName("Y")))))
5499  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5500cxxMemberCallExpr(on(callExpr()))
5501  does not match `(g()).m()`, because the parens are not ignored.
5502
5503FIXME: Overload to allow directly matching types?
5504</pre></td></tr>
5505
5506
5507<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>
5508<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5509stripping off any parentheses or implicit casts.
5510
5511Given
5512  class Y { public: void m(); };
5513  Y g();
5514  class X : public Y {};
5515  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5516cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5517  matches `y.m()` and `(g()).m()`.
5518cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5519  matches `x.m()`.
5520cxxMemberCallExpr(on(callExpr()))
5521  matches `(g()).m()`.
5522
5523FIXME: Overload to allow directly matching types?
5524</pre></td></tr>
5525
5526
5527<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>
5528<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5529</pre></td></tr>
5530
5531
5532<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>
5533<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5534matches the InnerMatcher, or is a pointer to a type that matches the
5535InnerMatcher.
5536
5537Given
5538  class Y { public: void m(); };
5539  class X : public Y { void g(); };
5540  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5541cxxMemberCallExpr(thisPointerType(hasDeclaration(
5542    cxxRecordDecl(hasName("Y")))))
5543  matches `y.m()`, `p-&gt;m()` and `x.m()`.
5544cxxMemberCallExpr(thisPointerType(hasDeclaration(
5545    cxxRecordDecl(hasName("X")))))
5546  matches `x.g()`.
5547</pre></td></tr>
5548
5549
5550<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>
5551<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5552produce multiple matches.
5553
5554Given
5555  class A { virtual void f(); };
5556  class B : public A { void f(); };
5557  class C : public B { void f(); };
5558cxxMethodDecl(ofClass(hasName("C")),
5559              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5560  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5561  that B::f is not overridden by C::f).
5562
5563The check can produce multiple matches in case of multiple inheritance, e.g.
5564  class A1 { virtual void f(); };
5565  class A2 { virtual void f(); };
5566  class C : public A1, public A2 { void f(); };
5567cxxMethodDecl(ofClass(hasName("C")),
5568              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5569  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5570  once with "b" binding "A2::f" and "d" binding "C::f".
5571</pre></td></tr>
5572
5573
5574<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>
5575<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5576belongs to.
5577
5578FIXME: Generalize this for other kinds of declarations.
5579FIXME: What other kind of declarations would we need to generalize
5580this to?
5581
5582Example matches A() in the last line
5583    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5584        ofClass(hasName("A"))))))
5585  class A {
5586   public:
5587    A();
5588  };
5589  A a = A();
5590</pre></td></tr>
5591
5592
5593<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>
5594<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
5595
5596Given:
5597  MyClass *p1 = new (Storage) MyClass();
5598cxxNewExpr(hasAnyPlacementArg(anything()))
5599  matches the expression 'new (Storage, 16) MyClass()'.
5600</pre></td></tr>
5601
5602
5603<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>
5604<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5605
5606Given:
5607  MyClass *p1 = new MyClass[10];
5608cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
5609  matches the expression 'new MyClass[10]'.
5610</pre></td></tr>
5611
5612
5613<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>
5614<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5615matches the given matcher.
5616
5617The associated declaration is:
5618- for type nodes, the declaration of the underlying type
5619- for CallExpr, the declaration of the callee
5620- for MemberExpr, the declaration of the referenced member
5621- for CXXConstructExpr, the declaration of the constructor
5622- for CXXNewExpr, the declaration of the operator new
5623- for ObjCIvarExpr, the declaration of the ivar
5624
5625For type nodes, hasDeclaration will generally match the declaration of the
5626sugared type. Given
5627  class X {};
5628  typedef X Y;
5629  Y y;
5630in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5631typedefDecl. A common use case is to match the underlying, desugared type.
5632This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5633  varDecl(hasType(hasUnqualifiedDesugaredType(
5634      recordType(hasDeclaration(decl())))))
5635In this matcher, the decl will match the CXXRecordDecl of class X.
5636
5637Usable 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;,
5638  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;,
5639  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;,
5640  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;,
5641  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;,
5642  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;,
5643  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5644</pre></td></tr>
5645
5646
5647<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>
5648<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
5649
5650Given:
5651  MyClass *p1 = new (Storage, 16) MyClass();
5652cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
5653  matches the expression 'new (Storage, 16) MyClass()'.
5654</pre></td></tr>
5655
5656
5657<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>
5658<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
5659
5660Example:
5661matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
5662  class Foo;
5663  class Bar : Foo {};
5664  class Baz : Bar {};
5665  class SpecialBase;
5666  class Proxy : SpecialBase {};  // matches Proxy
5667  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
5668
5669FIXME: Refactor this and isDerivedFrom to reuse implementation.
5670</pre></td></tr>
5671
5672
5673<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>
5674<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
5675
5676Example:
5677matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
5678  class Foo;
5679  class Bar : Foo {};
5680  class Baz : Bar {};
5681  class SpecialBase;
5682  class Proxy : SpecialBase {};  // matches Proxy
5683  class IndirectlyDerived : Proxy {};  // doesn't match
5684</pre></td></tr>
5685
5686
5687<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>
5688<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5689
5690Given:
5691  class A { void func(); };
5692  class B { void member(); };
5693
5694cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5695A but not B.
5696</pre></td></tr>
5697
5698
5699<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>
5700<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
5701matching Base, or Objective-C classes that directly or indirectly
5702subclass a class matching Base.
5703
5704Note that a class is not considered to be derived from itself.
5705
5706Example matches Y, Z, C (Base == hasName("X"))
5707  class X;
5708  class Y : public X {};  // directly derived
5709  class Z : public Y {};  // indirectly derived
5710  typedef X A;
5711  typedef A B;
5712  class C : public B {};  // derived from a typedef of X
5713
5714In the following example, Bar matches isDerivedFrom(hasName("X")):
5715  class Foo;
5716  typedef Foo X;
5717  class Bar : public Foo {};  // derived from a type that X is a typedef of
5718
5719In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
5720  @interface NSObject @end
5721  @interface Bar : NSObject @end
5722
5723Usable 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;
5724</pre></td></tr>
5725
5726
5727<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>
5728<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
5729matching Base.
5730
5731Note that a class is not considered to be derived from itself.
5732
5733Example matches Y, C (Base == hasName("X"))
5734  class X;
5735  class Y : public X {};  // directly derived
5736  class Z : public Y {};  // indirectly derived
5737  typedef X A;
5738  typedef A B;
5739  class C : public B {};  // derived from a typedef of X
5740
5741In the following example, Bar matches isDerivedFrom(hasName("X")):
5742  class Foo;
5743  typedef Foo X;
5744  class Bar : public Foo {};  // derived from a type that X is a typedef of
5745</pre></td></tr>
5746
5747
5748<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>
5749<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5750match Base.
5751</pre></td></tr>
5752
5753
5754<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>
5755<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5756expression, or an ObjC-message-send expression.
5757
5758Given
5759  void x(int, int, int) { int y; x(1, y, 42); }
5760callExpr(hasAnyArgument(declRefExpr()))
5761  matches x(1, y, 42)
5762with hasAnyArgument(...)
5763  matching y
5764
5765For ObjectiveC, given
5766  @interface I - (void) f:(int) y; @end
5767  void foo(I *i) { [i f:12]; }
5768objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5769  matches [i f:12]
5770</pre></td></tr>
5771
5772
5773<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>
5774<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5775given matcher.
5776
5777Example matches y.x() (matcher = callExpr(callee(
5778                                   cxxMethodDecl(hasName("x")))))
5779  class Y { public: void x(); };
5780  void z() { Y y; y.x(); }
5781</pre></td></tr>
5782
5783
5784<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>
5785<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5786
5787Given
5788  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5789  void f() { f(); }
5790callExpr(callee(expr()))
5791  matches this-&gt;x(), x(), y.x(), f()
5792with callee(...)
5793  matching this-&gt;x, x, y.x, f respectively
5794
5795Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
5796because this introduces ambiguous overloads with calls to Callee taking a
5797internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
5798implemented in terms of implicit casts.
5799</pre></td></tr>
5800
5801
5802<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>
5803<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5804
5805Given
5806  void f(int i);
5807  int y;
5808  f(y);
5809callExpr(
5810  forEachArgumentWithParam(
5811    declRefExpr(to(varDecl(hasName("y")))),
5812    parmVarDecl(hasType(isInteger()))
5813))
5814  matches f(y);
5815with declRefExpr(...)
5816  matching int y
5817and parmVarDecl(...)
5818  matching int i
5819</pre></td></tr>
5820
5821
5822<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>
5823<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5824expression, or an ObjC-message-send expression.
5825
5826Given
5827  void x(int, int, int) { int y; x(1, y, 42); }
5828callExpr(hasAnyArgument(declRefExpr()))
5829  matches x(1, y, 42)
5830with hasAnyArgument(...)
5831  matching y
5832
5833For ObjectiveC, given
5834  @interface I - (void) f:(int) y; @end
5835  void foo(I *i) { [i f:12]; }
5836objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5837  matches [i f:12]
5838</pre></td></tr>
5839
5840
5841<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>
5842<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5843call expression.
5844
5845Example matches y in x(y)
5846    (matcher = callExpr(hasArgument(0, declRefExpr())))
5847  void x(int) { int y; x(y); }
5848</pre></td></tr>
5849
5850
5851<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>
5852<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5853matches the given matcher.
5854
5855The associated declaration is:
5856- for type nodes, the declaration of the underlying type
5857- for CallExpr, the declaration of the callee
5858- for MemberExpr, the declaration of the referenced member
5859- for CXXConstructExpr, the declaration of the constructor
5860- for CXXNewExpr, the declaration of the operator new
5861- for ObjCIvarExpr, the declaration of the ivar
5862
5863For type nodes, hasDeclaration will generally match the declaration of the
5864sugared type. Given
5865  class X {};
5866  typedef X Y;
5867  Y y;
5868in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5869typedefDecl. A common use case is to match the underlying, desugared type.
5870This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5871  varDecl(hasType(hasUnqualifiedDesugaredType(
5872      recordType(hasDeclaration(decl())))))
5873In this matcher, the decl will match the CXXRecordDecl of class X.
5874
5875Usable 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;,
5876  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;,
5877  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;,
5878  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;,
5879  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;,
5880  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;,
5881  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5882</pre></td></tr>
5883
5884
5885<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>
5886<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5887extension, matches the constant given in the statement.
5888
5889Given
5890  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5891caseStmt(hasCaseConstant(integerLiteral()))
5892  matches "case 1:"
5893</pre></td></tr>
5894
5895
5896<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>
5897<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5898or opaque value's source expression matches the given matcher.
5899
5900Example 1: matches "a string"
5901(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5902class URL { URL(string); };
5903URL url = "a string";
5904
5905Example 2: matches 'b' (matcher =
5906opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5907int a = b ?: 1;
5908</pre></td></tr>
5909
5910
5911<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>
5912<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5913functionDecl that have at least one TemplateArgument matching the given
5914InnerMatcher.
5915
5916Given
5917  template&lt;typename T&gt; class A {};
5918  template&lt;&gt; class A&lt;double&gt; {};
5919  A&lt;int&gt; a;
5920
5921  template&lt;typename T&gt; f() {};
5922  void func() { f&lt;int&gt;(); };
5923
5924classTemplateSpecializationDecl(hasAnyTemplateArgument(
5925    refersToType(asString("int"))))
5926  matches the specialization A&lt;int&gt;
5927
5928functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5929  matches the specialization f&lt;int&gt;
5930</pre></td></tr>
5931
5932
5933<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>
5934<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5935
5936Given
5937  template&lt;typename T&gt; class A {}; #1
5938  template&lt;&gt; class A&lt;int&gt; {}; #2
5939classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
5940  matches '#2' with classTemplateDecl() matching the class template
5941  declaration of 'A' at #1.
5942</pre></td></tr>
5943
5944
5945<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>
5946<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5947functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5948
5949Given
5950  template&lt;typename T, typename U&gt; class A {};
5951  A&lt;bool, int&gt; b;
5952  A&lt;int, bool&gt; c;
5953
5954  template&lt;typename T&gt; void f() {}
5955  void func() { f&lt;int&gt;(); };
5956classTemplateSpecializationDecl(hasTemplateArgument(
5957    1, refersToType(asString("int"))))
5958  matches the specialization A&lt;bool, int&gt;
5959
5960functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5961  matches the specialization f&lt;int&gt;
5962</pre></td></tr>
5963
5964
5965<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>
5966<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5967type.
5968
5969Given
5970  struct A {};
5971  A a[7];
5972  int b[7];
5973arrayType(hasElementType(builtinType()))
5974  matches "int b[7]"
5975
5976Usable 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;
5977</pre></td></tr>
5978
5979
5980<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>
5981<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
5982a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5983
5984Given
5985  { {}; 1+2; }
5986hasAnySubstatement(compoundStmt())
5987  matches '{ {}; 1+2; }'
5988with compoundStmt()
5989  matching '{}'
5990</pre></td></tr>
5991
5992
5993<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>
5994<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5995</pre></td></tr>
5996
5997
5998<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>
5999<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
6000matches the given matcher.
6001
6002The associated declaration is:
6003- for type nodes, the declaration of the underlying type
6004- for CallExpr, the declaration of the callee
6005- for MemberExpr, the declaration of the referenced member
6006- for CXXConstructExpr, the declaration of the constructor
6007- for CXXNewExpr, the declaration of the operator new
6008- for ObjCIvarExpr, the declaration of the ivar
6009
6010For type nodes, hasDeclaration will generally match the declaration of the
6011sugared type. Given
6012  class X {};
6013  typedef X Y;
6014  Y y;
6015in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6016typedefDecl. A common use case is to match the underlying, desugared type.
6017This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6018  varDecl(hasType(hasUnqualifiedDesugaredType(
6019      recordType(hasDeclaration(decl())))))
6020In this matcher, the decl will match the CXXRecordDecl of class X.
6021
6022Usable 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;,
6023  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;,
6024  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;,
6025  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;,
6026  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;,
6027  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;,
6028  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6029</pre></td></tr>
6030
6031
6032<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>
6033<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
6034specific using shadow declaration.
6035
6036Given
6037  namespace a { void f() {} }
6038  using a::f;
6039  void g() {
6040    f();     // Matches this ..
6041    a::f();  // .. but not this.
6042  }
6043declRefExpr(throughUsingDecl(anything()))
6044  matches f()
6045</pre></td></tr>
6046
6047
6048<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>
6049<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
6050specified matcher.
6051
6052Example matches x in if(x)
6053    (matcher = declRefExpr(to(varDecl(hasName("x")))))
6054  bool x;
6055  if (x) {}
6056</pre></td></tr>
6057
6058
6059<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>
6060<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
6061
6062Note that this does not work for global declarations because the AST
6063breaks up multiple-declaration DeclStmt's into multiple single-declaration
6064DeclStmt's.
6065Example: Given non-global declarations
6066  int a, b = 0;
6067  int c;
6068  int d = 2, e;
6069declStmt(containsDeclaration(
6070      0, varDecl(hasInitializer(anything()))))
6071  matches only 'int d = 2, e;', and
6072declStmt(containsDeclaration(1, varDecl()))
6073  matches 'int a, b = 0' as well as 'int d = 2, e;'
6074  but 'int c;' is not matched.
6075</pre></td></tr>
6076
6077
6078<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>
6079<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
6080
6081Given
6082  int a, b;
6083  int c;
6084declStmt(hasSingleDecl(anything()))
6085  matches 'int c;' but not 'int a, b;'.
6086</pre></td></tr>
6087
6088
6089<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</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>
6090<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
6091the inner matcher.
6092
6093Given
6094  int x;
6095declaratorDecl(hasTypeLoc(loc(asString("int"))))
6096  matches int x
6097</pre></td></tr>
6098
6099
6100<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>
6101<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
6102Decl, matches InnerMatcher.
6103
6104Given
6105  namespace N {
6106    namespace M {
6107      class D {};
6108    }
6109  }
6110
6111cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
6112declaration of class D.
6113</pre></td></tr>
6114
6115
6116<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>
6117<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
6118
6119Given
6120  decltype(1) a = 1;
6121  decltype(2.0) b = 2.0;
6122decltypeType(hasUnderlyingType(isInteger()))
6123  matches the type of "a"
6124
6125Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
6126</pre></td></tr>
6127
6128
6129<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>
6130<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
6131definition that has a given body.
6132
6133Given
6134  for (;;) {}
6135hasBody(compoundStmt())
6136  matches 'for (;;) {}'
6137with compoundStmt()
6138  matching '{}'
6139</pre></td></tr>
6140
6141
6142<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>
6143<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
6144switch statement or conditional operator.
6145
6146Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6147  if (true) {}
6148</pre></td></tr>
6149
6150
6151<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>
6152<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
6153matches InnerMatcher if the qualifier exists.
6154
6155Given
6156  namespace N {
6157    namespace M {
6158      class D {};
6159    }
6160  }
6161  N::M::D d;
6162
6163elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
6164matches the type of the variable declaration of d.
6165</pre></td></tr>
6166
6167
6168<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>
6169<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
6170
6171Given
6172  namespace N {
6173    namespace M {
6174      class D {};
6175    }
6176  }
6177  N::M::D d;
6178
6179elaboratedType(namesType(recordType(
6180hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
6181declaration of d.
6182</pre></td></tr>
6183
6184
6185<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>
6186<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
6187matches the given matcher.
6188
6189The associated declaration is:
6190- for type nodes, the declaration of the underlying type
6191- for CallExpr, the declaration of the callee
6192- for MemberExpr, the declaration of the referenced member
6193- for CXXConstructExpr, the declaration of the constructor
6194- for CXXNewExpr, the declaration of the operator new
6195- for ObjCIvarExpr, the declaration of the ivar
6196
6197For type nodes, hasDeclaration will generally match the declaration of the
6198sugared type. Given
6199  class X {};
6200  typedef X Y;
6201  Y y;
6202in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6203typedefDecl. A common use case is to match the underlying, desugared type.
6204This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6205  varDecl(hasType(hasUnqualifiedDesugaredType(
6206      recordType(hasDeclaration(decl())))))
6207In this matcher, the decl will match the CXXRecordDecl of class X.
6208
6209Usable 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;,
6210  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;,
6211  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;,
6212  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;,
6213  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;,
6214  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;,
6215  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6216</pre></td></tr>
6217
6218
6219<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>
6220<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
6221
6222(Note: Clang's AST refers to other conversions as "casts" too, and calls
6223actual casts "explicit" casts.)
6224</pre></td></tr>
6225
6226
6227<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
6228<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
6229declaration's type.
6230
6231In case of a value declaration (for example a variable declaration),
6232this resolves one layer of indirection. For example, in the value
6233declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6234X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6235declaration of x.
6236
6237Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6238            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6239            and friend class X (matcher = friendDecl(hasType("X"))
6240 class X {};
6241 void y(X &amp;x) { x; X z; }
6242 class Y { friend class X; };
6243
6244Example matches class Derived
6245(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6246class Base {};
6247class Derived : Base {};
6248
6249Usable 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;,
6250Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6251</pre></td></tr>
6252
6253
6254<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>
6255<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
6256matcher.
6257
6258Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6259            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6260            and U (matcher = typedefDecl(hasType(asString("int")))
6261            and friend class X (matcher = friendDecl(hasType("X"))
6262 class X {};
6263 void y(X &amp;x) { x; X z; }
6264 typedef int U;
6265 class Y { friend class X; };
6266</pre></td></tr>
6267
6268
6269<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>
6270<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
6271elidable constructor and other corresponding bookkeeping nodes.
6272
6273In C++17, elidable copy constructors are no longer being generated in the
6274AST as it is not permitted by the standard. They are, however, part of the
6275AST in C++14 and earlier. So, a matcher must abstract over these differences
6276to work in all language modes. This matcher skips elidable constructor-call
6277AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
6278various implicit nodes inside the constructor calls, all of which will not
6279appear in the C++17 AST.
6280
6281Given
6282
6283struct H {};
6284H G();
6285void f() {
6286  H D = G();
6287}
6288
6289``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
6290matches ``H D = G()`` in C++11 through C++17 (and beyond).
6291</pre></td></tr>
6292
6293
6294<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>
6295<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
6296are stripped off.
6297
6298Parentheses and explicit casts are not discarded.
6299Given
6300  int arr[5];
6301  int a = 0;
6302  char b = 0;
6303  const int c = a;
6304  int *d = arr;
6305  long e = (long) 0l;
6306The matchers
6307   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
6308   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
6309would match the declarations for a, b, c, and d, but not e.
6310While
6311   varDecl(hasInitializer(integerLiteral()))
6312   varDecl(hasInitializer(declRefExpr()))
6313only match the declarations for b, c, and d.
6314</pre></td></tr>
6315
6316
6317<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>
6318<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
6319nodes are stripped off.
6320
6321Parentheses and explicit casts are not discarded.
6322Given
6323  class C {};
6324  C a = C();
6325  C b;
6326  C c = b;
6327The matchers
6328   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
6329would match the declarations for a, b, and c.
6330While
6331   varDecl(hasInitializer(cxxConstructExpr()))
6332only match the declarations for b and c.
6333</pre></td></tr>
6334
6335
6336<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>
6337<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
6338casts are stripped off.
6339
6340Implicit and non-C Style casts are also discarded.
6341Given
6342  int a = 0;
6343  char b = (0);
6344  void* c = reinterpret_cast&lt;char*&gt;(0);
6345  char d = char(0);
6346The matcher
6347   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
6348would match the declarations for a, b, c, and d.
6349while
6350   varDecl(hasInitializer(integerLiteral()))
6351only match the declaration for a.
6352</pre></td></tr>
6353
6354
6355<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>
6356<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
6357parentheses are stripped off.
6358
6359Explicit casts are not discarded.
6360Given
6361  int arr[5];
6362  int a = 0;
6363  char b = (0);
6364  const int c = a;
6365  int *d = (arr);
6366  long e = ((long) 0l);
6367The matchers
6368   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
6369   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
6370would match the declarations for a, b, c, and d, but not e.
6371while
6372   varDecl(hasInitializer(integerLiteral()))
6373   varDecl(hasInitializer(declRefExpr()))
6374would only match the declaration for a.
6375</pre></td></tr>
6376
6377
6378<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>
6379<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
6380
6381Given
6382  const char* str = ("my-string");
6383The matcher
6384  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
6385would match the implicit cast resulting from the assignment.
6386</pre></td></tr>
6387
6388
6389<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>
6390<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
6391
6392Given
6393  class C {
6394    int a = 2;
6395    int b = 3;
6396    int c;
6397  };
6398fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
6399  matches 'int a;' but not 'int b;'.
6400fieldDecl(hasInClassInitializer(anything()))
6401  matches 'int a;' and 'int b;' but not 'int c;'.
6402</pre></td></tr>
6403
6404
6405<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>
6406<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
6407definition that has a given body.
6408
6409Given
6410  for (;;) {}
6411hasBody(compoundStmt())
6412  matches 'for (;;) {}'
6413with compoundStmt()
6414  matching '{}'
6415</pre></td></tr>
6416
6417
6418<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>
6419<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
6420switch statement or conditional operator.
6421
6422Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6423  if (true) {}
6424</pre></td></tr>
6425
6426
6427<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>
6428<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
6429
6430Example:
6431    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
6432matches '++x' in
6433    for (x; x &lt; N; ++x) { }
6434</pre></td></tr>
6435
6436
6437<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>
6438<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
6439
6440Example:
6441    forStmt(hasLoopInit(declStmt()))
6442matches 'int x = 0' in
6443    for (int x = 0; x &lt; N; ++x) { }
6444</pre></td></tr>
6445
6446
6447<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</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>
6448<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
6449declaration's type.
6450
6451In case of a value declaration (for example a variable declaration),
6452this resolves one layer of indirection. For example, in the value
6453declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6454X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6455declaration of x.
6456
6457Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6458            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6459            and friend class X (matcher = friendDecl(hasType("X"))
6460 class X {};
6461 void y(X &amp;x) { x; X z; }
6462 class Y { friend class X; };
6463
6464Example matches class Derived
6465(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6466class Base {};
6467class Derived : Base {};
6468
6469Usable 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;,
6470Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6471</pre></td></tr>
6472
6473
6474<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>
6475<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6476matcher.
6477
6478Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6479            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6480            and U (matcher = typedefDecl(hasType(asString("int")))
6481            and friend class X (matcher = friendDecl(hasType("X"))
6482 class X {};
6483 void y(X &amp;x) { x; X z; }
6484 typedef int U;
6485 class Y { friend class X; };
6486</pre></td></tr>
6487
6488
6489<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>
6490<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6491block.
6492
6493Does not match the 'this' parameter of a method.
6494
6495Given
6496  class X { void f(int x, int y, int z) {} };
6497cxxMethodDecl(hasAnyParameter(hasName("y")))
6498  matches f(int x, int y, int z) {}
6499with hasAnyParameter(...)
6500  matching int y
6501
6502For ObjectiveC, given
6503  @interface I - (void) f:(int) y; @end
6504
6505the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6506matches the declaration of method f with hasParameter
6507matching y.
6508
6509For blocks, given
6510  b = ^(int y) { printf("%d", y) };
6511
6512the matcher blockDecl(hasAnyParameter(hasName("y")))
6513matches the declaration of the block b with hasParameter
6514matching y.
6515</pre></td></tr>
6516
6517
6518<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>
6519<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6520functionDecl that have at least one TemplateArgument matching the given
6521InnerMatcher.
6522
6523Given
6524  template&lt;typename T&gt; class A {};
6525  template&lt;&gt; class A&lt;double&gt; {};
6526  A&lt;int&gt; a;
6527
6528  template&lt;typename T&gt; f() {};
6529  void func() { f&lt;int&gt;(); };
6530
6531classTemplateSpecializationDecl(hasAnyTemplateArgument(
6532    refersToType(asString("int"))))
6533  matches the specialization A&lt;int&gt;
6534
6535functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6536  matches the specialization f&lt;int&gt;
6537</pre></td></tr>
6538
6539
6540<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>
6541<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
6542definition that has a given body.
6543
6544Given
6545  for (;;) {}
6546hasBody(compoundStmt())
6547  matches 'for (;;) {}'
6548with compoundStmt()
6549  matching '{}'
6550</pre></td></tr>
6551
6552
6553<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>
6554<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6555declaration.
6556
6557Given
6558  template&lt;bool b&gt;
6559  struct S {
6560    S(int); // #1
6561    explicit S(double); // #2
6562    operator int(); // #3
6563    explicit operator bool(); // #4
6564    explicit(false) S(bool) // # 7
6565    explicit(true) S(char) // # 8
6566    explicit(b) S(S) // # 9
6567  };
6568  S(int) -&gt; S&lt;true&gt; // #5
6569  explicit S(double) -&gt; S&lt;false&gt; // #6
6570cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6571cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6572cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6573</pre></td></tr>
6574
6575
6576<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>
6577<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6578declaration or a block.
6579
6580Given
6581  class X { void f(int x) {} };
6582cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6583  matches f(int x) {}
6584with hasParameter(...)
6585  matching int x
6586
6587For ObjectiveC, given
6588  @interface I - (void) f:(int) y; @end
6589
6590the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6591matches the declaration of method f with hasParameter
6592matching y.
6593</pre></td></tr>
6594
6595
6596<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>
6597<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6598functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6599
6600Given
6601  template&lt;typename T, typename U&gt; class A {};
6602  A&lt;bool, int&gt; b;
6603  A&lt;int, bool&gt; c;
6604
6605  template&lt;typename T&gt; void f() {}
6606  void func() { f&lt;int&gt;(); };
6607classTemplateSpecializationDecl(hasTemplateArgument(
6608    1, refersToType(asString("int"))))
6609  matches the specialization A&lt;bool, int&gt;
6610
6611functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6612  matches the specialization f&lt;int&gt;
6613</pre></td></tr>
6614
6615
6616<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>
6617<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6618
6619Given:
6620  class X { int f() { return 1; } };
6621cxxMethodDecl(returns(asString("int")))
6622  matches int f() { return 1; }
6623</pre></td></tr>
6624
6625
6626<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>
6627<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6628switch statement or conditional operator.
6629
6630Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6631  if (true) {}
6632</pre></td></tr>
6633
6634
6635<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>
6636<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6637
6638Given
6639  if (A* a = GetAPointer()) {}
6640hasConditionVariableStatement(...)
6641  matches 'A* a = GetAPointer()'.
6642</pre></td></tr>
6643
6644
6645<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>
6646<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6647
6648Examples matches the if statement
6649  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6650  if (false) false; else true;
6651</pre></td></tr>
6652
6653
6654<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>
6655<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
6656
6657Given:
6658 void foo() {
6659   if (int i = foobar(); i &gt; 0) {}
6660   switch (int i = foobar(); i) {}
6661   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6662 }
6663 void bar() {
6664   if (foobar() &gt; 0) {}
6665   switch (foobar()) {}
6666   for (auto&amp; x : get_range()) {}
6667 }
6668ifStmt(hasInitStatement(anything()))
6669  matches the if statement in foo but not in bar.
6670switchStmt(hasInitStatement(anything()))
6671  matches the switch statement in foo but not in bar.
6672cxxForRangeStmt(hasInitStatement(anything()))
6673  matches the range for statement in foo but not in bar.
6674</pre></td></tr>
6675
6676
6677<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>
6678<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6679
6680Examples matches the if statement
6681  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6682  if (false) true; else false;
6683</pre></td></tr>
6684
6685
6686<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>
6687<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6688matcher.
6689
6690FIXME: Unit test this matcher
6691</pre></td></tr>
6692
6693
6694<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>
6695<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6696
6697Example matches y.
6698    (matcher = initListExpr(hasInit(0, expr())))
6699  int x{y}.
6700</pre></td></tr>
6701
6702
6703<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>
6704<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6705(if expression have it).
6706</pre></td></tr>
6707
6708
6709<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>
6710<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6711matches the given matcher.
6712
6713The associated declaration is:
6714- for type nodes, the declaration of the underlying type
6715- for CallExpr, the declaration of the callee
6716- for MemberExpr, the declaration of the referenced member
6717- for CXXConstructExpr, the declaration of the constructor
6718- for CXXNewExpr, the declaration of the operator new
6719- for ObjCIvarExpr, the declaration of the ivar
6720
6721For type nodes, hasDeclaration will generally match the declaration of the
6722sugared type. Given
6723  class X {};
6724  typedef X Y;
6725  Y y;
6726in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6727typedefDecl. A common use case is to match the underlying, desugared type.
6728This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6729  varDecl(hasType(hasUnqualifiedDesugaredType(
6730      recordType(hasDeclaration(decl())))))
6731In this matcher, the decl will match the CXXRecordDecl of class X.
6732
6733Usable 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;,
6734  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;,
6735  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;,
6736  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;,
6737  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;,
6738  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;,
6739  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6740</pre></td></tr>
6741
6742
6743<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>
6744<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6745matches the given matcher.
6746
6747The associated declaration is:
6748- for type nodes, the declaration of the underlying type
6749- for CallExpr, the declaration of the callee
6750- for MemberExpr, the declaration of the referenced member
6751- for CXXConstructExpr, the declaration of the constructor
6752- for CXXNewExpr, the declaration of the operator new
6753- for ObjCIvarExpr, the declaration of the ivar
6754
6755For type nodes, hasDeclaration will generally match the declaration of the
6756sugared type. Given
6757  class X {};
6758  typedef X Y;
6759  Y y;
6760in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6761typedefDecl. A common use case is to match the underlying, desugared type.
6762This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6763  varDecl(hasType(hasUnqualifiedDesugaredType(
6764      recordType(hasDeclaration(decl())))))
6765In this matcher, the decl will match the CXXRecordDecl of class X.
6766
6767Usable 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;,
6768  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;,
6769  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;,
6770  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;,
6771  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;,
6772  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;,
6773  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6774</pre></td></tr>
6775
6776
6777<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>
6778<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
6779
6780Given
6781  struct foo {
6782    void bar() {
6783      auto f = [this](){};
6784    }
6785  }
6786lambdaExpr(hasAnyCapture(cxxThisExpr()))
6787  matches [this](){};
6788</pre></td></tr>
6789
6790
6791<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>
6792<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
6793
6794Given
6795  void foo() {
6796    int x;
6797    auto f = [x](){};
6798  }
6799lambdaExpr(hasAnyCapture(anything()))
6800  matches [x](){};
6801</pre></td></tr>
6802
6803
6804<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>
6805<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6806matches the given matcher.
6807
6808The associated declaration is:
6809- for type nodes, the declaration of the underlying type
6810- for CallExpr, the declaration of the callee
6811- for MemberExpr, the declaration of the referenced member
6812- for CXXConstructExpr, the declaration of the constructor
6813- for CXXNewExpr, the declaration of the operator new
6814- for ObjCIvarExpr, the declaration of the ivar
6815
6816For type nodes, hasDeclaration will generally match the declaration of the
6817sugared type. Given
6818  class X {};
6819  typedef X Y;
6820  Y y;
6821in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6822typedefDecl. A common use case is to match the underlying, desugared type.
6823This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6824  varDecl(hasType(hasUnqualifiedDesugaredType(
6825      recordType(hasDeclaration(decl())))))
6826In this matcher, the decl will match the CXXRecordDecl of class X.
6827
6828Usable 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;,
6829  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;,
6830  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;,
6831  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;,
6832  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;,
6833  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;,
6834  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6835</pre></td></tr>
6836
6837
6838<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>
6839<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6840given matcher. Implicit object expressions are included; that is, it matches
6841use of implicit `this`.
6842
6843Given
6844  struct X {
6845    int m;
6846    int f(X x) { x.m; return m; }
6847  };
6848memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6849  matches `x.m`, but not `m`; however,
6850memberExpr(hasObjectExpression(hasType(pointsTo(
6851     cxxRecordDecl(hasName("X"))))))
6852  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6853</pre></td></tr>
6854
6855
6856<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>
6857<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6858given matcher.
6859
6860Given
6861  struct { int first, second; } first, second;
6862  int i(second.first);
6863  int j(first.second);
6864memberExpr(member(hasName("first")))
6865  matches second.first
6866  but not first.second (because the member name there is "second").
6867</pre></td></tr>
6868
6869
6870<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>
6871<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6872pointee matches a given matcher.
6873
6874Given
6875  int *a;
6876  int const *b;
6877  float const *f;
6878pointerType(pointee(isConstQualified(), isInteger()))
6879  matches "int const *b"
6880
6881Usable 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;,
6882  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;
6883</pre></td></tr>
6884
6885
6886<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>
6887<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6888matcher.
6889
6890Given
6891  namespace N { template&lt;class T&gt; void f(T t); }
6892  template &lt;class T&gt; void g() { using N::f; f(T()); }
6893unresolvedLookupExpr(hasAnyDeclaration(
6894    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6895  matches the use of f in g() .
6896</pre></td></tr>
6897
6898
6899<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>
6900<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6901
6902Given
6903  struct A { struct B { struct C {}; }; };
6904  A::B::C c;
6905nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6906  matches "A::"
6907</pre></td></tr>
6908
6909
6910<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>
6911<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6912NestedNameSpecifier-matcher matches.
6913</pre></td></tr>
6914
6915
6916<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>
6917<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6918given TypeLoc.
6919
6920Given
6921  struct A { struct B { struct C {}; }; };
6922  A::B::C c;
6923nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6924  hasDeclaration(cxxRecordDecl(hasName("A")))))))
6925  matches "A::"
6926</pre></td></tr>
6927
6928
6929<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>
6930<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6931
6932Given
6933  struct A { struct B { struct C {}; }; };
6934  A::B::C c;
6935nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6936  matches "A::"
6937</pre></td></tr>
6938
6939
6940<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>
6941<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6942given namespace matcher.
6943
6944Given
6945  namespace ns { struct A {}; }
6946  ns::A a;
6947nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6948  matches "ns::"
6949</pre></td></tr>
6950
6951
6952<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>
6953<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6954given QualType matcher without qualifiers.
6955
6956Given
6957  struct A { struct B { struct C {}; }; };
6958  A::B::C c;
6959nestedNameSpecifier(specifiesType(
6960  hasDeclaration(cxxRecordDecl(hasName("A")))
6961))
6962  matches "A::"
6963</pre></td></tr>
6964
6965
6966<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>
6967<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6968
6969Given
6970
6971  #pragma omp parallel
6972  #pragma omp parallel default(none)
6973
6974``ompExecutableDirective(hasAnyClause(anything()))`` matches
6975``omp parallel default(none)``.
6976</pre></td></tr>
6977
6978
6979<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>
6980<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6981
6982Prerequisite: the executable directive must not be standalone directive.
6983If it is, it will never match.
6984
6985Given
6986
6987   #pragma omp parallel
6988   ;
6989   #pragma omp parallel
6990   {}
6991
6992``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6993</pre></td></tr>
6994
6995
6996<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>
6997<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
6998matching Base, or Objective-C classes that directly or indirectly
6999subclass a class matching Base.
7000
7001Note that a class is not considered to be derived from itself.
7002
7003Example matches Y, Z, C (Base == hasName("X"))
7004  class X;
7005  class Y : public X {};  // directly derived
7006  class Z : public Y {};  // indirectly derived
7007  typedef X A;
7008  typedef A B;
7009  class C : public B {};  // derived from a typedef of X
7010
7011In the following example, Bar matches isDerivedFrom(hasName("X")):
7012  class Foo;
7013  typedef Foo X;
7014  class Bar : public Foo {};  // derived from a type that X is a typedef of
7015
7016In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7017  @interface NSObject @end
7018  @interface Bar : NSObject @end
7019
7020Usable 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;
7021</pre></td></tr>
7022
7023
7024<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>
7025<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7026matching Base.
7027
7028Note that a class is not considered to be derived from itself.
7029
7030Example matches Y, C (Base == hasName("X"))
7031  class X;
7032  class Y : public X {};  // directly derived
7033  class Z : public Y {};  // indirectly derived
7034  typedef X A;
7035  typedef A B;
7036  class C : public B {};  // derived from a typedef of X
7037
7038In the following example, Bar matches isDerivedFrom(hasName("X")):
7039  class Foo;
7040  typedef Foo X;
7041  class Bar : public Foo {};  // derived from a type that X is a typedef of
7042</pre></td></tr>
7043
7044
7045<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>
7046<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7047match Base.
7048</pre></td></tr>
7049
7050
7051<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>
7052<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
7053expression, or an ObjC-message-send expression.
7054
7055Given
7056  void x(int, int, int) { int y; x(1, y, 42); }
7057callExpr(hasAnyArgument(declRefExpr()))
7058  matches x(1, y, 42)
7059with hasAnyArgument(...)
7060  matching y
7061
7062For ObjectiveC, given
7063  @interface I - (void) f:(int) y; @end
7064  void foo(I *i) { [i f:12]; }
7065objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7066  matches [i f:12]
7067</pre></td></tr>
7068
7069
7070<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</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>
7071<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7072call expression.
7073
7074Example matches y in x(y)
7075    (matcher = callExpr(hasArgument(0, declRefExpr())))
7076  void x(int) { int y; x(y); }
7077</pre></td></tr>
7078
7079
7080<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>
7081<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
7082and the inner matcher matches on that instance.
7083
7084For example the method call in
7085  NSString *x = @"hello";
7086  [x containsString:@"h"];
7087is matched by
7088objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
7089</pre></td></tr>
7090
7091
7092<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>
7093<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
7094
7095Example
7096matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
7097matches the [webView ...] message invocation.
7098  NSString *webViewJavaScript = ...
7099  UIWebView *webView = ...
7100  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
7101</pre></td></tr>
7102
7103
7104<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>
7105<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
7106block.
7107
7108Does not match the 'this' parameter of a method.
7109
7110Given
7111  class X { void f(int x, int y, int z) {} };
7112cxxMethodDecl(hasAnyParameter(hasName("y")))
7113  matches f(int x, int y, int z) {}
7114with hasAnyParameter(...)
7115  matching int y
7116
7117For ObjectiveC, given
7118  @interface I - (void) f:(int) y; @end
7119
7120the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7121matches the declaration of method f with hasParameter
7122matching y.
7123
7124For blocks, given
7125  b = ^(int y) { printf("%d", y) };
7126
7127the matcher blockDecl(hasAnyParameter(hasName("y")))
7128matches the declaration of the block b with hasParameter
7129matching y.
7130</pre></td></tr>
7131
7132
7133<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>
7134<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
7135declaration or a block.
7136
7137Given
7138  class X { void f(int x) {} };
7139cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7140  matches f(int x) {}
7141with hasParameter(...)
7142  matching int x
7143
7144For ObjectiveC, given
7145  @interface I - (void) f:(int) y; @end
7146
7147the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7148matches the declaration of method f with hasParameter
7149matching y.
7150</pre></td></tr>
7151
7152
7153<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>
7154<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
7155or opaque value's source expression matches the given matcher.
7156
7157Example 1: matches "a string"
7158(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7159class URL { URL(string); };
7160URL url = "a string";
7161
7162Example 2: matches 'b' (matcher =
7163opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7164int a = b ?: 1;
7165</pre></td></tr>
7166
7167
7168<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>
7169<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
7170overloads matches the given matcher.
7171
7172Given
7173  template &lt;typename T&gt; void foo(T);
7174  template &lt;typename T&gt; void bar(T);
7175  template &lt;typename T&gt; void baz(T t) {
7176    foo(t);
7177    bar(t);
7178  }
7179unresolvedLookupExpr(hasAnyDeclaration(
7180    functionTemplateDecl(hasName("foo"))))
7181  matches foo in foo(t); but not bar in bar(t);
7182</pre></td></tr>
7183
7184
7185<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>
7186<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
7187
7188Given
7189  int (*ptr_to_array)[4];
7190  int (*ptr_to_func)(int);
7191
7192varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
7193ptr_to_func but not ptr_to_array.
7194
7195Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
7196</pre></td></tr>
7197
7198
7199<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>
7200<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
7201pointee matches a given matcher.
7202
7203Given
7204  int *a;
7205  int const *b;
7206  float const *f;
7207pointerType(pointee(isConstQualified(), isInteger()))
7208  matches "int const *b"
7209
7210Usable 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;,
7211  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;
7212</pre></td></tr>
7213
7214
7215<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>
7216<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
7217
7218Given:
7219  typedef int &amp;int_ref;
7220  int a;
7221  int_ref b = a;
7222
7223varDecl(hasType(qualType(referenceType()))))) will not match the
7224declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
7225</pre></td></tr>
7226
7227
7228<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>
7229<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
7230matches the given matcher.
7231
7232The associated declaration is:
7233- for type nodes, the declaration of the underlying type
7234- for CallExpr, the declaration of the callee
7235- for MemberExpr, the declaration of the referenced member
7236- for CXXConstructExpr, the declaration of the constructor
7237- for CXXNewExpr, the declaration of the operator new
7238- for ObjCIvarExpr, the declaration of the ivar
7239
7240For type nodes, hasDeclaration will generally match the declaration of the
7241sugared type. Given
7242  class X {};
7243  typedef X Y;
7244  Y y;
7245in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7246typedefDecl. A common use case is to match the underlying, desugared type.
7247This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7248  varDecl(hasType(hasUnqualifiedDesugaredType(
7249      recordType(hasDeclaration(decl())))))
7250In this matcher, the decl will match the CXXRecordDecl of class X.
7251
7252Usable 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;,
7253  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;,
7254  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;,
7255  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;,
7256  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;,
7257  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;,
7258  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7259</pre></td></tr>
7260
7261
7262<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>
7263<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
7264
7265Given
7266  void (*fp)(void);
7267The matcher
7268  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
7269would match the declaration for fp.
7270</pre></td></tr>
7271
7272
7273<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>
7274<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
7275</pre></td></tr>
7276
7277
7278<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>
7279<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
7280matches the specified matcher.
7281
7282Example matches y-&gt;x()
7283  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
7284     cxxRecordDecl(hasName("Y")))))))
7285  class Y { public: void x(); };
7286  void z() { Y *y; y-&gt;x(); }
7287</pre></td></tr>
7288
7289
7290<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>
7291<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
7292</pre></td></tr>
7293
7294
7295<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>
7296<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
7297type matches the specified matcher.
7298
7299Example matches X &amp;x and const X &amp;y
7300    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
7301  class X {
7302    void a(X b) {
7303      X &amp;x = b;
7304      const X &amp;y = b;
7305    }
7306  };
7307</pre></td></tr>
7308
7309
7310<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>
7311<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
7312matches the given matcher.
7313
7314The associated declaration is:
7315- for type nodes, the declaration of the underlying type
7316- for CallExpr, the declaration of the callee
7317- for MemberExpr, the declaration of the referenced member
7318- for CXXConstructExpr, the declaration of the constructor
7319- for CXXNewExpr, the declaration of the operator new
7320- for ObjCIvarExpr, the declaration of the ivar
7321
7322For type nodes, hasDeclaration will generally match the declaration of the
7323sugared type. Given
7324  class X {};
7325  typedef X Y;
7326  Y y;
7327in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7328typedefDecl. A common use case is to match the underlying, desugared type.
7329This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7330  varDecl(hasType(hasUnqualifiedDesugaredType(
7331      recordType(hasDeclaration(decl())))))
7332In this matcher, the decl will match the CXXRecordDecl of class X.
7333
7334Usable 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;,
7335  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;,
7336  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;,
7337  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;,
7338  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;,
7339  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;,
7340  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7341</pre></td></tr>
7342
7343
7344<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>
7345<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
7346pointee matches a given matcher.
7347
7348Given
7349  int *a;
7350  int const *b;
7351  float const *f;
7352pointerType(pointee(isConstQualified(), isInteger()))
7353  matches "int const *b"
7354
7355Usable 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;,
7356  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;
7357</pre></td></tr>
7358
7359
7360<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>
7361<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
7362
7363Given
7364  return a + b;
7365hasReturnValue(binaryOperator())
7366  matches 'return a + b'
7367with binaryOperator()
7368  matching 'a + b'
7369</pre></td></tr>
7370
7371
7372<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>
7373<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
7374a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7375
7376Given
7377  { {}; 1+2; }
7378hasAnySubstatement(compoundStmt())
7379  matches '{ {}; 1+2; }'
7380with compoundStmt()
7381  matching '{}'
7382</pre></td></tr>
7383
7384
7385<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>
7386<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7387alignof.
7388</pre></td></tr>
7389
7390
7391<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>
7392<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
7393
7394Given:
7395F&amp; operator=(const F&amp; o) {
7396  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
7397  return *this;
7398}
7399returnStmt(forFunction(hasName("operator=")))
7400  matches 'return *this'
7401  but does not match 'return v &gt; 0'
7402</pre></td></tr>
7403
7404
7405<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>
7406<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7407sizeof.
7408</pre></td></tr>
7409
7410
7411<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>
7412<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
7413type that matches the provided matcher.
7414
7415Given
7416  template &lt;typename T&gt;
7417  double F(T t);
7418  int i;
7419  double j = F(i);
7420
7421substTemplateTypeParmType(hasReplacementType(type())) matches int
7422</pre></td></tr>
7423
7424
7425<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>
7426<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
7427statement. This matcher may produce multiple matches.
7428
7429Given
7430  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
7431switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
7432  matches four times, with "c" binding each of "case 1:", "case 2:",
7433"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
7434"switch (1)", "switch (2)" and "switch (2)".
7435</pre></td></tr>
7436
7437
7438<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>
7439<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
7440switch statement or conditional operator.
7441
7442Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7443  if (true) {}
7444</pre></td></tr>
7445
7446
7447<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>
7448<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
7449
7450Given:
7451 void foo() {
7452   if (int i = foobar(); i &gt; 0) {}
7453   switch (int i = foobar(); i) {}
7454   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7455 }
7456 void bar() {
7457   if (foobar() &gt; 0) {}
7458   switch (foobar()) {}
7459   for (auto&amp; x : get_range()) {}
7460 }
7461ifStmt(hasInitStatement(anything()))
7462  matches the if statement in foo but not in bar.
7463switchStmt(hasInitStatement(anything()))
7464  matches the switch statement in foo but not in bar.
7465cxxForRangeStmt(hasInitStatement(anything()))
7466  matches the range for statement in foo but not in bar.
7467</pre></td></tr>
7468
7469
7470<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>
7471<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
7472matches the given matcher.
7473
7474The associated declaration is:
7475- for type nodes, the declaration of the underlying type
7476- for CallExpr, the declaration of the callee
7477- for MemberExpr, the declaration of the referenced member
7478- for CXXConstructExpr, the declaration of the constructor
7479- for CXXNewExpr, the declaration of the operator new
7480- for ObjCIvarExpr, the declaration of the ivar
7481
7482For type nodes, hasDeclaration will generally match the declaration of the
7483sugared type. Given
7484  class X {};
7485  typedef X Y;
7486  Y y;
7487in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7488typedefDecl. A common use case is to match the underlying, desugared type.
7489This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7490  varDecl(hasType(hasUnqualifiedDesugaredType(
7491      recordType(hasDeclaration(decl())))))
7492In this matcher, the decl will match the CXXRecordDecl of class X.
7493
7494Usable 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;,
7495  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;,
7496  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;,
7497  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;,
7498  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;,
7499  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;,
7500  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7501</pre></td></tr>
7502
7503
7504<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>
7505<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
7506
7507Given
7508  struct B { int next; };
7509  template&lt;int(B::*next_ptr)&gt; struct A {};
7510  A&lt;&amp;B::next&gt; a;
7511templateSpecializationType(hasAnyTemplateArgument(
7512  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
7513  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7514    B::next
7515</pre></td></tr>
7516
7517
7518<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>
7519<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
7520declaration.
7521
7522Given
7523  struct B { int next; };
7524  template&lt;int(B::*next_ptr)&gt; struct A {};
7525  A&lt;&amp;B::next&gt; a;
7526classTemplateSpecializationDecl(hasAnyTemplateArgument(
7527    refersToDeclaration(fieldDecl(hasName("next")))))
7528  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7529    B::next
7530</pre></td></tr>
7531
7532
7533<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>
7534<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
7535
7536Given
7537  template&lt;int T&gt; struct C {};
7538  C&lt;42&gt; c;
7539classTemplateSpecializationDecl(
7540  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
7541  matches the implicit instantiation of C in C&lt;42&gt;.
7542</pre></td></tr>
7543
7544
7545<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>
7546<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
7547
7548Given
7549  template&lt;template &lt;typename&gt; class S&gt; class X {};
7550  template&lt;typename T&gt; class Y {};
7551  X&lt;Y&gt; xi;
7552classTemplateSpecializationDecl(hasAnyTemplateArgument(
7553    refersToTemplate(templateName())))
7554  matches the specialization X&lt;Y&gt;
7555</pre></td></tr>
7556
7557
7558<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>
7559<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
7560
7561Given
7562  struct X {};
7563  template&lt;typename T&gt; struct A {};
7564  A&lt;X&gt; a;
7565classTemplateSpecializationDecl(hasAnyTemplateArgument(
7566    refersToType(class(hasName("X")))))
7567  matches the specialization A&lt;X&gt;
7568</pre></td></tr>
7569
7570
7571<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>
7572<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7573functionDecl that have at least one TemplateArgument matching the given
7574InnerMatcher.
7575
7576Given
7577  template&lt;typename T&gt; class A {};
7578  template&lt;&gt; class A&lt;double&gt; {};
7579  A&lt;int&gt; a;
7580
7581  template&lt;typename T&gt; f() {};
7582  void func() { f&lt;int&gt;(); };
7583
7584classTemplateSpecializationDecl(hasAnyTemplateArgument(
7585    refersToType(asString("int"))))
7586  matches the specialization A&lt;int&gt;
7587
7588functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7589  matches the specialization f&lt;int&gt;
7590</pre></td></tr>
7591
7592
7593<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>
7594<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
7595matches the given matcher.
7596
7597The associated declaration is:
7598- for type nodes, the declaration of the underlying type
7599- for CallExpr, the declaration of the callee
7600- for MemberExpr, the declaration of the referenced member
7601- for CXXConstructExpr, the declaration of the constructor
7602- for CXXNewExpr, the declaration of the operator new
7603- for ObjCIvarExpr, the declaration of the ivar
7604
7605For type nodes, hasDeclaration will generally match the declaration of the
7606sugared type. Given
7607  class X {};
7608  typedef X Y;
7609  Y y;
7610in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7611typedefDecl. A common use case is to match the underlying, desugared type.
7612This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7613  varDecl(hasType(hasUnqualifiedDesugaredType(
7614      recordType(hasDeclaration(decl())))))
7615In this matcher, the decl will match the CXXRecordDecl of class X.
7616
7617Usable 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;,
7618  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;,
7619  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;,
7620  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;,
7621  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;,
7622  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;,
7623  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7624</pre></td></tr>
7625
7626
7627<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>
7628<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7629functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7630
7631Given
7632  template&lt;typename T, typename U&gt; class A {};
7633  A&lt;bool, int&gt; b;
7634  A&lt;int, bool&gt; c;
7635
7636  template&lt;typename T&gt; void f() {}
7637  void func() { f&lt;int&gt;(); };
7638classTemplateSpecializationDecl(hasTemplateArgument(
7639    1, refersToType(asString("int"))))
7640  matches the specialization A&lt;bool, int&gt;
7641
7642functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7643  matches the specialization f&lt;int&gt;
7644</pre></td></tr>
7645
7646
7647<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>
7648<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7649matches the given matcher.
7650
7651The associated declaration is:
7652- for type nodes, the declaration of the underlying type
7653- for CallExpr, the declaration of the callee
7654- for MemberExpr, the declaration of the referenced member
7655- for CXXConstructExpr, the declaration of the constructor
7656- for CXXNewExpr, the declaration of the operator new
7657- for ObjCIvarExpr, the declaration of the ivar
7658
7659For type nodes, hasDeclaration will generally match the declaration of the
7660sugared type. Given
7661  class X {};
7662  typedef X Y;
7663  Y y;
7664in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7665typedefDecl. A common use case is to match the underlying, desugared type.
7666This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7667  varDecl(hasType(hasUnqualifiedDesugaredType(
7668      recordType(hasDeclaration(decl())))))
7669In this matcher, the decl will match the CXXRecordDecl of class X.
7670
7671Usable 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;,
7672  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;,
7673  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;,
7674  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;,
7675  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;,
7676  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;,
7677  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7678</pre></td></tr>
7679
7680
7681<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>
7682<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7683QualType-matcher matches.
7684</pre></td></tr>
7685
7686
7687<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>
7688<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7689matcher.
7690
7691Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7692            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7693            and U (matcher = typedefDecl(hasType(asString("int")))
7694            and friend class X (matcher = friendDecl(hasType("X"))
7695 class X {};
7696 void y(X &amp;x) { x; X z; }
7697 typedef int U;
7698 class Y { friend class X; };
7699</pre></td></tr>
7700
7701
7702<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>
7703<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7704matches the given matcher.
7705
7706The associated declaration is:
7707- for type nodes, the declaration of the underlying type
7708- for CallExpr, the declaration of the callee
7709- for MemberExpr, the declaration of the referenced member
7710- for CXXConstructExpr, the declaration of the constructor
7711- for CXXNewExpr, the declaration of the operator new
7712- for ObjCIvarExpr, the declaration of the ivar
7713
7714For type nodes, hasDeclaration will generally match the declaration of the
7715sugared type. Given
7716  class X {};
7717  typedef X Y;
7718  Y y;
7719in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7720typedefDecl. A common use case is to match the underlying, desugared type.
7721This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7722  varDecl(hasType(hasUnqualifiedDesugaredType(
7723      recordType(hasDeclaration(decl())))))
7724In this matcher, the decl will match the CXXRecordDecl of class X.
7725
7726Usable 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;,
7727  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;,
7728  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;,
7729  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;,
7730  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;,
7731  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;,
7732  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7733</pre></td></tr>
7734
7735
7736<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>
7737<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7738type of the matched node.
7739
7740For example, in:
7741  class A {};
7742  using B = A;
7743The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7744both B and A.
7745</pre></td></tr>
7746
7747
7748<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>
7749<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7750
7751Given
7752  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7753unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7754  matches sizeof(a) and alignof(c)
7755</pre></td></tr>
7756
7757
7758<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>
7759<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7760
7761Example matches true (matcher = hasUnaryOperand(
7762                                  cxxBoolLiteral(equals(true))))
7763  !true
7764</pre></td></tr>
7765
7766
7767<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>
7768<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7769given matcher. Implicit object expressions are included; that is, it matches
7770use of implicit `this`.
7771
7772Given
7773  struct X {
7774    int m;
7775    int f(X x) { x.m; return m; }
7776  };
7777memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7778  matches `x.m`, but not `m`; however,
7779memberExpr(hasObjectExpression(hasType(pointsTo(
7780     cxxRecordDecl(hasName("X"))))))
7781  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7782</pre></td></tr>
7783
7784
7785<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>
7786<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7787matches the given matcher.
7788
7789The associated declaration is:
7790- for type nodes, the declaration of the underlying type
7791- for CallExpr, the declaration of the callee
7792- for MemberExpr, the declaration of the referenced member
7793- for CXXConstructExpr, the declaration of the constructor
7794- for CXXNewExpr, the declaration of the operator new
7795- for ObjCIvarExpr, the declaration of the ivar
7796
7797For type nodes, hasDeclaration will generally match the declaration of the
7798sugared type. Given
7799  class X {};
7800  typedef X Y;
7801  Y y;
7802in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7803typedefDecl. A common use case is to match the underlying, desugared type.
7804This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7805  varDecl(hasType(hasUnqualifiedDesugaredType(
7806      recordType(hasDeclaration(decl())))))
7807In this matcher, the decl will match the CXXRecordDecl of class X.
7808
7809Usable 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;,
7810  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;,
7811  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;,
7812  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;,
7813  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;,
7814  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;,
7815  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7816</pre></td></tr>
7817
7818
7819<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</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>
7820<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7821
7822Given
7823  namespace X { void b(); }
7824  using X::b;
7825usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7826  matches using X::b </pre></td></tr>
7827
7828
7829<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>
7830<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7831matched by the given matcher.
7832
7833Given
7834  namespace X { int a; void b(); }
7835  using X::a;
7836  using X::b;
7837usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7838  matches using X::b but not using X::a </pre></td></tr>
7839
7840
7841<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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>
7842<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7843declaration's type.
7844
7845In case of a value declaration (for example a variable declaration),
7846this resolves one layer of indirection. For example, in the value
7847declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7848X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7849declaration of x.
7850
7851Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7852            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7853            and friend class X (matcher = friendDecl(hasType("X"))
7854 class X {};
7855 void y(X &amp;x) { x; X z; }
7856 class Y { friend class X; };
7857
7858Example matches class Derived
7859(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7860class Base {};
7861class Derived : Base {};
7862
7863Usable 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;,
7864Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7865</pre></td></tr>
7866
7867
7868<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>
7869<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7870matcher.
7871
7872Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7873            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7874            and U (matcher = typedefDecl(hasType(asString("int")))
7875            and friend class X (matcher = friendDecl(hasType("X"))
7876 class X {};
7877 void y(X &amp;x) { x; X z; }
7878 typedef int U;
7879 class Y { friend class X; };
7880</pre></td></tr>
7881
7882
7883<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>
7884<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7885that matches the given matcher.
7886
7887Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7888  bool y() { return true; }
7889  bool x = y();
7890</pre></td></tr>
7891
7892
7893<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>
7894<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7895expression.
7896
7897Given
7898  void f(int b) {
7899    int a[b];
7900  }
7901variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7902  varDecl(hasName("b")))))))
7903  matches "int a[b]"
7904</pre></td></tr>
7905
7906
7907<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>
7908<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7909definition that has a given body.
7910
7911Given
7912  for (;;) {}
7913hasBody(compoundStmt())
7914  matches 'for (;;) {}'
7915with compoundStmt()
7916  matching '{}'
7917</pre></td></tr>
7918
7919
7920<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>
7921<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
7922switch statement or conditional operator.
7923
7924Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7925  if (true) {}
7926</pre></td></tr>
7927
7928<!--END_TRAVERSAL_MATCHERS -->
7929</table>
7930
7931</div>
7932</body>
7933</html>
7934
7935
7936