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