1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23  if (!id) return;
24  row = document.getElementById(id);
25  if (row.style.display != 'table-cell')
26    row.style.display = 'table-cell';
27  else
28    row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66    ifStmt(hasTrueExpression(
67        expr(hasDescendant(
68            ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
103<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107  class C {
108    C() : i(42) {}
109    int i;
110  };
111</pre></td></tr>
112
113
114<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118  class C {
119  public:
120    int a;
121  };
122accessSpecDecl()
123  matches 'public:'
124</pre></td></tr>
125
126
127<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
128<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
129
130Example matches the declaration of the nameless block printing an input
131integer.
132
133  myFunc(^(int p) {
134    printf("%d", p);
135  })
136</pre></td></tr>
137
138
139<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
140<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
141
142Example matches Z
143  template&lt;class T&gt; class Z {};
144</pre></td></tr>
145
146
147<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
148<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
149
150Given
151  template&lt;class T1, class T2, int I&gt;
152  class A {};
153
154  template&lt;class T, int I&gt;
155  class A&lt;T, T*, I&gt; {};
156
157  template&lt;&gt;
158  class A&lt;int, int, 1&gt; {};
159classTemplatePartialSpecializationDecl()
160  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
161</pre></td></tr>
162
163
164<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
165<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
166
167Given
168  template&lt;typename T&gt; class A {};
169  template&lt;&gt; class A&lt;double&gt; {};
170  A&lt;int&gt; a;
171classTemplateSpecializationDecl()
172  matches the specializations A&lt;int&gt; and A&lt;double&gt;
173</pre></td></tr>
174
175
176<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
177<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
178
179Example matches Foo::Foo() and Foo::Foo(int)
180  class Foo {
181   public:
182    Foo();
183    Foo(int);
184    int DoSomething();
185  };
186</pre></td></tr>
187
188
189<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
190<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
191
192Example matches the operator.
193  class X { operator int() const; };
194</pre></td></tr>
195
196
197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
198<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
199
200Example matches the deduction guide.
201  template&lt;typename T&gt;
202  class X { X(int) };
203  X(int) -&gt; X&lt;int&gt;;
204</pre></td></tr>
205
206
207<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
208<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
209
210Example matches Foo::~Foo()
211  class Foo {
212   public:
213    virtual ~Foo();
214  };
215</pre></td></tr>
216
217
218<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
219<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
220
221Example matches y
222  class X { void y(); };
223</pre></td></tr>
224
225
226<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
227<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
228
229Example matches X, Z
230  class X;
231  template&lt;class T&gt; class Z {};
232</pre></td></tr>
233
234
235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
236<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
237
238Examples matches X, C, and the friend declaration inside C;
239  void X();
240  class C {
241    friend X;
242  };
243</pre></td></tr>
244
245
246<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
247<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
248and non-type template parameter declarations).
249
250Given
251  class X { int y; };
252declaratorDecl()
253  matches int y.
254</pre></td></tr>
255
256
257<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
258<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
259
260Example matches A, B, C
261  enum X {
262    A, B, C
263  };
264</pre></td></tr>
265
266
267<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
268<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
269
270Example matches X
271  enum X {
272    A, B, C
273  };
274</pre></td></tr>
275
276
277<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
278<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
279
280Given
281  class X { int m; };
282fieldDecl()
283  matches 'm'.
284</pre></td></tr>
285
286
287<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
288<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
289
290Given
291  class X { friend void foo(); };
292friendDecl()
293  matches 'friend void foo()'.
294</pre></td></tr>
295
296
297<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
298<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
299
300Example matches f
301  void f();
302</pre></td></tr>
303
304
305<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
306<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
307
308Example matches f
309  template&lt;class T&gt; void f(T t) {}
310</pre></td></tr>
311
312
313<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
314<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
315
316Given
317  struct X { struct { int a; }; };
318indirectFieldDecl()
319  matches 'a'.
320</pre></td></tr>
321
322
323<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
324<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
325
326Given
327  goto FOO;
328  FOO: bar();
329labelDecl()
330  matches 'FOO:'
331</pre></td></tr>
332
333
334<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
335<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
336
337Given
338  extern "C" {}
339linkageSpecDecl()
340  matches "extern "C" {}"
341</pre></td></tr>
342
343
344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
345<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
346
347Example matches X, S, the anonymous union type, i, and U;
348  typedef int X;
349  struct S {
350    union {
351      int i;
352    } U;
353  };
354</pre></td></tr>
355
356
357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
358<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
359
360Given
361  namespace test {}
362  namespace alias = ::test;
363namespaceAliasDecl()
364  matches "namespace alias" but not "namespace test"
365</pre></td></tr>
366
367
368<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
369<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
370
371Given
372  namespace {}
373  namespace test {}
374namespaceDecl()
375  matches "namespace {}" and "namespace test {}"
376</pre></td></tr>
377
378
379<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
380<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
381
382Given
383  template &lt;typename T, int N&gt; struct C {};
384nonTypeTemplateParmDecl()
385  matches 'N', but not 'T'.
386</pre></td></tr>
387
388
389<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
390<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
391
392Example matches Foo (Additions)
393  @interface Foo (Additions)
394  @end
395</pre></td></tr>
396
397
398<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
399<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
400
401Example matches Foo (Additions)
402  @implementation Foo (Additions)
403  @end
404</pre></td></tr>
405
406
407<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
408<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
409
410Example matches Foo
411  @implementation Foo
412  @end
413</pre></td></tr>
414
415
416<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
417<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
418
419Example matches Foo
420  @interface Foo
421  @end
422</pre></td></tr>
423
424
425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
426<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
427
428Example matches _enabled
429  @implementation Foo {
430    BOOL _enabled;
431  }
432  @end
433</pre></td></tr>
434
435
436<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
437<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
438
439Example matches both declaration and definition of -[Foo method]
440  @interface Foo
441  - (void)method;
442  @end
443
444  @implementation Foo
445  - (void)method {}
446  @end
447</pre></td></tr>
448
449
450<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
451<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
452
453Example matches enabled
454  @interface Foo
455  @property BOOL enabled;
456  @end
457</pre></td></tr>
458
459
460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
461<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
462
463Example matches FooDelegate
464  @protocol FooDelegate
465  @end
466</pre></td></tr>
467
468
469<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
470<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
471
472Given
473  void f(int x);
474parmVarDecl()
475  matches int x.
476</pre></td></tr>
477
478
479<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
480<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
481
482Example matches X, Z, U, and S
483  class X;
484  template&lt;class T&gt; class Z {};
485  struct S {};
486  union U {};
487</pre></td></tr>
488
489
490<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
491<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
492
493Example:
494  staticAssertExpr()
495matches
496  static_assert(sizeof(S) == sizeof(int))
497in
498  struct S {
499    int x;
500  };
501  static_assert(sizeof(S) == sizeof(int));
502</pre></td></tr>
503
504
505<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
506<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
507
508Example matches X, Z, U, S, E
509  class X;
510  template&lt;class T&gt; class Z {};
511  struct S {};
512  union U {};
513  enum E {
514    A, B, C
515  };
516</pre></td></tr>
517
518
519<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
520<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
521
522Given
523  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
524templateTypeParmDecl()
525  matches 'Z', but not 'N'.
526</pre></td></tr>
527
528
529<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
530<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
531
532Given
533  template &lt;typename T, int N&gt; struct C {};
534templateTypeParmDecl()
535  matches 'T', but not 'N'.
536</pre></td></tr>
537
538
539<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
540<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
541
542Given
543  int X;
544  namespace NS {
545  int Y;
546  }  // namespace NS
547decl(hasDeclContext(translationUnitDecl()))
548  matches "int X", but not "int Y".
549</pre></td></tr>
550
551
552<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
553<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
554
555Given
556  typedef int X;
557  using Y = int;
558typeAliasDecl()
559  matches "using Y = int", but not "typedef int X"
560</pre></td></tr>
561
562
563<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
564<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
565
566typeAliasTemplateDecl() matches
567  template &lt;typename T&gt;
568  using Y = X&lt;T&gt;;
569</pre></td></tr>
570
571
572<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
573<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
574
575Given
576  typedef int X;
577  using Y = int;
578typedefDecl()
579  matches "typedef int X", but not "using Y = int"
580</pre></td></tr>
581
582
583<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
584<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
585
586Given
587  typedef int X;
588  using Y = int;
589typedefNameDecl()
590  matches "typedef int X" and "using Y = int"
591</pre></td></tr>
592
593
594<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
595<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
596typename.
597
598Given
599  template &lt;typename T&gt;
600  struct Base { typedef T Foo; };
601
602  template&lt;typename T&gt;
603  struct S : private Base&lt;T&gt; {
604    using typename Base&lt;T&gt;::Foo;
605  };
606unresolvedUsingTypenameDecl()
607  matches using Base&lt;T&gt;::Foo </pre></td></tr>
608
609
610<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
611<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
612
613Given
614  template&lt;typename X&gt;
615  class C : private X {
616    using X::x;
617  };
618unresolvedUsingValueDecl()
619  matches using X::x </pre></td></tr>
620
621
622<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
623<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
624
625Given
626  namespace X { int x; }
627  using X::x;
628usingDecl()
629  matches using X::x </pre></td></tr>
630
631
632<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
633<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
634
635Given
636  namespace X { int x; }
637  using namespace X;
638usingDirectiveDecl()
639  matches using namespace X </pre></td></tr>
640
641
642<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
643<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
644
645Example matches A, B, C and F
646  enum X { A, B, C };
647  void F();
648</pre></td></tr>
649
650
651<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
652<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
653
654Note: this does not match declarations of member variables, which are
655"field" declarations in Clang parlance.
656
657Example matches a
658  int a;
659</pre></td></tr>
660
661
662<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
663<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
664
665Examples matches the declaration node with foo and bar, but not
666number.
667(matcher = declStmt(has(decompositionDecl())))
668
669  int number = 42;
670  auto [foo, bar] = std::make_pair{42, 42};
671</pre></td></tr>
672
673
674<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
675<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
676</pre></td></tr>
677
678
679<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
680<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
681
682Given
683  namespace ns {
684    struct A { static void f(); };
685    void A::f() {}
686    void g() { A::f(); }
687  }
688  ns::A a;
689nestedNameSpecifier()
690  matches "ns::" and both "A::"
691</pre></td></tr>
692
693
694<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
695<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
696
697Given
698
699  #pragma omp parallel default(none)
700  #pragma omp parallel default(shared)
701  #pragma omp parallel default(firstprivate)
702  #pragma omp parallel
703
704``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
705``default(firstprivate)``
706</pre></td></tr>
707
708
709<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
710<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
711</pre></td></tr>
712
713
714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
715<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
716
717Given
718  FOO: bar();
719  void *ptr = &amp;&amp;FOO;
720  goto *bar;
721addrLabelExpr()
722  matches '&amp;&amp;FOO'
723</pre></td></tr>
724
725
726<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
727<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
728
729Given
730  int i = a[1];
731arraySubscriptExpr()
732  matches "a[1]"
733</pre></td></tr>
734
735
736<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
737<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
738
739 int i = 100;
740  __asm("mov al, 2");
741asmStmt()
742  matches '__asm("mov al, 2")'
743</pre></td></tr>
744
745
746<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
747<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
748Example matches __atomic_load_n(ptr, 1)
749  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
750</pre></td></tr>
751
752
753<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
754<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
755
756Given
757  @autoreleasepool {
758    int x = 0;
759  }
760autoreleasePoolStmt(stmt()) matches the declaration of "x"
761inside the autorelease pool.
762</pre></td></tr>
763
764
765<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
766<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
767
768Example matches a ?: b
769  (a ?: b) + 42;
770</pre></td></tr>
771
772
773<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
774<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
775
776Example matches a || b
777  !(a || b)
778</pre></td></tr>
779
780
781<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
782<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
783
784Example: matches "^{}":
785  void f() { ^{}(); }
786</pre></td></tr>
787
788
789<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
790<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
791
792Given
793  while (true) { break; }
794breakStmt()
795  matches 'break'
796</pre></td></tr>
797
798
799<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
800<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
801
802Example: Matches (int) 2.2f in
803  int i = (int) 2.2f;
804</pre></td></tr>
805
806
807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
808<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
809
810Example matches x.y() and y()
811  X x;
812  x.y();
813  y();
814</pre></td></tr>
815
816
817<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
818<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
819
820Given
821  switch(a) { case 42: break; default: break; }
822caseStmt()
823  matches 'case 42:'.
824</pre></td></tr>
825
826
827<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
828<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
829
830Example: castExpr() matches each of the following:
831  (int) 3;
832  const_cast&lt;Expr *&gt;(SubExpr);
833  char c = 0;
834but does not match
835  int i = (0);
836  int k = 0;
837</pre></td></tr>
838
839
840<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
841<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
842
843Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
844though.
845
846Example matches 'a', L'a'
847  char ch = 'a';
848  wchar_t chw = L'a';
849</pre></td></tr>
850
851
852<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
853<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
854</pre></td></tr>
855
856
857<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
858<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
859
860Example match: {1}, (1, 2)
861  int array[4] = {1};
862  vector int myvec = (vector int)(1, 2);
863</pre></td></tr>
864
865
866<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
867<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
868
869Example matches '{}' and '{{}}' in 'for (;;) {{}}'
870  for (;;) {{}}
871</pre></td></tr>
872
873
874<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
875<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
876
877Example matches a ? b : c
878  (a ? b : c) + 42
879</pre></td></tr>
880
881
882<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
883<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
884
885Example matches the constant in the case statement:
886    (matcher = constantExpr())
887  switch (a) {
888  case 37: break;
889  }
890</pre></td></tr>
891
892
893<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
894<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
895
896Given
897  while (true) { continue; }
898continueStmt()
899  matches 'continue'
900</pre></td></tr>
901
902
903<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
904<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
905
906Example matches,
907  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
908</pre></td></tr>
909
910
911<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
912<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
913
914Example matches FunctionTakesString(GetStringByValue())
915    (matcher = cxxBindTemporaryExpr())
916  FunctionTakesString(GetStringByValue());
917  FunctionTakesStringByPointer(GetStringPointer());
918</pre></td></tr>
919
920
921<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
922<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
923
924Example matches true
925  true
926</pre></td></tr>
927
928
929<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
930<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
931
932  try {} catch(int i) {}
933cxxCatchStmt()
934  matches 'catch(int i)'
935</pre></td></tr>
936
937
938<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
939<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
940
941Example: Matches const_cast&lt;int*&gt;(&amp;r) in
942  int n = 42;
943  const int &amp;r(n);
944  int* p = const_cast&lt;int*&gt;(&amp;r);
945</pre></td></tr>
946
947
948<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
949<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
950
951Example matches string(ptr, n) and ptr within arguments of f
952    (matcher = cxxConstructExpr())
953  void f(const string &amp;a, const string &amp;b);
954  char *ptr;
955  int n;
956  f(string(ptr, n), ptr);
957</pre></td></tr>
958
959
960<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
961<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
962
963Example matches the CXXDefaultArgExpr placeholder inserted for the
964    default value of the second parameter in the call expression f(42)
965    (matcher = cxxDefaultArgExpr())
966  void f(int x, int y = 0);
967  f(42);
968</pre></td></tr>
969
970
971<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
972<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
973
974Given
975  delete X;
976cxxDeleteExpr()
977  matches 'delete X'.
978</pre></td></tr>
979
980
981<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
982<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
983resolved because the base expression or the member name was dependent.
984
985Given
986  template &lt;class T&gt; void f() { T t; t.g(); }
987cxxDependentScopeMemberExpr()
988  matches t.g
989</pre></td></tr>
990
991
992<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
993<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
994
995Example:
996  cxxDynamicCastExpr()
997matches
998  dynamic_cast&lt;D*&gt;(&amp;b);
999in
1000  struct B { virtual ~B() {} }; struct D : B {};
1001  B b;
1002  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1003</pre></td></tr>
1004
1005
1006<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
1007<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1008
1009cxxForRangeStmt() matches 'for (auto a : i)'
1010  int i[] =  {1, 2, 3}; for (auto a : i);
1011  for(int j = 0; j &lt; 5; ++j);
1012</pre></td></tr>
1013
1014
1015<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
1016<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1017
1018Example: Matches Foo(bar);
1019  Foo f = bar;
1020  Foo g = (Foo) bar;
1021  Foo h = Foo(bar);
1022</pre></td></tr>
1023
1024
1025<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
1026<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1027
1028Example matches x.y()
1029  X x;
1030  x.y();
1031</pre></td></tr>
1032
1033
1034<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
1035<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1036
1037Given
1038  new X;
1039cxxNewExpr()
1040  matches 'new X'.
1041</pre></td></tr>
1042
1043
1044<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>&gt;...</td></tr>
1045<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1046
1047Given
1048  bool a() noexcept;
1049  bool b() noexcept(true);
1050  bool c() noexcept(false);
1051  bool d() noexcept(noexcept(a()));
1052  bool e = noexcept(b()) || noexcept(c());
1053cxxNoexceptExpr()
1054  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1055  doesn't match the noexcept specifier in the declarations a, b, c or d.
1056</pre></td></tr>
1057
1058
1059<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
1060<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1061</pre></td></tr>
1062
1063
1064<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
1065<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1066
1067Note that if an operator isn't overloaded, it won't match. Instead, use
1068binaryOperator matcher.
1069Currently it does not match operators such as new delete.
1070FIXME: figure out why these do not match?
1071
1072Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1073    (matcher = cxxOperatorCallExpr())
1074  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1075  ostream &amp;o; int b = 1, c = 1;
1076  o &lt;&lt; b &lt;&lt; c;
1077</pre></td></tr>
1078
1079
1080<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
1081<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1082
1083Either the source expression or the destination type can be matched
1084using has(), but hasDestinationType() is more specific and can be
1085more readable.
1086
1087Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1088  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1089</pre></td></tr>
1090
1091
1092<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
1093<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1094
1095See also: hasDestinationType
1096See also: reinterpretCast
1097
1098Example:
1099  cxxStaticCastExpr()
1100matches
1101  static_cast&lt;long&gt;(8)
1102in
1103  long eight(static_cast&lt;long&gt;(8));
1104</pre></td></tr>
1105
1106
1107<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
1108<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1109
1110Given
1111  std::vector&lt;int&gt; a({ 1, 2, 3 });
1112  std::vector&lt;int&gt; b = { 4, 5 };
1113  int c[] = { 6, 7 };
1114  std::pair&lt;int, int&gt; d = { 8, 9 };
1115cxxStdInitializerListExpr()
1116  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1117</pre></td></tr>
1118
1119
1120<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1121<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1122
1123Example: Matches Foo(bar, bar)
1124  Foo h = Foo(bar, bar);
1125</pre></td></tr>
1126
1127
1128<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1129<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1130
1131Example matches the implicit this expression in "return i".
1132    (matcher = cxxThisExpr())
1133struct foo {
1134  int i;
1135  int f() { return i; }
1136};
1137</pre></td></tr>
1138
1139
1140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1141<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1142
1143  try { throw 5; } catch(int i) {}
1144cxxThrowExpr()
1145  matches 'throw 5'
1146</pre></td></tr>
1147
1148
1149<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1150<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1151
1152  try {} catch(int i) {}
1153cxxTryStmt()
1154  matches 'try {}'
1155</pre></td></tr>
1156
1157
1158<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1159<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1160
1161Example matches T(t) in return statement of f
1162    (matcher = cxxUnresolvedConstructExpr())
1163  template &lt;typename T&gt;
1164  void f(const T&amp; t) { return T(t); }
1165</pre></td></tr>
1166
1167
1168<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
1169<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1170
1171Example matches x in if (x)
1172  bool x;
1173  if (x) {}
1174</pre></td></tr>
1175
1176
1177<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
1178<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1179
1180Given
1181  int a;
1182declStmt()
1183  matches 'int a'.
1184</pre></td></tr>
1185
1186
1187<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
1188<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1189
1190Given
1191  switch(a) { case 42: break; default: break; }
1192defaultStmt()
1193  matches 'default:'.
1194</pre></td></tr>
1195
1196
1197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1198<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1199
1200Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1201  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1202</pre></td></tr>
1203
1204
1205<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
1206<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1207
1208Given
1209  do {} while (true);
1210doStmt()
1211  matches 'do {} while(true)'
1212</pre></td></tr>
1213
1214
1215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
1216<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1217
1218Matches any cast expression written in user code, whether it be a
1219C-style cast, a functional-style cast, or a keyword cast.
1220
1221Does not match implicit conversions.
1222
1223Note: the name "explicitCast" is chosen to match Clang's terminology, as
1224Clang uses the term "cast" to apply to implicit conversions as well as to
1225actual cast expressions.
1226
1227See also: hasDestinationType.
1228
1229Example: matches all five of the casts in
1230  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1231but does not match the implicit conversion in
1232  long ell = 42;
1233</pre></td></tr>
1234
1235
1236<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
1237<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1238
1239Example matches x()
1240  void f() { x(); }
1241</pre></td></tr>
1242
1243
1244<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
1245<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1246of the sub-expression's evaluation.
1247
1248Example matches std::string()
1249  const std::string str = std::string();
1250</pre></td></tr>
1251
1252
1253<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>&gt;...</td></tr>
1254<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1255</pre></td></tr>
1256
1257
1258<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
1259<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
12601.0, 1.0f, 1.0L and 1e10.
1261
1262Does not match implicit conversions such as
1263  float a = 10;
1264</pre></td></tr>
1265
1266
1267<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
1268<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1269
1270Example matches 'for (;;) {}'
1271  for (;;) {}
1272  int i[] =  {1, 2, 3}; for (auto a : i);
1273</pre></td></tr>
1274
1275
1276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1277<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1278</pre></td></tr>
1279
1280
1281<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
1282<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1283
1284Given
1285  goto FOO;
1286  FOO: bar();
1287gotoStmt()
1288  matches 'goto FOO'
1289</pre></td></tr>
1290
1291
1292<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
1293<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1294
1295Example matches 'if (x) {}'
1296  if (x) {}
1297</pre></td></tr>
1298
1299
1300<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
1301<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1302point literals e.g.: 1i, 1.0i
1303</pre></td></tr>
1304
1305
1306<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
1307<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1308
1309This matches many different places, including function call return value
1310eliding, as well as any type conversions.
1311</pre></td></tr>
1312
1313
1314<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1315<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1316
1317Given
1318  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1319implicitValueInitExpr()
1320  matches "[0].y" (implicitly)
1321</pre></td></tr>
1322
1323
1324<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
1325<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1326
1327Given
1328  int a[] = { 1, 2 };
1329  struct B { int x, y; };
1330  B b = { 5, 6 };
1331initListExpr()
1332  matches "{ 1, 2 }" and "{ 5, 6 }"
1333</pre></td></tr>
1334
1335
1336<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
1337<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
13381, 1L, 0x1 and 1U.
1339
1340Does not match character-encoded integers such as L'a'.
1341</pre></td></tr>
1342
1343
1344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
1345<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1346
1347Given
1348  goto FOO;
1349  FOO: bar();
1350labelStmt()
1351  matches 'FOO:'
1352</pre></td></tr>
1353
1354
1355<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
1356<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1357
1358Example matches [&amp;](){return 5;}
1359  [&amp;](){return 5;}
1360</pre></td></tr>
1361
1362
1363<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
1364<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1365
1366Example: Given
1367  struct T {void func();};
1368  T f();
1369  void g(T);
1370materializeTemporaryExpr() matches 'f()' in these statements
1371  T u(f());
1372  g(f());
1373  f().func();
1374but does not match
1375  f();
1376</pre></td></tr>
1377
1378
1379<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
1380<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1381
1382Given
1383  class Y {
1384    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1385    int a; static int b;
1386  };
1387memberExpr()
1388  matches this-&gt;x, x, y.x, a, this-&gt;b
1389</pre></td></tr>
1390
1391
1392<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
1393<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1394
1395  foo();;
1396nullStmt()
1397  matches the second ';'
1398</pre></td></tr>
1399
1400
1401<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1402<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1403
1404Example matches @catch
1405  @try {}
1406  @catch (...) {}
1407</pre></td></tr>
1408
1409
1410<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1411<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1412
1413Example matches @finally
1414  @try {}
1415  @finally {}
1416</pre></td></tr>
1417
1418
1419<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
1420<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1421
1422Example: matches "a" in "init" method:
1423@implementation A {
1424  NSString *a;
1425}
1426- (void) init {
1427  a = @"hello";
1428}
1429</pre></td></tr>
1430
1431
1432<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1433<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1434
1435The innermost message send invokes the "alloc" class method on the
1436NSString class, while the outermost message send invokes the
1437"initWithString" instance method on the object returned from
1438NSString's "alloc". This matcher should match both message sends.
1439  [[NSString alloc] initWithString:@"Hello"]
1440</pre></td></tr>
1441
1442
1443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
1444<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1445
1446Example matches @throw obj;
1447</pre></td></tr>
1448
1449
1450<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
1451<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1452
1453Example matches @try
1454  @try {}
1455  @catch (...) {}
1456</pre></td></tr>
1457
1458
1459<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
1460<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
1461
1462Given
1463
1464  #pragma omp parallel
1465  #pragma omp parallel default(none)
1466  #pragma omp taskyield
1467
1468``ompExecutableDirective()`` matches ``omp parallel``,
1469``omp parallel default(none)`` and ``omp taskyield``.
1470</pre></td></tr>
1471
1472
1473<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
1474<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1475to reference another expressions and can be met
1476in BinaryConditionalOperators, for example.
1477
1478Example matches 'a'
1479  (a ?: c) + 42;
1480</pre></td></tr>
1481
1482
1483<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
1484<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1485
1486Example matches (foo() + 1)
1487  int foo() { return 1; }
1488  int a = (foo() + 1);
1489</pre></td></tr>
1490
1491
1492<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
1493<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1494ParenListExprs don't have a predefined type and are used for late parsing.
1495In the final AST, they can be met in template declarations.
1496
1497Given
1498  template&lt;typename T&gt; class X {
1499    void f() {
1500      X x(*this);
1501      int a = 0, b = 1; int i = (a, b);
1502    }
1503  };
1504parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1505has a predefined type and is a ParenExpr, not a ParenListExpr.
1506</pre></td></tr>
1507
1508
1509<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
1510<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1511
1512Example: Matches __func__
1513  printf("%s", __func__);
1514</pre></td></tr>
1515
1516
1517<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
1518<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1519
1520Given
1521  return 1;
1522returnStmt()
1523  matches 'return 1'
1524</pre></td></tr>
1525
1526
1527<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
1528<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1529
1530Given
1531  { ++a; }
1532stmt()
1533  matches both the compound statement '{ ++a; }' and '++a'.
1534</pre></td></tr>
1535
1536
1537<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
1538<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1539
1540Example match: ({ int X = 4; X; })
1541  int C = ({ int X = 4; X; });
1542</pre></td></tr>
1543
1544
1545<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
1546<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1547
1548Example matches "abcd", L"abcd"
1549  char *s = "abcd";
1550  wchar_t *ws = L"abcd";
1551</pre></td></tr>
1552
1553
1554<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
1555<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1556
1557Given
1558  template &lt;int N&gt;
1559  struct A { static const int n = N; };
1560  struct B : public A&lt;42&gt; {};
1561substNonTypeTemplateParmExpr()
1562  matches "N" in the right-hand side of "static const int n = N;"
1563</pre></td></tr>
1564
1565
1566<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
1567<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1568
1569Given
1570  switch(a) { case 42: break; default: break; }
1571switchCase()
1572  matches 'case 42:' and 'default:'.
1573</pre></td></tr>
1574
1575
1576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
1577<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1578
1579Given
1580  switch(a) { case 42: break; default: break; }
1581switchStmt()
1582  matches 'switch(a)'.
1583</pre></td></tr>
1584
1585
1586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
1587<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1588
1589Given
1590  Foo x = bar;
1591  int y = sizeof(x) + alignof(x);
1592unaryExprOrTypeTraitExpr()
1593  matches sizeof(x) and alignof(x)
1594</pre></td></tr>
1595
1596
1597<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
1598<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1599
1600Example matches !a
1601  !a || b
1602</pre></td></tr>
1603
1604
1605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
1606<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1607but could not be resolved to a specific declaration.
1608
1609Given
1610  template&lt;typename T&gt;
1611  T foo() { T a; return a; }
1612  template&lt;typename T&gt;
1613  void bar() {
1614    foo&lt;T&gt;();
1615  }
1616unresolvedLookupExpr()
1617  matches foo&lt;T&gt;() </pre></td></tr>
1618
1619
1620<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
1621<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
1622
1623Given
1624  struct X {
1625    template &lt;class T&gt; void f();
1626    void g();
1627  };
1628  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
1629unresolvedMemberExpr()
1630  matches x.f&lt;T&gt;
1631</pre></td></tr>
1632
1633
1634<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
1635<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1636
1637Example match: "foo"_suffix
1638</pre></td></tr>
1639
1640
1641<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
1642<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1643
1644Given
1645  while (true) {}
1646whileStmt()
1647  matches 'while (true) {}'.
1648</pre></td></tr>
1649
1650
1651<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;...</td></tr>
1652<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
1653
1654Given
1655  template &lt;typename T&gt; struct C {};
1656  C&lt;int&gt; c;
1657templateArgumentLoc()
1658  matches 'int' in C&lt;int&gt;.
1659</pre></td></tr>
1660
1661
1662<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
1663<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1664
1665Given
1666  template &lt;typename T&gt; struct C {};
1667  C&lt;int&gt; c;
1668templateArgument()
1669  matches 'int' in C&lt;int&gt;.
1670</pre></td></tr>
1671
1672
1673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
1674<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1675
1676Given
1677  template &lt;typename T&gt; class X { };
1678  X&lt;int&gt; xi;
1679templateName()
1680  matches 'X' in X&lt;int&gt;.
1681</pre></td></tr>
1682
1683
1684<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
1685<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1686</pre></td></tr>
1687
1688
1689<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
1690<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1691
1692Given
1693  int a[] = { 2, 3 };
1694  int b[4];
1695  void f() { int c[a[0]]; }
1696arrayType()
1697  matches "int a[]", "int b[4]" and "int c[a[0]]";
1698</pre></td></tr>
1699
1700
1701<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
1702<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1703
1704Given
1705  _Atomic(int) i;
1706atomicType()
1707  matches "_Atomic(int) i"
1708</pre></td></tr>
1709
1710
1711<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
1712<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1713
1714Given:
1715  auto n = 4;
1716  int v[] = { 2, 3 }
1717  for (auto i : v) { }
1718autoType()
1719  matches "auto n" and "auto i"
1720</pre></td></tr>
1721
1722
1723<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
1724<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1725"void (^)(int)".
1726
1727The pointee is always required to be a FunctionType.
1728</pre></td></tr>
1729
1730
1731<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
1732<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1733
1734Given
1735  struct A {};
1736  A a;
1737  int b;
1738  float c;
1739  bool d;
1740builtinType()
1741  matches "int b", "float c" and "bool d"
1742</pre></td></tr>
1743
1744
1745<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
1746<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1747
1748Given
1749  _Complex float f;
1750complexType()
1751  matches "_Complex float f"
1752</pre></td></tr>
1753
1754
1755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
1756<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1757
1758Given
1759  void() {
1760    int a[2];
1761    int b[] = { 2, 3 };
1762    int c[b[0]];
1763  }
1764constantArrayType()
1765  matches "int a[2]"
1766</pre></td></tr>
1767
1768
1769<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
1770<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1771Example matches i[] in declaration of f.
1772    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1773Example matches i[1].
1774    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1775  void f(int i[]) {
1776    i[1] = 0;
1777  }
1778</pre></td></tr>
1779
1780
1781<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
1782<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
1783
1784Given:
1785  short i = 1;
1786  int j = 42;
1787  decltype(i + j) result = i + j;
1788decltypeType()
1789  matches "decltype(i + j)"
1790</pre></td></tr>
1791
1792
1793<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
1794<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
1795template types.
1796
1797Given
1798  template &lt;typename T&gt;
1799  class C { public: C(T); };
1800
1801  C c(123);
1802deducedTemplateSpecializationType() matches the type in the declaration
1803of the variable c.
1804</pre></td></tr>
1805
1806
1807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
1808<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1809
1810Given
1811  template&lt;typename T, int Size&gt;
1812  class array {
1813    T data[Size];
1814  };
1815dependentSizedArrayType
1816  matches "T data[Size]"
1817</pre></td></tr>
1818
1819
1820<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
1821<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1822qualified name.
1823
1824Given
1825  namespace N {
1826    namespace M {
1827      class D {};
1828    }
1829  }
1830  class C {};
1831
1832  class C c;
1833  N::M::D d;
1834
1835elaboratedType() matches the type of the variable declarations of both
1836c and d.
1837</pre></td></tr>
1838
1839
1840<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
1841<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1842
1843Given
1844  enum C { Green };
1845  enum class S { Red };
1846
1847  C c;
1848  S s;
1849
1850enumType() matches the type of the variable declarations of both c and
1851s.
1852</pre></td></tr>
1853
1854
1855<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1856<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1857
1858Given
1859  int (*f)(int);
1860  void g();
1861functionProtoType()
1862  matches "int (*f)(int)" and the type of "g" in C++ mode.
1863  In C mode, "g" is not matched because it does not contain a prototype.
1864</pre></td></tr>
1865
1866
1867<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
1868<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1869
1870Given
1871  int (*f)(int);
1872  void g();
1873functionType()
1874  matches "int (*f)(int)" and the type of "g".
1875</pre></td></tr>
1876
1877
1878<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
1879<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1880
1881Given
1882  int a[] = { 2, 3 };
1883  int b[42];
1884  void f(int c[]) { int d[a[0]]; };
1885incompleteArrayType()
1886  matches "int a[]" and "int c[]"
1887</pre></td></tr>
1888
1889
1890<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
1891<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1892
1893Example matches S s, but not S&lt;T&gt; s.
1894    (matcher = parmVarDecl(hasType(injectedClassNameType())))
1895  template &lt;typename T&gt; struct S {
1896    void f(S s);
1897    void g(S&lt;T&gt; s);
1898  };
1899</pre></td></tr>
1900
1901
1902<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
1903<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1904
1905Given:
1906  int *a;
1907  int &amp;b = *a;
1908  int &amp;&amp;c = 1;
1909  auto &amp;d = b;
1910  auto &amp;&amp;e = c;
1911  auto &amp;&amp;f = 2;
1912  int g = 5;
1913
1914lValueReferenceType() matches the types of b, d, and e. e is
1915matched since the type is deduced as int&amp; by reference collapsing rules.
1916</pre></td></tr>
1917
1918
1919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
1920<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1921Given
1922  struct A { int i; }
1923  A::* ptr = A::i;
1924memberPointerType()
1925  matches "A::* ptr"
1926</pre></td></tr>
1927
1928
1929<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
1930<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1931a pointer type, despite being syntactically similar.
1932
1933Given
1934  int *a;
1935
1936  @interface Foo
1937  @end
1938  Foo *f;
1939pointerType()
1940  matches "Foo *f", but does not match "int *a".
1941</pre></td></tr>
1942
1943
1944<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
1945<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1946
1947Given
1948  int (*ptr_to_array)[4];
1949  int *array_of_ptrs[4];
1950
1951varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1952array_of_ptrs.
1953</pre></td></tr>
1954
1955
1956<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
1957<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1958types.
1959
1960Given
1961  int *a;
1962  int &amp;b = *a;
1963  int c = 5;
1964
1965  @interface Foo
1966  @end
1967  Foo *f;
1968pointerType()
1969  matches "int *a", but does not match "Foo *f".
1970</pre></td></tr>
1971
1972
1973<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
1974<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1975
1976Given:
1977  int *a;
1978  int &amp;b = *a;
1979  int &amp;&amp;c = 1;
1980  auto &amp;d = b;
1981  auto &amp;&amp;e = c;
1982  auto &amp;&amp;f = 2;
1983  int g = 5;
1984
1985rValueReferenceType() matches the types of c and f. e is not
1986matched as it is deduced to int&amp; by reference collapsing rules.
1987</pre></td></tr>
1988
1989
1990<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
1991<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1992
1993Given
1994  class C {};
1995  struct S {};
1996
1997  C c;
1998  S s;
1999
2000recordType() matches the type of the variable declarations of both c
2001and s.
2002</pre></td></tr>
2003
2004
2005<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
2006<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2007
2008Given
2009  int *a;
2010  int &amp;b = *a;
2011  int &amp;&amp;c = 1;
2012  auto &amp;d = b;
2013  auto &amp;&amp;e = c;
2014  auto &amp;&amp;f = 2;
2015  int g = 5;
2016
2017referenceType() matches the types of b, c, d, e, and f.
2018</pre></td></tr>
2019
2020
2021<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
2022<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2023template type parameter.
2024
2025Given
2026  template &lt;typename T&gt;
2027  void F(T t) {
2028    int i = 1 + t;
2029  }
2030
2031substTemplateTypeParmType() matches the type of 't' but not '1'
2032</pre></td></tr>
2033
2034
2035<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
2036<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2037
2038Given
2039  enum E {};
2040  class C {};
2041
2042  E e;
2043  C c;
2044
2045tagType() matches the type of the variable declarations of both e
2046and c.
2047</pre></td></tr>
2048
2049
2050<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
2051<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2052
2053Given
2054  template &lt;typename T&gt;
2055  class C { };
2056
2057  template class C&lt;int&gt;;  // A
2058  C&lt;char&gt; var;            // B
2059
2060templateSpecializationType() matches the type of the explicit
2061instantiation in A and the type of the variable declaration in B.
2062</pre></td></tr>
2063
2064
2065<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
2066<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2067
2068Example matches T, but not int.
2069    (matcher = templateTypeParmType())
2070  template &lt;typename T&gt; void f(int i);
2071</pre></td></tr>
2072
2073
2074<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
2075<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2076</pre></td></tr>
2077
2078
2079<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
2080<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2081
2082Given
2083  typedef int X;
2084typedefType()
2085  matches "typedef int X"
2086</pre></td></tr>
2087
2088
2089<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
2090<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2091
2092Given:
2093  typedef __underlying_type(T) type;
2094unaryTransformType()
2095  matches "__underlying_type(T)"
2096</pre></td></tr>
2097
2098
2099<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
2100<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2101integer-constant-expression.
2102
2103Given
2104  void f() {
2105    int a[] = { 2, 3 }
2106    int b[42];
2107    int c[a[0]];
2108  }
2109variableArrayType()
2110  matches "int c[a[0]]"
2111</pre></td></tr>
2112
2113<!--END_DECL_MATCHERS -->
2114</table>
2115
2116<!-- ======================================================================= -->
2117<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2118<!-- ======================================================================= -->
2119
2120<p>Narrowing matchers match certain attributes on the current node, thus
2121narrowing down the set of nodes of the current type to match on.</p>
2122
2123<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2124which allow users to create more powerful match expressions.</p>
2125
2126<table>
2127<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2128<!-- START_NARROWING_MATCHERS -->
2129
2130<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2131<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2132
2133Usable as: Any Matcher
2134</pre></td></tr>
2135
2136
2137<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2138<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2139
2140Usable as: Any Matcher
2141</pre></td></tr>
2142
2143
2144<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2145<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2146
2147Useful when another matcher requires a child matcher, but there's no
2148additional constraint. This will often be used with an explicit conversion
2149to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2150
2151Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2152"int* p" and "void f()" in
2153  int* p;
2154  void f();
2155
2156Usable as: Any Matcher
2157</pre></td></tr>
2158
2159
2160<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2161<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2162
2163Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2164  class X {};
2165  class Y {};
2166
2167Usable as: Any Matcher
2168</pre></td></tr>
2169
2170
2171<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2172<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2173specified names.
2174
2175   hasAnyOperatorName("+", "-")
2176 Is equivalent to
2177   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2178</pre></td></tr>
2179
2180
2181<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2182<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2183unary).
2184
2185Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2186  !(a || b)
2187</pre></td></tr>
2188
2189
2190<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2191<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2192
2193Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2194  if (a == b)
2195    a += b;
2196
2197Example 2: matches s1 = s2
2198           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2199  struct S { S&amp; operator=(const S&amp;); };
2200  void x() { S s1, s2; s1 = s2; }
2201</pre></td></tr>
2202
2203
2204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2205<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2206
2207Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2208  if (a == b)
2209    a += b;
2210
2211Example 2: matches s1 &lt; s2
2212           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2213  struct S { bool operator&lt;(const S&amp; other); };
2214  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2215</pre></td></tr>
2216
2217
2218<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
2219<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2220inheritance.
2221
2222Examples:
2223  class C {
2224  public:    int a;
2225  protected: int b;
2226  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2227  };
2228
2229  struct Base {};
2230  struct Derived1 : private Base {}; // matches 'Base'
2231  class Derived2 : Base {}; // matches 'Base'
2232</pre></td></tr>
2233
2234
2235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
2236<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2237protected inheritance.
2238
2239Examples:
2240  class C {
2241  public:    int a;
2242  protected: int b; // fieldDecl(isProtected()) matches 'b'
2243  private:   int c;
2244  };
2245
2246  class Base {};
2247  class Derived : protected Base {}; // matches 'Base'
2248</pre></td></tr>
2249
2250
2251<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
2252<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2253inheritance.
2254
2255Examples:
2256  class C {
2257  public:    int a; // fieldDecl(isPublic()) matches 'a'
2258  protected: int b;
2259  private:   int c;
2260  };
2261
2262  class Base {};
2263  class Derived1 : public Base {}; // matches 'Base'
2264  struct Derived2 : Base {}; // matches 'Base'
2265</pre></td></tr>
2266
2267
2268<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
2269<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2270virtual inheritance.
2271
2272Example:
2273  class A {
2274   public:
2275    virtual void x(); // matches x
2276  };
2277
2278Example:
2279  class Base {};
2280  class DirectlyDerived : virtual Base {}; // matches Base
2281  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2282
2283Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2284</pre></td></tr>
2285
2286
2287<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2288<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2289
2290
2291<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2292<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2293
2294Given
2295  f('false, 3.14, 42);
2296characterLiteral(equals(0))
2297  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2298  match false
2299floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2300  match 3.14
2301integerLiteral(equals(42))
2302  matches 42
2303
2304Note that you cannot directly match a negative numeric literal because the
2305minus sign is not part of the literal: It is a unary operator whose operand
2306is the positive numeric literal. Instead, you must use a unaryOperator()
2307matcher to match the minus sign:
2308
2309unaryOperator(hasOperatorName("-"),
2310              hasUnaryOperand(integerLiteral(equals(13))))
2311
2312Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2313           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2314</pre></td></tr>
2315
2316
2317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2318<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2319
2320
2321<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2322<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2323
2324
2325<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
2326<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2327
2328Given
2329  try {
2330    // ...
2331  } catch (int) {
2332    // ...
2333  } catch (...) {
2334    // ...
2335  }
2336cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2337</pre></td></tr>
2338
2339
2340<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2341<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2342a specific number of arguments (including absent default arguments).
2343
2344Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2345  void f(int x, int y);
2346  f(0, 0);
2347</pre></td></tr>
2348
2349
2350<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
2351<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2352</pre></td></tr>
2353
2354
2355<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
2356<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2357zero initialization.
2358
2359Given
2360void foo() {
2361  struct point { double x; double y; };
2362  point pt[2] = { { 1.0, 2.0 } };
2363}
2364initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2365will match the implicit array filler for pt[1].
2366</pre></td></tr>
2367
2368
2369<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2370<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2371
2372Given
2373  struct S {
2374    S(); // #1
2375    S(const S &amp;); // #2
2376    S(S &amp;&amp;); // #3
2377  };
2378cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2379</pre></td></tr>
2380
2381
2382<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2383<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2384
2385Given
2386  struct S {
2387    S(); // #1
2388    S(const S &amp;); // #2
2389    S(S &amp;&amp;); // #3
2390  };
2391cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2392</pre></td></tr>
2393
2394
2395<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2396<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2397
2398Given
2399  struct S {
2400    S(); // #1
2401    S(int) {} // #2
2402    S(S &amp;&amp;) : S() {} // #3
2403  };
2404  S::S() : S(0) {} // #4
2405cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2406#1 or #2.
2407</pre></td></tr>
2408
2409
2410<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2411<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2412that have an explicit specifier if this explicit specifier is resolved to
2413true.
2414
2415Given
2416  template&lt;bool b&gt;
2417  struct S {
2418    S(int); // #1
2419    explicit S(double); // #2
2420    operator int(); // #3
2421    explicit operator bool(); // #4
2422    explicit(false) S(bool) // # 7
2423    explicit(true) S(char) // # 8
2424    explicit(b) S(S) // # 9
2425  };
2426  S(int) -&gt; S&lt;true&gt; // #5
2427  explicit S(double) -&gt; S&lt;false&gt; // #6
2428cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2429cxxConversionDecl(isExplicit()) will match #4, but not #3.
2430cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2431</pre></td></tr>
2432
2433
2434<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
2435<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2436
2437Given
2438  struct S {
2439    S(); // #1
2440    S(const S &amp;); // #2
2441    S(S &amp;&amp;); // #3
2442  };
2443cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2444</pre></td></tr>
2445
2446
2447<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
2448<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
2449that have an explicit specifier if this explicit specifier is resolved to
2450true.
2451
2452Given
2453  template&lt;bool b&gt;
2454  struct S {
2455    S(int); // #1
2456    explicit S(double); // #2
2457    operator int(); // #3
2458    explicit operator bool(); // #4
2459    explicit(false) S(bool) // # 7
2460    explicit(true) S(char) // # 8
2461    explicit(b) S(S) // # 9
2462  };
2463  S(int) -&gt; S&lt;true&gt; // #5
2464  explicit S(double) -&gt; S&lt;false&gt; // #6
2465cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2466cxxConversionDecl(isExplicit()) will match #4, but not #3.
2467cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2468</pre></td></tr>
2469
2470
2471<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
2472<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2473opposed to a member.
2474
2475Given
2476  struct B {};
2477  struct D : B {
2478    int I;
2479    D(int i) : I(i) {}
2480  };
2481  struct E : B {
2482    E() : B() {}
2483  };
2484cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2485  will match E(), but not match D(int).
2486</pre></td></tr>
2487
2488
2489<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
2490<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2491opposed to a base.
2492
2493Given
2494  struct B {};
2495  struct D : B {
2496    int I;
2497    D(int i) : I(i) {}
2498  };
2499  struct E : B {
2500    E() : B() {}
2501  };
2502cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2503  will match D(int), but not match E().
2504</pre></td></tr>
2505
2506
2507<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
2508<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2509code (as opposed to implicitly added by the compiler).
2510
2511Given
2512  struct Foo {
2513    Foo() { }
2514    Foo(int) : foo_("A") { }
2515    string foo_;
2516  };
2517cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2518  will match Foo(int), but not Foo()
2519</pre></td></tr>
2520
2521
2522<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
2523<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
2524that have an explicit specifier if this explicit specifier is resolved to
2525true.
2526
2527Given
2528  template&lt;bool b&gt;
2529  struct S {
2530    S(int); // #1
2531    explicit S(double); // #2
2532    operator int(); // #3
2533    explicit operator bool(); // #4
2534    explicit(false) S(bool) // # 7
2535    explicit(true) S(char) // # 8
2536    explicit(b) S(S) // # 9
2537  };
2538  S(int) -&gt; S&lt;true&gt; // #5
2539  explicit S(double) -&gt; S&lt;false&gt; // #6
2540cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2541cxxConversionDecl(isExplicit()) will match #4, but not #3.
2542cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2543</pre></td></tr>
2544
2545
2546<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
2547<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
2548to '.'.
2549
2550Member calls on the implicit this pointer match as called with '-&gt;'.
2551
2552Given
2553  class Y {
2554    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2555    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
2556    int a;
2557    static int b;
2558  };
2559  template &lt;class T&gt;
2560  class Z {
2561    void x() { this-&gt;m; }
2562  };
2563memberExpr(isArrow())
2564  matches this-&gt;x, x, y.x, a, this-&gt;b
2565cxxDependentScopeMemberExpr(isArrow())
2566  matches this-&gt;m
2567unresolvedMemberExpr(isArrow())
2568  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
2569</pre></td></tr>
2570
2571
2572<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
2573<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2574
2575Given
2576struct A {
2577  void foo() const;
2578  void bar();
2579};
2580
2581cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2582</pre></td></tr>
2583
2584
2585<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
2586<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2587operator.
2588
2589Given
2590struct A {
2591  A &amp;operator=(const A &amp;);
2592  A &amp;operator=(A &amp;&amp;);
2593};
2594
2595cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2596the second one.
2597</pre></td></tr>
2598
2599
2600<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
2601<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2602
2603Given:
2604  class A final {};
2605
2606  struct B {
2607    virtual void f();
2608  };
2609
2610  struct C : B {
2611    void f() final;
2612  };
2613matches A and C::f, but not B, C, or B::f
2614</pre></td></tr>
2615
2616
2617<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
2618<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2619operator.
2620
2621Given
2622struct A {
2623  A &amp;operator=(const A &amp;);
2624  A &amp;operator=(A &amp;&amp;);
2625};
2626
2627cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2628the first one.
2629</pre></td></tr>
2630
2631
2632<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
2633<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2634
2635Given
2636  class A {
2637   public:
2638    virtual void x();
2639  };
2640  class B : public A {
2641   public:
2642    virtual void x();
2643  };
2644  matches B::x
2645</pre></td></tr>
2646
2647
2648<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
2649<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2650
2651Given
2652  class A {
2653   public:
2654    virtual void x() = 0;
2655  };
2656  matches A::x
2657</pre></td></tr>
2658
2659
2660<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2661<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2662
2663Given
2664  struct S {
2665    S(); // #1
2666    S(const S &amp;) = default; // #2
2667    S(S &amp;&amp;) = delete; // #3
2668  };
2669cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2670</pre></td></tr>
2671
2672
2673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
2674<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2675virtual inheritance.
2676
2677Example:
2678  class A {
2679   public:
2680    virtual void x(); // matches x
2681  };
2682
2683Example:
2684  class Base {};
2685  class DirectlyDerived : virtual Base {}; // matches Base
2686  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2687
2688Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2689</pre></td></tr>
2690
2691
2692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
2693<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2694
2695Given
2696  class A {
2697   public:
2698    virtual void x();
2699  };
2700  class B : public A {
2701   public:
2702    void x();
2703  };
2704  matches A::x but not B::x
2705</pre></td></tr>
2706
2707
2708<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2709<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2710
2711Given:
2712  MyClass *p1 = new MyClass[10];
2713cxxNewExpr(isArray())
2714  matches the expression 'new MyClass[10]'.
2715</pre></td></tr>
2716
2717
2718<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2719<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
2720
2721Matches overloaded operator names specified in strings without the
2722"operator" prefix: e.g. "&lt;&lt;".
2723
2724  hasAnyOverloadesOperatorName("+", "-")
2725Is equivalent to
2726  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
2727</pre></td></tr>
2728
2729
2730<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
2731<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2732
2733Matches overloaded operator names specified in strings without the
2734"operator" prefix: e.g. "&lt;&lt;".
2735
2736Given:
2737  class A { int operator*(); };
2738  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2739  A a;
2740  a &lt;&lt; a;   // &lt;-- This matches
2741
2742cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2743specified line and
2744cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2745matches the declaration of A.
2746
2747Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2748</pre></td></tr>
2749
2750
2751<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
2752<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2753
2754Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2755  if (a == b)
2756    a += b;
2757
2758Example 2: matches s1 = s2
2759           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2760  struct S { S&amp; operator=(const S&amp;); };
2761  void x() { S s1, s2; s1 = s2; }
2762</pre></td></tr>
2763
2764
2765<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
2766<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
2767
2768Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2769  if (a == b)
2770    a += b;
2771
2772Example 2: matches s1 &lt; s2
2773           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2774  struct S { bool operator&lt;(const S&amp; other); };
2775  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2776</pre></td></tr>
2777
2778
2779<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
2780<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2781
2782Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2783class x {};
2784class y;
2785</pre></td></tr>
2786
2787
2788<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
2789<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2790</pre></td></tr>
2791
2792
2793<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
2794<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
2795</pre></td></tr>
2796
2797
2798<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
2799<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2800static member variable template instantiations.
2801
2802Given
2803  template&lt;typename T&gt; void A(T t) { }
2804  template&lt;&gt; void A(int N) { }
2805functionDecl(isExplicitTemplateSpecialization())
2806  matches the specialization A&lt;int&gt;().
2807
2808Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2809</pre></td></tr>
2810
2811
2812<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
2813<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2814
2815Given:
2816  class A final {};
2817
2818  struct B {
2819    virtual void f();
2820  };
2821
2822  struct C : B {
2823    void f() final;
2824  };
2825matches A and C::f, but not B, C, or B::f
2826</pre></td></tr>
2827
2828
2829<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2830<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2831
2832Given:
2833  auto x = []{};
2834
2835cxxRecordDecl(isLambda()) matches the implicit class declaration of
2836decltype(x)
2837</pre></td></tr>
2838
2839
2840<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
2841<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
2842isSameOrDerivedFrom(hasName(...)).
2843</pre></td></tr>
2844
2845
2846<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
2847<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2848member variable template instantiations.
2849
2850Given
2851  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2852or
2853  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2854or
2855  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
2856cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2857  matches the template instantiation of X&lt;A&gt;.
2858
2859But given
2860  template &lt;typename T&gt;  class X {}; class A {};
2861  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2862cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2863  does not match, as X&lt;A&gt; is an explicit template specialization.
2864
2865Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2866</pre></td></tr>
2867
2868
2869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2870<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2871a specific number of arguments (including absent default arguments).
2872
2873Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2874  void f(int x, int y);
2875  f(0, 0);
2876</pre></td></tr>
2877
2878
2879<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
2880<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
2881
2882Example matches y(x) but not y(42) or NS::y(x).
2883  namespace NS {
2884    struct X {};
2885    void y(X);
2886  }
2887
2888  void y(...);
2889
2890  void test() {
2891    NS::X x;
2892    y(x); // Matches
2893    NS::y(x); // Doesn't match
2894    y(42); // Doesn't match
2895    using NS::y;
2896    y(x); // Found by both unqualified lookup and ADL, doesn't match
2897   }
2898</pre></td></tr>
2899
2900
2901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2902<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2903
2904Example: matches the implicit cast around 0
2905(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2906  int *p = 0;
2907
2908If the matcher is use from clang-query, CastKind parameter
2909should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
2910</pre></td></tr>
2911
2912
2913<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
2914<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2915
2916
2917<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2918<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2919
2920Given
2921  f('false, 3.14, 42);
2922characterLiteral(equals(0))
2923  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2924  match false
2925floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2926  match 3.14
2927integerLiteral(equals(42))
2928  matches 42
2929
2930Note that you cannot directly match a negative numeric literal because the
2931minus sign is not part of the literal: It is a unary operator whose operand
2932is the positive numeric literal. Instead, you must use a unaryOperator()
2933matcher to match the minus sign:
2934
2935unaryOperator(hasOperatorName("-"),
2936              hasUnaryOperand(integerLiteral(equals(13))))
2937
2938Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2939           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2940</pre></td></tr>
2941
2942
2943<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
2944<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2945
2946
2947<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
2948<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2949
2950
2951<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
2952<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2953
2954Given
2955  template&lt;typename T&gt; struct C {};
2956  C&lt;int&gt; c;
2957classTemplateSpecializationDecl(templateArgumentCountIs(1))
2958  matches C&lt;int&gt;.
2959</pre></td></tr>
2960
2961
2962<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
2963<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2964child statements.
2965
2966Example: Given
2967  { for (;;) {} }
2968compoundStmt(statementCountIs(0)))
2969  matches '{}'
2970  but does not match the outer compound statement.
2971</pre></td></tr>
2972
2973
2974<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
2975<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2976
2977Given
2978  int a[42];
2979  int b[2 * 21];
2980  int c[41], d[43];
2981  char *s = "abcd";
2982  wchar_t *ws = L"abcd";
2983  char *w = "a";
2984constantArrayType(hasSize(42))
2985  matches "int a[42]" and "int b[2 * 21]"
2986stringLiteral(hasSize(4))
2987  matches "abcd", L"abcd"
2988</pre></td></tr>
2989
2990
2991<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
2992<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2993declarations.
2994
2995Example: Given
2996  int a, b;
2997  int c;
2998  int d = 2, e;
2999declCountIs(2)
3000  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3001</pre></td></tr>
3002
3003
3004<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3005<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3006
3007Matches a node if it equals the node previously bound to ID.
3008
3009Given
3010  class X { int a; int b; };
3011cxxRecordDecl(
3012    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3013    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3014  matches the class X, as a and b have the same type.
3015
3016Note that when multiple matches are involved via forEach* matchers,
3017equalsBoundNodes acts as a filter.
3018For example:
3019compoundStmt(
3020    forEachDescendant(varDecl().bind("d")),
3021    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3022will trigger a match for each combination of variable declaration
3023and reference to that variable declaration within a compound statement.
3024</pre></td></tr>
3025
3026
3027<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
3028<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3029
3030Decl has pointer identity in the AST.
3031</pre></td></tr>
3032
3033
3034<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
3035<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3036
3037Given
3038  __attribute__((device)) void f() { ... }
3039decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3040f. If the matcher is used from clang-query, attr::Kind parameter should be
3041passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3042</pre></td></tr>
3043
3044
3045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
3046<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
3047Does not match if only part of the statement is expanded from that macro or
3048if different parts of the the statement are expanded from different
3049appearances of the macro.
3050</pre></td></tr>
3051
3052
3053<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
3054<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3055partially matching a given regex.
3056
3057Example matches Y but not X
3058    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3059  #include "ASTMatcher.h"
3060  class X {};
3061ASTMatcher.h:
3062  class Y {};
3063
3064Usable 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;
3065
3066If the matcher is used in clang-query, RegexFlags parameter
3067should be passed as a quoted string. e.g: "NoFlags".
3068Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3069</pre></td></tr>
3070
3071
3072<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>
3073<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3074
3075Example matches X but not Y
3076  (matcher = cxxRecordDecl(isExpansionInMainFile())
3077  #include &lt;Y.h&gt;
3078  class X {};
3079Y.h:
3080  class Y {};
3081
3082Usable 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;
3083</pre></td></tr>
3084
3085
3086<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3087<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3088
3089Example matches Y but not X
3090    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3091  #include &lt;SystemHeader.h&gt;
3092  class X {};
3093SystemHeader.h:
3094  class Y {};
3095
3096Usable 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;
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('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3101<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3102by the compiler (eg. implicit default/copy constructors).
3103</pre></td></tr>
3104
3105
3106<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>
3107<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3108
3109Given
3110  class vector {};
3111  namespace foo {
3112    class vector {};
3113    namespace std {
3114      class vector {};
3115    }
3116  }
3117  namespace std {
3118    inline namespace __1 {
3119      class vector {}; // #1
3120      namespace experimental {
3121        class vector {};
3122      }
3123    }
3124  }
3125cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3126</pre></td></tr>
3127
3128
3129<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>
3130<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3131template instantiations.
3132
3133Given
3134  template&lt;typename T&gt; void A(T t) { T i; }
3135  A(0);
3136  A(0U);
3137functionDecl(isInstantiated())
3138  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3139</pre></td></tr>
3140
3141
3142<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>
3143<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3144inheritance.
3145
3146Examples:
3147  class C {
3148  public:    int a;
3149  protected: int b;
3150  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3151  };
3152
3153  struct Base {};
3154  struct Derived1 : private Base {}; // matches 'Base'
3155  class Derived2 : Base {}; // matches 'Base'
3156</pre></td></tr>
3157
3158
3159<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>
3160<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3161protected inheritance.
3162
3163Examples:
3164  class C {
3165  public:    int a;
3166  protected: int b; // fieldDecl(isProtected()) matches 'b'
3167  private:   int c;
3168  };
3169
3170  class Base {};
3171  class Derived : protected Base {}; // matches 'Base'
3172</pre></td></tr>
3173
3174
3175<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>
3176<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3177inheritance.
3178
3179Examples:
3180  class C {
3181  public:    int a; // fieldDecl(isPublic()) matches 'a'
3182  protected: int b;
3183  private:   int c;
3184  };
3185
3186  class Base {};
3187  class Derived1 : public Base {}; // matches 'Base'
3188  struct Derived2 : Base {}; // matches 'Base'
3189</pre></td></tr>
3190
3191
3192<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>
3193<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3194a specific number of designators.
3195
3196Example: Given
3197  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3198  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3199designatorCountIs(2)
3200  matches '{ [2].y = 1.0, [0].x = 1.0 }',
3201  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3202</pre></td></tr>
3203
3204
3205<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>
3206<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3207
3208Example matches Y (matcher = enumDecl(isScoped()))
3209enum X {};
3210enum class Y {};
3211</pre></td></tr>
3212
3213
3214<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>
3215<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3216neither type- nor value-dependent.
3217
3218In the following example, the expression sizeof(sizeof(T() + T()))
3219is instantiation-dependent (since it involves a template parameter T),
3220but is neither type- nor value-dependent, since the type of the inner
3221sizeof is known (std::size_t) and therefore the size of the outer
3222sizeof is known.
3223  template&lt;typename T&gt;
3224  void f(T x, T y) { sizeof(sizeof(T() + T()); }
3225expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3226</pre></td></tr>
3227
3228
3229<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>
3230<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3231is not yet instantiated.
3232
3233For example, the expressions "x" and "x + y" are type-dependent in
3234the following code, but "y" is not type-dependent:
3235  template&lt;typename T&gt;
3236  void add(T x, int y) {
3237    x + y;
3238  }
3239expr(isTypeDependent()) matches x + y
3240</pre></td></tr>
3241
3242
3243<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>
3244<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3245non-type template parameter.
3246
3247For example, the array bound of "Chars" in the following example is
3248value-dependent.
3249  template&lt;int Size&gt; int f() { return Size; }
3250expr(isValueDependent()) matches return Size
3251</pre></td></tr>
3252
3253
3254<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>
3255<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3256GNU's __null, C++11's nullptr, or C's NULL macro.
3257
3258Given:
3259  void *v1 = NULL;
3260  void *v2 = nullptr;
3261  void *v3 = __null; // GNU extension
3262  char *cp = (char *)0;
3263  int *ip = 0;
3264  int i = 0;
3265expr(nullPointerConstant())
3266  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3267  initializer for i.
3268</pre></td></tr>
3269
3270
3271<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>
3272<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3273bit width.
3274
3275Given
3276  class C {
3277    int a : 2;
3278    int b : 4;
3279    int c : 2;
3280  };
3281fieldDecl(hasBitWidth(2))
3282  matches 'int a;' and 'int c;' but not 'int b;'.
3283</pre></td></tr>
3284
3285
3286<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>
3287<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3288
3289Given
3290  class C {
3291    int a : 2;
3292    int b;
3293  };
3294fieldDecl(isBitField())
3295  matches 'int a;' but not 'int b;'.
3296</pre></td></tr>
3297
3298
3299<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>
3300<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
3301
3302Given
3303  f('false, 3.14, 42);
3304characterLiteral(equals(0))
3305  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3306  match false
3307floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3308  match 3.14
3309integerLiteral(equals(42))
3310  matches 42
3311
3312Note that you cannot directly match a negative numeric literal because the
3313minus sign is not part of the literal: It is a unary operator whose operand
3314is the positive numeric literal. Instead, you must use a unaryOperator()
3315matcher to match the minus sign:
3316
3317unaryOperator(hasOperatorName("-"),
3318              hasUnaryOperand(integerLiteral(equals(13))))
3319
3320Usable 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;,
3321           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;
3322</pre></td></tr>
3323
3324
3325<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>
3326<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3327
3328
3329<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>
3330<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
3331
3332Matches overloaded operator names specified in strings without the
3333"operator" prefix: e.g. "&lt;&lt;".
3334
3335  hasAnyOverloadesOperatorName("+", "-")
3336Is equivalent to
3337  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3338</pre></td></tr>
3339
3340
3341<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
3342<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3343
3344Given:
3345  void f();
3346  void g() noexcept;
3347  void h() noexcept(true);
3348  void i() noexcept(false);
3349  void j() throw();
3350  void k() throw(int);
3351  void l() throw(...);
3352functionDecl(hasDynamicExceptionSpec()) and
3353  functionProtoType(hasDynamicExceptionSpec())
3354  match the declarations of j, k, and l, but not f, g, h, or i.
3355</pre></td></tr>
3356
3357
3358<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3359<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3360
3361Matches overloaded operator names specified in strings without the
3362"operator" prefix: e.g. "&lt;&lt;".
3363
3364Given:
3365  class A { int operator*(); };
3366  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3367  A a;
3368  a &lt;&lt; a;   // &lt;-- This matches
3369
3370cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3371specified line and
3372cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3373matches the declaration of A.
3374
3375Usable 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;
3376</pre></td></tr>
3377
3378
3379<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>
3380<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3381
3382Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3383int X() {}
3384auto Y() -&gt; int {}
3385</pre></td></tr>
3386
3387
3388<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>
3389<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3390       and if constexpr.
3391
3392Given:
3393  constexpr int foo = 42;
3394  constexpr int bar();
3395  void baz() { if constexpr(1 &gt; 0) {} }
3396varDecl(isConstexpr())
3397  matches the declaration of foo.
3398functionDecl(isConstexpr())
3399  matches the declaration of bar.
3400ifStmt(isConstexpr())
3401  matches the if statement in baz.
3402</pre></td></tr>
3403
3404
3405<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>
3406<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3407
3408Given:
3409  class A { ~A(); };
3410  class B { ~B() = default; };
3411functionDecl(isDefaulted())
3412  matches the declaration of ~B, but not ~A.
3413</pre></td></tr>
3414
3415
3416<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
3417<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
3418
3419Example matches A, va, fa
3420  class A {};
3421  class B;  // Doesn't match, as it has no body.
3422  int va;
3423  extern int vb;  // Doesn't match, as it doesn't define the variable.
3424  void fa() {}
3425  void fb();  // Doesn't match, as it has no body.
3426  @interface X
3427  - (void)ma; // Doesn't match, interface is declaration.
3428  @end
3429  @implementation X
3430  - (void)ma {}
3431  @end
3432
3433Usable 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;,
3434  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3435</pre></td></tr>
3436
3437
3438<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>
3439<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3440
3441Given:
3442  void Func();
3443  void DeletedFunc() = delete;
3444functionDecl(isDeleted())
3445  matches the declaration of DeletedFunc, but not Func.
3446</pre></td></tr>
3447
3448
3449<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>
3450<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3451static member variable template instantiations.
3452
3453Given
3454  template&lt;typename T&gt; void A(T t) { }
3455  template&lt;&gt; void A(int N) { }
3456functionDecl(isExplicitTemplateSpecialization())
3457  matches the specialization A&lt;int&gt;().
3458
3459Usable 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;
3460</pre></td></tr>
3461
3462
3463<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>
3464<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
3465
3466Given:
3467  extern "C" void f() {}
3468  extern "C" { void g() {} }
3469  void h() {}
3470  extern "C" int x = 1;
3471  extern "C" int y = 2;
3472  int z = 3;
3473functionDecl(isExternC())
3474  matches the declaration of f and g, but not the declaration of h.
3475varDecl(isExternC())
3476  matches the declaration of x and y, but not the declaration of z.
3477</pre></td></tr>
3478
3479
3480<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>
3481<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3482the inline keyword.
3483
3484Given
3485  inline void f();
3486  void g();
3487  namespace n {
3488  inline namespace m {}
3489  }
3490functionDecl(isInline()) will match ::f().
3491namespaceDecl(isInline()) will match n::m.
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('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
3496<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3497into an executable program.
3498</pre></td></tr>
3499
3500
3501<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>
3502<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3503
3504Given
3505  void nope();
3506  [[noreturn]] void a();
3507  __attribute__((noreturn)) void b();
3508  struct c { [[noreturn]] c(); };
3509functionDecl(isNoReturn())
3510  matches all of those except
3511  void nope();
3512</pre></td></tr>
3513
3514
3515<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>
3516<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3517
3518Given:
3519  void f();
3520  void g() noexcept;
3521  void h() throw();
3522  void i() throw(int);
3523  void j() noexcept(false);
3524functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3525  match the declarations of g, and h, but not f, i or j.
3526</pre></td></tr>
3527
3528
3529<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>
3530<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
3531class specifier ("static" keyword) written in the source.
3532
3533Given:
3534  static void f() {}
3535  static int i = 0;
3536  extern int j;
3537  int k;
3538functionDecl(isStaticStorageClass())
3539  matches the function declaration f.
3540varDecl(isStaticStorageClass())
3541  matches the variable declaration i.
3542</pre></td></tr>
3543
3544
3545<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>
3546<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3547member variable template instantiations.
3548
3549Given
3550  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3551or
3552  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3553or
3554  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3555cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3556  matches the template instantiation of X&lt;A&gt;.
3557
3558But given
3559  template &lt;typename T&gt;  class X {}; class A {};
3560  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3561cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3562  does not match, as X&lt;A&gt; is an explicit template specialization.
3563
3564Usable 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;
3565</pre></td></tr>
3566
3567
3568<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>
3569<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3570
3571Example matches f, but not g or h. The function i will not match, even when
3572compiled in C mode.
3573  void f(...);
3574  void g(int);
3575  template &lt;typename... Ts&gt; void h(Ts...);
3576  void i();
3577</pre></td></tr>
3578
3579
3580<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isWeak0')"><a name="isWeak0Anchor">isWeak</a></td><td></td></tr>
3581<tr><td colspan="4" class="doc" id="isWeak0"><pre>Matches weak function declarations.
3582
3583Given:
3584  void foo() __attribute__((__weakref__("__foo")));
3585  void bar();
3586functionDecl(isWeak())
3587  matches the weak declaration "foo", but not "bar".
3588</pre></td></tr>
3589
3590
3591<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>
3592<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3593specific parameter count.
3594
3595Given
3596  void f(int i) {}
3597  void g(int i, int j) {}
3598  void h(int i, int j);
3599  void j(int i);
3600  void k(int x, int y, int z, ...);
3601functionDecl(parameterCountIs(2))
3602  matches g and h
3603functionProtoType(parameterCountIs(2))
3604  matches g and h
3605functionProtoType(parameterCountIs(3))
3606  matches k
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('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
3611<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3612
3613Given:
3614  void f();
3615  void g() noexcept;
3616  void h() noexcept(true);
3617  void i() noexcept(false);
3618  void j() throw();
3619  void k() throw(int);
3620  void l() throw(...);
3621functionDecl(hasDynamicExceptionSpec()) and
3622  functionProtoType(hasDynamicExceptionSpec())
3623  match the declarations of j, k, and l, but not f, g, h, or i.
3624</pre></td></tr>
3625
3626
3627<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>
3628<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3629
3630Given:
3631  void f();
3632  void g() noexcept;
3633  void h() throw();
3634  void i() throw(int);
3635  void j() noexcept(false);
3636functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3637  match the declarations of g, and h, but not f, i or j.
3638</pre></td></tr>
3639
3640
3641<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>
3642<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3643specific parameter count.
3644
3645Given
3646  void f(int i) {}
3647  void g(int i, int j) {}
3648  void h(int i, int j);
3649  void j(int i);
3650  void k(int x, int y, int z, ...);
3651functionDecl(parameterCountIs(2))
3652  matches g and h
3653functionProtoType(parameterCountIs(2))
3654  matches g and h
3655functionProtoType(parameterCountIs(3))
3656  matches k
3657</pre></td></tr>
3658
3659
3660<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>
3661<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3662       and if constexpr.
3663
3664Given:
3665  constexpr int foo = 42;
3666  constexpr int bar();
3667  void baz() { if constexpr(1 &gt; 0) {} }
3668varDecl(isConstexpr())
3669  matches the declaration of foo.
3670functionDecl(isConstexpr())
3671  matches the declaration of bar.
3672ifStmt(isConstexpr())
3673  matches the if statement in baz.
3674</pre></td></tr>
3675
3676
3677<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>
3678<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3679
3680
3681<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>
3682<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3683
3684Given
3685  f('false, 3.14, 42);
3686characterLiteral(equals(0))
3687  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3688  match false
3689floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3690  match 3.14
3691integerLiteral(equals(42))
3692  matches 42
3693
3694Note that you cannot directly match a negative numeric literal because the
3695minus sign is not part of the literal: It is a unary operator whose operand
3696is the positive numeric literal. Instead, you must use a unaryOperator()
3697matcher to match the minus sign:
3698
3699unaryOperator(hasOperatorName("-"),
3700              hasUnaryOperand(integerLiteral(equals(13))))
3701
3702Usable 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;,
3703           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;
3704</pre></td></tr>
3705
3706
3707<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>
3708<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3709
3710
3711<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>
3712<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3713
3714
3715<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>
3716<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3717to '.'.
3718
3719Member calls on the implicit this pointer match as called with '-&gt;'.
3720
3721Given
3722  class Y {
3723    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3724    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3725    int a;
3726    static int b;
3727  };
3728  template &lt;class T&gt;
3729  class Z {
3730    void x() { this-&gt;m; }
3731  };
3732memberExpr(isArrow())
3733  matches this-&gt;x, x, y.x, a, this-&gt;b
3734cxxDependentScopeMemberExpr(isArrow())
3735  matches this-&gt;m
3736unresolvedMemberExpr(isArrow())
3737  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3738</pre></td></tr>
3739
3740
3741<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>
3742<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3743
3744This matcher is only provided as a performance optimization of hasName.
3745    hasAnyName(a, b, c)
3746 is equivalent to, but faster than
3747    anyOf(hasName(a), hasName(b), hasName(c))
3748</pre></td></tr>
3749
3750
3751<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>
3752<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3753
3754Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3755void f() {
3756  int x;
3757  static int y;
3758}
3759int z;
3760
3761Example matches f() because it has external formal linkage despite being
3762unique to the translation unit as though it has internal likage
3763(matcher = functionDecl(hasExternalFormalLinkage()))
3764
3765namespace {
3766void f() {}
3767}
3768</pre></td></tr>
3769
3770
3771<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>
3772<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3773
3774Supports specifying enclosing namespaces or classes by prefixing the name
3775with '&lt;enclosing&gt;::'.
3776Does not match typedefs of an underlying type with the given name.
3777
3778Example matches X (Name == "X")
3779  class X;
3780
3781Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3782  namespace a { namespace b { class X; } }
3783</pre></td></tr>
3784
3785
3786<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>
3787<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3788a substring matched by the given RegExp.
3789
3790Supports specifying enclosing namespaces or classes by
3791prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3792of an underlying type with the given name.
3793
3794Example matches X (regexp == "::X")
3795  class X;
3796
3797Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3798  namespace foo { namespace bar { class X; } }
3799
3800If the matcher is used in clang-query, RegexFlags parameter
3801should be passed as a quoted string. e.g: "NoFlags".
3802Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3803</pre></td></tr>
3804
3805
3806<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>
3807<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3808
3809Given
3810  namespace n {
3811  namespace {} // #1
3812  }
3813namespaceDecl(isAnonymous()) will match #1 but not ::n.
3814</pre></td></tr>
3815
3816
3817<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>
3818<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3819the inline keyword.
3820
3821Given
3822  inline void f();
3823  void g();
3824  namespace n {
3825  inline namespace m {}
3826  }
3827functionDecl(isInline()) will match ::f().
3828namespaceDecl(isInline()) will match n::m.
3829</pre></td></tr>
3830
3831
3832<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>
3833<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
3834specified.
3835
3836Given
3837
3838  #pragma omp parallel
3839  #pragma omp parallel default(none)
3840  #pragma omp parallel default(shared)
3841  #pragma omp parallel default(firstprivate)
3842
3843``ompDefaultClause(isFirstPrivateKind())`` matches only
3844``default(firstprivate)``.
3845</pre></td></tr>
3846
3847
3848<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>
3849<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3850
3851Given
3852
3853  #pragma omp parallel
3854  #pragma omp parallel default(none)
3855  #pragma omp parallel default(shared)
3856  #pragma omp parallel default(firstprivate)
3857
3858``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3859</pre></td></tr>
3860
3861
3862<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>
3863<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3864
3865Given
3866
3867  #pragma omp parallel
3868  #pragma omp parallel default(none)
3869  #pragma omp parallel default(shared)
3870  #pragma omp parallel default(firstprivate)
3871
3872``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3873</pre></td></tr>
3874
3875
3876<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>
3877<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3878clause kind.
3879
3880Given
3881
3882  #pragma omp parallel
3883  #pragma omp parallel for
3884  #pragma omp          for
3885
3886`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3887``omp parallel`` and ``omp parallel for``.
3888
3889If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3890should be passed as a quoted string. e.g.,
3891``isAllowedToContainClauseKind("OMPC_default").``
3892</pre></td></tr>
3893
3894
3895<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>
3896<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3897i.e., directives that can't have a structured block.
3898
3899Given
3900
3901  #pragma omp parallel
3902  {}
3903  #pragma omp taskyield
3904
3905``ompExecutableDirective(isStandaloneDirective()))`` matches
3906``omp taskyield``.
3907</pre></td></tr>
3908
3909
3910<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>
3911<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3912</pre></td></tr>
3913
3914
3915<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>
3916<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3917</pre></td></tr>
3918
3919
3920<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>
3921<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
3922isSameOrDerivedFrom(hasName(...)).
3923</pre></td></tr>
3924
3925
3926<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>
3927<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3928a specific number of arguments (including absent default arguments).
3929
3930Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3931  void f(int x, int y);
3932  f(0, 0);
3933</pre></td></tr>
3934
3935
3936<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>
3937<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
3938Selector.getAsString()
3939
3940 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
3941 matches both of the expressions below:
3942    [myObj methodA:argA];
3943    [myObj methodB:argB];
3944</pre></td></tr>
3945
3946
3947<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>
3948<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3949
3950objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3951message expression in
3952
3953  UIWebView *webView = ...;
3954  CGRect bodyFrame = webView.frame;
3955  bodyFrame.size.height = self.bodyContentHeight;
3956  webView.frame = bodyFrame;
3957  //     ^---- matches here
3958</pre></td></tr>
3959
3960
3961<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasNullSelector0')"><a name="hasNullSelector0Anchor">hasNullSelector</a></td><td></td></tr>
3962<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3963
3964Matches only when the selector of the objCMessageExpr is NULL. This may
3965represent an error condition in the tree!
3966</pre></td></tr>
3967
3968
3969<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>
3970<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3971
3972 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3973 matches the outer message expr in the code below, but NOT the message
3974 invocation for self.bodyView.
3975    [self.bodyView loadHTMLString:html baseURL:NULL];
3976</pre></td></tr>
3977
3978
3979<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>
3980<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3981
3982 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3983 matches self.bodyView in the code below, but NOT the outer message
3984 invocation of "loadHTMLString:baseURL:".
3985    [self.bodyView loadHTMLString:html baseURL:NULL];
3986</pre></td></tr>
3987
3988
3989<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>
3990<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3991
3992Example
3993matcher = objcMessageExpr(isClassMessage())
3994matches
3995  [NSString stringWithFormat:@"format"];
3996but not
3997  NSString *x = @"hello";
3998  [x containsString:@"h"];
3999</pre></td></tr>
4000
4001
4002<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>
4003<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
4004
4005Example
4006matcher = objcMessageExpr(isInstanceMessage())
4007matches
4008  NSString *x = @"hello";
4009  [x containsString:@"h"];
4010but not
4011  [NSString stringWithFormat:@"format"];
4012</pre></td></tr>
4013
4014
4015<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>
4016<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
4017a substring matched by the given RegExp.
4018 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4019 invocation for self.bodyView.
4020    [self.bodyView loadHTMLString:html baseURL:NULL];
4021
4022If the matcher is used in clang-query, RegexFlags parameter
4023should be passed as a quoted string. e.g: "NoFlags".
4024Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4025</pre></td></tr>
4026
4027
4028<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>
4029<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4030
4031 matcher = objCMessageExpr(numSelectorArgs(0));
4032 matches self.bodyView in the code below
4033
4034 matcher = objCMessageExpr(numSelectorArgs(2));
4035 matches the invocation of "loadHTMLString:baseURL:" but not that
4036 of self.bodyView
4037    [self.bodyView loadHTMLString:html baseURL:NULL];
4038</pre></td></tr>
4039
4040
4041<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>
4042<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4043
4044Example
4045matcher = objcMethodDecl(isClassMethod())
4046matches
4047@interface I + (void)foo; @end
4048but not
4049@interface I - (void)bar; @end
4050</pre></td></tr>
4051
4052
4053<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>
4054<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4055
4056Example matches A, va, fa
4057  class A {};
4058  class B;  // Doesn't match, as it has no body.
4059  int va;
4060  extern int vb;  // Doesn't match, as it doesn't define the variable.
4061  void fa() {}
4062  void fb();  // Doesn't match, as it has no body.
4063  @interface X
4064  - (void)ma; // Doesn't match, interface is declaration.
4065  @end
4066  @implementation X
4067  - (void)ma {}
4068  @end
4069
4070Usable 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;,
4071  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4072</pre></td></tr>
4073
4074
4075<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>
4076<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4077
4078Example
4079matcher = objcMethodDecl(isInstanceMethod())
4080matches
4081@interface I - (void)bar; @end
4082but not
4083@interface I + (void)foo; @end
4084</pre></td></tr>
4085
4086
4087<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>
4088<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4089
4090Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4091void x(int val) {}
4092void y(int val = 0) {}
4093
4094Deprecated. Use hasInitializer() instead to be able to
4095match on the contents of the default argument.  For example:
4096
4097void x(int val = 7) {}
4098void y(int val = 42) {}
4099parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4100  matches the parameter of y
4101
4102A matcher such as
4103  parmVarDecl(hasInitializer(anything()))
4104is equivalent to parmVarDecl(hasDefaultArgument()).
4105</pre></td></tr>
4106
4107
4108<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>
4109<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4110list. The parameter list could be that of either a block, function, or
4111objc-method.
4112
4113
4114Given
4115
4116void f(int a, int b, int c) {
4117}
4118
4119``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4120
4121``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4122</pre></td></tr>
4123
4124
4125<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>
4126<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4127
4128Given
4129  class Y { public: void x(); };
4130  void z() { Y* y; y-&gt;x(); }
4131cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4132  matches y-&gt;x()
4133</pre></td></tr>
4134
4135
4136<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>
4137<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4138
4139Matches a node if it equals the node previously bound to ID.
4140
4141Given
4142  class X { int a; int b; };
4143cxxRecordDecl(
4144    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4145    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4146  matches the class X, as a and b have the same type.
4147
4148Note that when multiple matches are involved via forEach* matchers,
4149equalsBoundNodes acts as a filter.
4150For example:
4151compoundStmt(
4152    forEachDescendant(varDecl().bind("d")),
4153    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4154will trigger a match for each combination of variable declaration
4155and reference to that variable declaration within a compound statement.
4156</pre></td></tr>
4157
4158
4159<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>
4160<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4161the node, not hidden within a typedef.
4162
4163Given
4164  typedef const int const_int;
4165  const_int i;
4166  int *const j;
4167  int *volatile k;
4168  int m;
4169varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4170i is const-qualified but the qualifier is not local.
4171</pre></td></tr>
4172
4173
4174<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>
4175<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4176
4177Given
4178  void a(char);
4179  void b(wchar_t);
4180  void c(double);
4181functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4182matches "a(char)", "b(wchar_t)", but not "c(double)".
4183</pre></td></tr>
4184
4185
4186<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>
4187<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4188the Objective-C object pointer type, which is different despite being
4189syntactically similar.
4190
4191Given
4192  int *i = nullptr;
4193
4194  @interface Foo
4195  @end
4196  Foo *f;
4197
4198  int j;
4199varDecl(hasType(isAnyPointer()))
4200  matches "int *i" and "Foo *f", but not "int j".
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('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
4205<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4206include "top-level" const.
4207
4208Given
4209  void a(int);
4210  void b(int const);
4211  void c(const int);
4212  void d(const int*);
4213  void e(int const) {};
4214functionDecl(hasAnyParameter(hasType(isConstQualified())))
4215  matches "void b(int const)", "void c(const int)" and
4216  "void e(int const) {}". It does not match d as there
4217  is no top-level const on the parameter type "const int *".
4218</pre></td></tr>
4219
4220
4221<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>
4222<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4223
4224Given
4225  void a(int);
4226  void b(long);
4227  void c(double);
4228functionDecl(hasAnyParameter(hasType(isInteger())))
4229matches "a(int)", "b(long)", but not "c(double)".
4230</pre></td></tr>
4231
4232
4233<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>
4234<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4235
4236Given
4237  void a(int);
4238  void b(unsigned long);
4239  void c(double);
4240functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4241matches "a(int)", but not "b(unsigned long)" and "c(double)".
4242</pre></td></tr>
4243
4244
4245<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>
4246<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4247
4248Given
4249  void a(int);
4250  void b(unsigned long);
4251  void c(double);
4252functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4253matches "b(unsigned long)", but not "a(int)" and "c(double)".
4254</pre></td></tr>
4255
4256
4257<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>
4258<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4259include "top-level" volatile.
4260
4261Given
4262  void a(int);
4263  void b(int volatile);
4264  void c(volatile int);
4265  void d(volatile int*);
4266  void e(int volatile) {};
4267functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4268  matches "void b(int volatile)", "void c(volatile int)" and
4269  "void e(int volatile) {}". It does not match d as there
4270  is no top-level volatile on the parameter type "volatile int *".
4271</pre></td></tr>
4272
4273
4274<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4275<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4276
4277Matches a node if it equals the node previously bound to ID.
4278
4279Given
4280  class X { int a; int b; };
4281cxxRecordDecl(
4282    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4283    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4284  matches the class X, as a and b have the same type.
4285
4286Note that when multiple matches are involved via forEach* matchers,
4287equalsBoundNodes acts as a filter.
4288For example:
4289compoundStmt(
4290    forEachDescendant(varDecl().bind("d")),
4291    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4292will trigger a match for each combination of variable declaration
4293and reference to that variable declaration within a compound statement.
4294</pre></td></tr>
4295
4296
4297<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>
4298<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
4299
4300Stmt has pointer identity in the AST.
4301</pre></td></tr>
4302
4303
4304<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro1')"><a name="isExpandedFromMacro1Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
4305<tr><td colspan="4" class="doc" id="isExpandedFromMacro1"><pre>Matches statements that are (transitively) expanded from the named macro.
4306Does not match if only part of the statement is expanded from that macro or
4307if different parts of the the statement are expanded from different
4308appearances of the macro.
4309</pre></td></tr>
4310
4311
4312<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>
4313<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
4314partially matching a given regex.
4315
4316Example matches Y but not X
4317    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4318  #include "ASTMatcher.h"
4319  class X {};
4320ASTMatcher.h:
4321  class Y {};
4322
4323Usable 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;
4324
4325If the matcher is used in clang-query, RegexFlags parameter
4326should be passed as a quoted string. e.g: "NoFlags".
4327Flags can be combined with '|' example "IgnoreCase | BasicRegex"
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('isExpansionInMainFile1')"><a name="isExpansionInMainFile1Anchor">isExpansionInMainFile</a></td><td></td></tr>
4332<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
4333
4334Example matches X but not Y
4335  (matcher = cxxRecordDecl(isExpansionInMainFile())
4336  #include &lt;Y.h&gt;
4337  class X {};
4338Y.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('isExpansionInSystemHeader1')"><a name="isExpansionInSystemHeader1Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
4346<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
4347
4348Example matches Y but not X
4349    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4350  #include &lt;SystemHeader.h&gt;
4351  class X {};
4352SystemHeader.h:
4353  class Y {};
4354
4355Usable 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;
4356</pre></td></tr>
4357
4358
4359<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>
4360<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4361
4362Given
4363  int j;
4364  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4365  A(0);
4366  A(0U);
4367declStmt(isInTemplateInstantiation())
4368  matches 'int i;' and 'unsigned i'.
4369unless(stmt(isInTemplateInstantiation()))
4370  will NOT match j += 42; as it's shared between the template definition and
4371  instantiation.
4372</pre></td></tr>
4373
4374
4375<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>
4376<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4377
4378Given
4379  int a[42];
4380  int b[2 * 21];
4381  int c[41], d[43];
4382  char *s = "abcd";
4383  wchar_t *ws = L"abcd";
4384  char *w = "a";
4385constantArrayType(hasSize(42))
4386  matches "int a[42]" and "int b[2 * 21]"
4387stringLiteral(hasSize(4))
4388  matches "abcd", L"abcd"
4389</pre></td></tr>
4390
4391
4392<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>
4393<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
4394
4395Example matches C, but not S, U or E.
4396  struct S {};
4397  class C {};
4398  union U {};
4399  enum E {};
4400</pre></td></tr>
4401
4402
4403<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>
4404<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4405
4406Example matches A, va, fa
4407  class A {};
4408  class B;  // Doesn't match, as it has no body.
4409  int va;
4410  extern int vb;  // Doesn't match, as it doesn't define the variable.
4411  void fa() {}
4412  void fb();  // Doesn't match, as it has no body.
4413  @interface X
4414  - (void)ma; // Doesn't match, interface is declaration.
4415  @end
4416  @implementation X
4417  - (void)ma {}
4418  @end
4419
4420Usable 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;,
4421  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4422</pre></td></tr>
4423
4424
4425<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>
4426<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
4427
4428Example matches E, but not C, S or U.
4429  struct S {};
4430  class C {};
4431  union U {};
4432  enum E {};
4433</pre></td></tr>
4434
4435
4436<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>
4437<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
4438
4439Example matches S, but not C, U or E.
4440  struct S {};
4441  class C {};
4442  union U {};
4443  enum E {};
4444</pre></td></tr>
4445
4446
4447<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>
4448<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
4449
4450Example matches U, but not C, S or E.
4451  struct S {};
4452  class C {};
4453  union U {};
4454  enum E {};
4455</pre></td></tr>
4456
4457
4458<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>
4459<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4460
4461Note that 'Value' is a string as the template argument's value is
4462an arbitrary precision integer. 'Value' must be euqal to the canonical
4463representation of that integral value in base 10.
4464
4465Given
4466  template&lt;int T&gt; struct C {};
4467  C&lt;42&gt; c;
4468classTemplateSpecializationDecl(
4469  hasAnyTemplateArgument(equalsIntegralValue("42")))
4470  matches the implicit instantiation of C in C&lt;42&gt;.
4471</pre></td></tr>
4472
4473
4474<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>
4475<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4476
4477Given
4478  template&lt;int T&gt; struct C {};
4479  C&lt;42&gt; c;
4480classTemplateSpecializationDecl(
4481  hasAnyTemplateArgument(isIntegral()))
4482  matches the implicit instantiation of C in C&lt;42&gt;
4483  with isIntegral() matching 42.
4484</pre></td></tr>
4485
4486
4487<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>
4488<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4489
4490Given
4491  template&lt;typename T&gt; struct C {};
4492  C&lt;int&gt; c;
4493classTemplateSpecializationDecl(templateArgumentCountIs(1))
4494  matches C&lt;int&gt;.
4495</pre></td></tr>
4496
4497
4498<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro2')"><a name="isExpandedFromMacro2Anchor">isExpandedFromMacro</a></td><td>std::string MacroName</td></tr>
4499<tr><td colspan="4" class="doc" id="isExpandedFromMacro2"><pre>Matches statements that are (transitively) expanded from the named macro.
4500Does not match if only part of the statement is expanded from that macro or
4501if different parts of the the statement are expanded from different
4502appearances of the macro.
4503</pre></td></tr>
4504
4505
4506<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>
4507<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4508partially matching a given regex.
4509
4510Example matches Y but not X
4511    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4512  #include "ASTMatcher.h"
4513  class X {};
4514ASTMatcher.h:
4515  class Y {};
4516
4517Usable 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;
4518
4519If the matcher is used in clang-query, RegexFlags parameter
4520should be passed as a quoted string. e.g: "NoFlags".
4521Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4522</pre></td></tr>
4523
4524
4525<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>
4526<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4527
4528Example matches X but not Y
4529  (matcher = cxxRecordDecl(isExpansionInMainFile())
4530  #include &lt;Y.h&gt;
4531  class X {};
4532Y.h:
4533  class Y {};
4534
4535Usable 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;
4536</pre></td></tr>
4537
4538
4539<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>
4540<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4541
4542Example matches Y but not X
4543    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4544  #include &lt;SystemHeader.h&gt;
4545  class X {};
4546SystemHeader.h:
4547  class Y {};
4548
4549Usable 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;
4550</pre></td></tr>
4551
4552
4553<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>
4554<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4555
4556Given
4557 struct S { bool func(); };
4558functionDecl(returns(booleanType()))
4559  matches "bool func();"
4560</pre></td></tr>
4561
4562
4563<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>
4564<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4565
4566Matches a node if it equals the node previously bound to ID.
4567
4568Given
4569  class X { int a; int b; };
4570cxxRecordDecl(
4571    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4572    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4573  matches the class X, as a and b have the same type.
4574
4575Note that when multiple matches are involved via forEach* matchers,
4576equalsBoundNodes acts as a filter.
4577For example:
4578compoundStmt(
4579    forEachDescendant(varDecl().bind("d")),
4580    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4581will trigger a match for each combination of variable declaration
4582and reference to that variable declaration within a compound statement.
4583</pre></td></tr>
4584
4585
4586<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>
4587<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4588
4589Type has pointer identity in the AST.
4590</pre></td></tr>
4591
4592
4593<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>
4594<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4595
4596Given
4597  int i;
4598  float f;
4599realFloatingPointType()
4600  matches "float f" but not "int i"
4601</pre></td></tr>
4602
4603
4604<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>
4605<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4606
4607Given
4608 struct S { void func(); };
4609functionDecl(returns(voidType()))
4610  matches "void func();"
4611</pre></td></tr>
4612
4613
4614<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>
4615<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4616
4617Given
4618  int x;
4619  int s = sizeof(x) + alignof(x)
4620unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4621  matches sizeof(x)
4622
4623If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4624should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4625</pre></td></tr>
4626
4627
4628<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>
4629<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
4630specified names.
4631
4632   hasAnyOperatorName("+", "-")
4633 Is equivalent to
4634   anyOf(hasOperatorName("+"), hasOperatorName("-"))
4635</pre></td></tr>
4636
4637
4638<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>
4639<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4640unary).
4641
4642Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4643  !(a || b)
4644</pre></td></tr>
4645
4646
4647<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>
4648<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4649to '.'.
4650
4651Member calls on the implicit this pointer match as called with '-&gt;'.
4652
4653Given
4654  class Y {
4655    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4656    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4657    int a;
4658    static int b;
4659  };
4660  template &lt;class T&gt;
4661  class Z {
4662    void x() { this-&gt;m; }
4663  };
4664memberExpr(isArrow())
4665  matches this-&gt;x, x, y.x, a, this-&gt;b
4666cxxDependentScopeMemberExpr(isArrow())
4667  matches this-&gt;m
4668unresolvedMemberExpr(isArrow())
4669  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4670</pre></td></tr>
4671
4672
4673<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>
4674<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4675
4676Example matches x, but not y, z, or a.
4677(matcher = varDecl(hasAutomaticStorageDuration())
4678void f() {
4679  int x;
4680  static int y;
4681  thread_local int z;
4682}
4683int a;
4684</pre></td></tr>
4685
4686
4687<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>
4688<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4689
4690Example matches y and z (matcher = varDecl(hasGlobalStorage())
4691void f() {
4692  int x;
4693  static int y;
4694}
4695int z;
4696</pre></td></tr>
4697
4698
4699<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
4700<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4701non-static local variable.
4702
4703Example matches x (matcher = varDecl(hasLocalStorage())
4704void f() {
4705  int x;
4706  static int y;
4707}
4708int z;
4709</pre></td></tr>
4710
4711
4712<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>
4713<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4714It includes the variable declared at namespace scope and those declared
4715with "static" and "extern" storage class specifiers.
4716
4717void f() {
4718  int x;
4719  static int y;
4720  thread_local int z;
4721}
4722int a;
4723static int b;
4724extern int c;
4725varDecl(hasStaticStorageDuration())
4726  matches the function declaration y, a, b and c.
4727</pre></td></tr>
4728
4729
4730<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
4731<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4732
4733Example matches z, but not x, z, or a.
4734(matcher = varDecl(hasThreadStorageDuration())
4735void f() {
4736  int x;
4737  static int y;
4738  thread_local int z;
4739}
4740int a;
4741</pre></td></tr>
4742
4743
4744<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>
4745<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4746       and if constexpr.
4747
4748Given:
4749  constexpr int foo = 42;
4750  constexpr int bar();
4751  void baz() { if constexpr(1 &gt; 0) {} }
4752varDecl(isConstexpr())
4753  matches the declaration of foo.
4754functionDecl(isConstexpr())
4755  matches the declaration of bar.
4756ifStmt(isConstexpr())
4757  matches the if statement in baz.
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('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
4762<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4763
4764Example matches A, va, fa
4765  class A {};
4766  class B;  // Doesn't match, as it has no body.
4767  int va;
4768  extern int vb;  // Doesn't match, as it doesn't define the variable.
4769  void fa() {}
4770  void fb();  // Doesn't match, as it has no body.
4771  @interface X
4772  - (void)ma; // Doesn't match, interface is declaration.
4773  @end
4774  @implementation X
4775  - (void)ma {}
4776  @end
4777
4778Usable 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;,
4779  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4780</pre></td></tr>
4781
4782
4783<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExceptionVariable0')"><a name="isExceptionVariable0Anchor">isExceptionVariable</a></td><td></td></tr>
4784<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4785a C++ catch block, or an Objective-C statement.
4786
4787Example matches x (matcher = varDecl(isExceptionVariable())
4788void f(int y) {
4789  try {
4790  } catch (int x) {
4791  }
4792}
4793</pre></td></tr>
4794
4795
4796<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>
4797<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4798static member variable template instantiations.
4799
4800Given
4801  template&lt;typename T&gt; void A(T t) { }
4802  template&lt;&gt; void A(int N) { }
4803functionDecl(isExplicitTemplateSpecialization())
4804  matches the specialization A&lt;int&gt;().
4805
4806Usable 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;
4807</pre></td></tr>
4808
4809
4810<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>
4811<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4812
4813Given:
4814  extern "C" void f() {}
4815  extern "C" { void g() {} }
4816  void h() {}
4817  extern "C" int x = 1;
4818  extern "C" int y = 2;
4819  int z = 3;
4820functionDecl(isExternC())
4821  matches the declaration of f and g, but not the declaration of h.
4822varDecl(isExternC())
4823  matches the declaration of x and y, but not the declaration of z.
4824</pre></td></tr>
4825
4826
4827<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>
4828<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4829
4830Example matches y (matcher = varDecl(isStaticLocal()))
4831void f() {
4832  int x;
4833  static int y;
4834}
4835static int z;
4836</pre></td></tr>
4837
4838
4839<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>
4840<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4841class specifier ("static" keyword) written in the source.
4842
4843Given:
4844  static void f() {}
4845  static int i = 0;
4846  extern int j;
4847  int k;
4848functionDecl(isStaticStorageClass())
4849  matches the function declaration f.
4850varDecl(isStaticStorageClass())
4851  matches the variable declaration i.
4852</pre></td></tr>
4853
4854
4855<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>
4856<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4857member variable template instantiations.
4858
4859Given
4860  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4861or
4862  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4863or
4864  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4865cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4866  matches the template instantiation of X&lt;A&gt;.
4867
4868But given
4869  template &lt;typename T&gt;  class X {}; class A {};
4870  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4871cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4872  does not match, as X&lt;A&gt; is an explicit template specialization.
4873
4874Usable 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;
4875</pre></td></tr>
4876
4877<!--END_NARROWING_MATCHERS -->
4878</table>
4879
4880<!-- ======================================================================= -->
4881<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4882<!-- ======================================================================= -->
4883
4884<p>Traversal matchers specify the relationship to other nodes that are
4885reachable from the current node.</p>
4886
4887<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4888forEachDescendant) which work on all nodes and allow users to write more generic
4889match expressions.</p>
4890
4891<table>
4892<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4893<!-- START_TRAVERSAL_MATCHERS -->
4894
4895<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>
4896<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4897
4898Unlike anyOf, eachOf will generate a match result for each
4899matching submatcher.
4900
4901For example, in:
4902  class A { int a; int b; };
4903The matcher:
4904  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4905                       has(fieldDecl(hasName("b")).bind("v"))))
4906will generate two results binding "v", the first of which binds
4907the field declaration of a, the second the field declaration of
4908b.
4909
4910Usable as: Any Matcher
4911</pre></td></tr>
4912
4913
4914<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>
4915<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
4916
4917Generates results for each match.
4918
4919For example, in:
4920  class A { class B {}; class C {}; };
4921The matcher:
4922  cxxRecordDecl(hasName("::A"),
4923                findAll(cxxRecordDecl(isDefinition()).bind("m")))
4924will generate results for A, B and C.
4925
4926Usable as: Any Matcher
4927</pre></td></tr>
4928
4929
4930<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4931<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4932provided matcher.
4933
4934Example matches X, A, A::X, B, B::C, B::C::X
4935  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4936  class X {};
4937  class A { class X {}; };  // Matches A, because A::X is a class of name
4938                            // X inside A.
4939  class B { class C { class X {}; }; };
4940
4941DescendantT must be an AST base type.
4942
4943As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4944each result that matches instead of only on the first one.
4945
4946Note: Recursively combined ForEachDescendant can cause many matches:
4947  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4948    forEachDescendant(cxxRecordDecl())
4949  )))
4950will match 10 times (plus injected class name matches) on:
4951  class A { class B { class C { class D { class E {}; }; }; }; };
4952
4953Usable as: Any Matcher
4954</pre></td></tr>
4955
4956
4957<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4958<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4959provided matcher.
4960
4961Example matches X, Y, Y::X, Z::Y, Z::Y::X
4962  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4963  class X {};
4964  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
4965                            // inside Y.
4966  class Z { class Y { class X {}; }; };  // Does not match Z.
4967
4968ChildT must be an AST base type.
4969
4970As opposed to 'has', 'forEach' will cause a match for each result that
4971matches instead of only on the first one.
4972
4973Usable as: Any Matcher
4974</pre></td></tr>
4975
4976
4977<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4978<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4979matcher.
4980
4981Given
4982void f() { if (true) { int x = 42; } }
4983void g() { for (;;) { int x = 43; } }
4984expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4985
4986Usable as: Any Matcher
4987</pre></td></tr>
4988
4989
4990<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4991<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4992provided matcher.
4993
4994Example matches X, Y, Z
4995    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4996  class X {};  // Matches X, because X::X is a class of name X inside X.
4997  class Y { class X {}; };
4998  class Z { class Y { class X {}; }; };
4999
5000DescendantT must be an AST base type.
5001
5002Usable as: Any Matcher
5003</pre></td></tr>
5004
5005
5006<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
5007<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
5008provided matcher.
5009
5010Example matches X, Y
5011  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
5012  class X {};  // Matches X, because X::X is a class of name X inside X.
5013  class Y { class X {}; };
5014  class Z { class Y { class X {}; }; };  // Does not match Z.
5015
5016ChildT must be an AST base type.
5017
5018Usable as: Any Matcher
5019Note that has is direct matcher, so it also matches things like implicit
5020casts and paren casts. If you are matching with expr then you should
5021probably consider using ignoringParenImpCasts like:
5022has(ignoringParenImpCasts(expr())).
5023</pre></td></tr>
5024
5025
5026<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5027<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5028matcher.
5029
5030Given
5031void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5032compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5033
5034Usable as: Any Matcher
5035</pre></td></tr>
5036
5037
5038<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
5039<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5040
5041However, optionally will retain any bindings generated by the submatcher.
5042Useful when additional information which may or may not present about a main
5043matching node is desired.
5044
5045For example, in:
5046  class Foo {
5047    int bar;
5048  }
5049The matcher:
5050  cxxRecordDecl(
5051    optionally(has(
5052      fieldDecl(hasName("bar")).bind("var")
5053  ))).bind("record")
5054will produce a result binding for both "record" and "var".
5055The matcher will produce a "record" binding for even if there is no data
5056member named "bar" in that class.
5057
5058Usable as: Any Matcher
5059</pre></td></tr>
5060
5061
5062<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>
5063<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5064
5065Given
5066  void foo()
5067  {
5068      int i = 3.0;
5069  }
5070The matcher
5071  traverse(TK_IgnoreImplicitCastsAndParentheses,
5072    varDecl(hasInitializer(floatLiteral().bind("init")))
5073  )
5074matches the variable declaration with "init" bound to the "3.0".
5075</pre></td></tr>
5076
5077
5078<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>
5079<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5080switch statement or conditional operator.
5081
5082Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5083  if (true) {}
5084</pre></td></tr>
5085
5086
5087<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>
5088<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5089(binary or ternary).
5090
5091Example matches b
5092  condition ? a : b
5093  condition ?: b
5094</pre></td></tr>
5095
5096
5097<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>
5098<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5099
5100Example 1 (conditional ternary operator): matches a
5101  condition ? a : b
5102
5103Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5104  condition ?: b
5105</pre></td></tr>
5106
5107
5108<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>
5109<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5110matches the given matcher.
5111
5112The associated declaration is:
5113- for type nodes, the declaration of the underlying type
5114- for CallExpr, the declaration of the callee
5115- for MemberExpr, the declaration of the referenced member
5116- for CXXConstructExpr, the declaration of the constructor
5117- for CXXNewExpr, the declaration of the operator new
5118- for ObjCIvarExpr, the declaration of the ivar
5119
5120For type nodes, hasDeclaration will generally match the declaration of the
5121sugared type. Given
5122  class X {};
5123  typedef X Y;
5124  Y y;
5125in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5126typedefDecl. A common use case is to match the underlying, desugared type.
5127This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5128  varDecl(hasType(hasUnqualifiedDesugaredType(
5129      recordType(hasDeclaration(decl())))))
5130In this matcher, the decl will match the CXXRecordDecl of class X.
5131
5132Usable 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;,
5133  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;,
5134  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;,
5135  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;,
5136  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;,
5137  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;,
5138  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5139</pre></td></tr>
5140
5141
5142<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>
5143<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5144
5145Given
5146  int i[5];
5147  void f() { i[1] = 42; }
5148arraySubscriptExpression(hasBase(implicitCastExpr(
5149    hasSourceExpression(declRefExpr()))))
5150  matches i[1] with the declRefExpr() matching i
5151</pre></td></tr>
5152
5153
5154<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>
5155<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5156
5157Given
5158  int i[5];
5159  void f() { i[1] = 42; }
5160arraySubscriptExpression(hasIndex(integerLiteral()))
5161  matches i[1] with the integerLiteral() matching 1
5162</pre></td></tr>
5163
5164
5165<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>
5166<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
5167
5168Example matches a (matcher = binaryOperator(hasLHS()))
5169  a || b
5170</pre></td></tr>
5171
5172
5173<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>
5174<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
5175
5176Example matches b (matcher = binaryOperator(hasRHS()))
5177  a || b
5178</pre></td></tr>
5179
5180
5181<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>
5182<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5183type.
5184
5185Given
5186  struct A {};
5187  A a[7];
5188  int b[7];
5189arrayType(hasElementType(builtinType()))
5190  matches "int b[7]"
5191
5192Usable 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;
5193</pre></td></tr>
5194
5195
5196<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>
5197<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
5198
5199Given
5200  _Atomic(int) i;
5201  _Atomic(float) f;
5202atomicType(hasValueType(isInteger()))
5203 matches "_Atomic(int) i"
5204
5205Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
5206</pre></td></tr>
5207
5208
5209<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>
5210<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
5211
5212Note: There is no TypeLoc for the deduced type and thus no
5213getDeducedLoc() matcher.
5214
5215Given
5216  auto a = 1;
5217  auto b = 2.0;
5218autoType(hasDeducedType(isInteger()))
5219  matches "auto a"
5220
5221Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
5222</pre></td></tr>
5223
5224
5225<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>
5226<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
5227binary operator matches.
5228</pre></td></tr>
5229
5230
5231<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>
5232<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
5233
5234Example matches a (matcher = binaryOperator(hasLHS()))
5235  a || b
5236</pre></td></tr>
5237
5238
5239<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>
5240<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
5241
5242Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
5243                                             integerLiteral(equals(2)))
5244  1 + 2 // Match
5245  2 + 1 // Match
5246  1 + 1 // No match
5247  2 + 2 // No match
5248</pre></td></tr>
5249
5250
5251<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>
5252<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
5253
5254Example matches b (matcher = binaryOperator(hasRHS()))
5255  a || b
5256</pre></td></tr>
5257
5258
5259<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>
5260<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
5261block.
5262
5263Does not match the 'this' parameter of a method.
5264
5265Given
5266  class X { void f(int x, int y, int z) {} };
5267cxxMethodDecl(hasAnyParameter(hasName("y")))
5268  matches f(int x, int y, int z) {}
5269with hasAnyParameter(...)
5270  matching int y
5271
5272For ObjectiveC, given
5273  @interface I - (void) f:(int) y; @end
5274
5275the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5276matches the declaration of method f with hasParameter
5277matching y.
5278
5279For blocks, given
5280  b = ^(int y) { printf("%d", y) };
5281
5282the matcher blockDecl(hasAnyParameter(hasName("y")))
5283matches the declaration of the block b with hasParameter
5284matching y.
5285</pre></td></tr>
5286
5287
5288<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>
5289<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
5290declaration or a block.
5291
5292Given
5293  class X { void f(int x) {} };
5294cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5295  matches f(int x) {}
5296with hasParameter(...)
5297  matching int x
5298
5299For ObjectiveC, given
5300  @interface I - (void) f:(int) y; @end
5301
5302the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5303matches the declaration of method f with hasParameter
5304matching y.
5305</pre></td></tr>
5306
5307
5308<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>
5309<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
5310pointee matches a given matcher.
5311
5312Given
5313  int *a;
5314  int const *b;
5315  float const *f;
5316pointerType(pointee(isConstQualified(), isInteger()))
5317  matches "int const *b"
5318
5319Usable 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;,
5320  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;
5321</pre></td></tr>
5322
5323
5324<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>
5325<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
5326declaration's type.
5327
5328In case of a value declaration (for example a variable declaration),
5329this resolves one layer of indirection. For example, in the value
5330declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5331X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5332declaration of x.
5333
5334Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5335            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5336            and friend class X (matcher = friendDecl(hasType("X"))
5337 class X {};
5338 void y(X &amp;x) { x; X z; }
5339 class Y { friend class X; };
5340
5341Example matches class Derived
5342(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
5343class Base {};
5344class Derived : Base {};
5345
5346Usable 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;,
5347Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
5348</pre></td></tr>
5349
5350
5351<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>
5352<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
5353
5354Given
5355  void f(int i);
5356  int y;
5357  f(y);
5358callExpr(
5359  forEachArgumentWithParam(
5360    declRefExpr(to(varDecl(hasName("y")))),
5361    parmVarDecl(hasType(isInteger()))
5362))
5363  matches f(y);
5364with declRefExpr(...)
5365  matching int y
5366and parmVarDecl(...)
5367  matching int i
5368</pre></td></tr>
5369
5370
5371<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>
5372<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
5373CXXConstructExpr. It is very similar to forEachArgumentWithParam but
5374it works on calls through function pointers as well.
5375
5376The difference is, that function pointers do not provide access to a
5377ParmVarDecl, but only the QualType for each argument.
5378
5379Given
5380  void f(int i);
5381  int y;
5382  f(y);
5383  void (*f_ptr)(int) = f;
5384  f_ptr(y);
5385callExpr(
5386  forEachArgumentWithParamType(
5387    declRefExpr(to(varDecl(hasName("y")))),
5388    qualType(isInteger()).bind("type)
5389))
5390  matches f(y) and f_ptr(y)
5391with declRefExpr(...)
5392  matching int y
5393and qualType(...)
5394  matching int
5395</pre></td></tr>
5396
5397
5398<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>
5399<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
5400expression, or an ObjC-message-send expression.
5401
5402Given
5403  void x(int, int, int) { int y; x(1, y, 42); }
5404callExpr(hasAnyArgument(declRefExpr()))
5405  matches x(1, y, 42)
5406with hasAnyArgument(...)
5407  matching y
5408
5409For ObjectiveC, given
5410  @interface I - (void) f:(int) y; @end
5411  void foo(I *i) { [i f:12]; }
5412objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5413  matches [i f:12]
5414</pre></td></tr>
5415
5416
5417<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>
5418<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
5419call expression.
5420
5421Example matches y in x(y)
5422    (matcher = callExpr(hasArgument(0, declRefExpr())))
5423  void x(int) { int y; x(y); }
5424</pre></td></tr>
5425
5426
5427<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>
5428<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
5429matches the given matcher.
5430
5431The associated declaration is:
5432- for type nodes, the declaration of the underlying type
5433- for CallExpr, the declaration of the callee
5434- for MemberExpr, the declaration of the referenced member
5435- for CXXConstructExpr, the declaration of the constructor
5436- for CXXNewExpr, the declaration of the operator new
5437- for ObjCIvarExpr, the declaration of the ivar
5438
5439For type nodes, hasDeclaration will generally match the declaration of the
5440sugared type. Given
5441  class X {};
5442  typedef X Y;
5443  Y y;
5444in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5445typedefDecl. A common use case is to match the underlying, desugared type.
5446This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5447  varDecl(hasType(hasUnqualifiedDesugaredType(
5448      recordType(hasDeclaration(decl())))))
5449In this matcher, the decl will match the CXXRecordDecl of class X.
5450
5451Usable 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;,
5452  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;,
5453  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;,
5454  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;,
5455  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;,
5456  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;,
5457  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5458</pre></td></tr>
5459
5460
5461<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>
5462<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
5463
5464Given
5465  class A { A() : i(42), j(42) {} int i; int j; };
5466cxxConstructorDecl(forEachConstructorInitializer(
5467  forField(decl().bind("x"))
5468))
5469  will trigger two matches, binding for 'i' and 'j' respectively.
5470</pre></td></tr>
5471
5472
5473<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>
5474<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
5475
5476Given
5477  struct Foo {
5478    Foo() : foo_(1) { }
5479    int foo_;
5480  };
5481cxxRecordDecl(has(cxxConstructorDecl(
5482  hasAnyConstructorInitializer(anything())
5483)))
5484  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5485</pre></td></tr>
5486
5487
5488<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>
5489<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5490
5491Given
5492  struct Foo {
5493    Foo() : foo_(1) { }
5494    int foo_;
5495  };
5496cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5497    forField(hasName("foo_"))))))
5498  matches Foo
5499with forField matching foo_
5500</pre></td></tr>
5501
5502
5503<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>
5504<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5505
5506Given
5507  struct Foo {
5508    Foo() : foo_(1) { }
5509    int foo_;
5510  };
5511cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5512    withInitializer(integerLiteral(equals(1)))))))
5513  matches Foo
5514with withInitializer matching (1)
5515</pre></td></tr>
5516
5517
5518<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>
5519<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5520given matcher. Implicit object expressions are included; that is, it matches
5521use of implicit `this`.
5522
5523Given
5524  struct X {
5525    int m;
5526    int f(X x) { x.m; return m; }
5527  };
5528memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5529  matches `x.m`, but not `m`; however,
5530memberExpr(hasObjectExpression(hasType(pointsTo(
5531     cxxRecordDecl(hasName("X"))))))
5532  matches `m` (aka. `this-&gt;m`), but not `x.m`.
5533</pre></td></tr>
5534
5535
5536<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>
5537<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
5538
5539
5540<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>
5541<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
5542
5543Given:
5544 void foo() {
5545   if (int i = foobar(); i &gt; 0) {}
5546   switch (int i = foobar(); i) {}
5547   for (auto&amp; a = get_range(); auto&amp; x : a) {}
5548 }
5549 void bar() {
5550   if (foobar() &gt; 0) {}
5551   switch (foobar()) {}
5552   for (auto&amp; x : get_range()) {}
5553 }
5554ifStmt(hasInitStatement(anything()))
5555  matches the if statement in foo but not in bar.
5556switchStmt(hasInitStatement(anything()))
5557  matches the switch statement in foo but not in bar.
5558cxxForRangeStmt(hasInitStatement(anything()))
5559  matches the range for statement in foo but not in bar.
5560</pre></td></tr>
5561
5562
5563<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>
5564<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5565
5566Example:
5567    forStmt(hasLoopVariable(anything()))
5568matches 'int x' in
5569    for (int x : a) { }
5570</pre></td></tr>
5571
5572
5573<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>
5574<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5575
5576Example:
5577    forStmt(hasRangeInit(anything()))
5578matches 'a' in
5579    for (int x : a) { }
5580</pre></td></tr>
5581
5582
5583<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>
5584<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5585`on`, matches the argument directly without stripping away anything.
5586
5587Given
5588  class Y { public: void m(); };
5589  Y g();
5590  class X : public Y { void g(); };
5591  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5592cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5593    cxxRecordDecl(hasName("Y")))))
5594  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5595cxxMemberCallExpr(on(callExpr()))
5596  does not match `(g()).m()`, because the parens are not ignored.
5597
5598FIXME: Overload to allow directly matching types?
5599</pre></td></tr>
5600
5601
5602<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>
5603<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5604stripping off any parentheses or implicit casts.
5605
5606Given
5607  class Y { public: void m(); };
5608  Y g();
5609  class X : public Y {};
5610  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5611cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5612  matches `y.m()` and `(g()).m()`.
5613cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5614  matches `x.m()`.
5615cxxMemberCallExpr(on(callExpr()))
5616  matches `(g()).m()`.
5617
5618FIXME: Overload to allow directly matching types?
5619</pre></td></tr>
5620
5621
5622<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>
5623<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5624</pre></td></tr>
5625
5626
5627<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>
5628<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5629matches the InnerMatcher, or is a pointer to a type that matches the
5630InnerMatcher.
5631
5632Given
5633  class Y { public: void m(); };
5634  class X : public Y { void g(); };
5635  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5636cxxMemberCallExpr(thisPointerType(hasDeclaration(
5637    cxxRecordDecl(hasName("Y")))))
5638  matches `y.m()`, `p-&gt;m()` and `x.m()`.
5639cxxMemberCallExpr(thisPointerType(hasDeclaration(
5640    cxxRecordDecl(hasName("X")))))
5641  matches `x.g()`.
5642</pre></td></tr>
5643
5644
5645<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>
5646<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5647produce multiple matches.
5648
5649Given
5650  class A { virtual void f(); };
5651  class B : public A { void f(); };
5652  class C : public B { void f(); };
5653cxxMethodDecl(ofClass(hasName("C")),
5654              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5655  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5656  that B::f is not overridden by C::f).
5657
5658The check can produce multiple matches in case of multiple inheritance, e.g.
5659  class A1 { virtual void f(); };
5660  class A2 { virtual void f(); };
5661  class C : public A1, public A2 { void f(); };
5662cxxMethodDecl(ofClass(hasName("C")),
5663              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5664  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5665  once with "b" binding "A2::f" and "d" binding "C::f".
5666</pre></td></tr>
5667
5668
5669<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>
5670<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5671belongs to.
5672
5673FIXME: Generalize this for other kinds of declarations.
5674FIXME: What other kind of declarations would we need to generalize
5675this to?
5676
5677Example matches A() in the last line
5678    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5679        ofClass(hasName("A"))))))
5680  class A {
5681   public:
5682    A();
5683  };
5684  A a = A();
5685</pre></td></tr>
5686
5687
5688<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>
5689<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
5690
5691Given:
5692  MyClass *p1 = new (Storage) MyClass();
5693cxxNewExpr(hasAnyPlacementArg(anything()))
5694  matches the expression 'new (Storage, 16) MyClass()'.
5695</pre></td></tr>
5696
5697
5698<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>
5699<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5700
5701Given:
5702  MyClass *p1 = new MyClass[10];
5703cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
5704  matches the expression 'new MyClass[10]'.
5705</pre></td></tr>
5706
5707
5708<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>
5709<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5710matches the given matcher.
5711
5712The associated declaration is:
5713- for type nodes, the declaration of the underlying type
5714- for CallExpr, the declaration of the callee
5715- for MemberExpr, the declaration of the referenced member
5716- for CXXConstructExpr, the declaration of the constructor
5717- for CXXNewExpr, the declaration of the operator new
5718- for ObjCIvarExpr, the declaration of the ivar
5719
5720For type nodes, hasDeclaration will generally match the declaration of the
5721sugared type. Given
5722  class X {};
5723  typedef X Y;
5724  Y y;
5725in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5726typedefDecl. A common use case is to match the underlying, desugared type.
5727This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5728  varDecl(hasType(hasUnqualifiedDesugaredType(
5729      recordType(hasDeclaration(decl())))))
5730In this matcher, the decl will match the CXXRecordDecl of class X.
5731
5732Usable 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;,
5733  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;,
5734  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;,
5735  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;,
5736  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;,
5737  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;,
5738  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5739</pre></td></tr>
5740
5741
5742<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>
5743<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
5744
5745Given:
5746  MyClass *p1 = new (Storage, 16) MyClass();
5747cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
5748  matches the expression 'new (Storage, 16) MyClass()'.
5749</pre></td></tr>
5750
5751
5752<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>
5753<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
5754
5755Example:
5756matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
5757  class Foo;
5758  class Bar : Foo {};
5759  class Baz : Bar {};
5760  class SpecialBase;
5761  class Proxy : SpecialBase {};  // matches Proxy
5762  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
5763
5764FIXME: Refactor this and isDerivedFrom to reuse implementation.
5765</pre></td></tr>
5766
5767
5768<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>
5769<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
5770
5771Example:
5772matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
5773  class Foo;
5774  class Bar : Foo {};
5775  class Baz : Bar {};
5776  class SpecialBase;
5777  class Proxy : SpecialBase {};  // matches Proxy
5778  class IndirectlyDerived : Proxy {};  // doesn't match
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('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>
5783<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5784
5785Given:
5786  class A { void func(); };
5787  class B { void member(); };
5788
5789cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5790A but not B.
5791</pre></td></tr>
5792
5793
5794<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>
5795<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
5796matching Base, or Objective-C classes that directly or indirectly
5797subclass a class matching Base.
5798
5799Note that a class is not considered to be derived from itself.
5800
5801Example matches Y, Z, C (Base == hasName("X"))
5802  class X;
5803  class Y : public X {};  // directly derived
5804  class Z : public Y {};  // indirectly derived
5805  typedef X A;
5806  typedef A B;
5807  class C : public B {};  // derived from a typedef of X
5808
5809In the following example, Bar matches isDerivedFrom(hasName("X")):
5810  class Foo;
5811  typedef Foo X;
5812  class Bar : public Foo {};  // derived from a type that X is a typedef of
5813
5814In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
5815  @interface NSObject @end
5816  @interface Bar : NSObject @end
5817
5818Usable 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;
5819</pre></td></tr>
5820
5821
5822<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>
5823<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
5824matching Base.
5825
5826Note that a class is not considered to be derived from itself.
5827
5828Example matches Y, C (Base == hasName("X"))
5829  class X;
5830  class Y : public X {};  // directly derived
5831  class Z : public Y {};  // indirectly derived
5832  typedef X A;
5833  typedef A B;
5834  class C : public B {};  // derived from a typedef of X
5835
5836In the following example, Bar matches isDerivedFrom(hasName("X")):
5837  class Foo;
5838  typedef Foo X;
5839  class Bar : public Foo {};  // derived from a type that X is a typedef of
5840</pre></td></tr>
5841
5842
5843<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>
5844<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5845match Base.
5846</pre></td></tr>
5847
5848
5849<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>
5850<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5851expression, or an ObjC-message-send expression.
5852
5853Given
5854  void x(int, int, int) { int y; x(1, y, 42); }
5855callExpr(hasAnyArgument(declRefExpr()))
5856  matches x(1, y, 42)
5857with hasAnyArgument(...)
5858  matching y
5859
5860For ObjectiveC, given
5861  @interface I - (void) f:(int) y; @end
5862  void foo(I *i) { [i f:12]; }
5863objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5864  matches [i f:12]
5865</pre></td></tr>
5866
5867
5868<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>
5869<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5870given matcher.
5871
5872Example matches y.x() (matcher = callExpr(callee(
5873                                   cxxMethodDecl(hasName("x")))))
5874  class Y { public: void x(); };
5875  void z() { Y y; y.x(); }
5876</pre></td></tr>
5877
5878
5879<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>
5880<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5881
5882Given
5883  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5884  void f() { f(); }
5885callExpr(callee(expr()))
5886  matches this-&gt;x(), x(), y.x(), f()
5887with callee(...)
5888  matching this-&gt;x, x, y.x, f respectively
5889
5890Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
5891because this introduces ambiguous overloads with calls to Callee taking a
5892internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
5893implemented in terms of implicit casts.
5894</pre></td></tr>
5895
5896
5897<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>
5898<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5899
5900Given
5901  void f(int i);
5902  int y;
5903  f(y);
5904callExpr(
5905  forEachArgumentWithParam(
5906    declRefExpr(to(varDecl(hasName("y")))),
5907    parmVarDecl(hasType(isInteger()))
5908))
5909  matches f(y);
5910with declRefExpr(...)
5911  matching int y
5912and parmVarDecl(...)
5913  matching int i
5914</pre></td></tr>
5915
5916
5917<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>
5918<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
5919CXXConstructExpr. It is very similar to forEachArgumentWithParam but
5920it works on calls through function pointers as well.
5921
5922The difference is, that function pointers do not provide access to a
5923ParmVarDecl, but only the QualType for each argument.
5924
5925Given
5926  void f(int i);
5927  int y;
5928  f(y);
5929  void (*f_ptr)(int) = f;
5930  f_ptr(y);
5931callExpr(
5932  forEachArgumentWithParamType(
5933    declRefExpr(to(varDecl(hasName("y")))),
5934    qualType(isInteger()).bind("type)
5935))
5936  matches f(y) and f_ptr(y)
5937with declRefExpr(...)
5938  matching int y
5939and qualType(...)
5940  matching int
5941</pre></td></tr>
5942
5943
5944<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>
5945<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5946expression, or an ObjC-message-send expression.
5947
5948Given
5949  void x(int, int, int) { int y; x(1, y, 42); }
5950callExpr(hasAnyArgument(declRefExpr()))
5951  matches x(1, y, 42)
5952with hasAnyArgument(...)
5953  matching y
5954
5955For ObjectiveC, given
5956  @interface I - (void) f:(int) y; @end
5957  void foo(I *i) { [i f:12]; }
5958objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5959  matches [i f:12]
5960</pre></td></tr>
5961
5962
5963<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>
5964<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5965call expression.
5966
5967Example matches y in x(y)
5968    (matcher = callExpr(hasArgument(0, declRefExpr())))
5969  void x(int) { int y; x(y); }
5970</pre></td></tr>
5971
5972
5973<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>
5974<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5975matches the given matcher.
5976
5977The associated declaration is:
5978- for type nodes, the declaration of the underlying type
5979- for CallExpr, the declaration of the callee
5980- for MemberExpr, the declaration of the referenced member
5981- for CXXConstructExpr, the declaration of the constructor
5982- for CXXNewExpr, the declaration of the operator new
5983- for ObjCIvarExpr, the declaration of the ivar
5984
5985For type nodes, hasDeclaration will generally match the declaration of the
5986sugared type. Given
5987  class X {};
5988  typedef X Y;
5989  Y y;
5990in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5991typedefDecl. A common use case is to match the underlying, desugared type.
5992This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5993  varDecl(hasType(hasUnqualifiedDesugaredType(
5994      recordType(hasDeclaration(decl())))))
5995In this matcher, the decl will match the CXXRecordDecl of class X.
5996
5997Usable 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;,
5998  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;,
5999  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;,
6000  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;,
6001  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;,
6002  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;,
6003  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6004</pre></td></tr>
6005
6006
6007<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>
6008<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
6009extension, matches the constant given in the statement.
6010
6011Given
6012  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
6013caseStmt(hasCaseConstant(integerLiteral()))
6014  matches "case 1:"
6015</pre></td></tr>
6016
6017
6018<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>
6019<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
6020or opaque value's source expression matches the given matcher.
6021
6022Example 1: matches "a string"
6023(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6024class URL { URL(string); };
6025URL url = "a string";
6026
6027Example 2: matches 'b' (matcher =
6028opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6029int a = b ?: 1;
6030</pre></td></tr>
6031
6032
6033<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>
6034<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6035functionDecl that have at least one TemplateArgument matching the given
6036InnerMatcher.
6037
6038Given
6039  template&lt;typename T&gt; class A {};
6040  template&lt;&gt; class A&lt;double&gt; {};
6041  A&lt;int&gt; a;
6042
6043  template&lt;typename T&gt; f() {};
6044  void func() { f&lt;int&gt;(); };
6045
6046classTemplateSpecializationDecl(hasAnyTemplateArgument(
6047    refersToType(asString("int"))))
6048  matches the specialization A&lt;int&gt;
6049
6050functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6051  matches the specialization f&lt;int&gt;
6052</pre></td></tr>
6053
6054
6055<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>
6056<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
6057
6058Given
6059  template&lt;typename T&gt; class A {}; #1
6060  template&lt;&gt; class A&lt;int&gt; {}; #2
6061classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
6062  matches '#2' with classTemplateDecl() matching the class template
6063  declaration of 'A' at #1.
6064</pre></td></tr>
6065
6066
6067<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>
6068<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6069functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6070
6071Given
6072  template&lt;typename T, typename U&gt; class A {};
6073  A&lt;bool, int&gt; b;
6074  A&lt;int, bool&gt; c;
6075
6076  template&lt;typename T&gt; void f() {}
6077  void func() { f&lt;int&gt;(); };
6078classTemplateSpecializationDecl(hasTemplateArgument(
6079    1, refersToType(asString("int"))))
6080  matches the specialization A&lt;bool, int&gt;
6081
6082functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6083  matches the specialization f&lt;int&gt;
6084</pre></td></tr>
6085
6086
6087<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>
6088<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
6089type.
6090
6091Given
6092  struct A {};
6093  A a[7];
6094  int b[7];
6095arrayType(hasElementType(builtinType()))
6096  matches "int b[7]"
6097
6098Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
6099</pre></td></tr>
6100
6101
6102<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
6103<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
6104a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6105
6106Given
6107  { {}; 1+2; }
6108hasAnySubstatement(compoundStmt())
6109  matches '{ {}; 1+2; }'
6110with compoundStmt()
6111  matching '{}'
6112</pre></td></tr>
6113
6114
6115<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>
6116<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
6117</pre></td></tr>
6118
6119
6120<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>
6121<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
6122matches the given matcher.
6123
6124The associated declaration is:
6125- for type nodes, the declaration of the underlying type
6126- for CallExpr, the declaration of the callee
6127- for MemberExpr, the declaration of the referenced member
6128- for CXXConstructExpr, the declaration of the constructor
6129- for CXXNewExpr, the declaration of the operator new
6130- for ObjCIvarExpr, the declaration of the ivar
6131
6132For type nodes, hasDeclaration will generally match the declaration of the
6133sugared type. Given
6134  class X {};
6135  typedef X Y;
6136  Y y;
6137in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6138typedefDecl. A common use case is to match the underlying, desugared type.
6139This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6140  varDecl(hasType(hasUnqualifiedDesugaredType(
6141      recordType(hasDeclaration(decl())))))
6142In this matcher, the decl will match the CXXRecordDecl of class X.
6143
6144Usable 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;,
6145  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;,
6146  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;,
6147  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;,
6148  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;,
6149  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;,
6150  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6151</pre></td></tr>
6152
6153
6154<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>
6155<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
6156specific using shadow declaration.
6157
6158Given
6159  namespace a { void f() {} }
6160  using a::f;
6161  void g() {
6162    f();     // Matches this ..
6163    a::f();  // .. but not this.
6164  }
6165declRefExpr(throughUsingDecl(anything()))
6166  matches f()
6167</pre></td></tr>
6168
6169
6170<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>
6171<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
6172specified matcher.
6173
6174Example matches x in if(x)
6175    (matcher = declRefExpr(to(varDecl(hasName("x")))))
6176  bool x;
6177  if (x) {}
6178</pre></td></tr>
6179
6180
6181<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>
6182<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
6183
6184Note that this does not work for global declarations because the AST
6185breaks up multiple-declaration DeclStmt's into multiple single-declaration
6186DeclStmt's.
6187Example: Given non-global declarations
6188  int a, b = 0;
6189  int c;
6190  int d = 2, e;
6191declStmt(containsDeclaration(
6192      0, varDecl(hasInitializer(anything()))))
6193  matches only 'int d = 2, e;', and
6194declStmt(containsDeclaration(1, varDecl()))
6195  matches 'int a, b = 0' as well as 'int d = 2, e;'
6196  but 'int c;' is not matched.
6197</pre></td></tr>
6198
6199
6200<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>
6201<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
6202
6203Given
6204  int a, b;
6205  int c;
6206declStmt(hasSingleDecl(anything()))
6207  matches 'int c;' but not 'int a, b;'.
6208</pre></td></tr>
6209
6210
6211<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>
6212<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
6213the inner matcher.
6214
6215Given
6216  int x;
6217declaratorDecl(hasTypeLoc(loc(asString("int"))))
6218  matches int x
6219</pre></td></tr>
6220
6221
6222<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>
6223<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
6224Decl, matches InnerMatcher.
6225
6226Given
6227  namespace N {
6228    namespace M {
6229      class D {};
6230    }
6231  }
6232
6233cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
6234declaration of class D.
6235</pre></td></tr>
6236
6237
6238<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>
6239<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
6240
6241Given
6242  decltype(1) a = 1;
6243  decltype(2.0) b = 2.0;
6244decltypeType(hasUnderlyingType(isInteger()))
6245  matches the type of "a"
6246
6247Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
6248</pre></td></tr>
6249
6250
6251<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>
6252<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
6253
6254
6255<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>
6256<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
6257switch statement or conditional operator.
6258
6259Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6260  if (true) {}
6261</pre></td></tr>
6262
6263
6264<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>
6265<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
6266matches InnerMatcher if the qualifier exists.
6267
6268Given
6269  namespace N {
6270    namespace M {
6271      class D {};
6272    }
6273  }
6274  N::M::D d;
6275
6276elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
6277matches the type of the variable declaration of d.
6278</pre></td></tr>
6279
6280
6281<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>
6282<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
6283
6284Given
6285  namespace N {
6286    namespace M {
6287      class D {};
6288    }
6289  }
6290  N::M::D d;
6291
6292elaboratedType(namesType(recordType(
6293hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
6294declaration of d.
6295</pre></td></tr>
6296
6297
6298<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>
6299<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
6300matches the given matcher.
6301
6302The associated declaration is:
6303- for type nodes, the declaration of the underlying type
6304- for CallExpr, the declaration of the callee
6305- for MemberExpr, the declaration of the referenced member
6306- for CXXConstructExpr, the declaration of the constructor
6307- for CXXNewExpr, the declaration of the operator new
6308- for ObjCIvarExpr, the declaration of the ivar
6309
6310For type nodes, hasDeclaration will generally match the declaration of the
6311sugared type. Given
6312  class X {};
6313  typedef X Y;
6314  Y y;
6315in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6316typedefDecl. A common use case is to match the underlying, desugared type.
6317This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6318  varDecl(hasType(hasUnqualifiedDesugaredType(
6319      recordType(hasDeclaration(decl())))))
6320In this matcher, the decl will match the CXXRecordDecl of class X.
6321
6322Usable 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;,
6323  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;,
6324  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;,
6325  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;,
6326  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;,
6327  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;,
6328  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6329</pre></td></tr>
6330
6331
6332<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>
6333<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
6334
6335(Note: Clang's AST refers to other conversions as "casts" too, and calls
6336actual casts "explicit" casts.)
6337</pre></td></tr>
6338
6339
6340<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>
6341<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
6342declaration's type.
6343
6344In case of a value declaration (for example a variable declaration),
6345this resolves one layer of indirection. For example, in the value
6346declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6347X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6348declaration of x.
6349
6350Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6351            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6352            and friend class X (matcher = friendDecl(hasType("X"))
6353 class X {};
6354 void y(X &amp;x) { x; X z; }
6355 class Y { friend class X; };
6356
6357Example matches class Derived
6358(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6359class Base {};
6360class Derived : Base {};
6361
6362Usable 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;,
6363Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6364</pre></td></tr>
6365
6366
6367<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>
6368<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
6369matcher.
6370
6371Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6372            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6373            and U (matcher = typedefDecl(hasType(asString("int")))
6374            and friend class X (matcher = friendDecl(hasType("X"))
6375 class X {};
6376 void y(X &amp;x) { x; X z; }
6377 typedef int U;
6378 class Y { friend class X; };
6379</pre></td></tr>
6380
6381
6382<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>
6383<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
6384elidable constructor and other corresponding bookkeeping nodes.
6385
6386In C++17, elidable copy constructors are no longer being generated in the
6387AST as it is not permitted by the standard. They are, however, part of the
6388AST in C++14 and earlier. So, a matcher must abstract over these differences
6389to work in all language modes. This matcher skips elidable constructor-call
6390AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
6391various implicit nodes inside the constructor calls, all of which will not
6392appear in the C++17 AST.
6393
6394Given
6395
6396struct H {};
6397H G();
6398void f() {
6399  H D = G();
6400}
6401
6402``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
6403matches ``H D = G()`` in C++11 through C++17 (and beyond).
6404</pre></td></tr>
6405
6406
6407<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>
6408<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
6409are stripped off.
6410
6411Parentheses and explicit casts are not discarded.
6412Given
6413  int arr[5];
6414  int a = 0;
6415  char b = 0;
6416  const int c = a;
6417  int *d = arr;
6418  long e = (long) 0l;
6419The matchers
6420   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
6421   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
6422would match the declarations for a, b, c, and d, but not e.
6423While
6424   varDecl(hasInitializer(integerLiteral()))
6425   varDecl(hasInitializer(declRefExpr()))
6426only match the declarations for b, c, and d.
6427</pre></td></tr>
6428
6429
6430<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>
6431<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
6432nodes are stripped off.
6433
6434Parentheses and explicit casts are not discarded.
6435Given
6436  class C {};
6437  C a = C();
6438  C b;
6439  C c = b;
6440The matchers
6441   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
6442would match the declarations for a, b, and c.
6443While
6444   varDecl(hasInitializer(cxxConstructExpr()))
6445only match the declarations for b and c.
6446</pre></td></tr>
6447
6448
6449<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>
6450<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
6451casts are stripped off.
6452
6453Implicit and non-C Style casts are also discarded.
6454Given
6455  int a = 0;
6456  char b = (0);
6457  void* c = reinterpret_cast&lt;char*&gt;(0);
6458  char d = char(0);
6459The matcher
6460   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
6461would match the declarations for a, b, c, and d.
6462while
6463   varDecl(hasInitializer(integerLiteral()))
6464only match the declaration for a.
6465</pre></td></tr>
6466
6467
6468<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>
6469<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
6470parentheses are stripped off.
6471
6472Explicit casts are not discarded.
6473Given
6474  int arr[5];
6475  int a = 0;
6476  char b = (0);
6477  const int c = a;
6478  int *d = (arr);
6479  long e = ((long) 0l);
6480The matchers
6481   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
6482   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
6483would match the declarations for a, b, c, and d, but not e.
6484while
6485   varDecl(hasInitializer(integerLiteral()))
6486   varDecl(hasInitializer(declRefExpr()))
6487would only match the declaration for a.
6488</pre></td></tr>
6489
6490
6491<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>
6492<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
6493
6494Given
6495  const char* str = ("my-string");
6496The matcher
6497  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
6498would match the implicit cast resulting from the assignment.
6499</pre></td></tr>
6500
6501
6502<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>
6503<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
6504
6505Given
6506  class C {
6507    int a = 2;
6508    int b = 3;
6509    int c;
6510  };
6511fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
6512  matches 'int a;' but not 'int b;'.
6513fieldDecl(hasInClassInitializer(anything()))
6514  matches 'int a;' and 'int b;' but not 'int c;'.
6515</pre></td></tr>
6516
6517
6518<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;</td><td class="name" onclick="toggle('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>
6519<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
6520
6521
6522<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>
6523<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
6524switch statement or conditional operator.
6525
6526Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6527  if (true) {}
6528</pre></td></tr>
6529
6530
6531<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>
6532<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
6533
6534Example:
6535    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
6536matches '++x' in
6537    for (x; x &lt; N; ++x) { }
6538</pre></td></tr>
6539
6540
6541<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>
6542<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
6543
6544Example:
6545    forStmt(hasLoopInit(declStmt()))
6546matches 'int x = 0' in
6547    for (int x = 0; x &lt; N; ++x) { }
6548</pre></td></tr>
6549
6550
6551<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>
6552<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
6553declaration's type.
6554
6555In case of a value declaration (for example a variable declaration),
6556this resolves one layer of indirection. For example, in the value
6557declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6558X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6559declaration of x.
6560
6561Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6562            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6563            and friend class X (matcher = friendDecl(hasType("X"))
6564 class X {};
6565 void y(X &amp;x) { x; X z; }
6566 class Y { friend class X; };
6567
6568Example matches class Derived
6569(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6570class Base {};
6571class Derived : Base {};
6572
6573Usable 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;,
6574Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6575</pre></td></tr>
6576
6577
6578<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>
6579<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6580matcher.
6581
6582Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6583            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6584            and U (matcher = typedefDecl(hasType(asString("int")))
6585            and friend class X (matcher = friendDecl(hasType("X"))
6586 class X {};
6587 void y(X &amp;x) { x; X z; }
6588 typedef int U;
6589 class Y { friend class X; };
6590</pre></td></tr>
6591
6592
6593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyBody0')"><a name="hasAnyBody0Anchor">hasAnyBody</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
6594<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
6595Note that this matcher matches all the declarations of a function whose
6596body is present in the AST.
6597
6598Given
6599  void f();
6600  void f() {}
6601  void g();
6602hasAnyBody(functionDecl())
6603  matches both 'void f();'
6604  and 'void f() {}'
6605with compoundStmt()
6606  matching '{}'
6607  but does not match 'void g();'
6608</pre></td></tr>
6609
6610
6611<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>
6612<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6613block.
6614
6615Does not match the 'this' parameter of a method.
6616
6617Given
6618  class X { void f(int x, int y, int z) {} };
6619cxxMethodDecl(hasAnyParameter(hasName("y")))
6620  matches f(int x, int y, int z) {}
6621with hasAnyParameter(...)
6622  matching int y
6623
6624For ObjectiveC, given
6625  @interface I - (void) f:(int) y; @end
6626
6627the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6628matches the declaration of method f with hasParameter
6629matching y.
6630
6631For blocks, given
6632  b = ^(int y) { printf("%d", y) };
6633
6634the matcher blockDecl(hasAnyParameter(hasName("y")))
6635matches the declaration of the block b with hasParameter
6636matching y.
6637</pre></td></tr>
6638
6639
6640<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>
6641<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6642functionDecl that have at least one TemplateArgument matching the given
6643InnerMatcher.
6644
6645Given
6646  template&lt;typename T&gt; class A {};
6647  template&lt;&gt; class A&lt;double&gt; {};
6648  A&lt;int&gt; a;
6649
6650  template&lt;typename T&gt; f() {};
6651  void func() { f&lt;int&gt;(); };
6652
6653classTemplateSpecializationDecl(hasAnyTemplateArgument(
6654    refersToType(asString("int"))))
6655  matches the specialization A&lt;int&gt;
6656
6657functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6658  matches the specialization f&lt;int&gt;
6659</pre></td></tr>
6660
6661
6662<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>
6663<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
6664
6665
6666<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>
6667<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6668declaration.
6669
6670Given
6671  template&lt;bool b&gt;
6672  struct S {
6673    S(int); // #1
6674    explicit S(double); // #2
6675    operator int(); // #3
6676    explicit operator bool(); // #4
6677    explicit(false) S(bool) // # 7
6678    explicit(true) S(char) // # 8
6679    explicit(b) S(S) // # 9
6680  };
6681  S(int) -&gt; S&lt;true&gt; // #5
6682  explicit S(double) -&gt; S&lt;false&gt; // #6
6683cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6684cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6685cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6686</pre></td></tr>
6687
6688
6689<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>
6690<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6691declaration or a block.
6692
6693Given
6694  class X { void f(int x) {} };
6695cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6696  matches f(int x) {}
6697with hasParameter(...)
6698  matching int x
6699
6700For ObjectiveC, given
6701  @interface I - (void) f:(int) y; @end
6702
6703the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6704matches the declaration of method f with hasParameter
6705matching y.
6706</pre></td></tr>
6707
6708
6709<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>
6710<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6711functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6712
6713Given
6714  template&lt;typename T, typename U&gt; class A {};
6715  A&lt;bool, int&gt; b;
6716  A&lt;int, bool&gt; c;
6717
6718  template&lt;typename T&gt; void f() {}
6719  void func() { f&lt;int&gt;(); };
6720classTemplateSpecializationDecl(hasTemplateArgument(
6721    1, refersToType(asString("int"))))
6722  matches the specialization A&lt;bool, int&gt;
6723
6724functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6725  matches the specialization f&lt;int&gt;
6726</pre></td></tr>
6727
6728
6729<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>
6730<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6731
6732Given:
6733  class X { int f() { return 1; } };
6734cxxMethodDecl(returns(asString("int")))
6735  matches int f() { return 1; }
6736</pre></td></tr>
6737
6738
6739<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>
6740<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6741switch statement or conditional operator.
6742
6743Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6744  if (true) {}
6745</pre></td></tr>
6746
6747
6748<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>
6749<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6750
6751Given
6752  if (A* a = GetAPointer()) {}
6753hasConditionVariableStatement(...)
6754  matches 'A* a = GetAPointer()'.
6755</pre></td></tr>
6756
6757
6758<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>
6759<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6760
6761Examples matches the if statement
6762  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6763  if (false) false; else true;
6764</pre></td></tr>
6765
6766
6767<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>
6768<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
6769
6770Given:
6771 void foo() {
6772   if (int i = foobar(); i &gt; 0) {}
6773   switch (int i = foobar(); i) {}
6774   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6775 }
6776 void bar() {
6777   if (foobar() &gt; 0) {}
6778   switch (foobar()) {}
6779   for (auto&amp; x : get_range()) {}
6780 }
6781ifStmt(hasInitStatement(anything()))
6782  matches the if statement in foo but not in bar.
6783switchStmt(hasInitStatement(anything()))
6784  matches the switch statement in foo but not in bar.
6785cxxForRangeStmt(hasInitStatement(anything()))
6786  matches the range for statement in foo but not in bar.
6787</pre></td></tr>
6788
6789
6790<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>
6791<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6792
6793Examples matches the if statement
6794  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6795  if (false) true; else false;
6796</pre></td></tr>
6797
6798
6799<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>
6800<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6801matcher.
6802
6803FIXME: Unit test this matcher
6804</pre></td></tr>
6805
6806
6807<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>
6808<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6809
6810Example matches y.
6811    (matcher = initListExpr(hasInit(0, expr())))
6812  int x{y}.
6813</pre></td></tr>
6814
6815
6816<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>
6817<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6818(if expression have it).
6819</pre></td></tr>
6820
6821
6822<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>
6823<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6824matches the given matcher.
6825
6826The associated declaration is:
6827- for type nodes, the declaration of the underlying type
6828- for CallExpr, the declaration of the callee
6829- for MemberExpr, the declaration of the referenced member
6830- for CXXConstructExpr, the declaration of the constructor
6831- for CXXNewExpr, the declaration of the operator new
6832- for ObjCIvarExpr, the declaration of the ivar
6833
6834For type nodes, hasDeclaration will generally match the declaration of the
6835sugared type. Given
6836  class X {};
6837  typedef X Y;
6838  Y y;
6839in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6840typedefDecl. A common use case is to match the underlying, desugared type.
6841This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6842  varDecl(hasType(hasUnqualifiedDesugaredType(
6843      recordType(hasDeclaration(decl())))))
6844In this matcher, the decl will match the CXXRecordDecl of class X.
6845
6846Usable 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;,
6847  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;,
6848  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;,
6849  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;,
6850  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;,
6851  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;,
6852  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6853</pre></td></tr>
6854
6855
6856<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>
6857<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6858matches the given matcher.
6859
6860The associated declaration is:
6861- for type nodes, the declaration of the underlying type
6862- for CallExpr, the declaration of the callee
6863- for MemberExpr, the declaration of the referenced member
6864- for CXXConstructExpr, the declaration of the constructor
6865- for CXXNewExpr, the declaration of the operator new
6866- for ObjCIvarExpr, the declaration of the ivar
6867
6868For type nodes, hasDeclaration will generally match the declaration of the
6869sugared type. Given
6870  class X {};
6871  typedef X Y;
6872  Y y;
6873in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6874typedefDecl. A common use case is to match the underlying, desugared type.
6875This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6876  varDecl(hasType(hasUnqualifiedDesugaredType(
6877      recordType(hasDeclaration(decl())))))
6878In this matcher, the decl will match the CXXRecordDecl of class X.
6879
6880Usable 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;,
6881  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;,
6882  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;,
6883  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;,
6884  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;,
6885  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;,
6886  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6887</pre></td></tr>
6888
6889
6890<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>
6891<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
6892
6893Given
6894  struct foo {
6895    void bar() {
6896      auto f = [this](){};
6897    }
6898  }
6899lambdaExpr(hasAnyCapture(cxxThisExpr()))
6900  matches [this](){};
6901</pre></td></tr>
6902
6903
6904<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>
6905<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
6906
6907Given
6908  void foo() {
6909    int x;
6910    auto f = [x](){};
6911  }
6912lambdaExpr(hasAnyCapture(anything()))
6913  matches [x](){};
6914</pre></td></tr>
6915
6916
6917<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>
6918<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6919matches the given matcher.
6920
6921The associated declaration is:
6922- for type nodes, the declaration of the underlying type
6923- for CallExpr, the declaration of the callee
6924- for MemberExpr, the declaration of the referenced member
6925- for CXXConstructExpr, the declaration of the constructor
6926- for CXXNewExpr, the declaration of the operator new
6927- for ObjCIvarExpr, the declaration of the ivar
6928
6929For type nodes, hasDeclaration will generally match the declaration of the
6930sugared type. Given
6931  class X {};
6932  typedef X Y;
6933  Y y;
6934in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6935typedefDecl. A common use case is to match the underlying, desugared type.
6936This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6937  varDecl(hasType(hasUnqualifiedDesugaredType(
6938      recordType(hasDeclaration(decl())))))
6939In this matcher, the decl will match the CXXRecordDecl of class X.
6940
6941Usable 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;,
6942  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;,
6943  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;,
6944  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;,
6945  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;,
6946  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;,
6947  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6948</pre></td></tr>
6949
6950
6951<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>
6952<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6953given matcher. Implicit object expressions are included; that is, it matches
6954use of implicit `this`.
6955
6956Given
6957  struct X {
6958    int m;
6959    int f(X x) { x.m; return m; }
6960  };
6961memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6962  matches `x.m`, but not `m`; however,
6963memberExpr(hasObjectExpression(hasType(pointsTo(
6964     cxxRecordDecl(hasName("X"))))))
6965  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6966</pre></td></tr>
6967
6968
6969<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>
6970<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6971given matcher.
6972
6973Given
6974  struct { int first, second; } first, second;
6975  int i(second.first);
6976  int j(first.second);
6977memberExpr(member(hasName("first")))
6978  matches second.first
6979  but not first.second (because the member name there is "second").
6980</pre></td></tr>
6981
6982
6983<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>
6984<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6985pointee matches a given matcher.
6986
6987Given
6988  int *a;
6989  int const *b;
6990  float const *f;
6991pointerType(pointee(isConstQualified(), isInteger()))
6992  matches "int const *b"
6993
6994Usable 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;,
6995  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;
6996</pre></td></tr>
6997
6998
6999<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>
7000<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
7001matcher.
7002
7003Given
7004  namespace N { template&lt;class T&gt; void f(T t); }
7005  template &lt;class T&gt; void g() { using N::f; f(T()); }
7006unresolvedLookupExpr(hasAnyDeclaration(
7007    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
7008  matches the use of f in g() .
7009</pre></td></tr>
7010
7011
7012<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>
7013<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
7014
7015Given
7016  struct A { struct B { struct C {}; }; };
7017  A::B::C c;
7018nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
7019  matches "A::"
7020</pre></td></tr>
7021
7022
7023<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>
7024<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7025NestedNameSpecifier-matcher matches.
7026</pre></td></tr>
7027
7028
7029<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>
7030<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
7031given TypeLoc.
7032
7033Given
7034  struct A { struct B { struct C {}; }; };
7035  A::B::C c;
7036nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
7037  hasDeclaration(cxxRecordDecl(hasName("A")))))))
7038  matches "A::"
7039</pre></td></tr>
7040
7041
7042<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>
7043<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
7044
7045Given
7046  struct A { struct B { struct C {}; }; };
7047  A::B::C c;
7048nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
7049  matches "A::"
7050</pre></td></tr>
7051
7052
7053<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>
7054<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
7055given namespace matcher.
7056
7057Given
7058  namespace ns { struct A {}; }
7059  ns::A a;
7060nestedNameSpecifier(specifiesNamespace(hasName("ns")))
7061  matches "ns::"
7062</pre></td></tr>
7063
7064
7065<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>
7066<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
7067given QualType matcher without qualifiers.
7068
7069Given
7070  struct A { struct B { struct C {}; }; };
7071  A::B::C c;
7072nestedNameSpecifier(specifiesType(
7073  hasDeclaration(cxxRecordDecl(hasName("A")))
7074))
7075  matches "A::"
7076</pre></td></tr>
7077
7078
7079<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;</td><td class="name" onclick="toggle('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>
7080<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
7081
7082Given
7083
7084  #pragma omp parallel
7085  #pragma omp parallel default(none)
7086
7087``ompExecutableDirective(hasAnyClause(anything()))`` matches
7088``omp parallel default(none)``.
7089</pre></td></tr>
7090
7091
7092<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>
7093<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
7094
7095Prerequisite: the executable directive must not be standalone directive.
7096If it is, it will never match.
7097
7098Given
7099
7100   #pragma omp parallel
7101   ;
7102   #pragma omp parallel
7103   {}
7104
7105``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
7106</pre></td></tr>
7107
7108
7109<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>
7110<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
7111matching Base, or Objective-C classes that directly or indirectly
7112subclass a class matching Base.
7113
7114Note that a class is not considered to be derived from itself.
7115
7116Example matches Y, Z, C (Base == hasName("X"))
7117  class X;
7118  class Y : public X {};  // directly derived
7119  class Z : public Y {};  // indirectly derived
7120  typedef X A;
7121  typedef A B;
7122  class C : public B {};  // derived from a typedef of X
7123
7124In the following example, Bar matches isDerivedFrom(hasName("X")):
7125  class Foo;
7126  typedef Foo X;
7127  class Bar : public Foo {};  // derived from a type that X is a typedef of
7128
7129In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7130  @interface NSObject @end
7131  @interface Bar : NSObject @end
7132
7133Usable 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;
7134</pre></td></tr>
7135
7136
7137<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>
7138<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7139matching Base.
7140
7141Note that a class is not considered to be derived from itself.
7142
7143Example matches Y, C (Base == hasName("X"))
7144  class X;
7145  class Y : public X {};  // directly derived
7146  class Z : public Y {};  // indirectly derived
7147  typedef X A;
7148  typedef A B;
7149  class C : public B {};  // derived from a typedef of X
7150
7151In the following example, Bar matches isDerivedFrom(hasName("X")):
7152  class Foo;
7153  typedef Foo X;
7154  class Bar : public Foo {};  // derived from a type that X is a typedef of
7155</pre></td></tr>
7156
7157
7158<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>
7159<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7160match Base.
7161</pre></td></tr>
7162
7163
7164<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>
7165<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
7166expression, or an ObjC-message-send expression.
7167
7168Given
7169  void x(int, int, int) { int y; x(1, y, 42); }
7170callExpr(hasAnyArgument(declRefExpr()))
7171  matches x(1, y, 42)
7172with hasAnyArgument(...)
7173  matching y
7174
7175For ObjectiveC, given
7176  @interface I - (void) f:(int) y; @end
7177  void foo(I *i) { [i f:12]; }
7178objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7179  matches [i f:12]
7180</pre></td></tr>
7181
7182
7183<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>
7184<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7185call expression.
7186
7187Example matches y in x(y)
7188    (matcher = callExpr(hasArgument(0, declRefExpr())))
7189  void x(int) { int y; x(y); }
7190</pre></td></tr>
7191
7192
7193<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>
7194<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
7195and the inner matcher matches on that instance.
7196
7197For example the method call in
7198  NSString *x = @"hello";
7199  [x containsString:@"h"];
7200is matched by
7201objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
7202</pre></td></tr>
7203
7204
7205<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>
7206<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
7207
7208Example
7209matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
7210matches the [webView ...] message invocation.
7211  NSString *webViewJavaScript = ...
7212  UIWebView *webView = ...
7213  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
7214</pre></td></tr>
7215
7216
7217<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>
7218<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
7219block.
7220
7221Does not match the 'this' parameter of a method.
7222
7223Given
7224  class X { void f(int x, int y, int z) {} };
7225cxxMethodDecl(hasAnyParameter(hasName("y")))
7226  matches f(int x, int y, int z) {}
7227with hasAnyParameter(...)
7228  matching int y
7229
7230For ObjectiveC, given
7231  @interface I - (void) f:(int) y; @end
7232
7233the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7234matches the declaration of method f with hasParameter
7235matching y.
7236
7237For blocks, given
7238  b = ^(int y) { printf("%d", y) };
7239
7240the matcher blockDecl(hasAnyParameter(hasName("y")))
7241matches the declaration of the block b with hasParameter
7242matching y.
7243</pre></td></tr>
7244
7245
7246<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>
7247<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
7248declaration or a block.
7249
7250Given
7251  class X { void f(int x) {} };
7252cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7253  matches f(int x) {}
7254with hasParameter(...)
7255  matching int x
7256
7257For ObjectiveC, given
7258  @interface I - (void) f:(int) y; @end
7259
7260the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7261matches the declaration of method f with hasParameter
7262matching y.
7263</pre></td></tr>
7264
7265
7266<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>
7267<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
7268or opaque value's source expression matches the given matcher.
7269
7270Example 1: matches "a string"
7271(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7272class URL { URL(string); };
7273URL url = "a string";
7274
7275Example 2: matches 'b' (matcher =
7276opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7277int a = b ?: 1;
7278</pre></td></tr>
7279
7280
7281<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>
7282<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
7283overloads matches the given matcher.
7284
7285Given
7286  template &lt;typename T&gt; void foo(T);
7287  template &lt;typename T&gt; void bar(T);
7288  template &lt;typename T&gt; void baz(T t) {
7289    foo(t);
7290    bar(t);
7291  }
7292unresolvedLookupExpr(hasAnyDeclaration(
7293    functionTemplateDecl(hasName("foo"))))
7294  matches foo in foo(t); but not bar in bar(t);
7295</pre></td></tr>
7296
7297
7298<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>
7299<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
7300
7301Given
7302  int (*ptr_to_array)[4];
7303  int (*ptr_to_func)(int);
7304
7305varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
7306ptr_to_func but not ptr_to_array.
7307
7308Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
7309</pre></td></tr>
7310
7311
7312<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>
7313<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
7314pointee matches a given matcher.
7315
7316Given
7317  int *a;
7318  int const *b;
7319  float const *f;
7320pointerType(pointee(isConstQualified(), isInteger()))
7321  matches "int const *b"
7322
7323Usable 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;,
7324  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;
7325</pre></td></tr>
7326
7327
7328<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('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>
7329<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
7330
7331Given:
7332  typedef int &amp;int_ref;
7333  int a;
7334  int_ref b = a;
7335
7336varDecl(hasType(qualType(referenceType()))))) will not match the
7337declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
7338</pre></td></tr>
7339
7340
7341<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>
7342<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
7343matches the given matcher.
7344
7345The associated declaration is:
7346- for type nodes, the declaration of the underlying type
7347- for CallExpr, the declaration of the callee
7348- for MemberExpr, the declaration of the referenced member
7349- for CXXConstructExpr, the declaration of the constructor
7350- for CXXNewExpr, the declaration of the operator new
7351- for ObjCIvarExpr, the declaration of the ivar
7352
7353For type nodes, hasDeclaration will generally match the declaration of the
7354sugared type. Given
7355  class X {};
7356  typedef X Y;
7357  Y y;
7358in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7359typedefDecl. A common use case is to match the underlying, desugared type.
7360This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7361  varDecl(hasType(hasUnqualifiedDesugaredType(
7362      recordType(hasDeclaration(decl())))))
7363In this matcher, the decl will match the CXXRecordDecl of class X.
7364
7365Usable 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;,
7366  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;,
7367  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;,
7368  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;,
7369  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;,
7370  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;,
7371  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7372</pre></td></tr>
7373
7374
7375<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>
7376<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
7377
7378Given
7379  void (*fp)(void);
7380The matcher
7381  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
7382would match the declaration for fp.
7383</pre></td></tr>
7384
7385
7386<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>
7387<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
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('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>
7392<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
7393matches the specified matcher.
7394
7395Example matches y-&gt;x()
7396  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
7397     cxxRecordDecl(hasName("Y")))))))
7398  class Y { public: void x(); };
7399  void z() { Y *y; y-&gt;x(); }
7400</pre></td></tr>
7401
7402
7403<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>
7404<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
7405</pre></td></tr>
7406
7407
7408<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>
7409<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
7410type matches the specified matcher.
7411
7412Example matches X &amp;x and const X &amp;y
7413    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
7414  class X {
7415    void a(X b) {
7416      X &amp;x = b;
7417      const X &amp;y = b;
7418    }
7419  };
7420</pre></td></tr>
7421
7422
7423<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>
7424<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
7425matches the given matcher.
7426
7427The associated declaration is:
7428- for type nodes, the declaration of the underlying type
7429- for CallExpr, the declaration of the callee
7430- for MemberExpr, the declaration of the referenced member
7431- for CXXConstructExpr, the declaration of the constructor
7432- for CXXNewExpr, the declaration of the operator new
7433- for ObjCIvarExpr, the declaration of the ivar
7434
7435For type nodes, hasDeclaration will generally match the declaration of the
7436sugared type. Given
7437  class X {};
7438  typedef X Y;
7439  Y y;
7440in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7441typedefDecl. A common use case is to match the underlying, desugared type.
7442This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7443  varDecl(hasType(hasUnqualifiedDesugaredType(
7444      recordType(hasDeclaration(decl())))))
7445In this matcher, the decl will match the CXXRecordDecl of class X.
7446
7447Usable 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;,
7448  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;,
7449  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;,
7450  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;,
7451  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;,
7452  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;,
7453  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7454</pre></td></tr>
7455
7456
7457<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>
7458<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
7459pointee matches a given matcher.
7460
7461Given
7462  int *a;
7463  int const *b;
7464  float const *f;
7465pointerType(pointee(isConstQualified(), isInteger()))
7466  matches "int const *b"
7467
7468Usable 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;,
7469  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;
7470</pre></td></tr>
7471
7472
7473<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>
7474<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
7475
7476Given
7477  return a + b;
7478hasReturnValue(binaryOperator())
7479  matches 'return a + b'
7480with binaryOperator()
7481  matching 'a + b'
7482</pre></td></tr>
7483
7484
7485<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>
7486<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
7487a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7488
7489Given
7490  { {}; 1+2; }
7491hasAnySubstatement(compoundStmt())
7492  matches '{ {}; 1+2; }'
7493with compoundStmt()
7494  matching '{}'
7495</pre></td></tr>
7496
7497
7498<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>
7499<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7500alignof.
7501</pre></td></tr>
7502
7503
7504<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>
7505<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
7506
7507Given:
7508F&amp; operator=(const F&amp; o) {
7509  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
7510  return *this;
7511}
7512returnStmt(forFunction(hasName("operator=")))
7513  matches 'return *this'
7514  but does not match 'return v &gt; 0'
7515</pre></td></tr>
7516
7517
7518<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>
7519<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7520sizeof.
7521</pre></td></tr>
7522
7523
7524<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>
7525<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
7526type that matches the provided matcher.
7527
7528Given
7529  template &lt;typename T&gt;
7530  double F(T t);
7531  int i;
7532  double j = F(i);
7533
7534substTemplateTypeParmType(hasReplacementType(type())) matches int
7535</pre></td></tr>
7536
7537
7538<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;</td><td class="name" onclick="toggle('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>
7539<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
7540statement. This matcher may produce multiple matches.
7541
7542Given
7543  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
7544switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
7545  matches four times, with "c" binding each of "case 1:", "case 2:",
7546"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
7547"switch (1)", "switch (2)" and "switch (2)".
7548</pre></td></tr>
7549
7550
7551<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>
7552<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
7553switch statement or conditional operator.
7554
7555Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7556  if (true) {}
7557</pre></td></tr>
7558
7559
7560<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>
7561<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
7562
7563Given:
7564 void foo() {
7565   if (int i = foobar(); i &gt; 0) {}
7566   switch (int i = foobar(); i) {}
7567   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7568 }
7569 void bar() {
7570   if (foobar() &gt; 0) {}
7571   switch (foobar()) {}
7572   for (auto&amp; x : get_range()) {}
7573 }
7574ifStmt(hasInitStatement(anything()))
7575  matches the if statement in foo but not in bar.
7576switchStmt(hasInitStatement(anything()))
7577  matches the switch statement in foo but not in bar.
7578cxxForRangeStmt(hasInitStatement(anything()))
7579  matches the range for statement in foo but not in bar.
7580</pre></td></tr>
7581
7582
7583<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>
7584<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
7585matches the given matcher.
7586
7587The associated declaration is:
7588- for type nodes, the declaration of the underlying type
7589- for CallExpr, the declaration of the callee
7590- for MemberExpr, the declaration of the referenced member
7591- for CXXConstructExpr, the declaration of the constructor
7592- for CXXNewExpr, the declaration of the operator new
7593- for ObjCIvarExpr, the declaration of the ivar
7594
7595For type nodes, hasDeclaration will generally match the declaration of the
7596sugared type. Given
7597  class X {};
7598  typedef X Y;
7599  Y y;
7600in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7601typedefDecl. A common use case is to match the underlying, desugared type.
7602This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7603  varDecl(hasType(hasUnqualifiedDesugaredType(
7604      recordType(hasDeclaration(decl())))))
7605In this matcher, the decl will match the CXXRecordDecl of class X.
7606
7607Usable 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;,
7608  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;,
7609  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;,
7610  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;,
7611  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;,
7612  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;,
7613  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7614</pre></td></tr>
7615
7616
7617<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>
7618<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
7619
7620Given
7621  struct B { int next; };
7622  template&lt;int(B::*next_ptr)&gt; struct A {};
7623  A&lt;&amp;B::next&gt; a;
7624templateSpecializationType(hasAnyTemplateArgument(
7625  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
7626  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7627    B::next
7628</pre></td></tr>
7629
7630
7631<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>
7632<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
7633declaration.
7634
7635Given
7636  struct B { int next; };
7637  template&lt;int(B::*next_ptr)&gt; struct A {};
7638  A&lt;&amp;B::next&gt; a;
7639classTemplateSpecializationDecl(hasAnyTemplateArgument(
7640    refersToDeclaration(fieldDecl(hasName("next")))))
7641  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7642    B::next
7643</pre></td></tr>
7644
7645
7646<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>
7647<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
7648
7649Given
7650  template&lt;int T&gt; struct C {};
7651  C&lt;42&gt; c;
7652classTemplateSpecializationDecl(
7653  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
7654  matches the implicit instantiation of C in C&lt;42&gt;.
7655</pre></td></tr>
7656
7657
7658<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('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>
7659<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
7660
7661Given
7662  template&lt;template &lt;typename&gt; class S&gt; class X {};
7663  template&lt;typename T&gt; class Y {};
7664  X&lt;Y&gt; xi;
7665classTemplateSpecializationDecl(hasAnyTemplateArgument(
7666    refersToTemplate(templateName())))
7667  matches the specialization X&lt;Y&gt;
7668</pre></td></tr>
7669
7670
7671<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>
7672<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
7673
7674Given
7675  struct X {};
7676  template&lt;typename T&gt; struct A {};
7677  A&lt;X&gt; a;
7678classTemplateSpecializationDecl(hasAnyTemplateArgument(
7679    refersToType(class(hasName("X")))))
7680  matches the specialization A&lt;X&gt;
7681</pre></td></tr>
7682
7683
7684<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>
7685<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7686functionDecl that have at least one TemplateArgument matching the given
7687InnerMatcher.
7688
7689Given
7690  template&lt;typename T&gt; class A {};
7691  template&lt;&gt; class A&lt;double&gt; {};
7692  A&lt;int&gt; a;
7693
7694  template&lt;typename T&gt; f() {};
7695  void func() { f&lt;int&gt;(); };
7696
7697classTemplateSpecializationDecl(hasAnyTemplateArgument(
7698    refersToType(asString("int"))))
7699  matches the specialization A&lt;int&gt;
7700
7701functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7702  matches the specialization f&lt;int&gt;
7703</pre></td></tr>
7704
7705
7706<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>
7707<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
7708matches the given matcher.
7709
7710The associated declaration is:
7711- for type nodes, the declaration of the underlying type
7712- for CallExpr, the declaration of the callee
7713- for MemberExpr, the declaration of the referenced member
7714- for CXXConstructExpr, the declaration of the constructor
7715- for CXXNewExpr, the declaration of the operator new
7716- for ObjCIvarExpr, the declaration of the ivar
7717
7718For type nodes, hasDeclaration will generally match the declaration of the
7719sugared type. Given
7720  class X {};
7721  typedef X Y;
7722  Y y;
7723in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7724typedefDecl. A common use case is to match the underlying, desugared type.
7725This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7726  varDecl(hasType(hasUnqualifiedDesugaredType(
7727      recordType(hasDeclaration(decl())))))
7728In this matcher, the decl will match the CXXRecordDecl of class X.
7729
7730Usable 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;,
7731  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;,
7732  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;,
7733  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;,
7734  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;,
7735  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;,
7736  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7737</pre></td></tr>
7738
7739
7740<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>
7741<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7742functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7743
7744Given
7745  template&lt;typename T, typename U&gt; class A {};
7746  A&lt;bool, int&gt; b;
7747  A&lt;int, bool&gt; c;
7748
7749  template&lt;typename T&gt; void f() {}
7750  void func() { f&lt;int&gt;(); };
7751classTemplateSpecializationDecl(hasTemplateArgument(
7752    1, refersToType(asString("int"))))
7753  matches the specialization A&lt;bool, int&gt;
7754
7755functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7756  matches the specialization f&lt;int&gt;
7757</pre></td></tr>
7758
7759
7760<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>
7761<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7762matches the given matcher.
7763
7764The associated declaration is:
7765- for type nodes, the declaration of the underlying type
7766- for CallExpr, the declaration of the callee
7767- for MemberExpr, the declaration of the referenced member
7768- for CXXConstructExpr, the declaration of the constructor
7769- for CXXNewExpr, the declaration of the operator new
7770- for ObjCIvarExpr, the declaration of the ivar
7771
7772For type nodes, hasDeclaration will generally match the declaration of the
7773sugared type. Given
7774  class X {};
7775  typedef X Y;
7776  Y y;
7777in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7778typedefDecl. A common use case is to match the underlying, desugared type.
7779This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7780  varDecl(hasType(hasUnqualifiedDesugaredType(
7781      recordType(hasDeclaration(decl())))))
7782In this matcher, the decl will match the CXXRecordDecl of class X.
7783
7784Usable 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;,
7785  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;,
7786  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;,
7787  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;,
7788  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;,
7789  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;,
7790  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7791</pre></td></tr>
7792
7793
7794<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>
7795<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7796QualType-matcher matches.
7797</pre></td></tr>
7798
7799
7800<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>
7801<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7802matcher.
7803
7804Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7805            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7806            and U (matcher = typedefDecl(hasType(asString("int")))
7807            and friend class X (matcher = friendDecl(hasType("X"))
7808 class X {};
7809 void y(X &amp;x) { x; X z; }
7810 typedef int U;
7811 class Y { friend class X; };
7812</pre></td></tr>
7813
7814
7815<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>
7816<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7817matches the given matcher.
7818
7819The associated declaration is:
7820- for type nodes, the declaration of the underlying type
7821- for CallExpr, the declaration of the callee
7822- for MemberExpr, the declaration of the referenced member
7823- for CXXConstructExpr, the declaration of the constructor
7824- for CXXNewExpr, the declaration of the operator new
7825- for ObjCIvarExpr, the declaration of the ivar
7826
7827For type nodes, hasDeclaration will generally match the declaration of the
7828sugared type. Given
7829  class X {};
7830  typedef X Y;
7831  Y y;
7832in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7833typedefDecl. A common use case is to match the underlying, desugared type.
7834This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7835  varDecl(hasType(hasUnqualifiedDesugaredType(
7836      recordType(hasDeclaration(decl())))))
7837In this matcher, the decl will match the CXXRecordDecl of class X.
7838
7839Usable 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;,
7840  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;,
7841  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;,
7842  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;,
7843  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;,
7844  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;,
7845  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7846</pre></td></tr>
7847
7848
7849<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>
7850<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7851type of the matched node.
7852
7853For example, in:
7854  class A {};
7855  using B = A;
7856The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7857both B and A.
7858</pre></td></tr>
7859
7860
7861<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>
7862<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7863
7864Given
7865  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7866unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7867  matches sizeof(a) and alignof(c)
7868</pre></td></tr>
7869
7870
7871<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>
7872<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7873
7874Example matches true (matcher = hasUnaryOperand(
7875                                  cxxBoolLiteral(equals(true))))
7876  !true
7877</pre></td></tr>
7878
7879
7880<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>
7881<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7882given matcher. Implicit object expressions are included; that is, it matches
7883use of implicit `this`.
7884
7885Given
7886  struct X {
7887    int m;
7888    int f(X x) { x.m; return m; }
7889  };
7890memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7891  matches `x.m`, but not `m`; however,
7892memberExpr(hasObjectExpression(hasType(pointsTo(
7893     cxxRecordDecl(hasName("X"))))))
7894  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7895</pre></td></tr>
7896
7897
7898<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>
7899<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7900matches the given matcher.
7901
7902The associated declaration is:
7903- for type nodes, the declaration of the underlying type
7904- for CallExpr, the declaration of the callee
7905- for MemberExpr, the declaration of the referenced member
7906- for CXXConstructExpr, the declaration of the constructor
7907- for CXXNewExpr, the declaration of the operator new
7908- for ObjCIvarExpr, the declaration of the ivar
7909
7910For type nodes, hasDeclaration will generally match the declaration of the
7911sugared type. Given
7912  class X {};
7913  typedef X Y;
7914  Y y;
7915in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7916typedefDecl. A common use case is to match the underlying, desugared type.
7917This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7918  varDecl(hasType(hasUnqualifiedDesugaredType(
7919      recordType(hasDeclaration(decl())))))
7920In this matcher, the decl will match the CXXRecordDecl of class X.
7921
7922Usable 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;,
7923  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;,
7924  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;,
7925  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;,
7926  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;,
7927  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;,
7928  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7929</pre></td></tr>
7930
7931
7932<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>
7933<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7934
7935Given
7936  namespace X { void b(); }
7937  using X::b;
7938usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7939  matches using X::b </pre></td></tr>
7940
7941
7942<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>
7943<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7944matched by the given matcher.
7945
7946Given
7947  namespace X { int a; void b(); }
7948  using X::a;
7949  using X::b;
7950usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7951  matches using X::b but not using X::a </pre></td></tr>
7952
7953
7954<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>
7955<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7956declaration's type.
7957
7958In case of a value declaration (for example a variable declaration),
7959this resolves one layer of indirection. For example, in the value
7960declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7961X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7962declaration of x.
7963
7964Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7965            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7966            and friend class X (matcher = friendDecl(hasType("X"))
7967 class X {};
7968 void y(X &amp;x) { x; X z; }
7969 class Y { friend class X; };
7970
7971Example matches class Derived
7972(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7973class Base {};
7974class Derived : Base {};
7975
7976Usable 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;,
7977Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7978</pre></td></tr>
7979
7980
7981<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>
7982<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7983matcher.
7984
7985Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7986            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7987            and U (matcher = typedefDecl(hasType(asString("int")))
7988            and friend class X (matcher = friendDecl(hasType("X"))
7989 class X {};
7990 void y(X &amp;x) { x; X z; }
7991 typedef int U;
7992 class Y { friend class X; };
7993</pre></td></tr>
7994
7995
7996<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>
7997<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7998that matches the given matcher.
7999
8000Example matches x (matcher = varDecl(hasInitializer(callExpr())))
8001  bool y() { return true; }
8002  bool x = y();
8003</pre></td></tr>
8004
8005
8006<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>
8007<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
8008expression.
8009
8010Given
8011  void f(int b) {
8012    int a[b];
8013  }
8014variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
8015  varDecl(hasName("b")))))))
8016  matches "int a[b]"
8017</pre></td></tr>
8018
8019
8020<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>
8021<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
8022
8023
8024<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>
8025<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
8026switch statement or conditional operator.
8027
8028Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8029  if (true) {}
8030</pre></td></tr>
8031
8032<!--END_TRAVERSAL_MATCHERS -->
8033</table>
8034
8035</div>
8036</body>
8037</html>
8038
8039
8040