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>std::string RegExp</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</pre></td></tr>
3023
3024
3025<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>
3026<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3027
3028Example matches X but not Y
3029  (matcher = cxxRecordDecl(isExpansionInMainFile())
3030  #include &lt;Y.h&gt;
3031  class X {};
3032Y.h:
3033  class Y {};
3034
3035Usable 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;
3036</pre></td></tr>
3037
3038
3039<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>
3040<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3041
3042Example matches Y but not X
3043    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3044  #include &lt;SystemHeader.h&gt;
3045  class X {};
3046SystemHeader.h:
3047  class Y {};
3048
3049Usable 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;
3050</pre></td></tr>
3051
3052
3053<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>
3054<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3055by the compiler (eg. implicit default/copy constructors).
3056</pre></td></tr>
3057
3058
3059<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>
3060<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3061
3062Given
3063  class vector {};
3064  namespace foo {
3065    class vector {};
3066    namespace std {
3067      class vector {};
3068    }
3069  }
3070  namespace std {
3071    inline namespace __1 {
3072      class vector {}; // #1
3073      namespace experimental {
3074        class vector {};
3075      }
3076    }
3077  }
3078cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3079</pre></td></tr>
3080
3081
3082<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>
3083<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3084template instantiations.
3085
3086Given
3087  template&lt;typename T&gt; void A(T t) { T i; }
3088  A(0);
3089  A(0U);
3090functionDecl(isInstantiated())
3091  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3092</pre></td></tr>
3093
3094
3095<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>
3096<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3097inheritance.
3098
3099Examples:
3100  class C {
3101  public:    int a;
3102  protected: int b;
3103  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3104  };
3105
3106  struct Base {};
3107  struct Derived1 : private Base {}; // matches 'Base'
3108  class Derived2 : Base {}; // matches 'Base'
3109</pre></td></tr>
3110
3111
3112<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>
3113<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3114protected inheritance.
3115
3116Examples:
3117  class C {
3118  public:    int a;
3119  protected: int b; // fieldDecl(isProtected()) matches 'b'
3120  private:   int c;
3121  };
3122
3123  class Base {};
3124  class Derived : protected Base {}; // matches 'Base'
3125</pre></td></tr>
3126
3127
3128<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>
3129<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3130inheritance.
3131
3132Examples:
3133  class C {
3134  public:    int a; // fieldDecl(isPublic()) matches 'a'
3135  protected: int b;
3136  private:   int c;
3137  };
3138
3139  class Base {};
3140  class Derived1 : public Base {}; // matches 'Base'
3141  struct Derived2 : Base {}; // matches 'Base'
3142</pre></td></tr>
3143
3144
3145<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>
3146<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3147a specific number of designators.
3148
3149Example: Given
3150  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3151  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3152designatorCountIs(2)
3153  matches '{ [2].y = 1.0, [0].x = 1.0 }',
3154  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3155</pre></td></tr>
3156
3157
3158<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>
3159<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3160
3161Example matches Y (matcher = enumDecl(isScoped()))
3162enum X {};
3163enum class Y {};
3164</pre></td></tr>
3165
3166
3167<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>
3168<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3169neither type- nor value-dependent.
3170
3171In the following example, the expression sizeof(sizeof(T() + T()))
3172is instantiation-dependent (since it involves a template parameter T),
3173but is neither type- nor value-dependent, since the type of the inner
3174sizeof is known (std::size_t) and therefore the size of the outer
3175sizeof is known.
3176  template&lt;typename T&gt;
3177  void f(T x, T y) { sizeof(sizeof(T() + T()); }
3178expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3179</pre></td></tr>
3180
3181
3182<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>
3183<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3184is not yet instantiated.
3185
3186For example, the expressions "x" and "x + y" are type-dependent in
3187the following code, but "y" is not type-dependent:
3188  template&lt;typename T&gt;
3189  void add(T x, int y) {
3190    x + y;
3191  }
3192expr(isTypeDependent()) matches x + y
3193</pre></td></tr>
3194
3195
3196<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>
3197<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3198non-type template parameter.
3199
3200For example, the array bound of "Chars" in the following example is
3201value-dependent.
3202  template&lt;int Size&gt; int f() { return Size; }
3203expr(isValueDependent()) matches return Size
3204</pre></td></tr>
3205
3206
3207<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>
3208<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3209GNU's __null, C++11's nullptr, or C's NULL macro.
3210
3211Given:
3212  void *v1 = NULL;
3213  void *v2 = nullptr;
3214  void *v3 = __null; // GNU extension
3215  char *cp = (char *)0;
3216  int *ip = 0;
3217  int i = 0;
3218expr(nullPointerConstant())
3219  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3220  initializer for i.
3221</pre></td></tr>
3222
3223
3224<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>
3225<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3226bit width.
3227
3228Given
3229  class C {
3230    int a : 2;
3231    int b : 4;
3232    int c : 2;
3233  };
3234fieldDecl(hasBitWidth(2))
3235  matches 'int a;' and 'int c;' but not 'int b;'.
3236</pre></td></tr>
3237
3238
3239<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>
3240<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3241
3242Given
3243  class C {
3244    int a : 2;
3245    int b;
3246  };
3247fieldDecl(isBitField())
3248  matches 'int a;' but not 'int b;'.
3249</pre></td></tr>
3250
3251
3252<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>
3253<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
3254
3255Given
3256  f('false, 3.14, 42);
3257characterLiteral(equals(0))
3258  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3259  match false
3260floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3261  match 3.14
3262integerLiteral(equals(42))
3263  matches 42
3264
3265Note that you cannot directly match a negative numeric literal because the
3266minus sign is not part of the literal: It is a unary operator whose operand
3267is the positive numeric literal. Instead, you must use a unaryOperator()
3268matcher to match the minus sign:
3269
3270unaryOperator(hasOperatorName("-"),
3271              hasUnaryOperand(integerLiteral(equals(13))))
3272
3273Usable 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;,
3274           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;
3275</pre></td></tr>
3276
3277
3278<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>
3279<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3280
3281
3282<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>
3283<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
3284
3285Matches overloaded operator names specified in strings without the
3286"operator" prefix: e.g. "&lt;&lt;".
3287
3288  hasAnyOverloadesOperatorName("+", "-")
3289Is equivalent to
3290  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3291</pre></td></tr>
3292
3293
3294<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>
3295<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3296
3297Given:
3298  void f();
3299  void g() noexcept;
3300  void h() noexcept(true);
3301  void i() noexcept(false);
3302  void j() throw();
3303  void k() throw(int);
3304  void l() throw(...);
3305functionDecl(hasDynamicExceptionSpec()) and
3306  functionProtoType(hasDynamicExceptionSpec())
3307  match the declarations of j, k, and l, but not f, g, h, or i.
3308</pre></td></tr>
3309
3310
3311<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>
3312<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3313
3314Matches overloaded operator names specified in strings without the
3315"operator" prefix: e.g. "&lt;&lt;".
3316
3317Given:
3318  class A { int operator*(); };
3319  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3320  A a;
3321  a &lt;&lt; a;   // &lt;-- This matches
3322
3323cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3324specified line and
3325cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3326matches the declaration of A.
3327
3328Usable 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;
3329</pre></td></tr>
3330
3331
3332<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>
3333<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3334
3335Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3336int X() {}
3337auto Y() -&gt; int {}
3338</pre></td></tr>
3339
3340
3341<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>
3342<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3343       and if constexpr.
3344
3345Given:
3346  constexpr int foo = 42;
3347  constexpr int bar();
3348  void baz() { if constexpr(1 &gt; 0) {} }
3349varDecl(isConstexpr())
3350  matches the declaration of foo.
3351functionDecl(isConstexpr())
3352  matches the declaration of bar.
3353ifStmt(isConstexpr())
3354  matches the if statement in baz.
3355</pre></td></tr>
3356
3357
3358<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>
3359<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3360
3361Given:
3362  class A { ~A(); };
3363  class B { ~B() = default; };
3364functionDecl(isDefaulted())
3365  matches the declaration of ~B, but not ~A.
3366</pre></td></tr>
3367
3368
3369<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>
3370<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
3371
3372Example matches A, va, fa
3373  class A {};
3374  class B;  // Doesn't match, as it has no body.
3375  int va;
3376  extern int vb;  // Doesn't match, as it doesn't define the variable.
3377  void fa() {}
3378  void fb();  // Doesn't match, as it has no body.
3379  @interface X
3380  - (void)ma; // Doesn't match, interface is declaration.
3381  @end
3382  @implementation X
3383  - (void)ma {}
3384  @end
3385
3386Usable 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;,
3387  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3388</pre></td></tr>
3389
3390
3391<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>
3392<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3393
3394Given:
3395  void Func();
3396  void DeletedFunc() = delete;
3397functionDecl(isDeleted())
3398  matches the declaration of DeletedFunc, but not Func.
3399</pre></td></tr>
3400
3401
3402<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>
3403<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3404static member variable template instantiations.
3405
3406Given
3407  template&lt;typename T&gt; void A(T t) { }
3408  template&lt;&gt; void A(int N) { }
3409functionDecl(isExplicitTemplateSpecialization())
3410  matches the specialization A&lt;int&gt;().
3411
3412Usable 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;
3413</pre></td></tr>
3414
3415
3416<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>
3417<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
3418
3419Given:
3420  extern "C" void f() {}
3421  extern "C" { void g() {} }
3422  void h() {}
3423  extern "C" int x = 1;
3424  extern "C" int y = 2;
3425  int z = 3;
3426functionDecl(isExternC())
3427  matches the declaration of f and g, but not the declaration of h.
3428varDecl(isExternC())
3429  matches the declaration of x and y, but not the declaration of z.
3430</pre></td></tr>
3431
3432
3433<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>
3434<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3435the inline keyword.
3436
3437Given
3438  inline void f();
3439  void g();
3440  namespace n {
3441  inline namespace m {}
3442  }
3443functionDecl(isInline()) will match ::f().
3444namespaceDecl(isInline()) will match n::m.
3445</pre></td></tr>
3446
3447
3448<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>
3449<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3450into an executable program.
3451</pre></td></tr>
3452
3453
3454<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>
3455<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3456
3457Given
3458  void nope();
3459  [[noreturn]] void a();
3460  __attribute__((noreturn)) void b();
3461  struct c { [[noreturn]] c(); };
3462functionDecl(isNoReturn())
3463  matches all of those except
3464  void nope();
3465</pre></td></tr>
3466
3467
3468<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>
3469<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3470
3471Given:
3472  void f();
3473  void g() noexcept;
3474  void h() throw();
3475  void i() throw(int);
3476  void j() noexcept(false);
3477functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3478  match the declarations of g, and h, but not f, i or j.
3479</pre></td></tr>
3480
3481
3482<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>
3483<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
3484class specifier ("static" keyword) written in the source.
3485
3486Given:
3487  static void f() {}
3488  static int i = 0;
3489  extern int j;
3490  int k;
3491functionDecl(isStaticStorageClass())
3492  matches the function declaration f.
3493varDecl(isStaticStorageClass())
3494  matches the variable declaration i.
3495</pre></td></tr>
3496
3497
3498<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>
3499<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3500member variable template instantiations.
3501
3502Given
3503  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3504or
3505  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3506or
3507  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3508cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3509  matches the template instantiation of X&lt;A&gt;.
3510
3511But given
3512  template &lt;typename T&gt;  class X {}; class A {};
3513  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3514cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3515  does not match, as X&lt;A&gt; is an explicit template specialization.
3516
3517Usable 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;
3518</pre></td></tr>
3519
3520
3521<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>
3522<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3523
3524Example matches f, but not g or h. The function i will not match, even when
3525compiled in C mode.
3526  void f(...);
3527  void g(int);
3528  template &lt;typename... Ts&gt; void h(Ts...);
3529  void i();
3530</pre></td></tr>
3531
3532
3533<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>
3534<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3535specific parameter count.
3536
3537Given
3538  void f(int i) {}
3539  void g(int i, int j) {}
3540  void h(int i, int j);
3541  void j(int i);
3542  void k(int x, int y, int z, ...);
3543functionDecl(parameterCountIs(2))
3544  matches g and h
3545functionProtoType(parameterCountIs(2))
3546  matches g and h
3547functionProtoType(parameterCountIs(3))
3548  matches k
3549</pre></td></tr>
3550
3551
3552<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>
3553<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3554
3555Given:
3556  void f();
3557  void g() noexcept;
3558  void h() noexcept(true);
3559  void i() noexcept(false);
3560  void j() throw();
3561  void k() throw(int);
3562  void l() throw(...);
3563functionDecl(hasDynamicExceptionSpec()) and
3564  functionProtoType(hasDynamicExceptionSpec())
3565  match the declarations of j, k, and l, but not f, g, h, or i.
3566</pre></td></tr>
3567
3568
3569<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>
3570<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3571
3572Given:
3573  void f();
3574  void g() noexcept;
3575  void h() throw();
3576  void i() throw(int);
3577  void j() noexcept(false);
3578functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3579  match the declarations of g, and h, but not f, i or j.
3580</pre></td></tr>
3581
3582
3583<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>
3584<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3585specific parameter count.
3586
3587Given
3588  void f(int i) {}
3589  void g(int i, int j) {}
3590  void h(int i, int j);
3591  void j(int i);
3592  void k(int x, int y, int z, ...);
3593functionDecl(parameterCountIs(2))
3594  matches g and h
3595functionProtoType(parameterCountIs(2))
3596  matches g and h
3597functionProtoType(parameterCountIs(3))
3598  matches k
3599</pre></td></tr>
3600
3601
3602<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>
3603<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3604       and if constexpr.
3605
3606Given:
3607  constexpr int foo = 42;
3608  constexpr int bar();
3609  void baz() { if constexpr(1 &gt; 0) {} }
3610varDecl(isConstexpr())
3611  matches the declaration of foo.
3612functionDecl(isConstexpr())
3613  matches the declaration of bar.
3614ifStmt(isConstexpr())
3615  matches the if statement in baz.
3616</pre></td></tr>
3617
3618
3619<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>
3620<tr><td colspan="4" class="doc" id="equals6"><pre></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('equals0')"><a name="equals0Anchor">equals</a></td><td>const ValueT  Value</td></tr>
3624<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3625
3626Given
3627  f('false, 3.14, 42);
3628characterLiteral(equals(0))
3629  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3630  match false
3631floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3632  match 3.14
3633integerLiteral(equals(42))
3634  matches 42
3635
3636Note that you cannot directly match a negative numeric literal because the
3637minus sign is not part of the literal: It is a unary operator whose operand
3638is the positive numeric literal. Instead, you must use a unaryOperator()
3639matcher to match the minus sign:
3640
3641unaryOperator(hasOperatorName("-"),
3642              hasUnaryOperand(integerLiteral(equals(13))))
3643
3644Usable 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;,
3645           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;
3646</pre></td></tr>
3647
3648
3649<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>
3650<tr><td colspan="4" class="doc" id="equals13"><pre></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('equals9')"><a name="equals9Anchor">equals</a></td><td>unsigned Value</td></tr>
3654<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3655
3656
3657<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>
3658<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3659to '.'.
3660
3661Member calls on the implicit this pointer match as called with '-&gt;'.
3662
3663Given
3664  class Y {
3665    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3666    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3667    int a;
3668    static int b;
3669  };
3670  template &lt;class T&gt;
3671  class Z {
3672    void x() { this-&gt;m; }
3673  };
3674memberExpr(isArrow())
3675  matches this-&gt;x, x, y.x, a, this-&gt;b
3676cxxDependentScopeMemberExpr(isArrow())
3677  matches this-&gt;m
3678unresolvedMemberExpr(isArrow())
3679  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3680</pre></td></tr>
3681
3682
3683<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>
3684<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3685
3686This matcher is only provided as a performance optimization of hasName.
3687    hasAnyName(a, b, c)
3688 is equivalent to, but faster than
3689    anyOf(hasName(a), hasName(b), hasName(c))
3690</pre></td></tr>
3691
3692
3693<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>
3694<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3695
3696Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3697void f() {
3698  int x;
3699  static int y;
3700}
3701int z;
3702
3703Example matches f() because it has external formal linkage despite being
3704unique to the translation unit as though it has internal likage
3705(matcher = functionDecl(hasExternalFormalLinkage()))
3706
3707namespace {
3708void f() {}
3709}
3710</pre></td></tr>
3711
3712
3713<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>
3714<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3715
3716Supports specifying enclosing namespaces or classes by prefixing the name
3717with '&lt;enclosing&gt;::'.
3718Does not match typedefs of an underlying type with the given name.
3719
3720Example matches X (Name == "X")
3721  class X;
3722
3723Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3724  namespace a { namespace b { class X; } }
3725</pre></td></tr>
3726
3727
3728<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>std::string RegExp</td></tr>
3729<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3730a substring matched by the given RegExp.
3731
3732Supports specifying enclosing namespaces or classes by
3733prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3734of an underlying type with the given name.
3735
3736Example matches X (regexp == "::X")
3737  class X;
3738
3739Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3740  namespace foo { namespace bar { class X; } }
3741</pre></td></tr>
3742
3743
3744<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>
3745<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3746
3747Given
3748  namespace n {
3749  namespace {} // #1
3750  }
3751namespaceDecl(isAnonymous()) will match #1 but not ::n.
3752</pre></td></tr>
3753
3754
3755<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>
3756<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3757the inline keyword.
3758
3759Given
3760  inline void f();
3761  void g();
3762  namespace n {
3763  inline namespace m {}
3764  }
3765functionDecl(isInline()) will match ::f().
3766namespaceDecl(isInline()) will match n::m.
3767</pre></td></tr>
3768
3769
3770<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>
3771<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3772
3773Given
3774
3775  #pragma omp parallel
3776  #pragma omp parallel default(none)
3777  #pragma omp parallel default(shared)
3778
3779``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3780</pre></td></tr>
3781
3782
3783<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>
3784<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3785
3786Given
3787
3788  #pragma omp parallel
3789  #pragma omp parallel default(none)
3790  #pragma omp parallel default(shared)
3791
3792``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3793</pre></td></tr>
3794
3795
3796<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>
3797<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3798clause kind.
3799
3800Given
3801
3802  #pragma omp parallel
3803  #pragma omp parallel for
3804  #pragma omp          for
3805
3806`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3807``omp parallel`` and ``omp parallel for``.
3808
3809If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3810should be passed as a quoted string. e.g.,
3811``isAllowedToContainClauseKind("OMPC_default").``
3812</pre></td></tr>
3813
3814
3815<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>
3816<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3817i.e., directives that can't have a structured block.
3818
3819Given
3820
3821  #pragma omp parallel
3822  {}
3823  #pragma omp taskyield
3824
3825``ompExecutableDirective(isStandaloneDirective()))`` matches
3826``omp taskyield``.
3827</pre></td></tr>
3828
3829
3830<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>
3831<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3832</pre></td></tr>
3833
3834
3835<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>
3836<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3837</pre></td></tr>
3838
3839
3840<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>
3841<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
3842isSameOrDerivedFrom(hasName(...)).
3843</pre></td></tr>
3844
3845
3846<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>
3847<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3848a specific number of arguments (including absent default arguments).
3849
3850Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3851  void f(int x, int y);
3852  f(0, 0);
3853</pre></td></tr>
3854
3855
3856<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>
3857<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
3858Selector.getAsString()
3859
3860 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
3861 matches both of the expressions below:
3862    [myObj methodA:argA];
3863    [myObj methodB:argB];
3864</pre></td></tr>
3865
3866
3867<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>
3868<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3869
3870objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3871message expression in
3872
3873  UIWebView *webView = ...;
3874  CGRect bodyFrame = webView.frame;
3875  bodyFrame.size.height = self.bodyContentHeight;
3876  webView.frame = bodyFrame;
3877  //     ^---- matches here
3878</pre></td></tr>
3879
3880
3881<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>
3882<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3883
3884Matches only when the selector of the objCMessageExpr is NULL. This may
3885represent an error condition in the tree!
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('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
3890<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3891
3892 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3893 matches the outer message expr in the code below, but NOT the message
3894 invocation for self.bodyView.
3895    [self.bodyView loadHTMLString:html baseURL:NULL];
3896</pre></td></tr>
3897
3898
3899<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>
3900<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3901
3902 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3903 matches self.bodyView in the code below, but NOT the outer message
3904 invocation of "loadHTMLString:baseURL:".
3905    [self.bodyView loadHTMLString:html baseURL:NULL];
3906</pre></td></tr>
3907
3908
3909<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>
3910<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3911
3912Example
3913matcher = objcMessageExpr(isClassMessage())
3914matches
3915  [NSString stringWithFormat:@"format"];
3916but not
3917  NSString *x = @"hello";
3918  [x containsString:@"h"];
3919</pre></td></tr>
3920
3921
3922<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>
3923<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3924
3925Example
3926matcher = objcMessageExpr(isInstanceMessage())
3927matches
3928  NSString *x = @"hello";
3929  [x containsString:@"h"];
3930but not
3931  [NSString stringWithFormat:@"format"];
3932</pre></td></tr>
3933
3934
3935<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>std::string RegExp</td></tr>
3936<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3937a substring matched by the given RegExp.
3938 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3939 invocation for self.bodyView.
3940    [self.bodyView loadHTMLString:html baseURL:NULL];
3941</pre></td></tr>
3942
3943
3944<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>
3945<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3946
3947 matcher = objCMessageExpr(numSelectorArgs(0));
3948 matches self.bodyView in the code below
3949
3950 matcher = objCMessageExpr(numSelectorArgs(2));
3951 matches the invocation of "loadHTMLString:baseURL:" but not that
3952 of self.bodyView
3953    [self.bodyView loadHTMLString:html baseURL:NULL];
3954</pre></td></tr>
3955
3956
3957<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>
3958<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
3959
3960Example
3961matcher = objcMethodDecl(isClassMethod())
3962matches
3963@interface I + (void)foo; @end
3964but not
3965@interface I - (void)bar; @end
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('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
3970<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3971
3972Example matches A, va, fa
3973  class A {};
3974  class B;  // Doesn't match, as it has no body.
3975  int va;
3976  extern int vb;  // Doesn't match, as it doesn't define the variable.
3977  void fa() {}
3978  void fb();  // Doesn't match, as it has no body.
3979  @interface X
3980  - (void)ma; // Doesn't match, interface is declaration.
3981  @end
3982  @implementation X
3983  - (void)ma {}
3984  @end
3985
3986Usable 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;,
3987  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3988</pre></td></tr>
3989
3990
3991<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>
3992<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
3993
3994Example
3995matcher = objcMethodDecl(isInstanceMethod())
3996matches
3997@interface I - (void)bar; @end
3998but not
3999@interface I + (void)foo; @end
4000</pre></td></tr>
4001
4002
4003<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>
4004<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4005
4006Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4007void x(int val) {}
4008void y(int val = 0) {}
4009
4010Deprecated. Use hasInitializer() instead to be able to
4011match on the contents of the default argument.  For example:
4012
4013void x(int val = 7) {}
4014void y(int val = 42) {}
4015parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4016  matches the parameter of y
4017
4018A matcher such as
4019  parmVarDecl(hasInitializer(anything()))
4020is equivalent to parmVarDecl(hasDefaultArgument()).
4021</pre></td></tr>
4022
4023
4024<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>
4025<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4026list. The parameter list could be that of either a block, function, or
4027objc-method.
4028
4029
4030Given
4031
4032void f(int a, int b, int c) {
4033}
4034
4035``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4036
4037``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4038</pre></td></tr>
4039
4040
4041<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>
4042<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4043
4044Given
4045  class Y { public: void x(); };
4046  void z() { Y* y; y-&gt;x(); }
4047cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4048  matches y-&gt;x()
4049</pre></td></tr>
4050
4051
4052<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>
4053<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4054
4055Matches a node if it equals the node previously bound to ID.
4056
4057Given
4058  class X { int a; int b; };
4059cxxRecordDecl(
4060    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4061    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4062  matches the class X, as a and b have the same type.
4063
4064Note that when multiple matches are involved via forEach* matchers,
4065equalsBoundNodes acts as a filter.
4066For example:
4067compoundStmt(
4068    forEachDescendant(varDecl().bind("d")),
4069    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4070will trigger a match for each combination of variable declaration
4071and reference to that variable declaration within a compound statement.
4072</pre></td></tr>
4073
4074
4075<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>
4076<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4077the node, not hidden within a typedef.
4078
4079Given
4080  typedef const int const_int;
4081  const_int i;
4082  int *const j;
4083  int *volatile k;
4084  int m;
4085varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4086i is const-qualified but the qualifier is not local.
4087</pre></td></tr>
4088
4089
4090<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>
4091<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4092
4093Given
4094  void a(char);
4095  void b(wchar_t);
4096  void c(double);
4097functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4098matches "a(char)", "b(wchar_t)", but not "c(double)".
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('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
4103<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4104the Objective-C object pointer type, which is different despite being
4105syntactically similar.
4106
4107Given
4108  int *i = nullptr;
4109
4110  @interface Foo
4111  @end
4112  Foo *f;
4113
4114  int j;
4115varDecl(hasType(isAnyPointer()))
4116  matches "int *i" and "Foo *f", but not "int j".
4117</pre></td></tr>
4118
4119
4120<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>
4121<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4122include "top-level" const.
4123
4124Given
4125  void a(int);
4126  void b(int const);
4127  void c(const int);
4128  void d(const int*);
4129  void e(int const) {};
4130functionDecl(hasAnyParameter(hasType(isConstQualified())))
4131  matches "void b(int const)", "void c(const int)" and
4132  "void e(int const) {}". It does not match d as there
4133  is no top-level const on the parameter type "const int *".
4134</pre></td></tr>
4135
4136
4137<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>
4138<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4139
4140Given
4141  void a(int);
4142  void b(long);
4143  void c(double);
4144functionDecl(hasAnyParameter(hasType(isInteger())))
4145matches "a(int)", "b(long)", but not "c(double)".
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('isSignedInteger0')"><a name="isSignedInteger0Anchor">isSignedInteger</a></td><td></td></tr>
4150<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4151
4152Given
4153  void a(int);
4154  void b(unsigned long);
4155  void c(double);
4156functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4157matches "a(int)", but not "b(unsigned long)" and "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('isUnsignedInteger0')"><a name="isUnsignedInteger0Anchor">isUnsignedInteger</a></td><td></td></tr>
4162<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4163
4164Given
4165  void a(int);
4166  void b(unsigned long);
4167  void c(double);
4168functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4169matches "b(unsigned long)", but not "a(int)" 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('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
4174<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4175include "top-level" volatile.
4176
4177Given
4178  void a(int);
4179  void b(int volatile);
4180  void c(volatile int);
4181  void d(volatile int*);
4182  void e(int volatile) {};
4183functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4184  matches "void b(int volatile)", "void c(volatile int)" and
4185  "void e(int volatile) {}". It does not match d as there
4186  is no top-level volatile on the parameter type "volatile int *".
4187</pre></td></tr>
4188
4189
4190<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>
4191<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4192
4193Matches a node if it equals the node previously bound to ID.
4194
4195Given
4196  class X { int a; int b; };
4197cxxRecordDecl(
4198    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4199    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4200  matches the class X, as a and b have the same type.
4201
4202Note that when multiple matches are involved via forEach* matchers,
4203equalsBoundNodes acts as a filter.
4204For example:
4205compoundStmt(
4206    forEachDescendant(varDecl().bind("d")),
4207    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4208will trigger a match for each combination of variable declaration
4209and reference to that variable declaration within a compound statement.
4210</pre></td></tr>
4211
4212
4213<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>
4214<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
4215
4216Stmt has pointer identity in the AST.
4217</pre></td></tr>
4218
4219
4220<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>
4221<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
4222Does not match if only part of the statement is expanded from that macro or
4223if different parts of the the statement are expanded from different
4224appearances of the macro.
4225
4226FIXME: Change to be a polymorphic matcher that works on any syntactic
4227node. There's nothing `Stmt`-specific about it.
4228</pre></td></tr>
4229
4230
4231<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>std::string RegExp</td></tr>
4232<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
4233partially matching a given regex.
4234
4235Example matches Y but not X
4236    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4237  #include "ASTMatcher.h"
4238  class X {};
4239ASTMatcher.h:
4240  class Y {};
4241
4242Usable 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;
4243</pre></td></tr>
4244
4245
4246<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>
4247<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
4248
4249Example matches X but not Y
4250  (matcher = cxxRecordDecl(isExpansionInMainFile())
4251  #include &lt;Y.h&gt;
4252  class X {};
4253Y.h:
4254  class Y {};
4255
4256Usable 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;
4257</pre></td></tr>
4258
4259
4260<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>
4261<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
4262
4263Example matches Y but not X
4264    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4265  #include &lt;SystemHeader.h&gt;
4266  class X {};
4267SystemHeader.h:
4268  class Y {};
4269
4270Usable 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;
4271</pre></td></tr>
4272
4273
4274<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>
4275<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4276
4277Given
4278  int j;
4279  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4280  A(0);
4281  A(0U);
4282declStmt(isInTemplateInstantiation())
4283  matches 'int i;' and 'unsigned i'.
4284unless(stmt(isInTemplateInstantiation()))
4285  will NOT match j += 42; as it's shared between the template definition and
4286  instantiation.
4287</pre></td></tr>
4288
4289
4290<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>
4291<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4292
4293Given
4294  int a[42];
4295  int b[2 * 21];
4296  int c[41], d[43];
4297  char *s = "abcd";
4298  wchar_t *ws = L"abcd";
4299  char *w = "a";
4300constantArrayType(hasSize(42))
4301  matches "int a[42]" and "int b[2 * 21]"
4302stringLiteral(hasSize(4))
4303  matches "abcd", L"abcd"
4304</pre></td></tr>
4305
4306
4307<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>
4308<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
4309
4310Example matches C, but not S, U or E.
4311  struct S {};
4312  class C {};
4313  union U {};
4314  enum E {};
4315</pre></td></tr>
4316
4317
4318<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>
4319<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4320
4321Example matches A, va, fa
4322  class A {};
4323  class B;  // Doesn't match, as it has no body.
4324  int va;
4325  extern int vb;  // Doesn't match, as it doesn't define the variable.
4326  void fa() {}
4327  void fb();  // Doesn't match, as it has no body.
4328  @interface X
4329  - (void)ma; // Doesn't match, interface is declaration.
4330  @end
4331  @implementation X
4332  - (void)ma {}
4333  @end
4334
4335Usable 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;,
4336  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4337</pre></td></tr>
4338
4339
4340<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>
4341<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
4342
4343Example matches E, but not C, S or U.
4344  struct S {};
4345  class C {};
4346  union U {};
4347  enum E {};
4348</pre></td></tr>
4349
4350
4351<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>
4352<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
4353
4354Example matches S, but not C, U or E.
4355  struct S {};
4356  class C {};
4357  union U {};
4358  enum E {};
4359</pre></td></tr>
4360
4361
4362<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>
4363<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
4364
4365Example matches U, but not C, S or E.
4366  struct S {};
4367  class C {};
4368  union U {};
4369  enum E {};
4370</pre></td></tr>
4371
4372
4373<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>
4374<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4375
4376Note that 'Value' is a string as the template argument's value is
4377an arbitrary precision integer. 'Value' must be euqal to the canonical
4378representation of that integral value in base 10.
4379
4380Given
4381  template&lt;int T&gt; struct C {};
4382  C&lt;42&gt; c;
4383classTemplateSpecializationDecl(
4384  hasAnyTemplateArgument(equalsIntegralValue("42")))
4385  matches the implicit instantiation of C in C&lt;42&gt;.
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('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
4390<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4391
4392Given
4393  template&lt;int T&gt; struct C {};
4394  C&lt;42&gt; c;
4395classTemplateSpecializationDecl(
4396  hasAnyTemplateArgument(isIntegral()))
4397  matches the implicit instantiation of C in C&lt;42&gt;
4398  with isIntegral() matching 42.
4399</pre></td></tr>
4400
4401
4402<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>
4403<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4404
4405Given
4406  template&lt;typename T&gt; struct C {};
4407  C&lt;int&gt; c;
4408classTemplateSpecializationDecl(templateArgumentCountIs(1))
4409  matches C&lt;int&gt;.
4410</pre></td></tr>
4411
4412
4413<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>std::string RegExp</td></tr>
4414<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4415partially matching a given regex.
4416
4417Example matches Y but not X
4418    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4419  #include "ASTMatcher.h"
4420  class X {};
4421ASTMatcher.h:
4422  class Y {};
4423
4424Usable 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;
4425</pre></td></tr>
4426
4427
4428<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>
4429<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4430
4431Example matches X but not Y
4432  (matcher = cxxRecordDecl(isExpansionInMainFile())
4433  #include &lt;Y.h&gt;
4434  class X {};
4435Y.h:
4436  class Y {};
4437
4438Usable 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;
4439</pre></td></tr>
4440
4441
4442<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>
4443<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4444
4445Example matches Y but not X
4446    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4447  #include &lt;SystemHeader.h&gt;
4448  class X {};
4449SystemHeader.h:
4450  class Y {};
4451
4452Usable 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;
4453</pre></td></tr>
4454
4455
4456<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>
4457<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4458
4459Given
4460 struct S { bool func(); };
4461functionDecl(returns(booleanType()))
4462  matches "bool func();"
4463</pre></td></tr>
4464
4465
4466<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>
4467<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4468
4469Matches a node if it equals the node previously bound to ID.
4470
4471Given
4472  class X { int a; int b; };
4473cxxRecordDecl(
4474    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4475    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4476  matches the class X, as a and b have the same type.
4477
4478Note that when multiple matches are involved via forEach* matchers,
4479equalsBoundNodes acts as a filter.
4480For example:
4481compoundStmt(
4482    forEachDescendant(varDecl().bind("d")),
4483    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4484will trigger a match for each combination of variable declaration
4485and reference to that variable declaration within a compound statement.
4486</pre></td></tr>
4487
4488
4489<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>
4490<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4491
4492Type has pointer identity in the AST.
4493</pre></td></tr>
4494
4495
4496<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>
4497<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4498
4499Given
4500  int i;
4501  float f;
4502realFloatingPointType()
4503  matches "float f" but not "int i"
4504</pre></td></tr>
4505
4506
4507<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>
4508<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4509
4510Given
4511 struct S { void func(); };
4512functionDecl(returns(voidType()))
4513  matches "void func();"
4514</pre></td></tr>
4515
4516
4517<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>
4518<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4519
4520Given
4521  int x;
4522  int s = sizeof(x) + alignof(x)
4523unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4524  matches sizeof(x)
4525
4526If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4527should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4528</pre></td></tr>
4529
4530
4531<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>
4532<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
4533specified names.
4534
4535   hasAnyOperatorName("+", "-")
4536 Is equivalent to
4537   anyOf(hasOperatorName("+"), hasOperatorName("-"))
4538</pre></td></tr>
4539
4540
4541<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>
4542<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4543unary).
4544
4545Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4546  !(a || b)
4547</pre></td></tr>
4548
4549
4550<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>
4551<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4552to '.'.
4553
4554Member calls on the implicit this pointer match as called with '-&gt;'.
4555
4556Given
4557  class Y {
4558    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4559    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4560    int a;
4561    static int b;
4562  };
4563  template &lt;class T&gt;
4564  class Z {
4565    void x() { this-&gt;m; }
4566  };
4567memberExpr(isArrow())
4568  matches this-&gt;x, x, y.x, a, this-&gt;b
4569cxxDependentScopeMemberExpr(isArrow())
4570  matches this-&gt;m
4571unresolvedMemberExpr(isArrow())
4572  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4573</pre></td></tr>
4574
4575
4576<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>
4577<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4578
4579Example matches x, but not y, z, or a.
4580(matcher = varDecl(hasAutomaticStorageDuration())
4581void f() {
4582  int x;
4583  static int y;
4584  thread_local int z;
4585}
4586int a;
4587</pre></td></tr>
4588
4589
4590<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>
4591<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4592
4593Example matches y and z (matcher = varDecl(hasGlobalStorage())
4594void f() {
4595  int x;
4596  static int y;
4597}
4598int z;
4599</pre></td></tr>
4600
4601
4602<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>
4603<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4604non-static local variable.
4605
4606Example matches x (matcher = varDecl(hasLocalStorage())
4607void f() {
4608  int x;
4609  static int y;
4610}
4611int z;
4612</pre></td></tr>
4613
4614
4615<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>
4616<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4617It includes the variable declared at namespace scope and those declared
4618with "static" and "extern" storage class specifiers.
4619
4620void f() {
4621  int x;
4622  static int y;
4623  thread_local int z;
4624}
4625int a;
4626static int b;
4627extern int c;
4628varDecl(hasStaticStorageDuration())
4629  matches the function declaration y, a, b and c.
4630</pre></td></tr>
4631
4632
4633<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>
4634<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4635
4636Example matches z, but not x, z, or a.
4637(matcher = varDecl(hasThreadStorageDuration())
4638void f() {
4639  int x;
4640  static int y;
4641  thread_local int z;
4642}
4643int a;
4644</pre></td></tr>
4645
4646
4647<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>
4648<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4649       and if constexpr.
4650
4651Given:
4652  constexpr int foo = 42;
4653  constexpr int bar();
4654  void baz() { if constexpr(1 &gt; 0) {} }
4655varDecl(isConstexpr())
4656  matches the declaration of foo.
4657functionDecl(isConstexpr())
4658  matches the declaration of bar.
4659ifStmt(isConstexpr())
4660  matches the if statement in baz.
4661</pre></td></tr>
4662
4663
4664<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>
4665<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4666
4667Example matches A, va, fa
4668  class A {};
4669  class B;  // Doesn't match, as it has no body.
4670  int va;
4671  extern int vb;  // Doesn't match, as it doesn't define the variable.
4672  void fa() {}
4673  void fb();  // Doesn't match, as it has no body.
4674  @interface X
4675  - (void)ma; // Doesn't match, interface is declaration.
4676  @end
4677  @implementation X
4678  - (void)ma {}
4679  @end
4680
4681Usable 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;,
4682  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4683</pre></td></tr>
4684
4685
4686<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>
4687<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4688a C++ catch block, or an Objective-C statement.
4689
4690Example matches x (matcher = varDecl(isExceptionVariable())
4691void f(int y) {
4692  try {
4693  } catch (int x) {
4694  }
4695}
4696</pre></td></tr>
4697
4698
4699<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>
4700<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4701static member variable template instantiations.
4702
4703Given
4704  template&lt;typename T&gt; void A(T t) { }
4705  template&lt;&gt; void A(int N) { }
4706functionDecl(isExplicitTemplateSpecialization())
4707  matches the specialization A&lt;int&gt;().
4708
4709Usable 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;
4710</pre></td></tr>
4711
4712
4713<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>
4714<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4715
4716Given:
4717  extern "C" void f() {}
4718  extern "C" { void g() {} }
4719  void h() {}
4720  extern "C" int x = 1;
4721  extern "C" int y = 2;
4722  int z = 3;
4723functionDecl(isExternC())
4724  matches the declaration of f and g, but not the declaration of h.
4725varDecl(isExternC())
4726  matches the declaration of x and y, but not the declaration of z.
4727</pre></td></tr>
4728
4729
4730<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>
4731<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4732
4733Example matches y (matcher = varDecl(isStaticLocal()))
4734void f() {
4735  int x;
4736  static int y;
4737}
4738static int z;
4739</pre></td></tr>
4740
4741
4742<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>
4743<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4744class specifier ("static" keyword) written in the source.
4745
4746Given:
4747  static void f() {}
4748  static int i = 0;
4749  extern int j;
4750  int k;
4751functionDecl(isStaticStorageClass())
4752  matches the function declaration f.
4753varDecl(isStaticStorageClass())
4754  matches the variable declaration i.
4755</pre></td></tr>
4756
4757
4758<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>
4759<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4760member variable template instantiations.
4761
4762Given
4763  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4764or
4765  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4766or
4767  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4768cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4769  matches the template instantiation of X&lt;A&gt;.
4770
4771But given
4772  template &lt;typename T&gt;  class X {}; class A {};
4773  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4774cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4775  does not match, as X&lt;A&gt; is an explicit template specialization.
4776
4777Usable 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;
4778</pre></td></tr>
4779
4780<!--END_NARROWING_MATCHERS -->
4781</table>
4782
4783<!-- ======================================================================= -->
4784<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4785<!-- ======================================================================= -->
4786
4787<p>Traversal matchers specify the relationship to other nodes that are
4788reachable from the current node.</p>
4789
4790<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4791forEachDescendant) which work on all nodes and allow users to write more generic
4792match expressions.</p>
4793
4794<table>
4795<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4796<!-- START_TRAVERSAL_MATCHERS -->
4797
4798<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>
4799<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4800
4801Unlike anyOf, eachOf will generate a match result for each
4802matching submatcher.
4803
4804For example, in:
4805  class A { int a; int b; };
4806The matcher:
4807  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4808                       has(fieldDecl(hasName("b")).bind("v"))))
4809will generate two results binding "v", the first of which binds
4810the field declaration of a, the second the field declaration of
4811b.
4812
4813Usable as: Any Matcher
4814</pre></td></tr>
4815
4816
4817<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>
4818<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
4819
4820Generates results for each match.
4821
4822For example, in:
4823  class A { class B {}; class C {}; };
4824The matcher:
4825  cxxRecordDecl(hasName("::A"),
4826                findAll(cxxRecordDecl(isDefinition()).bind("m")))
4827will generate results for A, B and C.
4828
4829Usable as: Any Matcher
4830</pre></td></tr>
4831
4832
4833<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4834<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4835provided matcher.
4836
4837Example matches X, A, A::X, B, B::C, B::C::X
4838  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4839  class X {};
4840  class A { class X {}; };  // Matches A, because A::X is a class of name
4841                            // X inside A.
4842  class B { class C { class X {}; }; };
4843
4844DescendantT must be an AST base type.
4845
4846As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4847each result that matches instead of only on the first one.
4848
4849Note: Recursively combined ForEachDescendant can cause many matches:
4850  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4851    forEachDescendant(cxxRecordDecl())
4852  )))
4853will match 10 times (plus injected class name matches) on:
4854  class A { class B { class C { class D { class E {}; }; }; }; };
4855
4856Usable as: Any Matcher
4857</pre></td></tr>
4858
4859
4860<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4861<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4862provided matcher.
4863
4864Example matches X, Y, Y::X, Z::Y, Z::Y::X
4865  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4866  class X {};
4867  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
4868                            // inside Y.
4869  class Z { class Y { class X {}; }; };  // Does not match Z.
4870
4871ChildT must be an AST base type.
4872
4873As opposed to 'has', 'forEach' will cause a match for each result that
4874matches instead of only on the first one.
4875
4876Usable as: Any Matcher
4877</pre></td></tr>
4878
4879
4880<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4881<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4882matcher.
4883
4884Given
4885void f() { if (true) { int x = 42; } }
4886void g() { for (;;) { int x = 43; } }
4887expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4888
4889Usable as: Any Matcher
4890</pre></td></tr>
4891
4892
4893<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4894<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4895provided matcher.
4896
4897Example matches X, Y, Z
4898    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4899  class X {};  // Matches X, because X::X is a class of name X inside X.
4900  class Y { class X {}; };
4901  class Z { class Y { class X {}; }; };
4902
4903DescendantT must be an AST base type.
4904
4905Usable as: Any Matcher
4906</pre></td></tr>
4907
4908
4909<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4910<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4911provided matcher.
4912
4913Example matches X, Y
4914  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4915  class X {};  // Matches X, because X::X is a class of name X inside X.
4916  class Y { class X {}; };
4917  class Z { class Y { class X {}; }; };  // Does not match Z.
4918
4919ChildT must be an AST base type.
4920
4921Usable as: Any Matcher
4922Note that has is direct matcher, so it also matches things like implicit
4923casts and paren casts. If you are matching with expr then you should
4924probably consider using ignoringParenImpCasts like:
4925has(ignoringParenImpCasts(expr())).
4926</pre></td></tr>
4927
4928
4929<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4930<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4931matcher.
4932
4933Given
4934void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4935compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4936
4937Usable as: Any Matcher
4938</pre></td></tr>
4939
4940
4941<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
4942<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
4943
4944However, optionally will retain any bindings generated by the submatcher.
4945Useful when additional information which may or may not present about a main
4946matching node is desired.
4947
4948For example, in:
4949  class Foo {
4950    int bar;
4951  }
4952The matcher:
4953  cxxRecordDecl(
4954    optionally(has(
4955      fieldDecl(hasName("bar")).bind("var")
4956  ))).bind("record")
4957will produce a result binding for both "record" and "var".
4958The matcher will produce a "record" binding for even if there is no data
4959member named "bar" in that class.
4960
4961Usable as: Any Matcher
4962</pre></td></tr>
4963
4964
4965<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>
4966<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
4967
4968Given
4969  void foo()
4970  {
4971      int i = 3.0;
4972  }
4973The matcher
4974  traverse(TK_IgnoreImplicitCastsAndParentheses,
4975    varDecl(hasInitializer(floatLiteral().bind("init")))
4976  )
4977matches the variable declaration with "init" bound to the "3.0".
4978</pre></td></tr>
4979
4980
4981<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>
4982<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4983switch statement or conditional operator.
4984
4985Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4986  if (true) {}
4987</pre></td></tr>
4988
4989
4990<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>
4991<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4992(binary or ternary).
4993
4994Example matches b
4995  condition ? a : b
4996  condition ?: b
4997</pre></td></tr>
4998
4999
5000<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>
5001<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5002
5003Example 1 (conditional ternary operator): matches a
5004  condition ? a : b
5005
5006Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5007  condition ?: b
5008</pre></td></tr>
5009
5010
5011<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>
5012<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5013matches the given matcher.
5014
5015The associated declaration is:
5016- for type nodes, the declaration of the underlying type
5017- for CallExpr, the declaration of the callee
5018- for MemberExpr, the declaration of the referenced member
5019- for CXXConstructExpr, the declaration of the constructor
5020- for CXXNewExpr, the declaration of the operator new
5021- for ObjCIvarExpr, the declaration of the ivar
5022
5023For type nodes, hasDeclaration will generally match the declaration of the
5024sugared type. Given
5025  class X {};
5026  typedef X Y;
5027  Y y;
5028in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5029typedefDecl. A common use case is to match the underlying, desugared type.
5030This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5031  varDecl(hasType(hasUnqualifiedDesugaredType(
5032      recordType(hasDeclaration(decl())))))
5033In this matcher, the decl will match the CXXRecordDecl of class X.
5034
5035Usable 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;,
5036  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;,
5037  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;,
5038  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;,
5039  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;,
5040  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;,
5041  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5042</pre></td></tr>
5043
5044
5045<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>
5046<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5047
5048Given
5049  int i[5];
5050  void f() { i[1] = 42; }
5051arraySubscriptExpression(hasBase(implicitCastExpr(
5052    hasSourceExpression(declRefExpr()))))
5053  matches i[1] with the declRefExpr() matching i
5054</pre></td></tr>
5055
5056
5057<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>
5058<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5059
5060Given
5061  int i[5];
5062  void f() { i[1] = 42; }
5063arraySubscriptExpression(hasIndex(integerLiteral()))
5064  matches i[1] with the integerLiteral() matching 1
5065</pre></td></tr>
5066
5067
5068<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>
5069<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
5070
5071Example matches a (matcher = binaryOperator(hasLHS()))
5072  a || b
5073</pre></td></tr>
5074
5075
5076<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>
5077<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
5078
5079Example matches b (matcher = binaryOperator(hasRHS()))
5080  a || b
5081</pre></td></tr>
5082
5083
5084<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>
5085<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5086type.
5087
5088Given
5089  struct A {};
5090  A a[7];
5091  int b[7];
5092arrayType(hasElementType(builtinType()))
5093  matches "int b[7]"
5094
5095Usable 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;
5096</pre></td></tr>
5097
5098
5099<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>
5100<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
5101
5102Given
5103  _Atomic(int) i;
5104  _Atomic(float) f;
5105atomicType(hasValueType(isInteger()))
5106 matches "_Atomic(int) i"
5107
5108Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
5109</pre></td></tr>
5110
5111
5112<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>
5113<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
5114
5115Note: There is no TypeLoc for the deduced type and thus no
5116getDeducedLoc() matcher.
5117
5118Given
5119  auto a = 1;
5120  auto b = 2.0;
5121autoType(hasDeducedType(isInteger()))
5122  matches "auto a"
5123
5124Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
5125</pre></td></tr>
5126
5127
5128<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>
5129<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
5130binary operator matches.
5131</pre></td></tr>
5132
5133
5134<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>
5135<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
5136
5137Example matches a (matcher = binaryOperator(hasLHS()))
5138  a || b
5139</pre></td></tr>
5140
5141
5142<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>
5143<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
5144
5145Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
5146                                             integerLiteral(equals(2)))
5147  1 + 2 // Match
5148  2 + 1 // Match
5149  1 + 1 // No match
5150  2 + 2 // No match
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('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>
5155<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
5156
5157Example matches b (matcher = binaryOperator(hasRHS()))
5158  a || b
5159</pre></td></tr>
5160
5161
5162<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>
5163<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
5164block.
5165
5166Does not match the 'this' parameter of a method.
5167
5168Given
5169  class X { void f(int x, int y, int z) {} };
5170cxxMethodDecl(hasAnyParameter(hasName("y")))
5171  matches f(int x, int y, int z) {}
5172with hasAnyParameter(...)
5173  matching int y
5174
5175For ObjectiveC, given
5176  @interface I - (void) f:(int) y; @end
5177
5178the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5179matches the declaration of method f with hasParameter
5180matching y.
5181
5182For blocks, given
5183  b = ^(int y) { printf("%d", y) };
5184
5185the matcher blockDecl(hasAnyParameter(hasName("y")))
5186matches the declaration of the block b with hasParameter
5187matching y.
5188</pre></td></tr>
5189
5190
5191<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>
5192<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
5193declaration or a block.
5194
5195Given
5196  class X { void f(int x) {} };
5197cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5198  matches f(int x) {}
5199with hasParameter(...)
5200  matching int x
5201
5202For ObjectiveC, given
5203  @interface I - (void) f:(int) y; @end
5204
5205the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5206matches the declaration of method f with hasParameter
5207matching y.
5208</pre></td></tr>
5209
5210
5211<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>
5212<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
5213pointee matches a given matcher.
5214
5215Given
5216  int *a;
5217  int const *b;
5218  float const *f;
5219pointerType(pointee(isConstQualified(), isInteger()))
5220  matches "int const *b"
5221
5222Usable 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;,
5223  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;
5224</pre></td></tr>
5225
5226
5227<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>
5228<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
5229declaration's type.
5230
5231In case of a value declaration (for example a variable declaration),
5232this resolves one layer of indirection. For example, in the value
5233declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5234X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5235declaration of x.
5236
5237Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5238            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5239            and friend class X (matcher = friendDecl(hasType("X"))
5240 class X {};
5241 void y(X &amp;x) { x; X z; }
5242 class Y { friend class X; };
5243
5244Example matches class Derived
5245(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
5246class Base {};
5247class Derived : Base {};
5248
5249Usable 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;,
5250Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
5251</pre></td></tr>
5252
5253
5254<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>
5255<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
5256
5257Given
5258  void f(int i);
5259  int y;
5260  f(y);
5261callExpr(
5262  forEachArgumentWithParam(
5263    declRefExpr(to(varDecl(hasName("y")))),
5264    parmVarDecl(hasType(isInteger()))
5265))
5266  matches f(y);
5267with declRefExpr(...)
5268  matching int y
5269and parmVarDecl(...)
5270  matching int i
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('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>
5275<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
5276expression, or an ObjC-message-send expression.
5277
5278Given
5279  void x(int, int, int) { int y; x(1, y, 42); }
5280callExpr(hasAnyArgument(declRefExpr()))
5281  matches x(1, y, 42)
5282with hasAnyArgument(...)
5283  matching y
5284
5285For ObjectiveC, given
5286  @interface I - (void) f:(int) y; @end
5287  void foo(I *i) { [i f:12]; }
5288objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5289  matches [i f:12]
5290</pre></td></tr>
5291
5292
5293<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>
5294<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
5295call expression.
5296
5297Example matches y in x(y)
5298    (matcher = callExpr(hasArgument(0, declRefExpr())))
5299  void x(int) { int y; x(y); }
5300</pre></td></tr>
5301
5302
5303<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>
5304<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
5305matches the given matcher.
5306
5307The associated declaration is:
5308- for type nodes, the declaration of the underlying type
5309- for CallExpr, the declaration of the callee
5310- for MemberExpr, the declaration of the referenced member
5311- for CXXConstructExpr, the declaration of the constructor
5312- for CXXNewExpr, the declaration of the operator new
5313- for ObjCIvarExpr, the declaration of the ivar
5314
5315For type nodes, hasDeclaration will generally match the declaration of the
5316sugared type. Given
5317  class X {};
5318  typedef X Y;
5319  Y y;
5320in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5321typedefDecl. A common use case is to match the underlying, desugared type.
5322This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5323  varDecl(hasType(hasUnqualifiedDesugaredType(
5324      recordType(hasDeclaration(decl())))))
5325In this matcher, the decl will match the CXXRecordDecl of class X.
5326
5327Usable 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;,
5328  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;,
5329  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;,
5330  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;,
5331  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;,
5332  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;,
5333  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5334</pre></td></tr>
5335
5336
5337<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>
5338<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
5339
5340Given
5341  class A { A() : i(42), j(42) {} int i; int j; };
5342cxxConstructorDecl(forEachConstructorInitializer(
5343  forField(decl().bind("x"))
5344))
5345  will trigger two matches, binding for 'i' and 'j' respectively.
5346</pre></td></tr>
5347
5348
5349<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>
5350<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
5351
5352Given
5353  struct Foo {
5354    Foo() : foo_(1) { }
5355    int foo_;
5356  };
5357cxxRecordDecl(has(cxxConstructorDecl(
5358  hasAnyConstructorInitializer(anything())
5359)))
5360  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5361</pre></td></tr>
5362
5363
5364<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>
5365<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5366
5367Given
5368  struct Foo {
5369    Foo() : foo_(1) { }
5370    int foo_;
5371  };
5372cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5373    forField(hasName("foo_"))))))
5374  matches Foo
5375with forField matching foo_
5376</pre></td></tr>
5377
5378
5379<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>
5380<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5381
5382Given
5383  struct Foo {
5384    Foo() : foo_(1) { }
5385    int foo_;
5386  };
5387cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5388    withInitializer(integerLiteral(equals(1)))))))
5389  matches Foo
5390with withInitializer matching (1)
5391</pre></td></tr>
5392
5393
5394<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>
5395<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5396given matcher. Implicit object expressions are included; that is, it matches
5397use of implicit `this`.
5398
5399Given
5400  struct X {
5401    int m;
5402    int f(X x) { x.m; return m; }
5403  };
5404memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5405  matches `x.m`, but not `m`; however,
5406memberExpr(hasObjectExpression(hasType(pointsTo(
5407     cxxRecordDecl(hasName("X"))))))
5408  matches `m` (aka. `this-&gt;m`), but not `x.m`.
5409</pre></td></tr>
5410
5411
5412<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>
5413<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
5414definition that has a given body.
5415
5416Given
5417  for (;;) {}
5418hasBody(compoundStmt())
5419  matches 'for (;;) {}'
5420with compoundStmt()
5421  matching '{}'
5422</pre></td></tr>
5423
5424
5425<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>
5426<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
5427
5428Given:
5429 void foo() {
5430   if (int i = foobar(); i &gt; 0) {}
5431   switch (int i = foobar(); i) {}
5432   for (auto&amp; a = get_range(); auto&amp; x : a) {}
5433 }
5434 void bar() {
5435   if (foobar() &gt; 0) {}
5436   switch (foobar()) {}
5437   for (auto&amp; x : get_range()) {}
5438 }
5439ifStmt(hasInitStatement(anything()))
5440  matches the if statement in foo but not in bar.
5441switchStmt(hasInitStatement(anything()))
5442  matches the switch statement in foo but not in bar.
5443cxxForRangeStmt(hasInitStatement(anything()))
5444  matches the range for statement in foo but not in bar.
5445</pre></td></tr>
5446
5447
5448<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>
5449<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5450
5451Example:
5452    forStmt(hasLoopVariable(anything()))
5453matches 'int x' in
5454    for (int x : a) { }
5455</pre></td></tr>
5456
5457
5458<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>
5459<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5460
5461Example:
5462    forStmt(hasRangeInit(anything()))
5463matches 'a' in
5464    for (int x : a) { }
5465</pre></td></tr>
5466
5467
5468<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>
5469<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5470`on`, matches the argument directly without stripping away anything.
5471
5472Given
5473  class Y { public: void m(); };
5474  Y g();
5475  class X : public Y { void g(); };
5476  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5477cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5478    cxxRecordDecl(hasName("Y")))))
5479  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5480cxxMemberCallExpr(on(callExpr()))
5481  does not match `(g()).m()`, because the parens are not ignored.
5482
5483FIXME: Overload to allow directly matching types?
5484</pre></td></tr>
5485
5486
5487<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>
5488<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5489stripping off any parentheses or implicit casts.
5490
5491Given
5492  class Y { public: void m(); };
5493  Y g();
5494  class X : public Y {};
5495  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5496cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5497  matches `y.m()` and `(g()).m()`.
5498cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5499  matches `x.m()`.
5500cxxMemberCallExpr(on(callExpr()))
5501  matches `(g()).m()`.
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('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>
5508<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5509</pre></td></tr>
5510
5511
5512<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>
5513<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5514matches the InnerMatcher, or is a pointer to a type that matches the
5515InnerMatcher.
5516
5517Given
5518  class Y { public: void m(); };
5519  class X : public Y { void g(); };
5520  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5521cxxMemberCallExpr(thisPointerType(hasDeclaration(
5522    cxxRecordDecl(hasName("Y")))))
5523  matches `y.m()`, `p-&gt;m()` and `x.m()`.
5524cxxMemberCallExpr(thisPointerType(hasDeclaration(
5525    cxxRecordDecl(hasName("X")))))
5526  matches `x.g()`.
5527</pre></td></tr>
5528
5529
5530<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>
5531<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5532produce multiple matches.
5533
5534Given
5535  class A { virtual void f(); };
5536  class B : public A { void f(); };
5537  class C : public B { void f(); };
5538cxxMethodDecl(ofClass(hasName("C")),
5539              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5540  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5541  that B::f is not overridden by C::f).
5542
5543The check can produce multiple matches in case of multiple inheritance, e.g.
5544  class A1 { virtual void f(); };
5545  class A2 { virtual void f(); };
5546  class C : public A1, public A2 { void f(); };
5547cxxMethodDecl(ofClass(hasName("C")),
5548              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5549  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5550  once with "b" binding "A2::f" and "d" binding "C::f".
5551</pre></td></tr>
5552
5553
5554<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>
5555<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5556belongs to.
5557
5558FIXME: Generalize this for other kinds of declarations.
5559FIXME: What other kind of declarations would we need to generalize
5560this to?
5561
5562Example matches A() in the last line
5563    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5564        ofClass(hasName("A"))))))
5565  class A {
5566   public:
5567    A();
5568  };
5569  A a = A();
5570</pre></td></tr>
5571
5572
5573<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>
5574<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
5575
5576Given:
5577  MyClass *p1 = new (Storage) MyClass();
5578cxxNewExpr(hasAnyPlacementArg(anything()))
5579  matches the expression 'new (Storage, 16) MyClass()'.
5580</pre></td></tr>
5581
5582
5583<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>
5584<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5585
5586Given:
5587  MyClass *p1 = new MyClass[10];
5588cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
5589  matches the expression 'new MyClass[10]'.
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('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>
5594<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5595matches the given matcher.
5596
5597The associated declaration is:
5598- for type nodes, the declaration of the underlying type
5599- for CallExpr, the declaration of the callee
5600- for MemberExpr, the declaration of the referenced member
5601- for CXXConstructExpr, the declaration of the constructor
5602- for CXXNewExpr, the declaration of the operator new
5603- for ObjCIvarExpr, the declaration of the ivar
5604
5605For type nodes, hasDeclaration will generally match the declaration of the
5606sugared type. Given
5607  class X {};
5608  typedef X Y;
5609  Y y;
5610in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5611typedefDecl. A common use case is to match the underlying, desugared type.
5612This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5613  varDecl(hasType(hasUnqualifiedDesugaredType(
5614      recordType(hasDeclaration(decl())))))
5615In this matcher, the decl will match the CXXRecordDecl of class X.
5616
5617Usable 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;,
5618  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;,
5619  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;,
5620  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;,
5621  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;,
5622  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;,
5623  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5624</pre></td></tr>
5625
5626
5627<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>
5628<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
5629
5630Given:
5631  MyClass *p1 = new (Storage, 16) MyClass();
5632cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
5633  matches the expression 'new (Storage, 16) MyClass()'.
5634</pre></td></tr>
5635
5636
5637<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>
5638<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
5639
5640Example:
5641matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase")))))
5642  class Foo;
5643  class Bar : Foo {};
5644  class Baz : Bar {};
5645  class SpecialBase;
5646  class Proxy : SpecialBase {};  // matches Proxy
5647  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
5648
5649FIXME: Refactor this and isDerivedFrom to reuse implementation.
5650</pre></td></tr>
5651
5652
5653<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>
5654<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5655
5656Given:
5657  class A { void func(); };
5658  class B { void member(); };
5659
5660cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5661A but not B.
5662</pre></td></tr>
5663
5664
5665<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>
5666<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
5667matching Base, or Objective-C classes that directly or indirectly
5668subclass a class matching Base.
5669
5670Note that a class is not considered to be derived from itself.
5671
5672Example matches Y, Z, C (Base == hasName("X"))
5673  class X;
5674  class Y : public X {};  // directly derived
5675  class Z : public Y {};  // indirectly derived
5676  typedef X A;
5677  typedef A B;
5678  class C : public B {};  // derived from a typedef of X
5679
5680In the following example, Bar matches isDerivedFrom(hasName("X")):
5681  class Foo;
5682  typedef Foo X;
5683  class Bar : public Foo {};  // derived from a type that X is a typedef of
5684
5685In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
5686  @interface NSObject @end
5687  @interface Bar : NSObject @end
5688
5689Usable 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;
5690</pre></td></tr>
5691
5692
5693<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>
5694<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
5695matching Base.
5696
5697Note that a class is not considered to be derived from itself.
5698
5699Example matches Y, C (Base == hasName("X"))
5700  class X;
5701  class Y : public X {};  // directly derived
5702  class Z : public Y {};  // indirectly derived
5703  typedef X A;
5704  typedef A B;
5705  class C : public B {};  // derived from a typedef of X
5706
5707In the following example, Bar matches isDerivedFrom(hasName("X")):
5708  class Foo;
5709  typedef Foo X;
5710  class Bar : public Foo {};  // derived from a type that X is a typedef of
5711</pre></td></tr>
5712
5713
5714<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>
5715<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5716match Base.
5717</pre></td></tr>
5718
5719
5720<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>
5721<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5722expression, or an ObjC-message-send expression.
5723
5724Given
5725  void x(int, int, int) { int y; x(1, y, 42); }
5726callExpr(hasAnyArgument(declRefExpr()))
5727  matches x(1, y, 42)
5728with hasAnyArgument(...)
5729  matching y
5730
5731For ObjectiveC, given
5732  @interface I - (void) f:(int) y; @end
5733  void foo(I *i) { [i f:12]; }
5734objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5735  matches [i f:12]
5736</pre></td></tr>
5737
5738
5739<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>
5740<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5741given matcher.
5742
5743Example matches y.x() (matcher = callExpr(callee(
5744                                   cxxMethodDecl(hasName("x")))))
5745  class Y { public: void x(); };
5746  void z() { Y y; y.x(); }
5747</pre></td></tr>
5748
5749
5750<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>
5751<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5752
5753Given
5754  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5755  void f() { f(); }
5756callExpr(callee(expr()))
5757  matches this-&gt;x(), x(), y.x(), f()
5758with callee(...)
5759  matching this-&gt;x, x, y.x, f respectively
5760
5761Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
5762because this introduces ambiguous overloads with calls to Callee taking a
5763internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
5764implemented in terms of implicit casts.
5765</pre></td></tr>
5766
5767
5768<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>
5769<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5770
5771Given
5772  void f(int i);
5773  int y;
5774  f(y);
5775callExpr(
5776  forEachArgumentWithParam(
5777    declRefExpr(to(varDecl(hasName("y")))),
5778    parmVarDecl(hasType(isInteger()))
5779))
5780  matches f(y);
5781with declRefExpr(...)
5782  matching int y
5783and parmVarDecl(...)
5784  matching int i
5785</pre></td></tr>
5786
5787
5788<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>
5789<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5790expression, or an ObjC-message-send expression.
5791
5792Given
5793  void x(int, int, int) { int y; x(1, y, 42); }
5794callExpr(hasAnyArgument(declRefExpr()))
5795  matches x(1, y, 42)
5796with hasAnyArgument(...)
5797  matching y
5798
5799For ObjectiveC, given
5800  @interface I - (void) f:(int) y; @end
5801  void foo(I *i) { [i f:12]; }
5802objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5803  matches [i f:12]
5804</pre></td></tr>
5805
5806
5807<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>
5808<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5809call expression.
5810
5811Example matches y in x(y)
5812    (matcher = callExpr(hasArgument(0, declRefExpr())))
5813  void x(int) { int y; x(y); }
5814</pre></td></tr>
5815
5816
5817<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>
5818<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5819matches the given matcher.
5820
5821The associated declaration is:
5822- for type nodes, the declaration of the underlying type
5823- for CallExpr, the declaration of the callee
5824- for MemberExpr, the declaration of the referenced member
5825- for CXXConstructExpr, the declaration of the constructor
5826- for CXXNewExpr, the declaration of the operator new
5827- for ObjCIvarExpr, the declaration of the ivar
5828
5829For type nodes, hasDeclaration will generally match the declaration of the
5830sugared type. Given
5831  class X {};
5832  typedef X Y;
5833  Y y;
5834in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5835typedefDecl. A common use case is to match the underlying, desugared type.
5836This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5837  varDecl(hasType(hasUnqualifiedDesugaredType(
5838      recordType(hasDeclaration(decl())))))
5839In this matcher, the decl will match the CXXRecordDecl of class X.
5840
5841Usable 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;,
5842  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;,
5843  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;,
5844  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;,
5845  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;,
5846  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;,
5847  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5848</pre></td></tr>
5849
5850
5851<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>
5852<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5853extension, matches the constant given in the statement.
5854
5855Given
5856  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5857caseStmt(hasCaseConstant(integerLiteral()))
5858  matches "case 1:"
5859</pre></td></tr>
5860
5861
5862<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>
5863<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5864or opaque value's source expression matches the given matcher.
5865
5866Example 1: matches "a string"
5867(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5868class URL { URL(string); };
5869URL url = "a string";
5870
5871Example 2: matches 'b' (matcher =
5872opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5873int a = b ?: 1;
5874</pre></td></tr>
5875
5876
5877<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>
5878<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5879functionDecl that have at least one TemplateArgument matching the given
5880InnerMatcher.
5881
5882Given
5883  template&lt;typename T&gt; class A {};
5884  template&lt;&gt; class A&lt;double&gt; {};
5885  A&lt;int&gt; a;
5886
5887  template&lt;typename T&gt; f() {};
5888  void func() { f&lt;int&gt;(); };
5889
5890classTemplateSpecializationDecl(hasAnyTemplateArgument(
5891    refersToType(asString("int"))))
5892  matches the specialization A&lt;int&gt;
5893
5894functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5895  matches the specialization f&lt;int&gt;
5896</pre></td></tr>
5897
5898
5899<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>
5900<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5901
5902Given
5903  template&lt;typename T&gt; class A {}; #1
5904  template&lt;&gt; class A&lt;int&gt; {}; #2
5905classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
5906  matches '#2' with classTemplateDecl() matching the class template
5907  declaration of 'A' at #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('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>
5912<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5913functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5914
5915Given
5916  template&lt;typename T, typename U&gt; class A {};
5917  A&lt;bool, int&gt; b;
5918  A&lt;int, bool&gt; c;
5919
5920  template&lt;typename T&gt; void f() {}
5921  void func() { f&lt;int&gt;(); };
5922classTemplateSpecializationDecl(hasTemplateArgument(
5923    1, refersToType(asString("int"))))
5924  matches the specialization A&lt;bool, int&gt;
5925
5926functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5927  matches the specialization f&lt;int&gt;
5928</pre></td></tr>
5929
5930
5931<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>
5932<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5933type.
5934
5935Given
5936  struct A {};
5937  A a[7];
5938  int b[7];
5939arrayType(hasElementType(builtinType()))
5940  matches "int b[7]"
5941
5942Usable 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;
5943</pre></td></tr>
5944
5945
5946<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>
5947<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
5948a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5949
5950Given
5951  { {}; 1+2; }
5952hasAnySubstatement(compoundStmt())
5953  matches '{ {}; 1+2; }'
5954with compoundStmt()
5955  matching '{}'
5956</pre></td></tr>
5957
5958
5959<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>
5960<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5961</pre></td></tr>
5962
5963
5964<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>
5965<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
5966matches the given matcher.
5967
5968The associated declaration is:
5969- for type nodes, the declaration of the underlying type
5970- for CallExpr, the declaration of the callee
5971- for MemberExpr, the declaration of the referenced member
5972- for CXXConstructExpr, the declaration of the constructor
5973- for CXXNewExpr, the declaration of the operator new
5974- for ObjCIvarExpr, the declaration of the ivar
5975
5976For type nodes, hasDeclaration will generally match the declaration of the
5977sugared type. Given
5978  class X {};
5979  typedef X Y;
5980  Y y;
5981in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5982typedefDecl. A common use case is to match the underlying, desugared type.
5983This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5984  varDecl(hasType(hasUnqualifiedDesugaredType(
5985      recordType(hasDeclaration(decl())))))
5986In this matcher, the decl will match the CXXRecordDecl of class X.
5987
5988Usable 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;,
5989  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;,
5990  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;,
5991  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;,
5992  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;,
5993  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;,
5994  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
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('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>
5999<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
6000specific using shadow declaration.
6001
6002Given
6003  namespace a { void f() {} }
6004  using a::f;
6005  void g() {
6006    f();     // Matches this ..
6007    a::f();  // .. but not this.
6008  }
6009declRefExpr(throughUsingDecl(anything()))
6010  matches f()
6011</pre></td></tr>
6012
6013
6014<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>
6015<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
6016specified matcher.
6017
6018Example matches x in if(x)
6019    (matcher = declRefExpr(to(varDecl(hasName("x")))))
6020  bool x;
6021  if (x) {}
6022</pre></td></tr>
6023
6024
6025<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>
6026<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
6027
6028Note that this does not work for global declarations because the AST
6029breaks up multiple-declaration DeclStmt's into multiple single-declaration
6030DeclStmt's.
6031Example: Given non-global declarations
6032  int a, b = 0;
6033  int c;
6034  int d = 2, e;
6035declStmt(containsDeclaration(
6036      0, varDecl(hasInitializer(anything()))))
6037  matches only 'int d = 2, e;', and
6038declStmt(containsDeclaration(1, varDecl()))
6039  matches 'int a, b = 0' as well as 'int d = 2, e;'
6040  but 'int c;' is not matched.
6041</pre></td></tr>
6042
6043
6044<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>
6045<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
6046
6047Given
6048  int a, b;
6049  int c;
6050declStmt(hasSingleDecl(anything()))
6051  matches 'int c;' but not 'int a, b;'.
6052</pre></td></tr>
6053
6054
6055<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>
6056<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
6057the inner matcher.
6058
6059Given
6060  int x;
6061declaratorDecl(hasTypeLoc(loc(asString("int"))))
6062  matches int x
6063</pre></td></tr>
6064
6065
6066<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>
6067<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
6068Decl, matches InnerMatcher.
6069
6070Given
6071  namespace N {
6072    namespace M {
6073      class D {};
6074    }
6075  }
6076
6077cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
6078declaration of class D.
6079</pre></td></tr>
6080
6081
6082<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>
6083<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
6084
6085Given
6086  decltype(1) a = 1;
6087  decltype(2.0) b = 2.0;
6088decltypeType(hasUnderlyingType(isInteger()))
6089  matches the type of "a"
6090
6091Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
6092</pre></td></tr>
6093
6094
6095<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>
6096<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
6097definition that has a given body.
6098
6099Given
6100  for (;;) {}
6101hasBody(compoundStmt())
6102  matches 'for (;;) {}'
6103with compoundStmt()
6104  matching '{}'
6105</pre></td></tr>
6106
6107
6108<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>
6109<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
6110switch statement or conditional operator.
6111
6112Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6113  if (true) {}
6114</pre></td></tr>
6115
6116
6117<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>
6118<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
6119matches InnerMatcher if the qualifier exists.
6120
6121Given
6122  namespace N {
6123    namespace M {
6124      class D {};
6125    }
6126  }
6127  N::M::D d;
6128
6129elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
6130matches the type of the variable declaration of d.
6131</pre></td></tr>
6132
6133
6134<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>
6135<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
6136
6137Given
6138  namespace N {
6139    namespace M {
6140      class D {};
6141    }
6142  }
6143  N::M::D d;
6144
6145elaboratedType(namesType(recordType(
6146hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
6147declaration of d.
6148</pre></td></tr>
6149
6150
6151<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>
6152<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
6153matches the given matcher.
6154
6155The associated declaration is:
6156- for type nodes, the declaration of the underlying type
6157- for CallExpr, the declaration of the callee
6158- for MemberExpr, the declaration of the referenced member
6159- for CXXConstructExpr, the declaration of the constructor
6160- for CXXNewExpr, the declaration of the operator new
6161- for ObjCIvarExpr, the declaration of the ivar
6162
6163For type nodes, hasDeclaration will generally match the declaration of the
6164sugared type. Given
6165  class X {};
6166  typedef X Y;
6167  Y y;
6168in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6169typedefDecl. A common use case is to match the underlying, desugared type.
6170This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6171  varDecl(hasType(hasUnqualifiedDesugaredType(
6172      recordType(hasDeclaration(decl())))))
6173In this matcher, the decl will match the CXXRecordDecl of class X.
6174
6175Usable 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;,
6176  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;,
6177  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;,
6178  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;,
6179  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;,
6180  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;,
6181  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6182</pre></td></tr>
6183
6184
6185<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>
6186<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
6187
6188(Note: Clang's AST refers to other conversions as "casts" too, and calls
6189actual casts "explicit" casts.)
6190</pre></td></tr>
6191
6192
6193<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>
6194<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
6195declaration's type.
6196
6197In case of a value declaration (for example a variable declaration),
6198this resolves one layer of indirection. For example, in the value
6199declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6200X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6201declaration of x.
6202
6203Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6204            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6205            and friend class X (matcher = friendDecl(hasType("X"))
6206 class X {};
6207 void y(X &amp;x) { x; X z; }
6208 class Y { friend class X; };
6209
6210Example matches class Derived
6211(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6212class Base {};
6213class Derived : Base {};
6214
6215Usable 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;,
6216Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6217</pre></td></tr>
6218
6219
6220<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>
6221<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
6222matcher.
6223
6224Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6225            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6226            and U (matcher = typedefDecl(hasType(asString("int")))
6227            and friend class X (matcher = friendDecl(hasType("X"))
6228 class X {};
6229 void y(X &amp;x) { x; X z; }
6230 typedef int U;
6231 class Y { friend class X; };
6232</pre></td></tr>
6233
6234
6235<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>
6236<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
6237elidable constructor and other corresponding bookkeeping nodes.
6238
6239In C++17, elidable copy constructors are no longer being generated in the
6240AST as it is not permitted by the standard. They are, however, part of the
6241AST in C++14 and earlier. So, a matcher must abstract over these differences
6242to work in all language modes. This matcher skips elidable constructor-call
6243AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
6244various implicit nodes inside the constructor calls, all of which will not
6245appear in the C++17 AST.
6246
6247Given
6248
6249struct H {};
6250H G();
6251void f() {
6252  H D = G();
6253}
6254
6255``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
6256matches ``H D = G()`` in C++11 through C++17 (and beyond).
6257</pre></td></tr>
6258
6259
6260<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>
6261<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
6262are stripped off.
6263
6264Parentheses and explicit casts are not discarded.
6265Given
6266  int arr[5];
6267  int a = 0;
6268  char b = 0;
6269  const int c = a;
6270  int *d = arr;
6271  long e = (long) 0l;
6272The matchers
6273   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
6274   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
6275would match the declarations for a, b, c, and d, but not e.
6276While
6277   varDecl(hasInitializer(integerLiteral()))
6278   varDecl(hasInitializer(declRefExpr()))
6279only match the declarations for b, c, and d.
6280</pre></td></tr>
6281
6282
6283<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>
6284<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
6285nodes are stripped off.
6286
6287Parentheses and explicit casts are not discarded.
6288Given
6289  class C {};
6290  C a = C();
6291  C b;
6292  C c = b;
6293The matchers
6294   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
6295would match the declarations for a, b, and c.
6296While
6297   varDecl(hasInitializer(cxxConstructExpr()))
6298only match the declarations for b and c.
6299</pre></td></tr>
6300
6301
6302<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>
6303<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
6304casts are stripped off.
6305
6306Implicit and non-C Style casts are also discarded.
6307Given
6308  int a = 0;
6309  char b = (0);
6310  void* c = reinterpret_cast&lt;char*&gt;(0);
6311  char d = char(0);
6312The matcher
6313   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
6314would match the declarations for a, b, c, and d.
6315while
6316   varDecl(hasInitializer(integerLiteral()))
6317only match the declaration for a.
6318</pre></td></tr>
6319
6320
6321<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>
6322<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
6323parentheses are stripped off.
6324
6325Explicit casts are not discarded.
6326Given
6327  int arr[5];
6328  int a = 0;
6329  char b = (0);
6330  const int c = a;
6331  int *d = (arr);
6332  long e = ((long) 0l);
6333The matchers
6334   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
6335   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
6336would match the declarations for a, b, c, and d, but not e.
6337while
6338   varDecl(hasInitializer(integerLiteral()))
6339   varDecl(hasInitializer(declRefExpr()))
6340would only match the declaration for a.
6341</pre></td></tr>
6342
6343
6344<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>
6345<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
6346
6347Given
6348  const char* str = ("my-string");
6349The matcher
6350  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
6351would match the implicit cast resulting from the assignment.
6352</pre></td></tr>
6353
6354
6355<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>
6356<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
6357
6358Given
6359  class C {
6360    int a = 2;
6361    int b = 3;
6362    int c;
6363  };
6364fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
6365  matches 'int a;' but not 'int b;'.
6366fieldDecl(hasInClassInitializer(anything()))
6367  matches 'int a;' and 'int b;' but not 'int c;'.
6368</pre></td></tr>
6369
6370
6371<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>
6372<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
6373definition that has a given body.
6374
6375Given
6376  for (;;) {}
6377hasBody(compoundStmt())
6378  matches 'for (;;) {}'
6379with compoundStmt()
6380  matching '{}'
6381</pre></td></tr>
6382
6383
6384<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>
6385<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
6386switch statement or conditional operator.
6387
6388Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6389  if (true) {}
6390</pre></td></tr>
6391
6392
6393<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>
6394<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
6395
6396Example:
6397    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
6398matches '++x' in
6399    for (x; x &lt; N; ++x) { }
6400</pre></td></tr>
6401
6402
6403<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>
6404<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
6405
6406Example:
6407    forStmt(hasLoopInit(declStmt()))
6408matches 'int x = 0' in
6409    for (int x = 0; x &lt; N; ++x) { }
6410</pre></td></tr>
6411
6412
6413<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>
6414<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
6415declaration's type.
6416
6417In case of a value declaration (for example a variable declaration),
6418this resolves one layer of indirection. For example, in the value
6419declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6420X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6421declaration of x.
6422
6423Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6424            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6425            and friend class X (matcher = friendDecl(hasType("X"))
6426 class X {};
6427 void y(X &amp;x) { x; X z; }
6428 class Y { friend class X; };
6429
6430Example matches class Derived
6431(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6432class Base {};
6433class Derived : Base {};
6434
6435Usable 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;,
6436Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6437</pre></td></tr>
6438
6439
6440<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>
6441<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6442matcher.
6443
6444Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6445            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6446            and U (matcher = typedefDecl(hasType(asString("int")))
6447            and friend class X (matcher = friendDecl(hasType("X"))
6448 class X {};
6449 void y(X &amp;x) { x; X z; }
6450 typedef int U;
6451 class Y { friend class X; };
6452</pre></td></tr>
6453
6454
6455<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>
6456<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6457block.
6458
6459Does not match the 'this' parameter of a method.
6460
6461Given
6462  class X { void f(int x, int y, int z) {} };
6463cxxMethodDecl(hasAnyParameter(hasName("y")))
6464  matches f(int x, int y, int z) {}
6465with hasAnyParameter(...)
6466  matching int y
6467
6468For ObjectiveC, given
6469  @interface I - (void) f:(int) y; @end
6470
6471the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6472matches the declaration of method f with hasParameter
6473matching y.
6474
6475For blocks, given
6476  b = ^(int y) { printf("%d", y) };
6477
6478the matcher blockDecl(hasAnyParameter(hasName("y")))
6479matches the declaration of the block b with hasParameter
6480matching y.
6481</pre></td></tr>
6482
6483
6484<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>
6485<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6486functionDecl that have at least one TemplateArgument matching the given
6487InnerMatcher.
6488
6489Given
6490  template&lt;typename T&gt; class A {};
6491  template&lt;&gt; class A&lt;double&gt; {};
6492  A&lt;int&gt; a;
6493
6494  template&lt;typename T&gt; f() {};
6495  void func() { f&lt;int&gt;(); };
6496
6497classTemplateSpecializationDecl(hasAnyTemplateArgument(
6498    refersToType(asString("int"))))
6499  matches the specialization A&lt;int&gt;
6500
6501functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6502  matches the specialization f&lt;int&gt;
6503</pre></td></tr>
6504
6505
6506<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>
6507<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
6508definition that has a given body.
6509
6510Given
6511  for (;;) {}
6512hasBody(compoundStmt())
6513  matches 'for (;;) {}'
6514with compoundStmt()
6515  matching '{}'
6516</pre></td></tr>
6517
6518
6519<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>
6520<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6521declaration.
6522
6523Given
6524  template&lt;bool b&gt;
6525  struct S {
6526    S(int); // #1
6527    explicit S(double); // #2
6528    operator int(); // #3
6529    explicit operator bool(); // #4
6530    explicit(false) S(bool) // # 7
6531    explicit(true) S(char) // # 8
6532    explicit(b) S(S) // # 9
6533  };
6534  S(int) -&gt; S&lt;true&gt; // #5
6535  explicit S(double) -&gt; S&lt;false&gt; // #6
6536cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6537cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6538cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6539</pre></td></tr>
6540
6541
6542<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>
6543<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6544declaration or a block.
6545
6546Given
6547  class X { void f(int x) {} };
6548cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6549  matches f(int x) {}
6550with hasParameter(...)
6551  matching int x
6552
6553For ObjectiveC, given
6554  @interface I - (void) f:(int) y; @end
6555
6556the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6557matches the declaration of method f with hasParameter
6558matching y.
6559</pre></td></tr>
6560
6561
6562<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>
6563<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6564functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6565
6566Given
6567  template&lt;typename T, typename U&gt; class A {};
6568  A&lt;bool, int&gt; b;
6569  A&lt;int, bool&gt; c;
6570
6571  template&lt;typename T&gt; void f() {}
6572  void func() { f&lt;int&gt;(); };
6573classTemplateSpecializationDecl(hasTemplateArgument(
6574    1, refersToType(asString("int"))))
6575  matches the specialization A&lt;bool, int&gt;
6576
6577functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6578  matches the specialization f&lt;int&gt;
6579</pre></td></tr>
6580
6581
6582<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>
6583<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6584
6585Given:
6586  class X { int f() { return 1; } };
6587cxxMethodDecl(returns(asString("int")))
6588  matches int f() { return 1; }
6589</pre></td></tr>
6590
6591
6592<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>
6593<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6594switch statement or conditional operator.
6595
6596Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6597  if (true) {}
6598</pre></td></tr>
6599
6600
6601<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>
6602<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6603
6604Given
6605  if (A* a = GetAPointer()) {}
6606hasConditionVariableStatement(...)
6607  matches 'A* a = GetAPointer()'.
6608</pre></td></tr>
6609
6610
6611<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>
6612<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6613
6614Examples matches the if statement
6615  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6616  if (false) false; else true;
6617</pre></td></tr>
6618
6619
6620<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>
6621<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
6622
6623Given:
6624 void foo() {
6625   if (int i = foobar(); i &gt; 0) {}
6626   switch (int i = foobar(); i) {}
6627   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6628 }
6629 void bar() {
6630   if (foobar() &gt; 0) {}
6631   switch (foobar()) {}
6632   for (auto&amp; x : get_range()) {}
6633 }
6634ifStmt(hasInitStatement(anything()))
6635  matches the if statement in foo but not in bar.
6636switchStmt(hasInitStatement(anything()))
6637  matches the switch statement in foo but not in bar.
6638cxxForRangeStmt(hasInitStatement(anything()))
6639  matches the range for statement in foo but not in bar.
6640</pre></td></tr>
6641
6642
6643<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>
6644<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6645
6646Examples matches the if statement
6647  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6648  if (false) true; else false;
6649</pre></td></tr>
6650
6651
6652<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>
6653<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6654matcher.
6655
6656FIXME: Unit test this matcher
6657</pre></td></tr>
6658
6659
6660<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>
6661<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6662
6663Example matches y.
6664    (matcher = initListExpr(hasInit(0, expr())))
6665  int x{y}.
6666</pre></td></tr>
6667
6668
6669<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>
6670<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6671(if expression have it).
6672</pre></td></tr>
6673
6674
6675<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>
6676<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6677matches the given matcher.
6678
6679The associated declaration is:
6680- for type nodes, the declaration of the underlying type
6681- for CallExpr, the declaration of the callee
6682- for MemberExpr, the declaration of the referenced member
6683- for CXXConstructExpr, the declaration of the constructor
6684- for CXXNewExpr, the declaration of the operator new
6685- for ObjCIvarExpr, the declaration of the ivar
6686
6687For type nodes, hasDeclaration will generally match the declaration of the
6688sugared type. Given
6689  class X {};
6690  typedef X Y;
6691  Y y;
6692in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6693typedefDecl. A common use case is to match the underlying, desugared type.
6694This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6695  varDecl(hasType(hasUnqualifiedDesugaredType(
6696      recordType(hasDeclaration(decl())))))
6697In this matcher, the decl will match the CXXRecordDecl of class X.
6698
6699Usable 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;,
6700  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;,
6701  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;,
6702  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;,
6703  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;,
6704  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;,
6705  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6706</pre></td></tr>
6707
6708
6709<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>
6710<tr><td colspan="4" class="doc" id="hasDeclaration8"><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_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>
6744<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
6745
6746Given
6747  struct foo {
6748    void bar() {
6749      auto f = [this](){};
6750    }
6751  }
6752lambdaExpr(hasAnyCapture(cxxThisExpr()))
6753  matches [this](){};
6754</pre></td></tr>
6755
6756
6757<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>
6758<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
6759
6760Given
6761  void foo() {
6762    int x;
6763    auto f = [x](){};
6764  }
6765lambdaExpr(hasAnyCapture(anything()))
6766  matches [x](){};
6767</pre></td></tr>
6768
6769
6770<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>
6771<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6772matches the given matcher.
6773
6774The associated declaration is:
6775- for type nodes, the declaration of the underlying type
6776- for CallExpr, the declaration of the callee
6777- for MemberExpr, the declaration of the referenced member
6778- for CXXConstructExpr, the declaration of the constructor
6779- for CXXNewExpr, the declaration of the operator new
6780- for ObjCIvarExpr, the declaration of the ivar
6781
6782For type nodes, hasDeclaration will generally match the declaration of the
6783sugared type. Given
6784  class X {};
6785  typedef X Y;
6786  Y y;
6787in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6788typedefDecl. A common use case is to match the underlying, desugared type.
6789This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6790  varDecl(hasType(hasUnqualifiedDesugaredType(
6791      recordType(hasDeclaration(decl())))))
6792In this matcher, the decl will match the CXXRecordDecl of class X.
6793
6794Usable 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;,
6795  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;,
6796  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;,
6797  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;,
6798  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;,
6799  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;,
6800  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
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('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>
6805<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6806given matcher. Implicit object expressions are included; that is, it matches
6807use of implicit `this`.
6808
6809Given
6810  struct X {
6811    int m;
6812    int f(X x) { x.m; return m; }
6813  };
6814memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6815  matches `x.m`, but not `m`; however,
6816memberExpr(hasObjectExpression(hasType(pointsTo(
6817     cxxRecordDecl(hasName("X"))))))
6818  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6819</pre></td></tr>
6820
6821
6822<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>
6823<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6824given matcher.
6825
6826Given
6827  struct { int first, second; } first, second;
6828  int i(second.first);
6829  int j(first.second);
6830memberExpr(member(hasName("first")))
6831  matches second.first
6832  but not first.second (because the member name there is "second").
6833</pre></td></tr>
6834
6835
6836<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>
6837<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6838pointee matches a given matcher.
6839
6840Given
6841  int *a;
6842  int const *b;
6843  float const *f;
6844pointerType(pointee(isConstQualified(), isInteger()))
6845  matches "int const *b"
6846
6847Usable 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;,
6848  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;
6849</pre></td></tr>
6850
6851
6852<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>
6853<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6854matcher.
6855
6856Given
6857  namespace N { template&lt;class T&gt; void f(T t); }
6858  template &lt;class T&gt; void g() { using N::f; f(T()); }
6859unresolvedLookupExpr(hasAnyDeclaration(
6860    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6861  matches the use of f in g() .
6862</pre></td></tr>
6863
6864
6865<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>
6866<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6867
6868Given
6869  struct A { struct B { struct C {}; }; };
6870  A::B::C c;
6871nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6872  matches "A::"
6873</pre></td></tr>
6874
6875
6876<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>
6877<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6878NestedNameSpecifier-matcher matches.
6879</pre></td></tr>
6880
6881
6882<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>
6883<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6884given TypeLoc.
6885
6886Given
6887  struct A { struct B { struct C {}; }; };
6888  A::B::C c;
6889nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6890  hasDeclaration(cxxRecordDecl(hasName("A")))))))
6891  matches "A::"
6892</pre></td></tr>
6893
6894
6895<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>
6896<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6897
6898Given
6899  struct A { struct B { struct C {}; }; };
6900  A::B::C c;
6901nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6902  matches "A::"
6903</pre></td></tr>
6904
6905
6906<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>
6907<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6908given namespace matcher.
6909
6910Given
6911  namespace ns { struct A {}; }
6912  ns::A a;
6913nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6914  matches "ns::"
6915</pre></td></tr>
6916
6917
6918<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>
6919<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6920given QualType matcher without qualifiers.
6921
6922Given
6923  struct A { struct B { struct C {}; }; };
6924  A::B::C c;
6925nestedNameSpecifier(specifiesType(
6926  hasDeclaration(cxxRecordDecl(hasName("A")))
6927))
6928  matches "A::"
6929</pre></td></tr>
6930
6931
6932<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>
6933<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6934
6935Given
6936
6937  #pragma omp parallel
6938  #pragma omp parallel default(none)
6939
6940``ompExecutableDirective(hasAnyClause(anything()))`` matches
6941``omp parallel default(none)``.
6942</pre></td></tr>
6943
6944
6945<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>
6946<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6947
6948Prerequisite: the executable directive must not be standalone directive.
6949If it is, it will never match.
6950
6951Given
6952
6953   #pragma omp parallel
6954   ;
6955   #pragma omp parallel
6956   {}
6957
6958``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6959</pre></td></tr>
6960
6961
6962<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>
6963<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
6964matching Base, or Objective-C classes that directly or indirectly
6965subclass a class matching Base.
6966
6967Note that a class is not considered to be derived from itself.
6968
6969Example matches Y, Z, C (Base == hasName("X"))
6970  class X;
6971  class Y : public X {};  // directly derived
6972  class Z : public Y {};  // indirectly derived
6973  typedef X A;
6974  typedef A B;
6975  class C : public B {};  // derived from a typedef of X
6976
6977In the following example, Bar matches isDerivedFrom(hasName("X")):
6978  class Foo;
6979  typedef Foo X;
6980  class Bar : public Foo {};  // derived from a type that X is a typedef of
6981
6982In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6983  @interface NSObject @end
6984  @interface Bar : NSObject @end
6985
6986Usable 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;
6987</pre></td></tr>
6988
6989
6990<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>
6991<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6992matching Base.
6993
6994Note that a class is not considered to be derived from itself.
6995
6996Example matches Y, C (Base == hasName("X"))
6997  class X;
6998  class Y : public X {};  // directly derived
6999  class Z : public Y {};  // indirectly derived
7000  typedef X A;
7001  typedef A B;
7002  class C : public B {};  // derived from a typedef of X
7003
7004In the following example, Bar matches isDerivedFrom(hasName("X")):
7005  class Foo;
7006  typedef Foo X;
7007  class Bar : public Foo {};  // derived from a type that X is a typedef of
7008</pre></td></tr>
7009
7010
7011<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>
7012<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7013match Base.
7014</pre></td></tr>
7015
7016
7017<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>
7018<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
7019expression, or an ObjC-message-send expression.
7020
7021Given
7022  void x(int, int, int) { int y; x(1, y, 42); }
7023callExpr(hasAnyArgument(declRefExpr()))
7024  matches x(1, y, 42)
7025with hasAnyArgument(...)
7026  matching y
7027
7028For ObjectiveC, given
7029  @interface I - (void) f:(int) y; @end
7030  void foo(I *i) { [i f:12]; }
7031objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7032  matches [i f:12]
7033</pre></td></tr>
7034
7035
7036<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>
7037<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7038call expression.
7039
7040Example matches y in x(y)
7041    (matcher = callExpr(hasArgument(0, declRefExpr())))
7042  void x(int) { int y; x(y); }
7043</pre></td></tr>
7044
7045
7046<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>
7047<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
7048and the inner matcher matches on that instance.
7049
7050For example the method call in
7051  NSString *x = @"hello";
7052  [x containsString:@"h"];
7053is matched by
7054objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
7055</pre></td></tr>
7056
7057
7058<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>
7059<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
7060
7061Example
7062matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
7063matches the [webView ...] message invocation.
7064  NSString *webViewJavaScript = ...
7065  UIWebView *webView = ...
7066  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
7067</pre></td></tr>
7068
7069
7070<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>
7071<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
7072block.
7073
7074Does not match the 'this' parameter of a method.
7075
7076Given
7077  class X { void f(int x, int y, int z) {} };
7078cxxMethodDecl(hasAnyParameter(hasName("y")))
7079  matches f(int x, int y, int z) {}
7080with hasAnyParameter(...)
7081  matching int y
7082
7083For ObjectiveC, given
7084  @interface I - (void) f:(int) y; @end
7085
7086the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7087matches the declaration of method f with hasParameter
7088matching y.
7089
7090For blocks, given
7091  b = ^(int y) { printf("%d", y) };
7092
7093the matcher blockDecl(hasAnyParameter(hasName("y")))
7094matches the declaration of the block b with hasParameter
7095matching y.
7096</pre></td></tr>
7097
7098
7099<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>
7100<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
7101declaration or a block.
7102
7103Given
7104  class X { void f(int x) {} };
7105cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7106  matches f(int x) {}
7107with hasParameter(...)
7108  matching int x
7109
7110For ObjectiveC, given
7111  @interface I - (void) f:(int) y; @end
7112
7113the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7114matches the declaration of method f with hasParameter
7115matching y.
7116</pre></td></tr>
7117
7118
7119<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>
7120<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
7121or opaque value's source expression matches the given matcher.
7122
7123Example 1: matches "a string"
7124(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7125class URL { URL(string); };
7126URL url = "a string";
7127
7128Example 2: matches 'b' (matcher =
7129opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7130int a = b ?: 1;
7131</pre></td></tr>
7132
7133
7134<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>
7135<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
7136overloads matches the given matcher.
7137
7138Given
7139  template &lt;typename T&gt; void foo(T);
7140  template &lt;typename T&gt; void bar(T);
7141  template &lt;typename T&gt; void baz(T t) {
7142    foo(t);
7143    bar(t);
7144  }
7145unresolvedLookupExpr(hasAnyDeclaration(
7146    functionTemplateDecl(hasName("foo"))))
7147  matches foo in foo(t); but not bar in bar(t);
7148</pre></td></tr>
7149
7150
7151<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>
7152<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
7153
7154Given
7155  int (*ptr_to_array)[4];
7156  int (*ptr_to_func)(int);
7157
7158varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
7159ptr_to_func but not ptr_to_array.
7160
7161Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
7162</pre></td></tr>
7163
7164
7165<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>
7166<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
7167pointee matches a given matcher.
7168
7169Given
7170  int *a;
7171  int const *b;
7172  float const *f;
7173pointerType(pointee(isConstQualified(), isInteger()))
7174  matches "int const *b"
7175
7176Usable 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;,
7177  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;
7178</pre></td></tr>
7179
7180
7181<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>
7182<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
7183
7184Given:
7185  typedef int &amp;int_ref;
7186  int a;
7187  int_ref b = a;
7188
7189varDecl(hasType(qualType(referenceType()))))) will not match the
7190declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
7191</pre></td></tr>
7192
7193
7194<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>
7195<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
7196matches the given matcher.
7197
7198The associated declaration is:
7199- for type nodes, the declaration of the underlying type
7200- for CallExpr, the declaration of the callee
7201- for MemberExpr, the declaration of the referenced member
7202- for CXXConstructExpr, the declaration of the constructor
7203- for CXXNewExpr, the declaration of the operator new
7204- for ObjCIvarExpr, the declaration of the ivar
7205
7206For type nodes, hasDeclaration will generally match the declaration of the
7207sugared type. Given
7208  class X {};
7209  typedef X Y;
7210  Y y;
7211in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7212typedefDecl. A common use case is to match the underlying, desugared type.
7213This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7214  varDecl(hasType(hasUnqualifiedDesugaredType(
7215      recordType(hasDeclaration(decl())))))
7216In this matcher, the decl will match the CXXRecordDecl of class X.
7217
7218Usable 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;,
7219  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;,
7220  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;,
7221  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;,
7222  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;,
7223  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;,
7224  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
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('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>
7229<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
7230
7231Given
7232  void (*fp)(void);
7233The matcher
7234  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
7235would match the declaration for fp.
7236</pre></td></tr>
7237
7238
7239<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>
7240<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
7241</pre></td></tr>
7242
7243
7244<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>
7245<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
7246matches the specified matcher.
7247
7248Example matches y-&gt;x()
7249  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
7250     cxxRecordDecl(hasName("Y")))))))
7251  class Y { public: void x(); };
7252  void z() { Y *y; y-&gt;x(); }
7253</pre></td></tr>
7254
7255
7256<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>
7257<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
7258</pre></td></tr>
7259
7260
7261<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>
7262<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
7263type matches the specified matcher.
7264
7265Example matches X &amp;x and const X &amp;y
7266    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
7267  class X {
7268    void a(X b) {
7269      X &amp;x = b;
7270      const X &amp;y = b;
7271    }
7272  };
7273</pre></td></tr>
7274
7275
7276<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>
7277<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
7278matches the given matcher.
7279
7280The associated declaration is:
7281- for type nodes, the declaration of the underlying type
7282- for CallExpr, the declaration of the callee
7283- for MemberExpr, the declaration of the referenced member
7284- for CXXConstructExpr, the declaration of the constructor
7285- for CXXNewExpr, the declaration of the operator new
7286- for ObjCIvarExpr, the declaration of the ivar
7287
7288For type nodes, hasDeclaration will generally match the declaration of the
7289sugared type. Given
7290  class X {};
7291  typedef X Y;
7292  Y y;
7293in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7294typedefDecl. A common use case is to match the underlying, desugared type.
7295This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7296  varDecl(hasType(hasUnqualifiedDesugaredType(
7297      recordType(hasDeclaration(decl())))))
7298In this matcher, the decl will match the CXXRecordDecl of class X.
7299
7300Usable 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;,
7301  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;,
7302  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;,
7303  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;,
7304  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;,
7305  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;,
7306  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7307</pre></td></tr>
7308
7309
7310<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>
7311<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
7312pointee matches a given matcher.
7313
7314Given
7315  int *a;
7316  int const *b;
7317  float const *f;
7318pointerType(pointee(isConstQualified(), isInteger()))
7319  matches "int const *b"
7320
7321Usable 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;,
7322  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;
7323</pre></td></tr>
7324
7325
7326<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>
7327<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
7328
7329Given
7330  return a + b;
7331hasReturnValue(binaryOperator())
7332  matches 'return a + b'
7333with binaryOperator()
7334  matching 'a + b'
7335</pre></td></tr>
7336
7337
7338<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>
7339<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
7340a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7341
7342Given
7343  { {}; 1+2; }
7344hasAnySubstatement(compoundStmt())
7345  matches '{ {}; 1+2; }'
7346with compoundStmt()
7347  matching '{}'
7348</pre></td></tr>
7349
7350
7351<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>
7352<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7353alignof.
7354</pre></td></tr>
7355
7356
7357<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>
7358<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
7359
7360Given:
7361F&amp; operator=(const F&amp; o) {
7362  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
7363  return *this;
7364}
7365returnStmt(forFunction(hasName("operator=")))
7366  matches 'return *this'
7367  but does not match 'return v &gt; 0'
7368</pre></td></tr>
7369
7370
7371<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>
7372<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7373sizeof.
7374</pre></td></tr>
7375
7376
7377<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>
7378<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
7379type that matches the provided matcher.
7380
7381Given
7382  template &lt;typename T&gt;
7383  double F(T t);
7384  int i;
7385  double j = F(i);
7386
7387substTemplateTypeParmType(hasReplacementType(type())) matches int
7388</pre></td></tr>
7389
7390
7391<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>
7392<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
7393statement. This matcher may produce multiple matches.
7394
7395Given
7396  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
7397switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
7398  matches four times, with "c" binding each of "case 1:", "case 2:",
7399"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
7400"switch (1)", "switch (2)" and "switch (2)".
7401</pre></td></tr>
7402
7403
7404<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>
7405<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
7406switch statement or conditional operator.
7407
7408Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7409  if (true) {}
7410</pre></td></tr>
7411
7412
7413<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>
7414<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
7415
7416Given:
7417 void foo() {
7418   if (int i = foobar(); i &gt; 0) {}
7419   switch (int i = foobar(); i) {}
7420   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7421 }
7422 void bar() {
7423   if (foobar() &gt; 0) {}
7424   switch (foobar()) {}
7425   for (auto&amp; x : get_range()) {}
7426 }
7427ifStmt(hasInitStatement(anything()))
7428  matches the if statement in foo but not in bar.
7429switchStmt(hasInitStatement(anything()))
7430  matches the switch statement in foo but not in bar.
7431cxxForRangeStmt(hasInitStatement(anything()))
7432  matches the range for statement in foo but not in bar.
7433</pre></td></tr>
7434
7435
7436<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>
7437<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
7438matches the given matcher.
7439
7440The associated declaration is:
7441- for type nodes, the declaration of the underlying type
7442- for CallExpr, the declaration of the callee
7443- for MemberExpr, the declaration of the referenced member
7444- for CXXConstructExpr, the declaration of the constructor
7445- for CXXNewExpr, the declaration of the operator new
7446- for ObjCIvarExpr, the declaration of the ivar
7447
7448For type nodes, hasDeclaration will generally match the declaration of the
7449sugared type. Given
7450  class X {};
7451  typedef X Y;
7452  Y y;
7453in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7454typedefDecl. A common use case is to match the underlying, desugared type.
7455This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7456  varDecl(hasType(hasUnqualifiedDesugaredType(
7457      recordType(hasDeclaration(decl())))))
7458In this matcher, the decl will match the CXXRecordDecl of class X.
7459
7460Usable 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;,
7461  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;,
7462  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;,
7463  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;,
7464  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;,
7465  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;,
7466  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7467</pre></td></tr>
7468
7469
7470<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>
7471<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
7472
7473Given
7474  struct B { int next; };
7475  template&lt;int(B::*next_ptr)&gt; struct A {};
7476  A&lt;&amp;B::next&gt; a;
7477templateSpecializationType(hasAnyTemplateArgument(
7478  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
7479  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7480    B::next
7481</pre></td></tr>
7482
7483
7484<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>
7485<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
7486declaration.
7487
7488Given
7489  struct B { int next; };
7490  template&lt;int(B::*next_ptr)&gt; struct A {};
7491  A&lt;&amp;B::next&gt; a;
7492classTemplateSpecializationDecl(hasAnyTemplateArgument(
7493    refersToDeclaration(fieldDecl(hasName("next")))))
7494  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7495    B::next
7496</pre></td></tr>
7497
7498
7499<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>
7500<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
7501
7502Given
7503  template&lt;int T&gt; struct C {};
7504  C&lt;42&gt; c;
7505classTemplateSpecializationDecl(
7506  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
7507  matches the implicit instantiation of C in C&lt;42&gt;.
7508</pre></td></tr>
7509
7510
7511<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>
7512<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
7513
7514Given
7515  template&lt;template &lt;typename&gt; class S&gt; class X {};
7516  template&lt;typename T&gt; class Y {};
7517  X&lt;Y&gt; xi;
7518classTemplateSpecializationDecl(hasAnyTemplateArgument(
7519    refersToTemplate(templateName())))
7520  matches the specialization X&lt;Y&gt;
7521</pre></td></tr>
7522
7523
7524<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>
7525<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
7526
7527Given
7528  struct X {};
7529  template&lt;typename T&gt; struct A {};
7530  A&lt;X&gt; a;
7531classTemplateSpecializationDecl(hasAnyTemplateArgument(
7532    refersToType(class(hasName("X")))))
7533  matches the specialization A&lt;X&gt;
7534</pre></td></tr>
7535
7536
7537<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>
7538<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7539functionDecl that have at least one TemplateArgument matching the given
7540InnerMatcher.
7541
7542Given
7543  template&lt;typename T&gt; class A {};
7544  template&lt;&gt; class A&lt;double&gt; {};
7545  A&lt;int&gt; a;
7546
7547  template&lt;typename T&gt; f() {};
7548  void func() { f&lt;int&gt;(); };
7549
7550classTemplateSpecializationDecl(hasAnyTemplateArgument(
7551    refersToType(asString("int"))))
7552  matches the specialization A&lt;int&gt;
7553
7554functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7555  matches the specialization f&lt;int&gt;
7556</pre></td></tr>
7557
7558
7559<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>
7560<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
7561matches the given matcher.
7562
7563The associated declaration is:
7564- for type nodes, the declaration of the underlying type
7565- for CallExpr, the declaration of the callee
7566- for MemberExpr, the declaration of the referenced member
7567- for CXXConstructExpr, the declaration of the constructor
7568- for CXXNewExpr, the declaration of the operator new
7569- for ObjCIvarExpr, the declaration of the ivar
7570
7571For type nodes, hasDeclaration will generally match the declaration of the
7572sugared type. Given
7573  class X {};
7574  typedef X Y;
7575  Y y;
7576in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7577typedefDecl. A common use case is to match the underlying, desugared type.
7578This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7579  varDecl(hasType(hasUnqualifiedDesugaredType(
7580      recordType(hasDeclaration(decl())))))
7581In this matcher, the decl will match the CXXRecordDecl of class X.
7582
7583Usable 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;,
7584  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;,
7585  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;,
7586  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;,
7587  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;,
7588  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;,
7589  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&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('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>
7594<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7595functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7596
7597Given
7598  template&lt;typename T, typename U&gt; class A {};
7599  A&lt;bool, int&gt; b;
7600  A&lt;int, bool&gt; c;
7601
7602  template&lt;typename T&gt; void f() {}
7603  void func() { f&lt;int&gt;(); };
7604classTemplateSpecializationDecl(hasTemplateArgument(
7605    1, refersToType(asString("int"))))
7606  matches the specialization A&lt;bool, int&gt;
7607
7608functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7609  matches the specialization f&lt;int&gt;
7610</pre></td></tr>
7611
7612
7613<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>
7614<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7615matches the given matcher.
7616
7617The associated declaration is:
7618- for type nodes, the declaration of the underlying type
7619- for CallExpr, the declaration of the callee
7620- for MemberExpr, the declaration of the referenced member
7621- for CXXConstructExpr, the declaration of the constructor
7622- for CXXNewExpr, the declaration of the operator new
7623- for ObjCIvarExpr, the declaration of the ivar
7624
7625For type nodes, hasDeclaration will generally match the declaration of the
7626sugared type. Given
7627  class X {};
7628  typedef X Y;
7629  Y y;
7630in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7631typedefDecl. A common use case is to match the underlying, desugared type.
7632This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7633  varDecl(hasType(hasUnqualifiedDesugaredType(
7634      recordType(hasDeclaration(decl())))))
7635In this matcher, the decl will match the CXXRecordDecl of class X.
7636
7637Usable 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;,
7638  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;,
7639  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;,
7640  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;,
7641  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;,
7642  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;,
7643  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7644</pre></td></tr>
7645
7646
7647<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>
7648<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7649QualType-matcher matches.
7650</pre></td></tr>
7651
7652
7653<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>
7654<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7655matcher.
7656
7657Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7658            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7659            and U (matcher = typedefDecl(hasType(asString("int")))
7660            and friend class X (matcher = friendDecl(hasType("X"))
7661 class X {};
7662 void y(X &amp;x) { x; X z; }
7663 typedef int U;
7664 class Y { friend class X; };
7665</pre></td></tr>
7666
7667
7668<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>
7669<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7670matches the given matcher.
7671
7672The associated declaration is:
7673- for type nodes, the declaration of the underlying type
7674- for CallExpr, the declaration of the callee
7675- for MemberExpr, the declaration of the referenced member
7676- for CXXConstructExpr, the declaration of the constructor
7677- for CXXNewExpr, the declaration of the operator new
7678- for ObjCIvarExpr, the declaration of the ivar
7679
7680For type nodes, hasDeclaration will generally match the declaration of the
7681sugared type. Given
7682  class X {};
7683  typedef X Y;
7684  Y y;
7685in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7686typedefDecl. A common use case is to match the underlying, desugared type.
7687This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7688  varDecl(hasType(hasUnqualifiedDesugaredType(
7689      recordType(hasDeclaration(decl())))))
7690In this matcher, the decl will match the CXXRecordDecl of class X.
7691
7692Usable 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;,
7693  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;,
7694  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;,
7695  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;,
7696  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;,
7697  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;,
7698  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7699</pre></td></tr>
7700
7701
7702<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>
7703<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7704type of the matched node.
7705
7706For example, in:
7707  class A {};
7708  using B = A;
7709The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7710both B and A.
7711</pre></td></tr>
7712
7713
7714<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>
7715<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7716
7717Given
7718  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7719unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7720  matches sizeof(a) and alignof(c)
7721</pre></td></tr>
7722
7723
7724<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>
7725<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7726
7727Example matches true (matcher = hasUnaryOperand(
7728                                  cxxBoolLiteral(equals(true))))
7729  !true
7730</pre></td></tr>
7731
7732
7733<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>
7734<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7735given matcher. Implicit object expressions are included; that is, it matches
7736use of implicit `this`.
7737
7738Given
7739  struct X {
7740    int m;
7741    int f(X x) { x.m; return m; }
7742  };
7743memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7744  matches `x.m`, but not `m`; however,
7745memberExpr(hasObjectExpression(hasType(pointsTo(
7746     cxxRecordDecl(hasName("X"))))))
7747  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7748</pre></td></tr>
7749
7750
7751<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>
7752<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7753matches the given matcher.
7754
7755The associated declaration is:
7756- for type nodes, the declaration of the underlying type
7757- for CallExpr, the declaration of the callee
7758- for MemberExpr, the declaration of the referenced member
7759- for CXXConstructExpr, the declaration of the constructor
7760- for CXXNewExpr, the declaration of the operator new
7761- for ObjCIvarExpr, the declaration of the ivar
7762
7763For type nodes, hasDeclaration will generally match the declaration of the
7764sugared type. Given
7765  class X {};
7766  typedef X Y;
7767  Y y;
7768in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7769typedefDecl. A common use case is to match the underlying, desugared type.
7770This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7771  varDecl(hasType(hasUnqualifiedDesugaredType(
7772      recordType(hasDeclaration(decl())))))
7773In this matcher, the decl will match the CXXRecordDecl of class X.
7774
7775Usable 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;,
7776  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;,
7777  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;,
7778  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;,
7779  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;,
7780  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;,
7781  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7782</pre></td></tr>
7783
7784
7785<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>
7786<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7787
7788Given
7789  namespace X { void b(); }
7790  using X::b;
7791usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7792  matches using X::b </pre></td></tr>
7793
7794
7795<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>
7796<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7797matched by the given matcher.
7798
7799Given
7800  namespace X { int a; void b(); }
7801  using X::a;
7802  using X::b;
7803usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7804  matches using X::b but not using X::a </pre></td></tr>
7805
7806
7807<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>
7808<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7809declaration's type.
7810
7811In case of a value declaration (for example a variable declaration),
7812this resolves one layer of indirection. For example, in the value
7813declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7814X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7815declaration of x.
7816
7817Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7818            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7819            and friend class X (matcher = friendDecl(hasType("X"))
7820 class X {};
7821 void y(X &amp;x) { x; X z; }
7822 class Y { friend class X; };
7823
7824Example matches class Derived
7825(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7826class Base {};
7827class Derived : Base {};
7828
7829Usable 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;,
7830Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7831</pre></td></tr>
7832
7833
7834<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>
7835<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7836matcher.
7837
7838Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7839            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7840            and U (matcher = typedefDecl(hasType(asString("int")))
7841            and friend class X (matcher = friendDecl(hasType("X"))
7842 class X {};
7843 void y(X &amp;x) { x; X z; }
7844 typedef int U;
7845 class Y { friend class X; };
7846</pre></td></tr>
7847
7848
7849<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>
7850<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7851that matches the given matcher.
7852
7853Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7854  bool y() { return true; }
7855  bool x = y();
7856</pre></td></tr>
7857
7858
7859<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>
7860<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7861expression.
7862
7863Given
7864  void f(int b) {
7865    int a[b];
7866  }
7867variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7868  varDecl(hasName("b")))))))
7869  matches "int a[b]"
7870</pre></td></tr>
7871
7872
7873<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>
7874<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7875definition that has a given body.
7876
7877Given
7878  for (;;) {}
7879hasBody(compoundStmt())
7880  matches 'for (;;) {}'
7881with compoundStmt()
7882  matching '{}'
7883</pre></td></tr>
7884
7885
7886<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>
7887<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
7888switch statement or conditional operator.
7889
7890Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7891  if (true) {}
7892</pre></td></tr>
7893
7894<!--END_TRAVERSAL_MATCHERS -->
7895</table>
7896
7897</div>
7898</body>
7899</html>
7900
7901
7902