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