1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23  if (!id) return;
24  row = document.getElementById(id);
25  if (row.style.display != 'table-cell')
26    row.style.display = 'table-cell';
27  else
28    row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66    ifStmt(hasTrueExpression(
67        expr(hasDescendant(
68            ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
103<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107  class C {
108    C() : i(42) {}
109    int i;
110  };
111</pre></td></tr>
112
113
114<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118  class C {
119  public:
120    int a;
121  };
122accessSpecDecl()
123  matches 'public:'
124</pre></td></tr>
125
126
127<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
128<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
129
130Example matches the declaration of the nameless block printing an input
131integer.
132
133  myFunc(^(int p) {
134    printf("%d", p);
135  })
136</pre></td></tr>
137
138
139<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
140<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
141
142Example matches Z
143  template&lt;class T&gt; class Z {};
144</pre></td></tr>
145
146
147<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
148<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
149
150Given
151  template&lt;class T1, class T2, int I&gt;
152  class A {};
153
154  template&lt;class T, int I&gt;
155  class A&lt;T, T*, I&gt; {};
156
157  template&lt;&gt;
158  class A&lt;int, int, 1&gt; {};
159classTemplatePartialSpecializationDecl()
160  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
161</pre></td></tr>
162
163
164<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
165<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
166
167Given
168  template&lt;typename T&gt; class A {};
169  template&lt;&gt; class A&lt;double&gt; {};
170  A&lt;int&gt; a;
171classTemplateSpecializationDecl()
172  matches the specializations A&lt;int&gt; and A&lt;double&gt;
173</pre></td></tr>
174
175
176<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
177<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
178
179Example matches Foo::Foo() and Foo::Foo(int)
180  class Foo {
181   public:
182    Foo();
183    Foo(int);
184    int DoSomething();
185  };
186</pre></td></tr>
187
188
189<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
190<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
191
192Example matches the operator.
193  class X { operator int() const; };
194</pre></td></tr>
195
196
197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
198<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
199
200Example matches the deduction guide.
201  template&lt;typename T&gt;
202  class X { X(int) };
203  X(int) -&gt; X&lt;int&gt;;
204</pre></td></tr>
205
206
207<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
208<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
209
210Example matches Foo::~Foo()
211  class Foo {
212   public:
213    virtual ~Foo();
214  };
215</pre></td></tr>
216
217
218<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
219<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
220
221Example matches y
222  class X { void y(); };
223</pre></td></tr>
224
225
226<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
227<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
228
229Example matches X, Z
230  class X;
231  template&lt;class T&gt; class Z {};
232</pre></td></tr>
233
234
235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
236<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
237
238Examples matches X, C, and the friend declaration inside C;
239  void X();
240  class C {
241    friend X;
242  };
243</pre></td></tr>
244
245
246<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
247<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
248and non-type template parameter declarations).
249
250Given
251  class X { int y; };
252declaratorDecl()
253  matches int y.
254</pre></td></tr>
255
256
257<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
258<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
259
260Example matches A, B, C
261  enum X {
262    A, B, C
263  };
264</pre></td></tr>
265
266
267<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
268<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
269
270Example matches X
271  enum X {
272    A, B, C
273  };
274</pre></td></tr>
275
276
277<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
278<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
279
280Given
281  class X { int m; };
282fieldDecl()
283  matches 'm'.
284</pre></td></tr>
285
286
287<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
288<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
289
290Given
291  class X { friend void foo(); };
292friendDecl()
293  matches 'friend void foo()'.
294</pre></td></tr>
295
296
297<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
298<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
299
300Example matches f
301  void f();
302</pre></td></tr>
303
304
305<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
306<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
307
308Example matches f
309  template&lt;class T&gt; void f(T t) {}
310</pre></td></tr>
311
312
313<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
314<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
315
316Given
317  struct X { struct { int a; }; };
318indirectFieldDecl()
319  matches 'a'.
320</pre></td></tr>
321
322
323<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
324<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
325
326Given
327  goto FOO;
328  FOO: bar();
329labelDecl()
330  matches 'FOO:'
331</pre></td></tr>
332
333
334<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
335<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
336
337Given
338  extern "C" {}
339linkageSpecDecl()
340  matches "extern "C" {}"
341</pre></td></tr>
342
343
344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
345<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
346
347Example matches X, S, the anonymous union type, i, and U;
348  typedef int X;
349  struct S {
350    union {
351      int i;
352    } U;
353  };
354</pre></td></tr>
355
356
357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
358<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
359
360Given
361  namespace test {}
362  namespace alias = ::test;
363namespaceAliasDecl()
364  matches "namespace alias" but not "namespace test"
365</pre></td></tr>
366
367
368<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
369<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
370
371Given
372  namespace {}
373  namespace test {}
374namespaceDecl()
375  matches "namespace {}" and "namespace test {}"
376</pre></td></tr>
377
378
379<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
380<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
381
382Given
383  template &lt;typename T, int N&gt; struct C {};
384nonTypeTemplateParmDecl()
385  matches 'N', but not 'T'.
386</pre></td></tr>
387
388
389<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
390<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
391
392Example matches Foo (Additions)
393  @interface Foo (Additions)
394  @end
395</pre></td></tr>
396
397
398<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
399<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
400
401Example matches Foo (Additions)
402  @implementation Foo (Additions)
403  @end
404</pre></td></tr>
405
406
407<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
408<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
409
410Example matches Foo
411  @implementation Foo
412  @end
413</pre></td></tr>
414
415
416<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
417<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
418
419Example matches Foo
420  @interface Foo
421  @end
422</pre></td></tr>
423
424
425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
426<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
427
428Example matches _enabled
429  @implementation Foo {
430    BOOL _enabled;
431  }
432  @end
433</pre></td></tr>
434
435
436<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
437<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
438
439Example matches both declaration and definition of -[Foo method]
440  @interface Foo
441  - (void)method;
442  @end
443
444  @implementation Foo
445  - (void)method {}
446  @end
447</pre></td></tr>
448
449
450<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
451<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
452
453Example matches enabled
454  @interface Foo
455  @property BOOL enabled;
456  @end
457</pre></td></tr>
458
459
460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
461<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
462
463Example matches FooDelegate
464  @protocol FooDelegate
465  @end
466</pre></td></tr>
467
468
469<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
470<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
471
472Given
473  void f(int x);
474parmVarDecl()
475  matches int x.
476</pre></td></tr>
477
478
479<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
480<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
481
482Example matches X, Z, U, and S
483  class X;
484  template&lt;class T&gt; class Z {};
485  struct S {};
486  union U {};
487</pre></td></tr>
488
489
490<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
491<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
492
493Example:
494  staticAssertExpr()
495matches
496  static_assert(sizeof(S) == sizeof(int))
497in
498  struct S {
499    int x;
500  };
501  static_assert(sizeof(S) == sizeof(int));
502</pre></td></tr>
503
504
505<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('tagDecl0')"><a name="tagDecl0Anchor">tagDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;...</td></tr>
506<tr><td colspan="4" class="doc" id="tagDecl0"><pre>Matches tag declarations.
507
508Example matches X, Z, U, S, E
509  class X;
510  template&lt;class T&gt; class Z {};
511  struct S {};
512  union U {};
513  enum E {
514    A, B, C
515  };
516</pre></td></tr>
517
518
519<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTemplateParmDecl0')"><a name="templateTemplateParmDecl0Anchor">templateTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTemplateParmDecl.html">TemplateTemplateParmDecl</a>&gt;...</td></tr>
520<tr><td colspan="4" class="doc" id="templateTemplateParmDecl0"><pre>Matches template template parameter declarations.
521
522Given
523  template &lt;template &lt;typename&gt; class Z, int N&gt; struct C {};
524templateTypeParmDecl()
525  matches 'Z', but not 'N'.
526</pre></td></tr>
527
528
529<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
530<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
531
532Given
533  template &lt;typename T, int N&gt; struct C {};
534templateTypeParmDecl()
535  matches 'T', but not 'N'.
536</pre></td></tr>
537
538
539<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
540<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
541
542Given
543  int X;
544  namespace NS {
545  int Y;
546  }  // namespace NS
547decl(hasDeclContext(translationUnitDecl()))
548  matches "int X", but not "int Y".
549</pre></td></tr>
550
551
552<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
553<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
554
555Given
556  typedef int X;
557  using Y = int;
558typeAliasDecl()
559  matches "using Y = int", but not "typedef int X"
560</pre></td></tr>
561
562
563<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
564<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
565
566typeAliasTemplateDecl() matches
567  template &lt;typename T&gt;
568  using Y = X&lt;T&gt;;
569</pre></td></tr>
570
571
572<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
573<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
574
575Given
576  typedef int X;
577  using Y = int;
578typedefDecl()
579  matches "typedef int X", but not "using Y = int"
580</pre></td></tr>
581
582
583<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
584<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
585
586Given
587  typedef int X;
588  using Y = int;
589typedefNameDecl()
590  matches "typedef int X" and "using Y = int"
591</pre></td></tr>
592
593
594<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
595<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
596typename.
597
598Given
599  template &lt;typename T&gt;
600  struct Base { typedef T Foo; };
601
602  template&lt;typename T&gt;
603  struct S : private Base&lt;T&gt; {
604    using typename Base&lt;T&gt;::Foo;
605  };
606unresolvedUsingTypenameDecl()
607  matches using Base&lt;T&gt;::Foo </pre></td></tr>
608
609
610<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
611<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
612
613Given
614  template&lt;typename X&gt;
615  class C : private X {
616    using X::x;
617  };
618unresolvedUsingValueDecl()
619  matches using X::x </pre></td></tr>
620
621
622<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
623<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
624
625Given
626  namespace X { int x; }
627  using X::x;
628usingDecl()
629  matches using X::x </pre></td></tr>
630
631
632<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
633<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
634
635Given
636  namespace X { int x; }
637  using namespace X;
638usingDirectiveDecl()
639  matches using namespace X </pre></td></tr>
640
641
642<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
643<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
644
645Example matches A, B, C and F
646  enum X { A, B, C };
647  void F();
648</pre></td></tr>
649
650
651<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
652<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
653
654Note: this does not match declarations of member variables, which are
655"field" declarations in Clang parlance.
656
657Example matches a
658  int a;
659</pre></td></tr>
660
661
662<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;</td><td class="name" onclick="toggle('decompositionDecl0')"><a name="decompositionDecl0Anchor">decompositionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecompositionDecl.html">DecompositionDecl</a>&gt;...</td></tr>
663<tr><td colspan="4" class="doc" id="decompositionDecl0"><pre>Matches decomposition-declarations.
664
665Examples matches the declaration node with foo and bar, but not
666number.
667(matcher = declStmt(has(decompositionDecl())))
668
669  int number = 42;
670  auto [foo, bar] = std::make_pair{42, 42};
671</pre></td></tr>
672
673
674<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
675<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
676</pre></td></tr>
677
678
679<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
680<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
681
682Given
683  namespace ns {
684    struct A { static void f(); };
685    void A::f() {}
686    void g() { A::f(); }
687  }
688  ns::A a;
689nestedNameSpecifier()
690  matches "ns::" and both "A::"
691</pre></td></tr>
692
693
694<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
695<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
696
697Given
698
699  #pragma omp parallel default(none)
700  #pragma omp parallel default(shared)
701  #pragma omp parallel default(firstprivate)
702  #pragma omp parallel
703
704``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, and
705``default(firstprivate)``
706</pre></td></tr>
707
708
709<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
710<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
711</pre></td></tr>
712
713
714<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
715<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
716
717Given
718  FOO: bar();
719  void *ptr = &amp;&amp;FOO;
720  goto *bar;
721addrLabelExpr()
722  matches '&amp;&amp;FOO'
723</pre></td></tr>
724
725
726<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
727<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
728
729Given
730  int i = a[1];
731arraySubscriptExpr()
732  matches "a[1]"
733</pre></td></tr>
734
735
736<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
737<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
738
739 int i = 100;
740  __asm("mov al, 2");
741asmStmt()
742  matches '__asm("mov al, 2")'
743</pre></td></tr>
744
745
746<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
747<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
748Example matches __atomic_load_n(ptr, 1)
749  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
750</pre></td></tr>
751
752
753<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
754<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
755
756Given
757  @autoreleasepool {
758    int x = 0;
759  }
760autoreleasePoolStmt(stmt()) matches the declaration of "x"
761inside the autorelease pool.
762</pre></td></tr>
763
764
765<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
766<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
767
768Example matches a ?: b
769  (a ?: b) + 42;
770</pre></td></tr>
771
772
773<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
774<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
775
776Example matches a || b
777  !(a || b)
778</pre></td></tr>
779
780
781<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
782<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
783
784Example: matches "^{}":
785  void f() { ^{}(); }
786</pre></td></tr>
787
788
789<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
790<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
791
792Given
793  while (true) { break; }
794breakStmt()
795  matches 'break'
796</pre></td></tr>
797
798
799<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
800<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
801
802Example: Matches (int) 2.2f in
803  int i = (int) 2.2f;
804</pre></td></tr>
805
806
807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
808<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
809
810Example matches x.y() and y()
811  X x;
812  x.y();
813  y();
814</pre></td></tr>
815
816
817<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
818<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
819
820Given
821  switch(a) { case 42: break; default: break; }
822caseStmt()
823  matches 'case 42:'.
824</pre></td></tr>
825
826
827<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
828<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
829
830Example: castExpr() matches each of the following:
831  (int) 3;
832  const_cast&lt;Expr *&gt;(SubExpr);
833  char c = 0;
834but does not match
835  int i = (0);
836  int k = 0;
837</pre></td></tr>
838
839
840<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
841<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
842
843Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
844though.
845
846Example matches 'a', L'a'
847  char ch = 'a';
848  wchar_t chw = L'a';
849</pre></td></tr>
850
851
852<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
853<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
854</pre></td></tr>
855
856
857<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
858<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
859
860Example match: {1}, (1, 2)
861  int array[4] = {1};
862  vector int myvec = (vector int)(1, 2);
863</pre></td></tr>
864
865
866<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
867<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
868
869Example matches '{}' and '{{}}' in 'for (;;) {{}}'
870  for (;;) {{}}
871</pre></td></tr>
872
873
874<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
875<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
876
877Example matches a ? b : c
878  (a ? b : c) + 42
879</pre></td></tr>
880
881
882<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
883<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
884
885Example matches the constant in the case statement:
886    (matcher = constantExpr())
887  switch (a) {
888  case 37: break;
889  }
890</pre></td></tr>
891
892
893<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
894<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
895
896Given
897  while (true) { continue; }
898continueStmt()
899  matches 'continue'
900</pre></td></tr>
901
902
903<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
904<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
905
906Example matches,
907  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
908</pre></td></tr>
909
910
911<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
912<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
913
914Example matches FunctionTakesString(GetStringByValue())
915    (matcher = cxxBindTemporaryExpr())
916  FunctionTakesString(GetStringByValue());
917  FunctionTakesStringByPointer(GetStringPointer());
918</pre></td></tr>
919
920
921<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
922<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
923
924Example matches true
925  true
926</pre></td></tr>
927
928
929<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
930<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
931
932  try {} catch(int i) {}
933cxxCatchStmt()
934  matches 'catch(int i)'
935</pre></td></tr>
936
937
938<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
939<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
940
941Example: Matches const_cast&lt;int*&gt;(&amp;r) in
942  int n = 42;
943  const int &amp;r(n);
944  int* p = const_cast&lt;int*&gt;(&amp;r);
945</pre></td></tr>
946
947
948<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
949<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
950
951Example matches string(ptr, n) and ptr within arguments of f
952    (matcher = cxxConstructExpr())
953  void f(const string &amp;a, const string &amp;b);
954  char *ptr;
955  int n;
956  f(string(ptr, n), ptr);
957</pre></td></tr>
958
959
960<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
961<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
962
963Example matches the CXXDefaultArgExpr placeholder inserted for the
964    default value of the second parameter in the call expression f(42)
965    (matcher = cxxDefaultArgExpr())
966  void f(int x, int y = 0);
967  f(42);
968</pre></td></tr>
969
970
971<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
972<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
973
974Given
975  delete X;
976cxxDeleteExpr()
977  matches 'delete X'.
978</pre></td></tr>
979
980
981<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
982<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
983resolved because the base expression or the member name was dependent.
984
985Given
986  template &lt;class T&gt; void f() { T t; t.g(); }
987cxxDependentScopeMemberExpr()
988  matches t.g
989</pre></td></tr>
990
991
992<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
993<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
994
995Example:
996  cxxDynamicCastExpr()
997matches
998  dynamic_cast&lt;D*&gt;(&amp;b);
999in
1000  struct B { virtual ~B() {} }; struct D : B {};
1001  B b;
1002  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
1003</pre></td></tr>
1004
1005
1006<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
1007<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
1008
1009cxxForRangeStmt() matches 'for (auto a : i)'
1010  int i[] =  {1, 2, 3}; for (auto a : i);
1011  for(int j = 0; j &lt; 5; ++j);
1012</pre></td></tr>
1013
1014
1015<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
1016<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
1017
1018Example: Matches Foo(bar);
1019  Foo f = bar;
1020  Foo g = (Foo) bar;
1021  Foo h = Foo(bar);
1022</pre></td></tr>
1023
1024
1025<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
1026<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
1027
1028Example matches x.y()
1029  X x;
1030  x.y();
1031</pre></td></tr>
1032
1033
1034<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
1035<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
1036
1037Given
1038  new X;
1039cxxNewExpr()
1040  matches 'new X'.
1041</pre></td></tr>
1042
1043
1044<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNoexceptExpr0')"><a name="cxxNoexceptExpr0Anchor">cxxNoexceptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNoexceptExpr.html">CXXNoexceptExpr</a>&gt;...</td></tr>
1045<tr><td colspan="4" class="doc" id="cxxNoexceptExpr0"><pre>Matches noexcept expressions.
1046
1047Given
1048  bool a() noexcept;
1049  bool b() noexcept(true);
1050  bool c() noexcept(false);
1051  bool d() noexcept(noexcept(a()));
1052  bool e = noexcept(b()) || noexcept(c());
1053cxxNoexceptExpr()
1054  matches `noexcept(a())`, `noexcept(b())` and `noexcept(c())`.
1055  doesn't match the noexcept specifier in the declarations a, b, c or d.
1056</pre></td></tr>
1057
1058
1059<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
1060<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1061</pre></td></tr>
1062
1063
1064<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
1065<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1066
1067Note that if an operator isn't overloaded, it won't match. Instead, use
1068binaryOperator matcher.
1069Currently it does not match operators such as new delete.
1070FIXME: figure out why these do not match?
1071
1072Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1073    (matcher = cxxOperatorCallExpr())
1074  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1075  ostream &amp;o; int b = 1, c = 1;
1076  o &lt;&lt; b &lt;&lt; c;
1077</pre></td></tr>
1078
1079
1080<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
1081<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1082
1083Either the source expression or the destination type can be matched
1084using has(), but hasDestinationType() is more specific and can be
1085more readable.
1086
1087Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1088  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1089</pre></td></tr>
1090
1091
1092<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
1093<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1094
1095See also: hasDestinationType
1096See also: reinterpretCast
1097
1098Example:
1099  cxxStaticCastExpr()
1100matches
1101  static_cast&lt;long&gt;(8)
1102in
1103  long eight(static_cast&lt;long&gt;(8));
1104</pre></td></tr>
1105
1106
1107<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
1108<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1109
1110Given
1111  std::vector&lt;int&gt; a({ 1, 2, 3 });
1112  std::vector&lt;int&gt; b = { 4, 5 };
1113  int c[] = { 6, 7 };
1114  std::pair&lt;int, int&gt; d = { 8, 9 };
1115cxxStdInitializerListExpr()
1116  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1117</pre></td></tr>
1118
1119
1120<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1121<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1122
1123Example: Matches Foo(bar, bar)
1124  Foo h = Foo(bar, bar);
1125</pre></td></tr>
1126
1127
1128<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1129<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1130
1131Example matches the implicit this expression in "return i".
1132    (matcher = cxxThisExpr())
1133struct foo {
1134  int i;
1135  int f() { return i; }
1136};
1137</pre></td></tr>
1138
1139
1140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1141<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1142
1143  try { throw 5; } catch(int i) {}
1144cxxThrowExpr()
1145  matches 'throw 5'
1146</pre></td></tr>
1147
1148
1149<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1150<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1151
1152  try {} catch(int i) {}
1153cxxTryStmt()
1154  matches 'try {}'
1155</pre></td></tr>
1156
1157
1158<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1159<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1160
1161Example matches T(t) in return statement of f
1162    (matcher = cxxUnresolvedConstructExpr())
1163  template &lt;typename T&gt;
1164  void f(const T&amp; t) { return T(t); }
1165</pre></td></tr>
1166
1167
1168<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
1169<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1170
1171Example matches x in if (x)
1172  bool x;
1173  if (x) {}
1174</pre></td></tr>
1175
1176
1177<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
1178<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1179
1180Given
1181  int a;
1182declStmt()
1183  matches 'int a'.
1184</pre></td></tr>
1185
1186
1187<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
1188<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1189
1190Given
1191  switch(a) { case 42: break; default: break; }
1192defaultStmt()
1193  matches 'default:'.
1194</pre></td></tr>
1195
1196
1197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1198<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1199
1200Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1201  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1202</pre></td></tr>
1203
1204
1205<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
1206<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1207
1208Given
1209  do {} while (true);
1210doStmt()
1211  matches 'do {} while(true)'
1212</pre></td></tr>
1213
1214
1215<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
1216<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1217
1218Matches any cast expression written in user code, whether it be a
1219C-style cast, a functional-style cast, or a keyword cast.
1220
1221Does not match implicit conversions.
1222
1223Note: the name "explicitCast" is chosen to match Clang's terminology, as
1224Clang uses the term "cast" to apply to implicit conversions as well as to
1225actual cast expressions.
1226
1227See also: hasDestinationType.
1228
1229Example: matches all five of the casts in
1230  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1231but does not match the implicit conversion in
1232  long ell = 42;
1233</pre></td></tr>
1234
1235
1236<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
1237<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1238
1239Example matches x()
1240  void f() { x(); }
1241</pre></td></tr>
1242
1243
1244<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
1245<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1246of the sub-expression's evaluation.
1247
1248Example matches std::string()
1249  const std::string str = std::string();
1250</pre></td></tr>
1251
1252
1253<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('fixedPointLiteral0')"><a name="fixedPointLiteral0Anchor">fixedPointLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FixedPointLiteral.html">FixedPointLiteral</a>&gt;...</td></tr>
1254<tr><td colspan="4" class="doc" id="fixedPointLiteral0"><pre>Matches fixed point literals
1255</pre></td></tr>
1256
1257
1258<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
1259<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
12601.0, 1.0f, 1.0L and 1e10.
1261
1262Does not match implicit conversions such as
1263  float a = 10;
1264</pre></td></tr>
1265
1266
1267<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
1268<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1269
1270Example matches 'for (;;) {}'
1271  for (;;) {}
1272  int i[] =  {1, 2, 3}; for (auto a : i);
1273</pre></td></tr>
1274
1275
1276<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1277<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1278</pre></td></tr>
1279
1280
1281<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
1282<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1283
1284Given
1285  goto FOO;
1286  FOO: bar();
1287gotoStmt()
1288  matches 'goto FOO'
1289</pre></td></tr>
1290
1291
1292<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
1293<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1294
1295Example matches 'if (x) {}'
1296  if (x) {}
1297</pre></td></tr>
1298
1299
1300<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
1301<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1302point literals e.g.: 1i, 1.0i
1303</pre></td></tr>
1304
1305
1306<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
1307<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1308
1309This matches many different places, including function call return value
1310eliding, as well as any type conversions.
1311</pre></td></tr>
1312
1313
1314<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1315<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1316
1317Given
1318  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1319implicitValueInitExpr()
1320  matches "[0].y" (implicitly)
1321</pre></td></tr>
1322
1323
1324<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
1325<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1326
1327Given
1328  int a[] = { 1, 2 };
1329  struct B { int x, y; };
1330  B b = { 5, 6 };
1331initListExpr()
1332  matches "{ 1, 2 }" and "{ 5, 6 }"
1333</pre></td></tr>
1334
1335
1336<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
1337<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
13381, 1L, 0x1 and 1U.
1339
1340Does not match character-encoded integers such as L'a'.
1341</pre></td></tr>
1342
1343
1344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
1345<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1346
1347Given
1348  goto FOO;
1349  FOO: bar();
1350labelStmt()
1351  matches 'FOO:'
1352</pre></td></tr>
1353
1354
1355<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
1356<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1357
1358Example matches [&amp;](){return 5;}
1359  [&amp;](){return 5;}
1360</pre></td></tr>
1361
1362
1363<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
1364<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1365
1366Example: Given
1367  struct T {void func();};
1368  T f();
1369  void g(T);
1370materializeTemporaryExpr() matches 'f()' in these statements
1371  T u(f());
1372  g(f());
1373  f().func();
1374but does not match
1375  f();
1376</pre></td></tr>
1377
1378
1379<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
1380<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1381
1382Given
1383  class Y {
1384    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1385    int a; static int b;
1386  };
1387memberExpr()
1388  matches this-&gt;x, x, y.x, a, this-&gt;b
1389</pre></td></tr>
1390
1391
1392<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
1393<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1394
1395  foo();;
1396nullStmt()
1397  matches the second ';'
1398</pre></td></tr>
1399
1400
1401<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1402<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1403
1404Example matches @catch
1405  @try {}
1406  @catch (...) {}
1407</pre></td></tr>
1408
1409
1410<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1411<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1412
1413Example matches @finally
1414  @try {}
1415  @finally {}
1416</pre></td></tr>
1417
1418
1419<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
1420<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1421
1422Example: matches "a" in "init" method:
1423@implementation A {
1424  NSString *a;
1425}
1426- (void) init {
1427  a = @"hello";
1428}
1429</pre></td></tr>
1430
1431
1432<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1433<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1434
1435The innermost message send invokes the "alloc" class method on the
1436NSString class, while the outermost message send invokes the
1437"initWithString" instance method on the object returned from
1438NSString's "alloc". This matcher should match both message sends.
1439  [[NSString alloc] initWithString:@"Hello"]
1440</pre></td></tr>
1441
1442
1443<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
1444<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1445
1446Example matches @throw obj;
1447</pre></td></tr>
1448
1449
1450<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
1451<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1452
1453Example matches @try
1454  @try {}
1455  @catch (...) {}
1456</pre></td></tr>
1457
1458
1459<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
1460<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
1461
1462Given
1463
1464  #pragma omp parallel
1465  #pragma omp parallel default(none)
1466  #pragma omp taskyield
1467
1468``ompExecutableDirective()`` matches ``omp parallel``,
1469``omp parallel default(none)`` and ``omp taskyield``.
1470</pre></td></tr>
1471
1472
1473<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
1474<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1475to reference another expressions and can be met
1476in BinaryConditionalOperators, for example.
1477
1478Example matches 'a'
1479  (a ?: c) + 42;
1480</pre></td></tr>
1481
1482
1483<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
1484<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1485
1486Example matches (foo() + 1)
1487  int foo() { return 1; }
1488  int a = (foo() + 1);
1489</pre></td></tr>
1490
1491
1492<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
1493<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1494ParenListExprs don't have a predefined type and are used for late parsing.
1495In the final AST, they can be met in template declarations.
1496
1497Given
1498  template&lt;typename T&gt; class X {
1499    void f() {
1500      X x(*this);
1501      int a = 0, b = 1; int i = (a, b);
1502    }
1503  };
1504parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1505has a predefined type and is a ParenExpr, not a ParenListExpr.
1506</pre></td></tr>
1507
1508
1509<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
1510<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1511
1512Example: Matches __func__
1513  printf("%s", __func__);
1514</pre></td></tr>
1515
1516
1517<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
1518<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1519
1520Given
1521  return 1;
1522returnStmt()
1523  matches 'return 1'
1524</pre></td></tr>
1525
1526
1527<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
1528<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1529
1530Given
1531  { ++a; }
1532stmt()
1533  matches both the compound statement '{ ++a; }' and '++a'.
1534</pre></td></tr>
1535
1536
1537<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
1538<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1539
1540Example match: ({ int X = 4; X; })
1541  int C = ({ int X = 4; X; });
1542</pre></td></tr>
1543
1544
1545<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
1546<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1547
1548Example matches "abcd", L"abcd"
1549  char *s = "abcd";
1550  wchar_t *ws = L"abcd";
1551</pre></td></tr>
1552
1553
1554<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
1555<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1556
1557Given
1558  template &lt;int N&gt;
1559  struct A { static const int n = N; };
1560  struct B : public A&lt;42&gt; {};
1561substNonTypeTemplateParmExpr()
1562  matches "N" in the right-hand side of "static const int n = N;"
1563</pre></td></tr>
1564
1565
1566<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
1567<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1568
1569Given
1570  switch(a) { case 42: break; default: break; }
1571switchCase()
1572  matches 'case 42:' and 'default:'.
1573</pre></td></tr>
1574
1575
1576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
1577<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1578
1579Given
1580  switch(a) { case 42: break; default: break; }
1581switchStmt()
1582  matches 'switch(a)'.
1583</pre></td></tr>
1584
1585
1586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
1587<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1588
1589Given
1590  Foo x = bar;
1591  int y = sizeof(x) + alignof(x);
1592unaryExprOrTypeTraitExpr()
1593  matches sizeof(x) and alignof(x)
1594</pre></td></tr>
1595
1596
1597<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
1598<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1599
1600Example matches !a
1601  !a || b
1602</pre></td></tr>
1603
1604
1605<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
1606<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1607but could not be resolved to a specific declaration.
1608
1609Given
1610  template&lt;typename T&gt;
1611  T foo() { T a; return a; }
1612  template&lt;typename T&gt;
1613  void bar() {
1614    foo&lt;T&gt;();
1615  }
1616unresolvedLookupExpr()
1617  matches foo&lt;T&gt;() </pre></td></tr>
1618
1619
1620<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
1621<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
1622
1623Given
1624  struct X {
1625    template &lt;class T&gt; void f();
1626    void g();
1627  };
1628  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
1629unresolvedMemberExpr()
1630  matches x.f&lt;T&gt;
1631</pre></td></tr>
1632
1633
1634<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
1635<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1636
1637Example match: "foo"_suffix
1638</pre></td></tr>
1639
1640
1641<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
1642<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1643
1644Given
1645  while (true) {}
1646whileStmt()
1647  matches 'while (true) {}'.
1648</pre></td></tr>
1649
1650
1651<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;</td><td class="name" onclick="toggle('templateArgumentLoc0')"><a name="templateArgumentLoc0Anchor">templateArgumentLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgumentLoc.html">TemplateArgumentLoc</a>&gt;...</td></tr>
1652<tr><td colspan="4" class="doc" id="templateArgumentLoc0"><pre>Matches template arguments (with location info).
1653
1654Given
1655  template &lt;typename T&gt; struct C {};
1656  C&lt;int&gt; c;
1657templateArgumentLoc()
1658  matches 'int' in C&lt;int&gt;.
1659</pre></td></tr>
1660
1661
1662<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
1663<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1664
1665Given
1666  template &lt;typename T&gt; struct C {};
1667  C&lt;int&gt; c;
1668templateArgument()
1669  matches 'int' in C&lt;int&gt;.
1670</pre></td></tr>
1671
1672
1673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
1674<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1675
1676Given
1677  template &lt;typename T&gt; class X { };
1678  X&lt;int&gt; xi;
1679templateName()
1680  matches 'X' in X&lt;int&gt;.
1681</pre></td></tr>
1682
1683
1684<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
1685<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1686</pre></td></tr>
1687
1688
1689<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
1690<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1691
1692Given
1693  int a[] = { 2, 3 };
1694  int b[4];
1695  void f() { int c[a[0]]; }
1696arrayType()
1697  matches "int a[]", "int b[4]" and "int c[a[0]]";
1698</pre></td></tr>
1699
1700
1701<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
1702<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1703
1704Given
1705  _Atomic(int) i;
1706atomicType()
1707  matches "_Atomic(int) i"
1708</pre></td></tr>
1709
1710
1711<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
1712<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1713
1714Given:
1715  auto n = 4;
1716  int v[] = { 2, 3 }
1717  for (auto i : v) { }
1718autoType()
1719  matches "auto n" and "auto i"
1720</pre></td></tr>
1721
1722
1723<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
1724<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1725"void (^)(int)".
1726
1727The pointee is always required to be a FunctionType.
1728</pre></td></tr>
1729
1730
1731<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
1732<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1733
1734Given
1735  struct A {};
1736  A a;
1737  int b;
1738  float c;
1739  bool d;
1740builtinType()
1741  matches "int b", "float c" and "bool d"
1742</pre></td></tr>
1743
1744
1745<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
1746<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1747
1748Given
1749  _Complex float f;
1750complexType()
1751  matches "_Complex float f"
1752</pre></td></tr>
1753
1754
1755<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
1756<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1757
1758Given
1759  void() {
1760    int a[2];
1761    int b[] = { 2, 3 };
1762    int c[b[0]];
1763  }
1764constantArrayType()
1765  matches "int a[2]"
1766</pre></td></tr>
1767
1768
1769<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
1770<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1771Example matches i[] in declaration of f.
1772    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1773Example matches i[1].
1774    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1775  void f(int i[]) {
1776    i[1] = 0;
1777  }
1778</pre></td></tr>
1779
1780
1781<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
1782<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
1783
1784Given:
1785  short i = 1;
1786  int j = 42;
1787  decltype(i + j) result = i + j;
1788decltypeType()
1789  matches "decltype(i + j)"
1790</pre></td></tr>
1791
1792
1793<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
1794<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
1795template types.
1796
1797Given
1798  template &lt;typename T&gt;
1799  class C { public: C(T); };
1800
1801  C c(123);
1802deducedTemplateSpecializationType() matches the type in the declaration
1803of the variable c.
1804</pre></td></tr>
1805
1806
1807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
1808<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1809
1810Given
1811  template&lt;typename T, int Size&gt;
1812  class array {
1813    T data[Size];
1814  };
1815dependentSizedArrayType
1816  matches "T data[Size]"
1817</pre></td></tr>
1818
1819
1820<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
1821<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1822qualified name.
1823
1824Given
1825  namespace N {
1826    namespace M {
1827      class D {};
1828    }
1829  }
1830  class C {};
1831
1832  class C c;
1833  N::M::D d;
1834
1835elaboratedType() matches the type of the variable declarations of both
1836c and d.
1837</pre></td></tr>
1838
1839
1840<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
1841<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1842
1843Given
1844  enum C { Green };
1845  enum class S { Red };
1846
1847  C c;
1848  S s;
1849
1850enumType() matches the type of the variable declarations of both c and
1851s.
1852</pre></td></tr>
1853
1854
1855<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1856<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1857
1858Given
1859  int (*f)(int);
1860  void g();
1861functionProtoType()
1862  matches "int (*f)(int)" and the type of "g" in C++ mode.
1863  In C mode, "g" is not matched because it does not contain a prototype.
1864</pre></td></tr>
1865
1866
1867<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
1868<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1869
1870Given
1871  int (*f)(int);
1872  void g();
1873functionType()
1874  matches "int (*f)(int)" and the type of "g".
1875</pre></td></tr>
1876
1877
1878<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
1879<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1880
1881Given
1882  int a[] = { 2, 3 };
1883  int b[42];
1884  void f(int c[]) { int d[a[0]]; };
1885incompleteArrayType()
1886  matches "int a[]" and "int c[]"
1887</pre></td></tr>
1888
1889
1890<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
1891<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1892
1893Example matches S s, but not S&lt;T&gt; s.
1894    (matcher = parmVarDecl(hasType(injectedClassNameType())))
1895  template &lt;typename T&gt; struct S {
1896    void f(S s);
1897    void g(S&lt;T&gt; s);
1898  };
1899</pre></td></tr>
1900
1901
1902<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
1903<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1904
1905Given:
1906  int *a;
1907  int &amp;b = *a;
1908  int &amp;&amp;c = 1;
1909  auto &amp;d = b;
1910  auto &amp;&amp;e = c;
1911  auto &amp;&amp;f = 2;
1912  int g = 5;
1913
1914lValueReferenceType() matches the types of b, d, and e. e is
1915matched since the type is deduced as int&amp; by reference collapsing rules.
1916</pre></td></tr>
1917
1918
1919<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
1920<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1921Given
1922  struct A { int i; }
1923  A::* ptr = A::i;
1924memberPointerType()
1925  matches "A::* ptr"
1926</pre></td></tr>
1927
1928
1929<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
1930<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1931a pointer type, despite being syntactically similar.
1932
1933Given
1934  int *a;
1935
1936  @interface Foo
1937  @end
1938  Foo *f;
1939pointerType()
1940  matches "Foo *f", but does not match "int *a".
1941</pre></td></tr>
1942
1943
1944<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
1945<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1946
1947Given
1948  int (*ptr_to_array)[4];
1949  int *array_of_ptrs[4];
1950
1951varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1952array_of_ptrs.
1953</pre></td></tr>
1954
1955
1956<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
1957<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1958types.
1959
1960Given
1961  int *a;
1962  int &amp;b = *a;
1963  int c = 5;
1964
1965  @interface Foo
1966  @end
1967  Foo *f;
1968pointerType()
1969  matches "int *a", but does not match "Foo *f".
1970</pre></td></tr>
1971
1972
1973<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
1974<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1975
1976Given:
1977  int *a;
1978  int &amp;b = *a;
1979  int &amp;&amp;c = 1;
1980  auto &amp;d = b;
1981  auto &amp;&amp;e = c;
1982  auto &amp;&amp;f = 2;
1983  int g = 5;
1984
1985rValueReferenceType() matches the types of c and f. e is not
1986matched as it is deduced to int&amp; by reference collapsing rules.
1987</pre></td></tr>
1988
1989
1990<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
1991<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1992
1993Given
1994  class C {};
1995  struct S {};
1996
1997  C c;
1998  S s;
1999
2000recordType() matches the type of the variable declarations of both c
2001and s.
2002</pre></td></tr>
2003
2004
2005<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
2006<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
2007
2008Given
2009  int *a;
2010  int &amp;b = *a;
2011  int &amp;&amp;c = 1;
2012  auto &amp;d = b;
2013  auto &amp;&amp;e = c;
2014  auto &amp;&amp;f = 2;
2015  int g = 5;
2016
2017referenceType() matches the types of b, c, d, e, and f.
2018</pre></td></tr>
2019
2020
2021<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
2022<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
2023template type parameter.
2024
2025Given
2026  template &lt;typename T&gt;
2027  void F(T t) {
2028    int i = 1 + t;
2029  }
2030
2031substTemplateTypeParmType() matches the type of 't' but not '1'
2032</pre></td></tr>
2033
2034
2035<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
2036<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
2037
2038Given
2039  enum E {};
2040  class C {};
2041
2042  E e;
2043  C c;
2044
2045tagType() matches the type of the variable declarations of both e
2046and c.
2047</pre></td></tr>
2048
2049
2050<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
2051<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
2052
2053Given
2054  template &lt;typename T&gt;
2055  class C { };
2056
2057  template class C&lt;int&gt;;  // A
2058  C&lt;char&gt; var;            // B
2059
2060templateSpecializationType() matches the type of the explicit
2061instantiation in A and the type of the variable declaration in B.
2062</pre></td></tr>
2063
2064
2065<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
2066<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
2067
2068Example matches T, but not int.
2069    (matcher = templateTypeParmType())
2070  template &lt;typename T&gt; void f(int i);
2071</pre></td></tr>
2072
2073
2074<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
2075<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
2076</pre></td></tr>
2077
2078
2079<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
2080<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
2081
2082Given
2083  typedef int X;
2084typedefType()
2085  matches "typedef int X"
2086</pre></td></tr>
2087
2088
2089<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
2090<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2091
2092Given:
2093  typedef __underlying_type(T) type;
2094unaryTransformType()
2095  matches "__underlying_type(T)"
2096</pre></td></tr>
2097
2098
2099<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
2100<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2101integer-constant-expression.
2102
2103Given
2104  void f() {
2105    int a[] = { 2, 3 }
2106    int b[42];
2107    int c[a[0]];
2108  }
2109variableArrayType()
2110  matches "int c[a[0]]"
2111</pre></td></tr>
2112
2113<!--END_DECL_MATCHERS -->
2114</table>
2115
2116<!-- ======================================================================= -->
2117<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2118<!-- ======================================================================= -->
2119
2120<p>Narrowing matchers match certain attributes on the current node, thus
2121narrowing down the set of nodes of the current type to match on.</p>
2122
2123<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2124which allow users to create more powerful match expressions.</p>
2125
2126<table>
2127<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2128<!-- START_NARROWING_MATCHERS -->
2129
2130<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2131<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2132
2133Usable as: Any Matcher
2134</pre></td></tr>
2135
2136
2137<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2138<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2139
2140Usable as: Any Matcher
2141</pre></td></tr>
2142
2143
2144<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2145<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2146
2147Useful when another matcher requires a child matcher, but there's no
2148additional constraint. This will often be used with an explicit conversion
2149to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2150
2151Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2152"int* p" and "void f()" in
2153  int* p;
2154  void f();
2155
2156Usable as: Any Matcher
2157</pre></td></tr>
2158
2159
2160<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2161<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2162
2163Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2164  class X {};
2165  class Y {};
2166
2167Usable as: Any Matcher
2168</pre></td></tr>
2169
2170
2171<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasAnyOperatorName0')"><a name="hasAnyOperatorName0Anchor">hasAnyOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2172<tr><td colspan="4" class="doc" id="hasAnyOperatorName0"><pre>Matches operator expressions (binary or unary) that have any of the
2173specified names.
2174
2175   hasAnyOperatorName("+", "-")
2176 Is equivalent to
2177   anyOf(hasOperatorName("+"), hasOperatorName("-"))
2178</pre></td></tr>
2179
2180
2181<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2182<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2183unary).
2184
2185Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2186  !(a || b)
2187</pre></td></tr>
2188
2189
2190<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2191<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2192
2193Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2194  if (a == b)
2195    a += b;
2196
2197Example 2: matches s1 = s2
2198           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2199  struct S { S&amp; operator=(const S&amp;); };
2200  void x() { S s1, s2; s1 = s2; }
2201</pre></td></tr>
2202
2203
2204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator0')"><a name="isComparisonOperator0Anchor">isComparisonOperator</a></td><td></td></tr>
2205<tr><td colspan="4" class="doc" id="isComparisonOperator0"><pre>Matches comparison operators.
2206
2207Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2208  if (a == b)
2209    a += b;
2210
2211Example 2: matches s1 &lt; s2
2212           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2213  struct S { bool operator&lt;(const S&amp; other); };
2214  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2215</pre></td></tr>
2216
2217
2218<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPrivate1')"><a name="isPrivate1Anchor">isPrivate</a></td><td></td></tr>
2219<tr><td colspan="4" class="doc" id="isPrivate1"><pre>Matches private C++ declarations and C++ base specifers that specify private
2220inheritance.
2221
2222Examples:
2223  class C {
2224  public:    int a;
2225  protected: int b;
2226  private:   int c; // fieldDecl(isPrivate()) matches 'c'
2227  };
2228
2229  struct Base {};
2230  struct Derived1 : private Base {}; // matches 'Base'
2231  class Derived2 : Base {}; // matches 'Base'
2232</pre></td></tr>
2233
2234
2235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isProtected1')"><a name="isProtected1Anchor">isProtected</a></td><td></td></tr>
2236<tr><td colspan="4" class="doc" id="isProtected1"><pre>Matches protected C++ declarations and C++ base specifers that specify
2237protected inheritance.
2238
2239Examples:
2240  class C {
2241  public:    int a;
2242  protected: int b; // fieldDecl(isProtected()) matches 'b'
2243  private:   int c;
2244  };
2245
2246  class Base {};
2247  class Derived : protected Base {}; // matches 'Base'
2248</pre></td></tr>
2249
2250
2251<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isPublic1')"><a name="isPublic1Anchor">isPublic</a></td><td></td></tr>
2252<tr><td colspan="4" class="doc" id="isPublic1"><pre>Matches public C++ declarations and C++ base specifers that specify public
2253inheritance.
2254
2255Examples:
2256  class C {
2257  public:    int a; // fieldDecl(isPublic()) matches 'a'
2258  protected: int b;
2259  private:   int c;
2260  };
2261
2262  class Base {};
2263  class Derived1 : public Base {}; // matches 'Base'
2264  struct Derived2 : Base {}; // matches 'Base'
2265</pre></td></tr>
2266
2267
2268<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;</td><td class="name" onclick="toggle('isVirtual1')"><a name="isVirtual1Anchor">isVirtual</a></td><td></td></tr>
2269<tr><td colspan="4" class="doc" id="isVirtual1"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2270virtual inheritance.
2271
2272Example:
2273  class A {
2274   public:
2275    virtual void x(); // matches x
2276  };
2277
2278Example:
2279  class Base {};
2280  class DirectlyDerived : virtual Base {}; // matches Base
2281  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2282
2283Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2284</pre></td></tr>
2285
2286
2287<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2288<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2289
2290
2291<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2292<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2293
2294Given
2295  f('false, 3.14, 42);
2296characterLiteral(equals(0))
2297  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2298  match false
2299floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2300  match 3.14
2301integerLiteral(equals(42))
2302  matches 42
2303
2304Note that you cannot directly match a negative numeric literal because the
2305minus sign is not part of the literal: It is a unary operator whose operand
2306is the positive numeric literal. Instead, you must use a unaryOperator()
2307matcher to match the minus sign:
2308
2309unaryOperator(hasOperatorName("-"),
2310              hasUnaryOperand(integerLiteral(equals(13))))
2311
2312Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2313           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2314</pre></td></tr>
2315
2316
2317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2318<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2319
2320
2321<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2322<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2323
2324
2325<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
2326<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2327
2328Given
2329  try {
2330    // ...
2331  } catch (int) {
2332    // ...
2333  } catch (...) {
2334    // ...
2335  }
2336cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2337</pre></td></tr>
2338
2339
2340<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2341<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2342a specific number of arguments (including absent default arguments).
2343
2344Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2345  void f(int x, int y);
2346  f(0, 0);
2347</pre></td></tr>
2348
2349
2350<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
2351<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2352</pre></td></tr>
2353
2354
2355<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
2356<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2357zero initialization.
2358
2359Given
2360void foo() {
2361  struct point { double x; double y; };
2362  point pt[2] = { { 1.0, 2.0 } };
2363}
2364initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2365will match the implicit array filler for pt[1].
2366</pre></td></tr>
2367
2368
2369<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2370<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2371
2372Given
2373  struct S {
2374    S(); // #1
2375    S(const S &amp;); // #2
2376    S(S &amp;&amp;); // #3
2377  };
2378cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2379</pre></td></tr>
2380
2381
2382<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2383<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2384
2385Given
2386  struct S {
2387    S(); // #1
2388    S(const S &amp;); // #2
2389    S(S &amp;&amp;); // #3
2390  };
2391cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2392</pre></td></tr>
2393
2394
2395<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2396<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2397
2398Given
2399  struct S {
2400    S(); // #1
2401    S(int) {} // #2
2402    S(S &amp;&amp;) : S() {} // #3
2403  };
2404  S::S() : S(0) {} // #4
2405cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2406#1 or #2.
2407</pre></td></tr>
2408
2409
2410<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2411<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2412that have an explicit specifier if this explicit specifier is resolved to
2413true.
2414
2415Given
2416  template&lt;bool b&gt;
2417  struct S {
2418    S(int); // #1
2419    explicit S(double); // #2
2420    operator int(); // #3
2421    explicit operator bool(); // #4
2422    explicit(false) S(bool) // # 7
2423    explicit(true) S(char) // # 8
2424    explicit(b) S(S) // # 9
2425  };
2426  S(int) -&gt; S&lt;true&gt; // #5
2427  explicit S(double) -&gt; S&lt;false&gt; // #6
2428cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2429cxxConversionDecl(isExplicit()) will match #4, but not #3.
2430cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2431</pre></td></tr>
2432
2433
2434<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
2435<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2436
2437Given
2438  struct S {
2439    S(); // #1
2440    S(const S &amp;); // #2
2441    S(S &amp;&amp;); // #3
2442  };
2443cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2444</pre></td></tr>
2445
2446
2447<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
2448<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
2449that have an explicit specifier if this explicit specifier is resolved to
2450true.
2451
2452Given
2453  template&lt;bool b&gt;
2454  struct S {
2455    S(int); // #1
2456    explicit S(double); // #2
2457    operator int(); // #3
2458    explicit operator bool(); // #4
2459    explicit(false) S(bool) // # 7
2460    explicit(true) S(char) // # 8
2461    explicit(b) S(S) // # 9
2462  };
2463  S(int) -&gt; S&lt;true&gt; // #5
2464  explicit S(double) -&gt; S&lt;false&gt; // #6
2465cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2466cxxConversionDecl(isExplicit()) will match #4, but not #3.
2467cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2468</pre></td></tr>
2469
2470
2471<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
2472<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2473opposed to a member.
2474
2475Given
2476  struct B {};
2477  struct D : B {
2478    int I;
2479    D(int i) : I(i) {}
2480  };
2481  struct E : B {
2482    E() : B() {}
2483  };
2484cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2485  will match E(), but not match D(int).
2486</pre></td></tr>
2487
2488
2489<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
2490<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2491opposed to a base.
2492
2493Given
2494  struct B {};
2495  struct D : B {
2496    int I;
2497    D(int i) : I(i) {}
2498  };
2499  struct E : B {
2500    E() : B() {}
2501  };
2502cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2503  will match D(int), but not match E().
2504</pre></td></tr>
2505
2506
2507<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
2508<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2509code (as opposed to implicitly added by the compiler).
2510
2511Given
2512  struct Foo {
2513    Foo() { }
2514    Foo(int) : foo_("A") { }
2515    string foo_;
2516  };
2517cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2518  will match Foo(int), but not Foo()
2519</pre></td></tr>
2520
2521
2522<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
2523<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
2524that have an explicit specifier if this explicit specifier is resolved to
2525true.
2526
2527Given
2528  template&lt;bool b&gt;
2529  struct S {
2530    S(int); // #1
2531    explicit S(double); // #2
2532    operator int(); // #3
2533    explicit operator bool(); // #4
2534    explicit(false) S(bool) // # 7
2535    explicit(true) S(char) // # 8
2536    explicit(b) S(S) // # 9
2537  };
2538  S(int) -&gt; S&lt;true&gt; // #5
2539  explicit S(double) -&gt; S&lt;false&gt; // #6
2540cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2541cxxConversionDecl(isExplicit()) will match #4, but not #3.
2542cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2543</pre></td></tr>
2544
2545
2546<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
2547<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
2548to '.'.
2549
2550Member calls on the implicit this pointer match as called with '-&gt;'.
2551
2552Given
2553  class Y {
2554    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2555    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
2556    int a;
2557    static int b;
2558  };
2559  template &lt;class T&gt;
2560  class Z {
2561    void x() { this-&gt;m; }
2562  };
2563memberExpr(isArrow())
2564  matches this-&gt;x, x, y.x, a, this-&gt;b
2565cxxDependentScopeMemberExpr(isArrow())
2566  matches this-&gt;m
2567unresolvedMemberExpr(isArrow())
2568  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
2569</pre></td></tr>
2570
2571
2572<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
2573<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2574
2575Given
2576struct A {
2577  void foo() const;
2578  void bar();
2579};
2580
2581cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2582</pre></td></tr>
2583
2584
2585<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
2586<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2587operator.
2588
2589Given
2590struct A {
2591  A &amp;operator=(const A &amp;);
2592  A &amp;operator=(A &amp;&amp;);
2593};
2594
2595cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2596the second one.
2597</pre></td></tr>
2598
2599
2600<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
2601<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2602
2603Given:
2604  class A final {};
2605
2606  struct B {
2607    virtual void f();
2608  };
2609
2610  struct C : B {
2611    void f() final;
2612  };
2613matches A and C::f, but not B, C, or B::f
2614</pre></td></tr>
2615
2616
2617<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
2618<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2619operator.
2620
2621Given
2622struct A {
2623  A &amp;operator=(const A &amp;);
2624  A &amp;operator=(A &amp;&amp;);
2625};
2626
2627cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2628the first one.
2629</pre></td></tr>
2630
2631
2632<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
2633<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2634
2635Given
2636  class A {
2637   public:
2638    virtual void x();
2639  };
2640  class B : public A {
2641   public:
2642    virtual void x();
2643  };
2644  matches B::x
2645</pre></td></tr>
2646
2647
2648<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
2649<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2650
2651Given
2652  class A {
2653   public:
2654    virtual void x() = 0;
2655  };
2656  matches A::x
2657</pre></td></tr>
2658
2659
2660<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2661<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2662
2663Given
2664  struct S {
2665    S(); // #1
2666    S(const S &amp;) = default; // #2
2667    S(S &amp;&amp;) = delete; // #3
2668  };
2669cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2670</pre></td></tr>
2671
2672
2673<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
2674<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches declarations of virtual methods and C++ base specifers that specify
2675virtual inheritance.
2676
2677Example:
2678  class A {
2679   public:
2680    virtual void x(); // matches x
2681  };
2682
2683Example:
2684  class Base {};
2685  class DirectlyDerived : virtual Base {}; // matches Base
2686  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
2687
2688Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
2689</pre></td></tr>
2690
2691
2692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
2693<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2694
2695Given
2696  class A {
2697   public:
2698    virtual void x();
2699  };
2700  class B : public A {
2701   public:
2702    void x();
2703  };
2704  matches A::x but not B::x
2705</pre></td></tr>
2706
2707
2708<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2709<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2710
2711Given:
2712  MyClass *p1 = new MyClass[10];
2713cxxNewExpr(isArray())
2714  matches the expression 'new MyClass[10]'.
2715</pre></td></tr>
2716
2717
2718<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName0')"><a name="hasAnyOverloadedOperatorName0Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
2719<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName0"><pre>Matches overloaded operator names.
2720
2721Matches overloaded operator names specified in strings without the
2722"operator" prefix: e.g. "&lt;&lt;".
2723
2724  hasAnyOverloadesOperatorName("+", "-")
2725Is equivalent to
2726  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
2727</pre></td></tr>
2728
2729
2730<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
2731<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2732
2733Matches overloaded operator names specified in strings without the
2734"operator" prefix: e.g. "&lt;&lt;".
2735
2736Given:
2737  class A { int operator*(); };
2738  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2739  A a;
2740  a &lt;&lt; a;   // &lt;-- This matches
2741
2742cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2743specified line and
2744cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2745matches the declaration of A.
2746
2747Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2748</pre></td></tr>
2749
2750
2751<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
2752<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2753
2754Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2755  if (a == b)
2756    a += b;
2757
2758Example 2: matches s1 = s2
2759           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2760  struct S { S&amp; operator=(const S&amp;); };
2761  void x() { S s1, s2; s1 = s2; }
2762</pre></td></tr>
2763
2764
2765<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isComparisonOperator1')"><a name="isComparisonOperator1Anchor">isComparisonOperator</a></td><td></td></tr>
2766<tr><td colspan="4" class="doc" id="isComparisonOperator1"><pre>Matches comparison operators.
2767
2768Example 1: matches a == b (matcher = binaryOperator(isComparisonOperator()))
2769  if (a == b)
2770    a += b;
2771
2772Example 2: matches s1 &lt; s2
2773           (matcher = cxxOperatorCallExpr(isComparisonOperator()))
2774  struct S { bool operator&lt;(const S&amp; other); };
2775  void x(S s1, S s2) { bool b1 = s1 &lt; s2; }
2776</pre></td></tr>
2777
2778
2779<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
2780<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2781
2782Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2783class x {};
2784class y;
2785</pre></td></tr>
2786
2787
2788<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
2789<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2790</pre></td></tr>
2791
2792
2793<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
2794<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
2795</pre></td></tr>
2796
2797
2798<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
2799<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2800static member variable template instantiations.
2801
2802Given
2803  template&lt;typename T&gt; void A(T t) { }
2804  template&lt;&gt; void A(int N) { }
2805functionDecl(isExplicitTemplateSpecialization())
2806  matches the specialization A&lt;int&gt;().
2807
2808Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2809</pre></td></tr>
2810
2811
2812<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
2813<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2814
2815Given:
2816  class A final {};
2817
2818  struct B {
2819    virtual void f();
2820  };
2821
2822  struct C : B {
2823    void f() final;
2824  };
2825matches A and C::f, but not B, C, or B::f
2826</pre></td></tr>
2827
2828
2829<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2830<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2831
2832Given:
2833  auto x = []{};
2834
2835cxxRecordDecl(isLambda()) matches the implicit class declaration of
2836decltype(x)
2837</pre></td></tr>
2838
2839
2840<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
2841<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
2842isSameOrDerivedFrom(hasName(...)).
2843</pre></td></tr>
2844
2845
2846<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
2847<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2848member variable template instantiations.
2849
2850Given
2851  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2852or
2853  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2854or
2855  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
2856cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2857  matches the template instantiation of X&lt;A&gt;.
2858
2859But given
2860  template &lt;typename T&gt;  class X {}; class A {};
2861  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2862cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2863  does not match, as X&lt;A&gt; is an explicit template specialization.
2864
2865Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2866</pre></td></tr>
2867
2868
2869<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2870<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2871a specific number of arguments (including absent default arguments).
2872
2873Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2874  void f(int x, int y);
2875  f(0, 0);
2876</pre></td></tr>
2877
2878
2879<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
2880<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
2881
2882Example matches y(x) but not y(42) or NS::y(x).
2883  namespace NS {
2884    struct X {};
2885    void y(X);
2886  }
2887
2888  void y(...);
2889
2890  void test() {
2891    NS::X x;
2892    y(x); // Matches
2893    NS::y(x); // Doesn't match
2894    y(42); // Doesn't match
2895    using NS::y;
2896    y(x); // Found by both unqualified lookup and ADL, doesn't match
2897   }
2898</pre></td></tr>
2899
2900
2901<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2902<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2903
2904Example: matches the implicit cast around 0
2905(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2906  int *p = 0;
2907
2908If the matcher is use from clang-query, CastKind parameter
2909should be passed as a quoted string. e.g., hasCastKind("CK_NullToPointer").
2910</pre></td></tr>
2911
2912
2913<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
2914<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2915
2916
2917<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2918<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2919
2920Given
2921  f('false, 3.14, 42);
2922characterLiteral(equals(0))
2923  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2924  match false
2925floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2926  match 3.14
2927integerLiteral(equals(42))
2928  matches 42
2929
2930Note that you cannot directly match a negative numeric literal because the
2931minus sign is not part of the literal: It is a unary operator whose operand
2932is the positive numeric literal. Instead, you must use a unaryOperator()
2933matcher to match the minus sign:
2934
2935unaryOperator(hasOperatorName("-"),
2936              hasUnaryOperand(integerLiteral(equals(13))))
2937
2938Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2939           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2940</pre></td></tr>
2941
2942
2943<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
2944<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2945
2946
2947<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
2948<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2949
2950
2951<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
2952<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2953
2954Given
2955  template&lt;typename T&gt; struct C {};
2956  C&lt;int&gt; c;
2957classTemplateSpecializationDecl(templateArgumentCountIs(1))
2958  matches C&lt;int&gt;.
2959</pre></td></tr>
2960
2961
2962<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
2963<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2964child statements.
2965
2966Example: Given
2967  { for (;;) {} }
2968compoundStmt(statementCountIs(0)))
2969  matches '{}'
2970  but does not match the outer compound statement.
2971</pre></td></tr>
2972
2973
2974<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
2975<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2976
2977Given
2978  int a[42];
2979  int b[2 * 21];
2980  int c[41], d[43];
2981  char *s = "abcd";
2982  wchar_t *ws = L"abcd";
2983  char *w = "a";
2984constantArrayType(hasSize(42))
2985  matches "int a[42]" and "int b[2 * 21]"
2986stringLiteral(hasSize(4))
2987  matches "abcd", L"abcd"
2988</pre></td></tr>
2989
2990
2991<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
2992<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2993declarations.
2994
2995Example: Given
2996  int a, b;
2997  int c;
2998  int d = 2, e;
2999declCountIs(2)
3000  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
3001</pre></td></tr>
3002
3003
3004<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3005<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
3006
3007Matches a node if it equals the node previously bound to ID.
3008
3009Given
3010  class X { int a; int b; };
3011cxxRecordDecl(
3012    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3013    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3014  matches the class X, as a and b have the same type.
3015
3016Note that when multiple matches are involved via forEach* matchers,
3017equalsBoundNodes acts as a filter.
3018For example:
3019compoundStmt(
3020    forEachDescendant(varDecl().bind("d")),
3021    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3022will trigger a match for each combination of variable declaration
3023and reference to that variable declaration within a compound statement.
3024</pre></td></tr>
3025
3026
3027<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
3028<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
3029
3030Decl has pointer identity in the AST.
3031</pre></td></tr>
3032
3033
3034<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
3035<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
3036
3037Given
3038  __attribute__((device)) void f() { ... }
3039decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
3040f. If the matcher is used from clang-query, attr::Kind parameter should be
3041passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
3042</pre></td></tr>
3043
3044
3045<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
3046<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
3047partially matching a given regex.
3048
3049Example matches Y but not X
3050    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3051  #include "ASTMatcher.h"
3052  class X {};
3053ASTMatcher.h:
3054  class Y {};
3055
3056Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3057
3058If the matcher is used in clang-query, RegexFlags parameter
3059should be passed as a quoted string. e.g: "NoFlags".
3060Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3061</pre></td></tr>
3062
3063
3064<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
3065<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
3066
3067Example matches X but not Y
3068  (matcher = cxxRecordDecl(isExpansionInMainFile())
3069  #include &lt;Y.h&gt;
3070  class X {};
3071Y.h:
3072  class Y {};
3073
3074Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3075</pre></td></tr>
3076
3077
3078<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
3079<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
3080
3081Example matches Y but not X
3082    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3083  #include &lt;SystemHeader.h&gt;
3084  class X {};
3085SystemHeader.h:
3086  class Y {};
3087
3088Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
3089</pre></td></tr>
3090
3091
3092<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
3093<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
3094by the compiler (eg. implicit default/copy constructors).
3095</pre></td></tr>
3096
3097
3098<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
3099<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
3100
3101Given
3102  class vector {};
3103  namespace foo {
3104    class vector {};
3105    namespace std {
3106      class vector {};
3107    }
3108  }
3109  namespace std {
3110    inline namespace __1 {
3111      class vector {}; // #1
3112      namespace experimental {
3113        class vector {};
3114      }
3115    }
3116  }
3117cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
3118</pre></td></tr>
3119
3120
3121<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
3122<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3123template instantiations.
3124
3125Given
3126  template&lt;typename T&gt; void A(T t) { T i; }
3127  A(0);
3128  A(0U);
3129functionDecl(isInstantiated())
3130  matches 'A(int) {...};' and 'A(unsigned) {...}'.
3131</pre></td></tr>
3132
3133
3134<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
3135<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations and C++ base specifers that specify private
3136inheritance.
3137
3138Examples:
3139  class C {
3140  public:    int a;
3141  protected: int b;
3142  private:   int c; // fieldDecl(isPrivate()) matches 'c'
3143  };
3144
3145  struct Base {};
3146  struct Derived1 : private Base {}; // matches 'Base'
3147  class Derived2 : Base {}; // matches 'Base'
3148</pre></td></tr>
3149
3150
3151<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
3152<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations and C++ base specifers that specify
3153protected inheritance.
3154
3155Examples:
3156  class C {
3157  public:    int a;
3158  protected: int b; // fieldDecl(isProtected()) matches 'b'
3159  private:   int c;
3160  };
3161
3162  class Base {};
3163  class Derived : protected Base {}; // matches 'Base'
3164</pre></td></tr>
3165
3166
3167<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
3168<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations and C++ base specifers that specify public
3169inheritance.
3170
3171Examples:
3172  class C {
3173  public:    int a; // fieldDecl(isPublic()) matches 'a'
3174  protected: int b;
3175  private:   int c;
3176  };
3177
3178  class Base {};
3179  class Derived1 : public Base {}; // matches 'Base'
3180  struct Derived2 : Base {}; // matches 'Base'
3181</pre></td></tr>
3182
3183
3184<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
3185<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
3186a specific number of designators.
3187
3188Example: Given
3189  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
3190  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
3191designatorCountIs(2)
3192  matches '{ [2].y = 1.0, [0].x = 1.0 }',
3193  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
3194</pre></td></tr>
3195
3196
3197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
3198<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
3199
3200Example matches Y (matcher = enumDecl(isScoped()))
3201enum X {};
3202enum class Y {};
3203</pre></td></tr>
3204
3205
3206<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
3207<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
3208neither type- nor value-dependent.
3209
3210In the following example, the expression sizeof(sizeof(T() + T()))
3211is instantiation-dependent (since it involves a template parameter T),
3212but is neither type- nor value-dependent, since the type of the inner
3213sizeof is known (std::size_t) and therefore the size of the outer
3214sizeof is known.
3215  template&lt;typename T&gt;
3216  void f(T x, T y) { sizeof(sizeof(T() + T()); }
3217expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
3218</pre></td></tr>
3219
3220
3221<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
3222<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
3223is not yet instantiated.
3224
3225For example, the expressions "x" and "x + y" are type-dependent in
3226the following code, but "y" is not type-dependent:
3227  template&lt;typename T&gt;
3228  void add(T x, int y) {
3229    x + y;
3230  }
3231expr(isTypeDependent()) matches x + y
3232</pre></td></tr>
3233
3234
3235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
3236<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3237non-type template parameter.
3238
3239For example, the array bound of "Chars" in the following example is
3240value-dependent.
3241  template&lt;int Size&gt; int f() { return Size; }
3242expr(isValueDependent()) matches return Size
3243</pre></td></tr>
3244
3245
3246<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3247<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3248GNU's __null, C++11's nullptr, or C's NULL macro.
3249
3250Given:
3251  void *v1 = NULL;
3252  void *v2 = nullptr;
3253  void *v3 = __null; // GNU extension
3254  char *cp = (char *)0;
3255  int *ip = 0;
3256  int i = 0;
3257expr(nullPointerConstant())
3258  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3259  initializer for i.
3260</pre></td></tr>
3261
3262
3263<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('hasBitWidth0')"><a name="hasBitWidth0Anchor">hasBitWidth</a></td><td>unsigned Width</td></tr>
3264<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3265bit width.
3266
3267Given
3268  class C {
3269    int a : 2;
3270    int b : 4;
3271    int c : 2;
3272  };
3273fieldDecl(hasBitWidth(2))
3274  matches 'int a;' and 'int c;' but not 'int b;'.
3275</pre></td></tr>
3276
3277
3278<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;</td><td class="name" onclick="toggle('isBitField0')"><a name="isBitField0Anchor">isBitField</a></td><td></td></tr>
3279<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3280
3281Given
3282  class C {
3283    int a : 2;
3284    int b;
3285  };
3286fieldDecl(isBitField())
3287  matches 'int a;' but not 'int b;'.
3288</pre></td></tr>
3289
3290
3291<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals1')"><a name="equals1Anchor">equals</a></td><td>const ValueT  Value</td></tr>
3292<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
3293
3294Given
3295  f('false, 3.14, 42);
3296characterLiteral(equals(0))
3297  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3298  match false
3299floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3300  match 3.14
3301integerLiteral(equals(42))
3302  matches 42
3303
3304Note that you cannot directly match a negative numeric literal because the
3305minus sign is not part of the literal: It is a unary operator whose operand
3306is the positive numeric literal. Instead, you must use a unaryOperator()
3307matcher to match the minus sign:
3308
3309unaryOperator(hasOperatorName("-"),
3310              hasUnaryOperand(integerLiteral(equals(13))))
3311
3312Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
3313           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
3314</pre></td></tr>
3315
3316
3317<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;</td><td class="name" onclick="toggle('equals12')"><a name="equals12Anchor">equals</a></td><td>double Value</td></tr>
3318<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3319
3320
3321<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasAnyOverloadedOperatorName1')"><a name="hasAnyOverloadedOperatorName1Anchor">hasAnyOverloadedOperatorName</a></td><td>StringRef, ..., StringRef</td></tr>
3322<tr><td colspan="4" class="doc" id="hasAnyOverloadedOperatorName1"><pre>Matches overloaded operator names.
3323
3324Matches overloaded operator names specified in strings without the
3325"operator" prefix: e.g. "&lt;&lt;".
3326
3327  hasAnyOverloadesOperatorName("+", "-")
3328Is equivalent to
3329  anyOf(hasOverloadedOperatorName("+"), hasOverloadedOperatorName("-"))
3330</pre></td></tr>
3331
3332
3333<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
3334<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3335
3336Given:
3337  void f();
3338  void g() noexcept;
3339  void h() noexcept(true);
3340  void i() noexcept(false);
3341  void j() throw();
3342  void k() throw(int);
3343  void l() throw(...);
3344functionDecl(hasDynamicExceptionSpec()) and
3345  functionProtoType(hasDynamicExceptionSpec())
3346  match the declarations of j, k, and l, but not f, g, h, or i.
3347</pre></td></tr>
3348
3349
3350<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName0')"><a name="hasOverloadedOperatorName0Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
3351<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3352
3353Matches overloaded operator names specified in strings without the
3354"operator" prefix: e.g. "&lt;&lt;".
3355
3356Given:
3357  class A { int operator*(); };
3358  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3359  A a;
3360  a &lt;&lt; a;   // &lt;-- This matches
3361
3362cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3363specified line and
3364cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3365matches the declaration of A.
3366
3367Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
3368</pre></td></tr>
3369
3370
3371<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasTrailingReturn0')"><a name="hasTrailingReturn0Anchor">hasTrailingReturn</a></td><td></td></tr>
3372<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3373
3374Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3375int X() {}
3376auto Y() -&gt; int {}
3377</pre></td></tr>
3378
3379
3380<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
3381<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3382       and if constexpr.
3383
3384Given:
3385  constexpr int foo = 42;
3386  constexpr int bar();
3387  void baz() { if constexpr(1 &gt; 0) {} }
3388varDecl(isConstexpr())
3389  matches the declaration of foo.
3390functionDecl(isConstexpr())
3391  matches the declaration of bar.
3392ifStmt(isConstexpr())
3393  matches the if statement in baz.
3394</pre></td></tr>
3395
3396
3397<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
3398<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3399
3400Given:
3401  class A { ~A(); };
3402  class B { ~B() = default; };
3403functionDecl(isDefaulted())
3404  matches the declaration of ~B, but not ~A.
3405</pre></td></tr>
3406
3407
3408<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
3409<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
3410
3411Example matches A, va, fa
3412  class A {};
3413  class B;  // Doesn't match, as it has no body.
3414  int va;
3415  extern int vb;  // Doesn't match, as it doesn't define the variable.
3416  void fa() {}
3417  void fb();  // Doesn't match, as it has no body.
3418  @interface X
3419  - (void)ma; // Doesn't match, interface is declaration.
3420  @end
3421  @implementation X
3422  - (void)ma {}
3423  @end
3424
3425Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;,
3426  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3427</pre></td></tr>
3428
3429
3430<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDeleted0')"><a name="isDeleted0Anchor">isDeleted</a></td><td></td></tr>
3431<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3432
3433Given:
3434  void Func();
3435  void DeletedFunc() = delete;
3436functionDecl(isDeleted())
3437  matches the declaration of DeletedFunc, but not Func.
3438</pre></td></tr>
3439
3440
3441<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization0')"><a name="isExplicitTemplateSpecialization0Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
3442<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3443static member variable template instantiations.
3444
3445Given
3446  template&lt;typename T&gt; void A(T t) { }
3447  template&lt;&gt; void A(int N) { }
3448functionDecl(isExplicitTemplateSpecialization())
3449  matches the specialization A&lt;int&gt;().
3450
3451Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3452</pre></td></tr>
3453
3454
3455<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
3456<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
3457
3458Given:
3459  extern "C" void f() {}
3460  extern "C" { void g() {} }
3461  void h() {}
3462  extern "C" int x = 1;
3463  extern "C" int y = 2;
3464  int z = 3;
3465functionDecl(isExternC())
3466  matches the declaration of f and g, but not the declaration of h.
3467varDecl(isExternC())
3468  matches the declaration of x and y, but not the declaration of z.
3469</pre></td></tr>
3470
3471
3472<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isInline1')"><a name="isInline1Anchor">isInline</a></td><td></td></tr>
3473<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3474the inline keyword.
3475
3476Given
3477  inline void f();
3478  void g();
3479  namespace n {
3480  inline namespace m {}
3481  }
3482functionDecl(isInline()) will match ::f().
3483namespaceDecl(isInline()) will match n::m.
3484</pre></td></tr>
3485
3486
3487<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isMain0')"><a name="isMain0Anchor">isMain</a></td><td></td></tr>
3488<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3489into an executable program.
3490</pre></td></tr>
3491
3492
3493<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoReturn0')"><a name="isNoReturn0Anchor">isNoReturn</a></td><td></td></tr>
3494<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3495
3496Given
3497  void nope();
3498  [[noreturn]] void a();
3499  __attribute__((noreturn)) void b();
3500  struct c { [[noreturn]] c(); };
3501functionDecl(isNoReturn())
3502  matches all of those except
3503  void nope();
3504</pre></td></tr>
3505
3506
3507<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
3508<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3509
3510Given:
3511  void f();
3512  void g() noexcept;
3513  void h() throw();
3514  void i() throw(int);
3515  void j() noexcept(false);
3516functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3517  match the declarations of g, and h, but not f, i or j.
3518</pre></td></tr>
3519
3520
3521<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isStaticStorageClass0')"><a name="isStaticStorageClass0Anchor">isStaticStorageClass</a></td><td></td></tr>
3522<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
3523class specifier ("static" keyword) written in the source.
3524
3525Given:
3526  static void f() {}
3527  static int i = 0;
3528  extern int j;
3529  int k;
3530functionDecl(isStaticStorageClass())
3531  matches the function declaration f.
3532varDecl(isStaticStorageClass())
3533  matches the variable declaration i.
3534</pre></td></tr>
3535
3536
3537<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation0')"><a name="isTemplateInstantiation0Anchor">isTemplateInstantiation</a></td><td></td></tr>
3538<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3539member variable template instantiations.
3540
3541Given
3542  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3543or
3544  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3545or
3546  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3547cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3548  matches the template instantiation of X&lt;A&gt;.
3549
3550But given
3551  template &lt;typename T&gt;  class X {}; class A {};
3552  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3553cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3554  does not match, as X&lt;A&gt; is an explicit template specialization.
3555
3556Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
3557</pre></td></tr>
3558
3559
3560<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isVariadic0')"><a name="isVariadic0Anchor">isVariadic</a></td><td></td></tr>
3561<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3562
3563Example matches f, but not g or h. The function i will not match, even when
3564compiled in C mode.
3565  void f(...);
3566  void g(int);
3567  template &lt;typename... Ts&gt; void h(Ts...);
3568  void i();
3569</pre></td></tr>
3570
3571
3572<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs0')"><a name="parameterCountIs0Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
3573<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3574specific parameter count.
3575
3576Given
3577  void f(int i) {}
3578  void g(int i, int j) {}
3579  void h(int i, int j);
3580  void j(int i);
3581  void k(int x, int y, int z, ...);
3582functionDecl(parameterCountIs(2))
3583  matches g and h
3584functionProtoType(parameterCountIs(2))
3585  matches g and h
3586functionProtoType(parameterCountIs(3))
3587  matches k
3588</pre></td></tr>
3589
3590
3591<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>
3592<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3593
3594Given:
3595  void f();
3596  void g() noexcept;
3597  void h() noexcept(true);
3598  void i() noexcept(false);
3599  void j() throw();
3600  void k() throw(int);
3601  void l() throw(...);
3602functionDecl(hasDynamicExceptionSpec()) and
3603  functionProtoType(hasDynamicExceptionSpec())
3604  match the declarations of j, k, and l, but not f, g, h, or i.
3605</pre></td></tr>
3606
3607
3608<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>
3609<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3610
3611Given:
3612  void f();
3613  void g() noexcept;
3614  void h() throw();
3615  void i() throw(int);
3616  void j() noexcept(false);
3617functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3618  match the declarations of g, and h, but not f, i or j.
3619</pre></td></tr>
3620
3621
3622<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>
3623<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3624specific parameter count.
3625
3626Given
3627  void f(int i) {}
3628  void g(int i, int j) {}
3629  void h(int i, int j);
3630  void j(int i);
3631  void k(int x, int y, int z, ...);
3632functionDecl(parameterCountIs(2))
3633  matches g and h
3634functionProtoType(parameterCountIs(2))
3635  matches g and h
3636functionProtoType(parameterCountIs(3))
3637  matches k
3638</pre></td></tr>
3639
3640
3641<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>
3642<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3643       and if constexpr.
3644
3645Given:
3646  constexpr int foo = 42;
3647  constexpr int bar();
3648  void baz() { if constexpr(1 &gt; 0) {} }
3649varDecl(isConstexpr())
3650  matches the declaration of foo.
3651functionDecl(isConstexpr())
3652  matches the declaration of bar.
3653ifStmt(isConstexpr())
3654  matches the if statement in baz.
3655</pre></td></tr>
3656
3657
3658<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>
3659<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3660
3661
3662<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>
3663<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3664
3665Given
3666  f('false, 3.14, 42);
3667characterLiteral(equals(0))
3668  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3669  match false
3670floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3671  match 3.14
3672integerLiteral(equals(42))
3673  matches 42
3674
3675Note that you cannot directly match a negative numeric literal because the
3676minus sign is not part of the literal: It is a unary operator whose operand
3677is the positive numeric literal. Instead, you must use a unaryOperator()
3678matcher to match the minus sign:
3679
3680unaryOperator(hasOperatorName("-"),
3681              hasUnaryOperand(integerLiteral(equals(13))))
3682
3683Usable 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;,
3684           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;
3685</pre></td></tr>
3686
3687
3688<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>
3689<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3690
3691
3692<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>
3693<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3694
3695
3696<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>
3697<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3698to '.'.
3699
3700Member calls on the implicit this pointer match as called with '-&gt;'.
3701
3702Given
3703  class Y {
3704    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3705    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3706    int a;
3707    static int b;
3708  };
3709  template &lt;class T&gt;
3710  class Z {
3711    void x() { this-&gt;m; }
3712  };
3713memberExpr(isArrow())
3714  matches this-&gt;x, x, y.x, a, this-&gt;b
3715cxxDependentScopeMemberExpr(isArrow())
3716  matches this-&gt;m
3717unresolvedMemberExpr(isArrow())
3718  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3719</pre></td></tr>
3720
3721
3722<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>
3723<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
3724
3725This matcher is only provided as a performance optimization of hasName.
3726    hasAnyName(a, b, c)
3727 is equivalent to, but faster than
3728    anyOf(hasName(a), hasName(b), hasName(c))
3729</pre></td></tr>
3730
3731
3732<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasExternalFormalLinkage0')"><a name="hasExternalFormalLinkage0Anchor">hasExternalFormalLinkage</a></td><td></td></tr>
3733<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3734
3735Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3736void f() {
3737  int x;
3738  static int y;
3739}
3740int z;
3741
3742Example matches f() because it has external formal linkage despite being
3743unique to the translation unit as though it has internal likage
3744(matcher = functionDecl(hasExternalFormalLinkage()))
3745
3746namespace {
3747void f() {}
3748}
3749</pre></td></tr>
3750
3751
3752<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>
3753<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3754
3755Supports specifying enclosing namespaces or classes by prefixing the name
3756with '&lt;enclosing&gt;::'.
3757Does not match typedefs of an underlying type with the given name.
3758
3759Example matches X (Name == "X")
3760  class X;
3761
3762Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3763  namespace a { namespace b { class X; } }
3764</pre></td></tr>
3765
3766
3767<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>
3768<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3769a substring matched by the given RegExp.
3770
3771Supports specifying enclosing namespaces or classes by
3772prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3773of an underlying type with the given name.
3774
3775Example matches X (regexp == "::X")
3776  class X;
3777
3778Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3779  namespace foo { namespace bar { class X; } }
3780
3781If the matcher is used in clang-query, RegexFlags parameter
3782should be passed as a quoted string. e.g: "NoFlags".
3783Flags can be combined with '|' example "IgnoreCase | BasicRegex"
3784</pre></td></tr>
3785
3786
3787<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>
3788<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3789
3790Given
3791  namespace n {
3792  namespace {} // #1
3793  }
3794namespaceDecl(isAnonymous()) will match #1 but not ::n.
3795</pre></td></tr>
3796
3797
3798<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;</td><td class="name" onclick="toggle('isInline0')"><a name="isInline0Anchor">isInline</a></td><td></td></tr>
3799<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3800the inline keyword.
3801
3802Given
3803  inline void f();
3804  void g();
3805  namespace n {
3806  inline namespace m {}
3807  }
3808functionDecl(isInline()) will match ::f().
3809namespaceDecl(isInline()) will match n::m.
3810</pre></td></tr>
3811
3812
3813<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>
3814<tr><td colspan="4" class="doc" id="isFirstPrivateKind0"><pre>Matches if the OpenMP ``default`` clause has ``firstprivate`` kind
3815specified.
3816
3817Given
3818
3819  #pragma omp parallel
3820  #pragma omp parallel default(none)
3821  #pragma omp parallel default(shared)
3822  #pragma omp parallel default(firstprivate)
3823
3824``ompDefaultClause(isFirstPrivateKind())`` matches only
3825``default(firstprivate)``.
3826</pre></td></tr>
3827
3828
3829<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>
3830<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3831
3832Given
3833
3834  #pragma omp parallel
3835  #pragma omp parallel default(none)
3836  #pragma omp parallel default(shared)
3837  #pragma omp parallel default(firstprivate)
3838
3839``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3840</pre></td></tr>
3841
3842
3843<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>
3844<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3845
3846Given
3847
3848  #pragma omp parallel
3849  #pragma omp parallel default(none)
3850  #pragma omp parallel default(shared)
3851  #pragma omp parallel default(firstprivate)
3852
3853``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3854</pre></td></tr>
3855
3856
3857<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>
3858<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3859clause kind.
3860
3861Given
3862
3863  #pragma omp parallel
3864  #pragma omp parallel for
3865  #pragma omp          for
3866
3867`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3868``omp parallel`` and ``omp parallel for``.
3869
3870If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3871should be passed as a quoted string. e.g.,
3872``isAllowedToContainClauseKind("OMPC_default").``
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('isStandaloneDirective0')"><a name="isStandaloneDirective0Anchor">isStandaloneDirective</a></td><td></td></tr>
3877<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3878i.e., directives that can't have a structured block.
3879
3880Given
3881
3882  #pragma omp parallel
3883  {}
3884  #pragma omp taskyield
3885
3886``ompExecutableDirective(isStandaloneDirective()))`` matches
3887``omp taskyield``.
3888</pre></td></tr>
3889
3890
3891<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>
3892<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3893</pre></td></tr>
3894
3895
3896<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>
3897<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3898</pre></td></tr>
3899
3900
3901<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>
3902<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
3903isSameOrDerivedFrom(hasName(...)).
3904</pre></td></tr>
3905
3906
3907<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3908<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3909a specific number of arguments (including absent default arguments).
3910
3911Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3912  void f(int x, int y);
3913  f(0, 0);
3914</pre></td></tr>
3915
3916
3917<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
3918<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
3919Selector.getAsString()
3920
3921 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
3922 matches both of the expressions below:
3923    [myObj methodA:argA];
3924    [myObj methodB:argB];
3925</pre></td></tr>
3926
3927
3928<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasKeywordSelector0')"><a name="hasKeywordSelector0Anchor">hasKeywordSelector</a></td><td></td></tr>
3929<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3930
3931objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3932message expression in
3933
3934  UIWebView *webView = ...;
3935  CGRect bodyFrame = webView.frame;
3936  bodyFrame.size.height = self.bodyContentHeight;
3937  webView.frame = bodyFrame;
3938  //     ^---- matches here
3939</pre></td></tr>
3940
3941
3942<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>
3943<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3944
3945Matches only when the selector of the objCMessageExpr is NULL. This may
3946represent an error condition in the tree!
3947</pre></td></tr>
3948
3949
3950<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>
3951<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3952
3953 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3954 matches the outer message expr in the code below, but NOT the message
3955 invocation for self.bodyView.
3956    [self.bodyView loadHTMLString:html baseURL:NULL];
3957</pre></td></tr>
3958
3959
3960<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>
3961<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3962
3963 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3964 matches self.bodyView in the code below, but NOT the outer message
3965 invocation of "loadHTMLString:baseURL:".
3966    [self.bodyView loadHTMLString:html baseURL:NULL];
3967</pre></td></tr>
3968
3969
3970<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>
3971<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3972
3973Example
3974matcher = objcMessageExpr(isClassMessage())
3975matches
3976  [NSString stringWithFormat:@"format"];
3977but not
3978  NSString *x = @"hello";
3979  [x containsString:@"h"];
3980</pre></td></tr>
3981
3982
3983<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>
3984<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3985
3986Example
3987matcher = objcMessageExpr(isInstanceMessage())
3988matches
3989  NSString *x = @"hello";
3990  [x containsString:@"h"];
3991but not
3992  [NSString stringWithFormat:@"format"];
3993</pre></td></tr>
3994
3995
3996<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>
3997<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3998a substring matched by the given RegExp.
3999 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
4000 invocation for self.bodyView.
4001    [self.bodyView loadHTMLString:html baseURL:NULL];
4002
4003If the matcher is used in clang-query, RegexFlags parameter
4004should be passed as a quoted string. e.g: "NoFlags".
4005Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4006</pre></td></tr>
4007
4008
4009<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>
4010<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
4011
4012 matcher = objCMessageExpr(numSelectorArgs(0));
4013 matches self.bodyView in the code below
4014
4015 matcher = objCMessageExpr(numSelectorArgs(2));
4016 matches the invocation of "loadHTMLString:baseURL:" but not that
4017 of self.bodyView
4018    [self.bodyView loadHTMLString:html baseURL:NULL];
4019</pre></td></tr>
4020
4021
4022<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>
4023<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
4024
4025Example
4026matcher = objcMethodDecl(isClassMethod())
4027matches
4028@interface I + (void)foo; @end
4029but not
4030@interface I - (void)bar; @end
4031</pre></td></tr>
4032
4033
4034<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>
4035<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
4036
4037Example matches A, va, fa
4038  class A {};
4039  class B;  // Doesn't match, as it has no body.
4040  int va;
4041  extern int vb;  // Doesn't match, as it doesn't define the variable.
4042  void fa() {}
4043  void fb();  // Doesn't match, as it has no body.
4044  @interface X
4045  - (void)ma; // Doesn't match, interface is declaration.
4046  @end
4047  @implementation X
4048  - (void)ma {}
4049  @end
4050
4051Usable 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;,
4052  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4053</pre></td></tr>
4054
4055
4056<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>
4057<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
4058
4059Example
4060matcher = objcMethodDecl(isInstanceMethod())
4061matches
4062@interface I - (void)bar; @end
4063but not
4064@interface I + (void)foo; @end
4065</pre></td></tr>
4066
4067
4068<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>
4069<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
4070
4071Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
4072void x(int val) {}
4073void y(int val = 0) {}
4074
4075Deprecated. Use hasInitializer() instead to be able to
4076match on the contents of the default argument.  For example:
4077
4078void x(int val = 7) {}
4079void y(int val = 42) {}
4080parmVarDecl(hasInitializer(integerLiteral(equals(42))))
4081  matches the parameter of y
4082
4083A matcher such as
4084  parmVarDecl(hasInitializer(anything()))
4085is equivalent to parmVarDecl(hasDefaultArgument()).
4086</pre></td></tr>
4087
4088
4089<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>
4090<tr><td colspan="4" class="doc" id="isAtPosition0"><pre>Matches the ParmVarDecl nodes that are at the N'th position in the parameter
4091list. The parameter list could be that of either a block, function, or
4092objc-method.
4093
4094
4095Given
4096
4097void f(int a, int b, int c) {
4098}
4099
4100``parmVarDecl(isAtPosition(0))`` matches ``int a``.
4101
4102``parmVarDecl(isAtPosition(1))`` matches ``int b``.
4103</pre></td></tr>
4104
4105
4106<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>
4107<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
4108
4109Given
4110  class Y { public: void x(); };
4111  void z() { Y* y; y-&gt;x(); }
4112cxxMemberCallExpr(on(hasType(asString("class Y *"))))
4113  matches y-&gt;x()
4114</pre></td></tr>
4115
4116
4117<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
4118<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
4119
4120Matches a node if it equals the node previously bound to ID.
4121
4122Given
4123  class X { int a; int b; };
4124cxxRecordDecl(
4125    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4126    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4127  matches the class X, as a and b have the same type.
4128
4129Note that when multiple matches are involved via forEach* matchers,
4130equalsBoundNodes acts as a filter.
4131For example:
4132compoundStmt(
4133    forEachDescendant(varDecl().bind("d")),
4134    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4135will trigger a match for each combination of variable declaration
4136and reference to that variable declaration within a compound statement.
4137</pre></td></tr>
4138
4139
4140<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>
4141<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
4142the node, not hidden within a typedef.
4143
4144Given
4145  typedef const int const_int;
4146  const_int i;
4147  int *const j;
4148  int *volatile k;
4149  int m;
4150varDecl(hasType(hasLocalQualifiers())) matches only j and k.
4151i is const-qualified but the qualifier is not local.
4152</pre></td></tr>
4153
4154
4155<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>
4156<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
4157
4158Given
4159  void a(char);
4160  void b(wchar_t);
4161  void c(double);
4162functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
4163matches "a(char)", "b(wchar_t)", but not "c(double)".
4164</pre></td></tr>
4165
4166
4167<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>
4168<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
4169the Objective-C object pointer type, which is different despite being
4170syntactically similar.
4171
4172Given
4173  int *i = nullptr;
4174
4175  @interface Foo
4176  @end
4177  Foo *f;
4178
4179  int j;
4180varDecl(hasType(isAnyPointer()))
4181  matches "int *i" and "Foo *f", but not "int j".
4182</pre></td></tr>
4183
4184
4185<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isConstQualified0')"><a name="isConstQualified0Anchor">isConstQualified</a></td><td></td></tr>
4186<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
4187include "top-level" const.
4188
4189Given
4190  void a(int);
4191  void b(int const);
4192  void c(const int);
4193  void d(const int*);
4194  void e(int const) {};
4195functionDecl(hasAnyParameter(hasType(isConstQualified())))
4196  matches "void b(int const)", "void c(const int)" and
4197  "void e(int const) {}". It does not match d as there
4198  is no top-level const on the parameter type "const int *".
4199</pre></td></tr>
4200
4201
4202<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>
4203<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
4204
4205Given
4206  void a(int);
4207  void b(long);
4208  void c(double);
4209functionDecl(hasAnyParameter(hasType(isInteger())))
4210matches "a(int)", "b(long)", but not "c(double)".
4211</pre></td></tr>
4212
4213
4214<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>
4215<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
4216
4217Given
4218  void a(int);
4219  void b(unsigned long);
4220  void c(double);
4221functionDecl(hasAnyParameter(hasType(isSignedInteger())))
4222matches "a(int)", but not "b(unsigned long)" and "c(double)".
4223</pre></td></tr>
4224
4225
4226<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>
4227<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
4228
4229Given
4230  void a(int);
4231  void b(unsigned long);
4232  void c(double);
4233functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
4234matches "b(unsigned long)", but not "a(int)" and "c(double)".
4235</pre></td></tr>
4236
4237
4238<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>
4239<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
4240include "top-level" volatile.
4241
4242Given
4243  void a(int);
4244  void b(int volatile);
4245  void c(volatile int);
4246  void d(volatile int*);
4247  void e(int volatile) {};
4248functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
4249  matches "void b(int volatile)", "void c(volatile int)" and
4250  "void e(int volatile) {}". It does not match d as there
4251  is no top-level volatile on the parameter type "volatile int *".
4252</pre></td></tr>
4253
4254
4255<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>
4256<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
4257
4258Matches a node if it equals the node previously bound to ID.
4259
4260Given
4261  class X { int a; int b; };
4262cxxRecordDecl(
4263    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4264    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4265  matches the class X, as a and b have the same type.
4266
4267Note that when multiple matches are involved via forEach* matchers,
4268equalsBoundNodes acts as a filter.
4269For example:
4270compoundStmt(
4271    forEachDescendant(varDecl().bind("d")),
4272    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4273will trigger a match for each combination of variable declaration
4274and reference to that variable declaration within a compound statement.
4275</pre></td></tr>
4276
4277
4278<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>
4279<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
4280
4281Stmt has pointer identity in the AST.
4282</pre></td></tr>
4283
4284
4285<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpandedFromMacro0')"><a name="isExpandedFromMacro0Anchor">isExpandedFromMacro</a></td><td>llvm::StringRef MacroName</td></tr>
4286<tr><td colspan="4" class="doc" id="isExpandedFromMacro0"><pre>Matches statements that are (transitively) expanded from the named macro.
4287Does not match if only part of the statement is expanded from that macro or
4288if different parts of the the statement are expanded from different
4289appearances of the macro.
4290
4291FIXME: Change to be a polymorphic matcher that works on any syntactic
4292node. There's nothing `Stmt`-specific about it.
4293</pre></td></tr>
4294
4295
4296<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>StringRef RegExp, Regex::RegexFlags Flags = NoFlags</td></tr>
4297<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
4298partially matching a given regex.
4299
4300Example matches Y but not X
4301    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4302  #include "ASTMatcher.h"
4303  class X {};
4304ASTMatcher.h:
4305  class Y {};
4306
4307Usable 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;
4308
4309If the matcher is used in clang-query, RegexFlags parameter
4310should be passed as a quoted string. e.g: "NoFlags".
4311Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4312</pre></td></tr>
4313
4314
4315<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>
4316<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
4317
4318Example matches X but not Y
4319  (matcher = cxxRecordDecl(isExpansionInMainFile())
4320  #include &lt;Y.h&gt;
4321  class X {};
4322Y.h:
4323  class Y {};
4324
4325Usable 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;
4326</pre></td></tr>
4327
4328
4329<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>
4330<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
4331
4332Example matches Y but not X
4333    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4334  #include &lt;SystemHeader.h&gt;
4335  class X {};
4336SystemHeader.h:
4337  class Y {};
4338
4339Usable 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;
4340</pre></td></tr>
4341
4342
4343<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>
4344<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4345
4346Given
4347  int j;
4348  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4349  A(0);
4350  A(0U);
4351declStmt(isInTemplateInstantiation())
4352  matches 'int i;' and 'unsigned i'.
4353unless(stmt(isInTemplateInstantiation()))
4354  will NOT match j += 42; as it's shared between the template definition and
4355  instantiation.
4356</pre></td></tr>
4357
4358
4359<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>
4360<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4361
4362Given
4363  int a[42];
4364  int b[2 * 21];
4365  int c[41], d[43];
4366  char *s = "abcd";
4367  wchar_t *ws = L"abcd";
4368  char *w = "a";
4369constantArrayType(hasSize(42))
4370  matches "int a[42]" and "int b[2 * 21]"
4371stringLiteral(hasSize(4))
4372  matches "abcd", L"abcd"
4373</pre></td></tr>
4374
4375
4376<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>
4377<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
4378
4379Example matches C, but not S, U or E.
4380  struct S {};
4381  class C {};
4382  union U {};
4383  enum E {};
4384</pre></td></tr>
4385
4386
4387<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
4388<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4389
4390Example matches A, va, fa
4391  class A {};
4392  class B;  // Doesn't match, as it has no body.
4393  int va;
4394  extern int vb;  // Doesn't match, as it doesn't define the variable.
4395  void fa() {}
4396  void fb();  // Doesn't match, as it has no body.
4397  @interface X
4398  - (void)ma; // Doesn't match, interface is declaration.
4399  @end
4400  @implementation X
4401  - (void)ma {}
4402  @end
4403
4404Usable 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;,
4405  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4406</pre></td></tr>
4407
4408
4409<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>
4410<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
4411
4412Example matches E, but not C, S or U.
4413  struct S {};
4414  class C {};
4415  union U {};
4416  enum E {};
4417</pre></td></tr>
4418
4419
4420<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
4421<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
4422
4423Example matches S, but not C, U or E.
4424  struct S {};
4425  class C {};
4426  union U {};
4427  enum E {};
4428</pre></td></tr>
4429
4430
4431<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
4432<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
4433
4434Example matches U, but not C, S or E.
4435  struct S {};
4436  class C {};
4437  union U {};
4438  enum E {};
4439</pre></td></tr>
4440
4441
4442<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('equalsIntegralValue0')"><a name="equalsIntegralValue0Anchor">equalsIntegralValue</a></td><td>std::string Value</td></tr>
4443<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4444
4445Note that 'Value' is a string as the template argument's value is
4446an arbitrary precision integer. 'Value' must be euqal to the canonical
4447representation of that integral value in base 10.
4448
4449Given
4450  template&lt;int T&gt; struct C {};
4451  C&lt;42&gt; c;
4452classTemplateSpecializationDecl(
4453  hasAnyTemplateArgument(equalsIntegralValue("42")))
4454  matches the implicit instantiation of C in C&lt;42&gt;.
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('isIntegral0')"><a name="isIntegral0Anchor">isIntegral</a></td><td></td></tr>
4459<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4460
4461Given
4462  template&lt;int T&gt; struct C {};
4463  C&lt;42&gt; c;
4464classTemplateSpecializationDecl(
4465  hasAnyTemplateArgument(isIntegral()))
4466  matches the implicit instantiation of C in C&lt;42&gt;
4467  with isIntegral() matching 42.
4468</pre></td></tr>
4469
4470
4471<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>
4472<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4473
4474Given
4475  template&lt;typename T&gt; struct C {};
4476  C&lt;int&gt; c;
4477classTemplateSpecializationDecl(templateArgumentCountIs(1))
4478  matches C&lt;int&gt;.
4479</pre></td></tr>
4480
4481
4482<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>
4483<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4484partially matching a given regex.
4485
4486Example matches Y but not X
4487    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4488  #include "ASTMatcher.h"
4489  class X {};
4490ASTMatcher.h:
4491  class Y {};
4492
4493Usable 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;
4494
4495If the matcher is used in clang-query, RegexFlags parameter
4496should be passed as a quoted string. e.g: "NoFlags".
4497Flags can be combined with '|' example "IgnoreCase | BasicRegex"
4498</pre></td></tr>
4499
4500
4501<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>
4502<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4503
4504Example matches X but not Y
4505  (matcher = cxxRecordDecl(isExpansionInMainFile())
4506  #include &lt;Y.h&gt;
4507  class X {};
4508Y.h:
4509  class Y {};
4510
4511Usable 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;
4512</pre></td></tr>
4513
4514
4515<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>
4516<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4517
4518Example matches Y but not X
4519    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4520  #include &lt;SystemHeader.h&gt;
4521  class X {};
4522SystemHeader.h:
4523  class Y {};
4524
4525Usable 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;
4526</pre></td></tr>
4527
4528
4529<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>
4530<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4531
4532Given
4533 struct S { bool func(); };
4534functionDecl(returns(booleanType()))
4535  matches "bool func();"
4536</pre></td></tr>
4537
4538
4539<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>
4540<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4541
4542Matches a node if it equals the node previously bound to ID.
4543
4544Given
4545  class X { int a; int b; };
4546cxxRecordDecl(
4547    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4548    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4549  matches the class X, as a and b have the same type.
4550
4551Note that when multiple matches are involved via forEach* matchers,
4552equalsBoundNodes acts as a filter.
4553For example:
4554compoundStmt(
4555    forEachDescendant(varDecl().bind("d")),
4556    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4557will trigger a match for each combination of variable declaration
4558and reference to that variable declaration within a compound statement.
4559</pre></td></tr>
4560
4561
4562<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>
4563<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4564
4565Type has pointer identity in the AST.
4566</pre></td></tr>
4567
4568
4569<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>
4570<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4571
4572Given
4573  int i;
4574  float f;
4575realFloatingPointType()
4576  matches "float f" but not "int i"
4577</pre></td></tr>
4578
4579
4580<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
4581<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4582
4583Given
4584 struct S { void func(); };
4585functionDecl(returns(voidType()))
4586  matches "void func();"
4587</pre></td></tr>
4588
4589
4590<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>
4591<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4592
4593Given
4594  int x;
4595  int s = sizeof(x) + alignof(x)
4596unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4597  matches sizeof(x)
4598
4599If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4600should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4601</pre></td></tr>
4602
4603
4604<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>
4605<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
4606specified names.
4607
4608   hasAnyOperatorName("+", "-")
4609 Is equivalent to
4610   anyOf(hasOperatorName("+"), hasOperatorName("-"))
4611</pre></td></tr>
4612
4613
4614<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>
4615<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4616unary).
4617
4618Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4619  !(a || b)
4620</pre></td></tr>
4621
4622
4623<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>
4624<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4625to '.'.
4626
4627Member calls on the implicit this pointer match as called with '-&gt;'.
4628
4629Given
4630  class Y {
4631    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4632    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4633    int a;
4634    static int b;
4635  };
4636  template &lt;class T&gt;
4637  class Z {
4638    void x() { this-&gt;m; }
4639  };
4640memberExpr(isArrow())
4641  matches this-&gt;x, x, y.x, a, this-&gt;b
4642cxxDependentScopeMemberExpr(isArrow())
4643  matches this-&gt;m
4644unresolvedMemberExpr(isArrow())
4645  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4646</pre></td></tr>
4647
4648
4649<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>
4650<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4651
4652Example matches x, but not y, z, or a.
4653(matcher = varDecl(hasAutomaticStorageDuration())
4654void f() {
4655  int x;
4656  static int y;
4657  thread_local int z;
4658}
4659int a;
4660</pre></td></tr>
4661
4662
4663<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>
4664<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4665
4666Example matches y and z (matcher = varDecl(hasGlobalStorage())
4667void f() {
4668  int x;
4669  static int y;
4670}
4671int z;
4672</pre></td></tr>
4673
4674
4675<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>
4676<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4677non-static local variable.
4678
4679Example matches x (matcher = varDecl(hasLocalStorage())
4680void f() {
4681  int x;
4682  static int y;
4683}
4684int z;
4685</pre></td></tr>
4686
4687
4688<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>
4689<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4690It includes the variable declared at namespace scope and those declared
4691with "static" and "extern" storage class specifiers.
4692
4693void f() {
4694  int x;
4695  static int y;
4696  thread_local int z;
4697}
4698int a;
4699static int b;
4700extern int c;
4701varDecl(hasStaticStorageDuration())
4702  matches the function declaration y, a, b and c.
4703</pre></td></tr>
4704
4705
4706<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
4707<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4708
4709Example matches z, but not x, z, or a.
4710(matcher = varDecl(hasThreadStorageDuration())
4711void f() {
4712  int x;
4713  static int y;
4714  thread_local int z;
4715}
4716int a;
4717</pre></td></tr>
4718
4719
4720<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>
4721<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4722       and if constexpr.
4723
4724Given:
4725  constexpr int foo = 42;
4726  constexpr int bar();
4727  void baz() { if constexpr(1 &gt; 0) {} }
4728varDecl(isConstexpr())
4729  matches the declaration of foo.
4730functionDecl(isConstexpr())
4731  matches the declaration of bar.
4732ifStmt(isConstexpr())
4733  matches the if statement in baz.
4734</pre></td></tr>
4735
4736
4737<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>
4738<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4739
4740Example matches A, va, fa
4741  class A {};
4742  class B;  // Doesn't match, as it has no body.
4743  int va;
4744  extern int vb;  // Doesn't match, as it doesn't define the variable.
4745  void fa() {}
4746  void fb();  // Doesn't match, as it has no body.
4747  @interface X
4748  - (void)ma; // Doesn't match, interface is declaration.
4749  @end
4750  @implementation X
4751  - (void)ma {}
4752  @end
4753
4754Usable 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;,
4755  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4756</pre></td></tr>
4757
4758
4759<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>
4760<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4761a C++ catch block, or an Objective-C statement.
4762
4763Example matches x (matcher = varDecl(isExceptionVariable())
4764void f(int y) {
4765  try {
4766  } catch (int x) {
4767  }
4768}
4769</pre></td></tr>
4770
4771
4772<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>
4773<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4774static member variable template instantiations.
4775
4776Given
4777  template&lt;typename T&gt; void A(T t) { }
4778  template&lt;&gt; void A(int N) { }
4779functionDecl(isExplicitTemplateSpecialization())
4780  matches the specialization A&lt;int&gt;().
4781
4782Usable 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;
4783</pre></td></tr>
4784
4785
4786<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>
4787<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4788
4789Given:
4790  extern "C" void f() {}
4791  extern "C" { void g() {} }
4792  void h() {}
4793  extern "C" int x = 1;
4794  extern "C" int y = 2;
4795  int z = 3;
4796functionDecl(isExternC())
4797  matches the declaration of f and g, but not the declaration of h.
4798varDecl(isExternC())
4799  matches the declaration of x and y, but not the declaration of z.
4800</pre></td></tr>
4801
4802
4803<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>
4804<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4805
4806Example matches y (matcher = varDecl(isStaticLocal()))
4807void f() {
4808  int x;
4809  static int y;
4810}
4811static int z;
4812</pre></td></tr>
4813
4814
4815<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>
4816<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4817class specifier ("static" keyword) written in the source.
4818
4819Given:
4820  static void f() {}
4821  static int i = 0;
4822  extern int j;
4823  int k;
4824functionDecl(isStaticStorageClass())
4825  matches the function declaration f.
4826varDecl(isStaticStorageClass())
4827  matches the variable declaration i.
4828</pre></td></tr>
4829
4830
4831<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>
4832<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4833member variable template instantiations.
4834
4835Given
4836  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4837or
4838  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4839or
4840  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4841cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4842  matches the template instantiation of X&lt;A&gt;.
4843
4844But given
4845  template &lt;typename T&gt;  class X {}; class A {};
4846  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4847cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4848  does not match, as X&lt;A&gt; is an explicit template specialization.
4849
4850Usable 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;
4851</pre></td></tr>
4852
4853<!--END_NARROWING_MATCHERS -->
4854</table>
4855
4856<!-- ======================================================================= -->
4857<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4858<!-- ======================================================================= -->
4859
4860<p>Traversal matchers specify the relationship to other nodes that are
4861reachable from the current node.</p>
4862
4863<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4864forEachDescendant) which work on all nodes and allow users to write more generic
4865match expressions.</p>
4866
4867<table>
4868<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4869<!-- START_TRAVERSAL_MATCHERS -->
4870
4871<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>
4872<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4873
4874Unlike anyOf, eachOf will generate a match result for each
4875matching submatcher.
4876
4877For example, in:
4878  class A { int a; int b; };
4879The matcher:
4880  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4881                       has(fieldDecl(hasName("b")).bind("v"))))
4882will generate two results binding "v", the first of which binds
4883the field declaration of a, the second the field declaration of
4884b.
4885
4886Usable as: Any Matcher
4887</pre></td></tr>
4888
4889
4890<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>
4891<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
4892
4893Generates results for each match.
4894
4895For example, in:
4896  class A { class B {}; class C {}; };
4897The matcher:
4898  cxxRecordDecl(hasName("::A"),
4899                findAll(cxxRecordDecl(isDefinition()).bind("m")))
4900will generate results for A, B and C.
4901
4902Usable as: Any Matcher
4903</pre></td></tr>
4904
4905
4906<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4907<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4908provided matcher.
4909
4910Example matches X, A, A::X, B, B::C, B::C::X
4911  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4912  class X {};
4913  class A { class X {}; };  // Matches A, because A::X is a class of name
4914                            // X inside A.
4915  class B { class C { class X {}; }; };
4916
4917DescendantT must be an AST base type.
4918
4919As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4920each result that matches instead of only on the first one.
4921
4922Note: Recursively combined ForEachDescendant can cause many matches:
4923  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4924    forEachDescendant(cxxRecordDecl())
4925  )))
4926will match 10 times (plus injected class name matches) on:
4927  class A { class B { class C { class D { class E {}; }; }; }; };
4928
4929Usable as: Any Matcher
4930</pre></td></tr>
4931
4932
4933<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4934<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4935provided matcher.
4936
4937Example matches X, Y, Y::X, Z::Y, Z::Y::X
4938  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4939  class X {};
4940  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
4941                            // inside Y.
4942  class Z { class Y { class X {}; }; };  // Does not match Z.
4943
4944ChildT must be an AST base type.
4945
4946As opposed to 'has', 'forEach' will cause a match for each result that
4947matches instead of only on the first one.
4948
4949Usable as: Any Matcher
4950</pre></td></tr>
4951
4952
4953<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4954<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4955matcher.
4956
4957Given
4958void f() { if (true) { int x = 42; } }
4959void g() { for (;;) { int x = 43; } }
4960expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4961
4962Usable as: Any Matcher
4963</pre></td></tr>
4964
4965
4966<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4967<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4968provided matcher.
4969
4970Example matches X, Y, Z
4971    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4972  class X {};  // Matches X, because X::X is a class of name X inside X.
4973  class Y { class X {}; };
4974  class Z { class Y { class X {}; }; };
4975
4976DescendantT must be an AST base type.
4977
4978Usable as: Any Matcher
4979</pre></td></tr>
4980
4981
4982<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4983<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4984provided matcher.
4985
4986Example matches X, Y
4987  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4988  class X {};  // Matches X, because X::X is a class of name X inside X.
4989  class Y { class X {}; };
4990  class Z { class Y { class X {}; }; };  // Does not match Z.
4991
4992ChildT must be an AST base type.
4993
4994Usable as: Any Matcher
4995Note that has is direct matcher, so it also matches things like implicit
4996casts and paren casts. If you are matching with expr then you should
4997probably consider using ignoringParenImpCasts like:
4998has(ignoringParenImpCasts(expr())).
4999</pre></td></tr>
5000
5001
5002<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
5003<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
5004matcher.
5005
5006Given
5007void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
5008compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
5009
5010Usable as: Any Matcher
5011</pre></td></tr>
5012
5013
5014<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
5015<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
5016
5017However, optionally will retain any bindings generated by the submatcher.
5018Useful when additional information which may or may not present about a main
5019matching node is desired.
5020
5021For example, in:
5022  class Foo {
5023    int bar;
5024  }
5025The matcher:
5026  cxxRecordDecl(
5027    optionally(has(
5028      fieldDecl(hasName("bar")).bind("var")
5029  ))).bind("record")
5030will produce a result binding for both "record" and "var".
5031The matcher will produce a "record" binding for even if there is no data
5032member named "bar" in that class.
5033
5034Usable as: Any Matcher
5035</pre></td></tr>
5036
5037
5038<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>
5039<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
5040
5041Given
5042  void foo()
5043  {
5044      int i = 3.0;
5045  }
5046The matcher
5047  traverse(TK_IgnoreImplicitCastsAndParentheses,
5048    varDecl(hasInitializer(floatLiteral().bind("init")))
5049  )
5050matches the variable declaration with "init" bound to the "3.0".
5051</pre></td></tr>
5052
5053
5054<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>
5055<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
5056switch statement or conditional operator.
5057
5058Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5059  if (true) {}
5060</pre></td></tr>
5061
5062
5063<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>
5064<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
5065(binary or ternary).
5066
5067Example matches b
5068  condition ? a : b
5069  condition ?: b
5070</pre></td></tr>
5071
5072
5073<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>
5074<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
5075
5076Example 1 (conditional ternary operator): matches a
5077  condition ? a : b
5078
5079Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
5080  condition ?: b
5081</pre></td></tr>
5082
5083
5084<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>
5085<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
5086matches the given matcher.
5087
5088The associated declaration is:
5089- for type nodes, the declaration of the underlying type
5090- for CallExpr, the declaration of the callee
5091- for MemberExpr, the declaration of the referenced member
5092- for CXXConstructExpr, the declaration of the constructor
5093- for CXXNewExpr, the declaration of the operator new
5094- for ObjCIvarExpr, the declaration of the ivar
5095
5096For type nodes, hasDeclaration will generally match the declaration of the
5097sugared type. Given
5098  class X {};
5099  typedef X Y;
5100  Y y;
5101in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5102typedefDecl. A common use case is to match the underlying, desugared type.
5103This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5104  varDecl(hasType(hasUnqualifiedDesugaredType(
5105      recordType(hasDeclaration(decl())))))
5106In this matcher, the decl will match the CXXRecordDecl of class X.
5107
5108Usable 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;,
5109  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;,
5110  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;,
5111  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;,
5112  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;,
5113  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;,
5114  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5115</pre></td></tr>
5116
5117
5118<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>
5119<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
5120
5121Given
5122  int i[5];
5123  void f() { i[1] = 42; }
5124arraySubscriptExpression(hasBase(implicitCastExpr(
5125    hasSourceExpression(declRefExpr()))))
5126  matches i[1] with the declRefExpr() matching i
5127</pre></td></tr>
5128
5129
5130<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>
5131<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
5132
5133Given
5134  int i[5];
5135  void f() { i[1] = 42; }
5136arraySubscriptExpression(hasIndex(integerLiteral()))
5137  matches i[1] with the integerLiteral() matching 1
5138</pre></td></tr>
5139
5140
5141<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('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>
5142<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
5143
5144Example matches a (matcher = binaryOperator(hasLHS()))
5145  a || b
5146</pre></td></tr>
5147
5148
5149<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>
5150<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
5151
5152Example matches b (matcher = binaryOperator(hasRHS()))
5153  a || b
5154</pre></td></tr>
5155
5156
5157<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>
5158<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
5159type.
5160
5161Given
5162  struct A {};
5163  A a[7];
5164  int b[7];
5165arrayType(hasElementType(builtinType()))
5166  matches "int b[7]"
5167
5168Usable 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;
5169</pre></td></tr>
5170
5171
5172<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>
5173<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
5174
5175Given
5176  _Atomic(int) i;
5177  _Atomic(float) f;
5178atomicType(hasValueType(isInteger()))
5179 matches "_Atomic(int) i"
5180
5181Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
5182</pre></td></tr>
5183
5184
5185<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>
5186<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
5187
5188Note: There is no TypeLoc for the deduced type and thus no
5189getDeducedLoc() matcher.
5190
5191Given
5192  auto a = 1;
5193  auto b = 2.0;
5194autoType(hasDeducedType(isInteger()))
5195  matches "auto a"
5196
5197Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
5198</pre></td></tr>
5199
5200
5201<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>
5202<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
5203binary operator matches.
5204</pre></td></tr>
5205
5206
5207<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>
5208<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
5209
5210Example matches a (matcher = binaryOperator(hasLHS()))
5211  a || b
5212</pre></td></tr>
5213
5214
5215<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>
5216<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
5217
5218Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
5219                                             integerLiteral(equals(2)))
5220  1 + 2 // Match
5221  2 + 1 // Match
5222  1 + 1 // No match
5223  2 + 2 // No match
5224</pre></td></tr>
5225
5226
5227<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>
5228<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
5229
5230Example matches b (matcher = binaryOperator(hasRHS()))
5231  a || b
5232</pre></td></tr>
5233
5234
5235<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>
5236<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
5237block.
5238
5239Does not match the 'this' parameter of a method.
5240
5241Given
5242  class X { void f(int x, int y, int z) {} };
5243cxxMethodDecl(hasAnyParameter(hasName("y")))
5244  matches f(int x, int y, int z) {}
5245with hasAnyParameter(...)
5246  matching int y
5247
5248For ObjectiveC, given
5249  @interface I - (void) f:(int) y; @end
5250
5251the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5252matches the declaration of method f with hasParameter
5253matching y.
5254
5255For blocks, given
5256  b = ^(int y) { printf("%d", y) };
5257
5258the matcher blockDecl(hasAnyParameter(hasName("y")))
5259matches the declaration of the block b with hasParameter
5260matching y.
5261</pre></td></tr>
5262
5263
5264<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>
5265<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
5266declaration or a block.
5267
5268Given
5269  class X { void f(int x) {} };
5270cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5271  matches f(int x) {}
5272with hasParameter(...)
5273  matching int x
5274
5275For ObjectiveC, given
5276  @interface I - (void) f:(int) y; @end
5277
5278the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5279matches the declaration of method f with hasParameter
5280matching y.
5281</pre></td></tr>
5282
5283
5284<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>
5285<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
5286pointee matches a given matcher.
5287
5288Given
5289  int *a;
5290  int const *b;
5291  float const *f;
5292pointerType(pointee(isConstQualified(), isInteger()))
5293  matches "int const *b"
5294
5295Usable 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;,
5296  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;
5297</pre></td></tr>
5298
5299
5300<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>
5301<tr><td colspan="4" class="doc" id="hasType7"><pre>Overloaded to match the declaration of the expression's or value
5302declaration's type.
5303
5304In case of a value declaration (for example a variable declaration),
5305this resolves one layer of indirection. For example, in the value
5306declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5307X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5308declaration of x.
5309
5310Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5311            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5312            and friend class X (matcher = friendDecl(hasType("X"))
5313 class X {};
5314 void y(X &amp;x) { x; X z; }
5315 class Y { friend class X; };
5316
5317Example matches class Derived
5318(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
5319class Base {};
5320class Derived : Base {};
5321
5322Usable 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;,
5323Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
5324</pre></td></tr>
5325
5326
5327<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>
5328<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
5329
5330Given
5331  void f(int i);
5332  int y;
5333  f(y);
5334callExpr(
5335  forEachArgumentWithParam(
5336    declRefExpr(to(varDecl(hasName("y")))),
5337    parmVarDecl(hasType(isInteger()))
5338))
5339  matches f(y);
5340with declRefExpr(...)
5341  matching int y
5342and parmVarDecl(...)
5343  matching int i
5344</pre></td></tr>
5345
5346
5347<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>
5348<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType1"><pre>Matches all arguments and their respective types for a CallExpr or
5349CXXConstructExpr. It is very similar to forEachArgumentWithParam but
5350it works on calls through function pointers as well.
5351
5352The difference is, that function pointers do not provide access to a
5353ParmVarDecl, but only the QualType for each argument.
5354
5355Given
5356  void f(int i);
5357  int y;
5358  f(y);
5359  void (*f_ptr)(int) = f;
5360  f_ptr(y);
5361callExpr(
5362  forEachArgumentWithParamType(
5363    declRefExpr(to(varDecl(hasName("y")))),
5364    qualType(isInteger()).bind("type)
5365))
5366  matches f(y) and f_ptr(y)
5367with declRefExpr(...)
5368  matching int y
5369and qualType(...)
5370  matching int
5371</pre></td></tr>
5372
5373
5374<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>
5375<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
5376expression, or an ObjC-message-send expression.
5377
5378Given
5379  void x(int, int, int) { int y; x(1, y, 42); }
5380callExpr(hasAnyArgument(declRefExpr()))
5381  matches x(1, y, 42)
5382with hasAnyArgument(...)
5383  matching y
5384
5385For ObjectiveC, given
5386  @interface I - (void) f:(int) y; @end
5387  void foo(I *i) { [i f:12]; }
5388objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5389  matches [i f:12]
5390</pre></td></tr>
5391
5392
5393<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>
5394<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
5395call expression.
5396
5397Example matches y in x(y)
5398    (matcher = callExpr(hasArgument(0, declRefExpr())))
5399  void x(int) { int y; x(y); }
5400</pre></td></tr>
5401
5402
5403<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('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>
5404<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
5405matches the given matcher.
5406
5407The associated declaration is:
5408- for type nodes, the declaration of the underlying type
5409- for CallExpr, the declaration of the callee
5410- for MemberExpr, the declaration of the referenced member
5411- for CXXConstructExpr, the declaration of the constructor
5412- for CXXNewExpr, the declaration of the operator new
5413- for ObjCIvarExpr, the declaration of the ivar
5414
5415For type nodes, hasDeclaration will generally match the declaration of the
5416sugared type. Given
5417  class X {};
5418  typedef X Y;
5419  Y y;
5420in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5421typedefDecl. A common use case is to match the underlying, desugared type.
5422This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5423  varDecl(hasType(hasUnqualifiedDesugaredType(
5424      recordType(hasDeclaration(decl())))))
5425In this matcher, the decl will match the CXXRecordDecl of class X.
5426
5427Usable 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;,
5428  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;,
5429  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;,
5430  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;,
5431  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;,
5432  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;,
5433  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5434</pre></td></tr>
5435
5436
5437<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>
5438<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
5439
5440Given
5441  class A { A() : i(42), j(42) {} int i; int j; };
5442cxxConstructorDecl(forEachConstructorInitializer(
5443  forField(decl().bind("x"))
5444))
5445  will trigger two matches, binding for 'i' and 'j' respectively.
5446</pre></td></tr>
5447
5448
5449<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>
5450<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
5451
5452Given
5453  struct Foo {
5454    Foo() : foo_(1) { }
5455    int foo_;
5456  };
5457cxxRecordDecl(has(cxxConstructorDecl(
5458  hasAnyConstructorInitializer(anything())
5459)))
5460  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5461</pre></td></tr>
5462
5463
5464<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>
5465<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5466
5467Given
5468  struct Foo {
5469    Foo() : foo_(1) { }
5470    int foo_;
5471  };
5472cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5473    forField(hasName("foo_"))))))
5474  matches Foo
5475with forField matching foo_
5476</pre></td></tr>
5477
5478
5479<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>
5480<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5481
5482Given
5483  struct Foo {
5484    Foo() : foo_(1) { }
5485    int foo_;
5486  };
5487cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5488    withInitializer(integerLiteral(equals(1)))))))
5489  matches Foo
5490with withInitializer matching (1)
5491</pre></td></tr>
5492
5493
5494<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>
5495<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5496given matcher. Implicit object expressions are included; that is, it matches
5497use of implicit `this`.
5498
5499Given
5500  struct X {
5501    int m;
5502    int f(X x) { x.m; return m; }
5503  };
5504memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5505  matches `x.m`, but not `m`; however,
5506memberExpr(hasObjectExpression(hasType(pointsTo(
5507     cxxRecordDecl(hasName("X"))))))
5508  matches `m` (aka. `this-&gt;m`), but not `x.m`.
5509</pre></td></tr>
5510
5511
5512<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>
5513<tr><td colspan="4" class="doc" id="hasBody3"><pre></pre></td></tr>
5514
5515
5516<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>
5517<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
5518
5519Given:
5520 void foo() {
5521   if (int i = foobar(); i &gt; 0) {}
5522   switch (int i = foobar(); i) {}
5523   for (auto&amp; a = get_range(); auto&amp; x : a) {}
5524 }
5525 void bar() {
5526   if (foobar() &gt; 0) {}
5527   switch (foobar()) {}
5528   for (auto&amp; x : get_range()) {}
5529 }
5530ifStmt(hasInitStatement(anything()))
5531  matches the if statement in foo but not in bar.
5532switchStmt(hasInitStatement(anything()))
5533  matches the switch statement in foo but not in bar.
5534cxxForRangeStmt(hasInitStatement(anything()))
5535  matches the range for statement in foo but not in bar.
5536</pre></td></tr>
5537
5538
5539<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>
5540<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5541
5542Example:
5543    forStmt(hasLoopVariable(anything()))
5544matches 'int x' in
5545    for (int x : a) { }
5546</pre></td></tr>
5547
5548
5549<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>
5550<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5551
5552Example:
5553    forStmt(hasRangeInit(anything()))
5554matches 'a' in
5555    for (int x : a) { }
5556</pre></td></tr>
5557
5558
5559<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>
5560<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5561`on`, matches the argument directly without stripping away anything.
5562
5563Given
5564  class Y { public: void m(); };
5565  Y g();
5566  class X : public Y { void g(); };
5567  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5568cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5569    cxxRecordDecl(hasName("Y")))))
5570  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5571cxxMemberCallExpr(on(callExpr()))
5572  does not match `(g()).m()`, because the parens are not ignored.
5573
5574FIXME: Overload to allow directly matching types?
5575</pre></td></tr>
5576
5577
5578<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>
5579<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5580stripping off any parentheses or implicit casts.
5581
5582Given
5583  class Y { public: void m(); };
5584  Y g();
5585  class X : public Y {};
5586  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5587cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5588  matches `y.m()` and `(g()).m()`.
5589cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5590  matches `x.m()`.
5591cxxMemberCallExpr(on(callExpr()))
5592  matches `(g()).m()`.
5593
5594FIXME: Overload to allow directly matching types?
5595</pre></td></tr>
5596
5597
5598<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>
5599<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5600</pre></td></tr>
5601
5602
5603<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>
5604<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5605matches the InnerMatcher, or is a pointer to a type that matches the
5606InnerMatcher.
5607
5608Given
5609  class Y { public: void m(); };
5610  class X : public Y { void g(); };
5611  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5612cxxMemberCallExpr(thisPointerType(hasDeclaration(
5613    cxxRecordDecl(hasName("Y")))))
5614  matches `y.m()`, `p-&gt;m()` and `x.m()`.
5615cxxMemberCallExpr(thisPointerType(hasDeclaration(
5616    cxxRecordDecl(hasName("X")))))
5617  matches `x.g()`.
5618</pre></td></tr>
5619
5620
5621<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>
5622<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5623produce multiple matches.
5624
5625Given
5626  class A { virtual void f(); };
5627  class B : public A { void f(); };
5628  class C : public B { void f(); };
5629cxxMethodDecl(ofClass(hasName("C")),
5630              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5631  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5632  that B::f is not overridden by C::f).
5633
5634The check can produce multiple matches in case of multiple inheritance, e.g.
5635  class A1 { virtual void f(); };
5636  class A2 { virtual void f(); };
5637  class C : public A1, public A2 { void f(); };
5638cxxMethodDecl(ofClass(hasName("C")),
5639              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5640  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5641  once with "b" binding "A2::f" and "d" binding "C::f".
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('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>
5646<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5647belongs to.
5648
5649FIXME: Generalize this for other kinds of declarations.
5650FIXME: What other kind of declarations would we need to generalize
5651this to?
5652
5653Example matches A() in the last line
5654    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5655        ofClass(hasName("A"))))))
5656  class A {
5657   public:
5658    A();
5659  };
5660  A a = A();
5661</pre></td></tr>
5662
5663
5664<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>
5665<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
5666
5667Given:
5668  MyClass *p1 = new (Storage) MyClass();
5669cxxNewExpr(hasAnyPlacementArg(anything()))
5670  matches the expression 'new (Storage, 16) MyClass()'.
5671</pre></td></tr>
5672
5673
5674<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>
5675<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5676
5677Given:
5678  MyClass *p1 = new MyClass[10];
5679cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
5680  matches the expression 'new MyClass[10]'.
5681</pre></td></tr>
5682
5683
5684<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>
5685<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5686matches the given matcher.
5687
5688The associated declaration is:
5689- for type nodes, the declaration of the underlying type
5690- for CallExpr, the declaration of the callee
5691- for MemberExpr, the declaration of the referenced member
5692- for CXXConstructExpr, the declaration of the constructor
5693- for CXXNewExpr, the declaration of the operator new
5694- for ObjCIvarExpr, the declaration of the ivar
5695
5696For type nodes, hasDeclaration will generally match the declaration of the
5697sugared type. Given
5698  class X {};
5699  typedef X Y;
5700  Y y;
5701in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5702typedefDecl. A common use case is to match the underlying, desugared type.
5703This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5704  varDecl(hasType(hasUnqualifiedDesugaredType(
5705      recordType(hasDeclaration(decl())))))
5706In this matcher, the decl will match the CXXRecordDecl of class X.
5707
5708Usable 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;,
5709  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;,
5710  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;,
5711  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;,
5712  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;,
5713  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;,
5714  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5715</pre></td></tr>
5716
5717
5718<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>
5719<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
5720
5721Given:
5722  MyClass *p1 = new (Storage, 16) MyClass();
5723cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
5724  matches the expression 'new (Storage, 16) MyClass()'.
5725</pre></td></tr>
5726
5727
5728<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>
5729<tr><td colspan="4" class="doc" id="hasAnyBase0"><pre>Matches C++ classes that have a direct or indirect base matching BaseSpecMatcher.
5730
5731Example:
5732matcher hasAnyBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
5733  class Foo;
5734  class Bar : Foo {};
5735  class Baz : Bar {};
5736  class SpecialBase;
5737  class Proxy : SpecialBase {};  // matches Proxy
5738  class IndirectlyDerived : Proxy {};  //matches IndirectlyDerived
5739
5740FIXME: Refactor this and isDerivedFrom to reuse implementation.
5741</pre></td></tr>
5742
5743
5744<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>
5745<tr><td colspan="4" class="doc" id="hasDirectBase0"><pre>Matches C++ classes that have a direct base matching BaseSpecMatcher.
5746
5747Example:
5748matcher hasDirectBase(hasType(cxxRecordDecl(hasName("SpecialBase"))))
5749  class Foo;
5750  class Bar : Foo {};
5751  class Baz : Bar {};
5752  class SpecialBase;
5753  class Proxy : SpecialBase {};  // matches Proxy
5754  class IndirectlyDerived : Proxy {};  // doesn't match
5755</pre></td></tr>
5756
5757
5758<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>
5759<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5760
5761Given:
5762  class A { void func(); };
5763  class B { void member(); };
5764
5765cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5766A but not B.
5767</pre></td></tr>
5768
5769
5770<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>
5771<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
5772matching Base, or Objective-C classes that directly or indirectly
5773subclass a class matching Base.
5774
5775Note that a class is not considered to be derived from itself.
5776
5777Example matches Y, Z, C (Base == hasName("X"))
5778  class X;
5779  class Y : public X {};  // directly derived
5780  class Z : public Y {};  // indirectly derived
5781  typedef X A;
5782  typedef A B;
5783  class C : public B {};  // derived from a typedef of X
5784
5785In the following example, Bar matches isDerivedFrom(hasName("X")):
5786  class Foo;
5787  typedef Foo X;
5788  class Bar : public Foo {};  // derived from a type that X is a typedef of
5789
5790In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
5791  @interface NSObject @end
5792  @interface Bar : NSObject @end
5793
5794Usable 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;
5795</pre></td></tr>
5796
5797
5798<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>
5799<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
5800matching Base.
5801
5802Note that a class is not considered to be derived from itself.
5803
5804Example matches Y, C (Base == hasName("X"))
5805  class X;
5806  class Y : public X {};  // directly derived
5807  class Z : public Y {};  // indirectly derived
5808  typedef X A;
5809  typedef A B;
5810  class C : public B {};  // derived from a typedef of X
5811
5812In the following example, Bar matches isDerivedFrom(hasName("X")):
5813  class Foo;
5814  typedef Foo X;
5815  class Bar : public Foo {};  // derived from a type that X is a typedef of
5816</pre></td></tr>
5817
5818
5819<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>
5820<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5821match Base.
5822</pre></td></tr>
5823
5824
5825<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>
5826<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5827expression, or an ObjC-message-send expression.
5828
5829Given
5830  void x(int, int, int) { int y; x(1, y, 42); }
5831callExpr(hasAnyArgument(declRefExpr()))
5832  matches x(1, y, 42)
5833with hasAnyArgument(...)
5834  matching y
5835
5836For ObjectiveC, given
5837  @interface I - (void) f:(int) y; @end
5838  void foo(I *i) { [i f:12]; }
5839objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5840  matches [i f:12]
5841</pre></td></tr>
5842
5843
5844<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>
5845<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5846given matcher.
5847
5848Example matches y.x() (matcher = callExpr(callee(
5849                                   cxxMethodDecl(hasName("x")))))
5850  class Y { public: void x(); };
5851  void z() { Y y; y.x(); }
5852</pre></td></tr>
5853
5854
5855<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('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>
5856<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5857
5858Given
5859  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5860  void f() { f(); }
5861callExpr(callee(expr()))
5862  matches this-&gt;x(), x(), y.x(), f()
5863with callee(...)
5864  matching this-&gt;x, x, y.x, f respectively
5865
5866Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
5867because this introduces ambiguous overloads with calls to Callee taking a
5868internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
5869implemented in terms of implicit casts.
5870</pre></td></tr>
5871
5872
5873<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>
5874<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5875
5876Given
5877  void f(int i);
5878  int y;
5879  f(y);
5880callExpr(
5881  forEachArgumentWithParam(
5882    declRefExpr(to(varDecl(hasName("y")))),
5883    parmVarDecl(hasType(isInteger()))
5884))
5885  matches f(y);
5886with declRefExpr(...)
5887  matching int y
5888and parmVarDecl(...)
5889  matching int i
5890</pre></td></tr>
5891
5892
5893<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('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>
5894<tr><td colspan="4" class="doc" id="forEachArgumentWithParamType0"><pre>Matches all arguments and their respective types for a CallExpr or
5895CXXConstructExpr. It is very similar to forEachArgumentWithParam but
5896it works on calls through function pointers as well.
5897
5898The difference is, that function pointers do not provide access to a
5899ParmVarDecl, but only the QualType for each argument.
5900
5901Given
5902  void f(int i);
5903  int y;
5904  f(y);
5905  void (*f_ptr)(int) = f;
5906  f_ptr(y);
5907callExpr(
5908  forEachArgumentWithParamType(
5909    declRefExpr(to(varDecl(hasName("y")))),
5910    qualType(isInteger()).bind("type)
5911))
5912  matches f(y) and f_ptr(y)
5913with declRefExpr(...)
5914  matching int y
5915and qualType(...)
5916  matching int
5917</pre></td></tr>
5918
5919
5920<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>
5921<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5922expression, or an ObjC-message-send expression.
5923
5924Given
5925  void x(int, int, int) { int y; x(1, y, 42); }
5926callExpr(hasAnyArgument(declRefExpr()))
5927  matches x(1, y, 42)
5928with hasAnyArgument(...)
5929  matching y
5930
5931For ObjectiveC, given
5932  @interface I - (void) f:(int) y; @end
5933  void foo(I *i) { [i f:12]; }
5934objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5935  matches [i f:12]
5936</pre></td></tr>
5937
5938
5939<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>
5940<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5941call expression.
5942
5943Example matches y in x(y)
5944    (matcher = callExpr(hasArgument(0, declRefExpr())))
5945  void x(int) { int y; x(y); }
5946</pre></td></tr>
5947
5948
5949<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>
5950<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5951matches the given matcher.
5952
5953The associated declaration is:
5954- for type nodes, the declaration of the underlying type
5955- for CallExpr, the declaration of the callee
5956- for MemberExpr, the declaration of the referenced member
5957- for CXXConstructExpr, the declaration of the constructor
5958- for CXXNewExpr, the declaration of the operator new
5959- for ObjCIvarExpr, the declaration of the ivar
5960
5961For type nodes, hasDeclaration will generally match the declaration of the
5962sugared type. Given
5963  class X {};
5964  typedef X Y;
5965  Y y;
5966in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5967typedefDecl. A common use case is to match the underlying, desugared type.
5968This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5969  varDecl(hasType(hasUnqualifiedDesugaredType(
5970      recordType(hasDeclaration(decl())))))
5971In this matcher, the decl will match the CXXRecordDecl of class X.
5972
5973Usable 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;,
5974  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;,
5975  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;,
5976  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;,
5977  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;,
5978  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;,
5979  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5980</pre></td></tr>
5981
5982
5983<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>
5984<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5985extension, matches the constant given in the statement.
5986
5987Given
5988  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5989caseStmt(hasCaseConstant(integerLiteral()))
5990  matches "case 1:"
5991</pre></td></tr>
5992
5993
5994<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>
5995<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5996or opaque value's source expression matches the given matcher.
5997
5998Example 1: matches "a string"
5999(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6000class URL { URL(string); };
6001URL url = "a string";
6002
6003Example 2: matches 'b' (matcher =
6004opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6005int a = b ?: 1;
6006</pre></td></tr>
6007
6008
6009<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>
6010<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6011functionDecl that have at least one TemplateArgument matching the given
6012InnerMatcher.
6013
6014Given
6015  template&lt;typename T&gt; class A {};
6016  template&lt;&gt; class A&lt;double&gt; {};
6017  A&lt;int&gt; a;
6018
6019  template&lt;typename T&gt; f() {};
6020  void func() { f&lt;int&gt;(); };
6021
6022classTemplateSpecializationDecl(hasAnyTemplateArgument(
6023    refersToType(asString("int"))))
6024  matches the specialization A&lt;int&gt;
6025
6026functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6027  matches the specialization f&lt;int&gt;
6028</pre></td></tr>
6029
6030
6031<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>
6032<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
6033
6034Given
6035  template&lt;typename T&gt; class A {}; #1
6036  template&lt;&gt; class A&lt;int&gt; {}; #2
6037classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
6038  matches '#2' with classTemplateDecl() matching the class template
6039  declaration of 'A' at #1.
6040</pre></td></tr>
6041
6042
6043<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>
6044<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6045functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6046
6047Given
6048  template&lt;typename T, typename U&gt; class A {};
6049  A&lt;bool, int&gt; b;
6050  A&lt;int, bool&gt; c;
6051
6052  template&lt;typename T&gt; void f() {}
6053  void func() { f&lt;int&gt;(); };
6054classTemplateSpecializationDecl(hasTemplateArgument(
6055    1, refersToType(asString("int"))))
6056  matches the specialization A&lt;bool, int&gt;
6057
6058functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6059  matches the specialization f&lt;int&gt;
6060</pre></td></tr>
6061
6062
6063<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>
6064<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
6065type.
6066
6067Given
6068  struct A {};
6069  A a[7];
6070  int b[7];
6071arrayType(hasElementType(builtinType()))
6072  matches "int b[7]"
6073
6074Usable 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;
6075</pre></td></tr>
6076
6077
6078<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>
6079<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
6080a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6081
6082Given
6083  { {}; 1+2; }
6084hasAnySubstatement(compoundStmt())
6085  matches '{ {}; 1+2; }'
6086with compoundStmt()
6087  matching '{}'
6088</pre></td></tr>
6089
6090
6091<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>
6092<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whoes decayed type matches InnerMatcher
6093</pre></td></tr>
6094
6095
6096<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>
6097<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
6098matches the given matcher.
6099
6100The associated declaration is:
6101- for type nodes, the declaration of the underlying type
6102- for CallExpr, the declaration of the callee
6103- for MemberExpr, the declaration of the referenced member
6104- for CXXConstructExpr, the declaration of the constructor
6105- for CXXNewExpr, the declaration of the operator new
6106- for ObjCIvarExpr, the declaration of the ivar
6107
6108For type nodes, hasDeclaration will generally match the declaration of the
6109sugared type. Given
6110  class X {};
6111  typedef X Y;
6112  Y y;
6113in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6114typedefDecl. A common use case is to match the underlying, desugared type.
6115This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6116  varDecl(hasType(hasUnqualifiedDesugaredType(
6117      recordType(hasDeclaration(decl())))))
6118In this matcher, the decl will match the CXXRecordDecl of class X.
6119
6120Usable 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;,
6121  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;,
6122  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;,
6123  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;,
6124  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;,
6125  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;,
6126  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6127</pre></td></tr>
6128
6129
6130<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>
6131<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
6132specific using shadow declaration.
6133
6134Given
6135  namespace a { void f() {} }
6136  using a::f;
6137  void g() {
6138    f();     // Matches this ..
6139    a::f();  // .. but not this.
6140  }
6141declRefExpr(throughUsingDecl(anything()))
6142  matches f()
6143</pre></td></tr>
6144
6145
6146<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>
6147<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
6148specified matcher.
6149
6150Example matches x in if(x)
6151    (matcher = declRefExpr(to(varDecl(hasName("x")))))
6152  bool x;
6153  if (x) {}
6154</pre></td></tr>
6155
6156
6157<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>
6158<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
6159
6160Note that this does not work for global declarations because the AST
6161breaks up multiple-declaration DeclStmt's into multiple single-declaration
6162DeclStmt's.
6163Example: Given non-global declarations
6164  int a, b = 0;
6165  int c;
6166  int d = 2, e;
6167declStmt(containsDeclaration(
6168      0, varDecl(hasInitializer(anything()))))
6169  matches only 'int d = 2, e;', and
6170declStmt(containsDeclaration(1, varDecl()))
6171  matches 'int a, b = 0' as well as 'int d = 2, e;'
6172  but 'int c;' is not matched.
6173</pre></td></tr>
6174
6175
6176<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>
6177<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
6178
6179Given
6180  int a, b;
6181  int c;
6182declStmt(hasSingleDecl(anything()))
6183  matches 'int c;' but not 'int a, b;'.
6184</pre></td></tr>
6185
6186
6187<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>
6188<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
6189the inner matcher.
6190
6191Given
6192  int x;
6193declaratorDecl(hasTypeLoc(loc(asString("int"))))
6194  matches int x
6195</pre></td></tr>
6196
6197
6198<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>
6199<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
6200Decl, matches InnerMatcher.
6201
6202Given
6203  namespace N {
6204    namespace M {
6205      class D {};
6206    }
6207  }
6208
6209cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
6210declaration of class D.
6211</pre></td></tr>
6212
6213
6214<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>
6215<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
6216
6217Given
6218  decltype(1) a = 1;
6219  decltype(2.0) b = 2.0;
6220decltypeType(hasUnderlyingType(isInteger()))
6221  matches the type of "a"
6222
6223Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
6224</pre></td></tr>
6225
6226
6227<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>
6228<tr><td colspan="4" class="doc" id="hasBody0"><pre></pre></td></tr>
6229
6230
6231<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>
6232<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
6233switch statement or conditional operator.
6234
6235Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6236  if (true) {}
6237</pre></td></tr>
6238
6239
6240<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>
6241<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
6242matches InnerMatcher if the qualifier exists.
6243
6244Given
6245  namespace N {
6246    namespace M {
6247      class D {};
6248    }
6249  }
6250  N::M::D d;
6251
6252elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
6253matches the type of the variable declaration of d.
6254</pre></td></tr>
6255
6256
6257<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>
6258<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
6259
6260Given
6261  namespace N {
6262    namespace M {
6263      class D {};
6264    }
6265  }
6266  N::M::D d;
6267
6268elaboratedType(namesType(recordType(
6269hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
6270declaration of d.
6271</pre></td></tr>
6272
6273
6274<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>
6275<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
6276matches the given matcher.
6277
6278The associated declaration is:
6279- for type nodes, the declaration of the underlying type
6280- for CallExpr, the declaration of the callee
6281- for MemberExpr, the declaration of the referenced member
6282- for CXXConstructExpr, the declaration of the constructor
6283- for CXXNewExpr, the declaration of the operator new
6284- for ObjCIvarExpr, the declaration of the ivar
6285
6286For type nodes, hasDeclaration will generally match the declaration of the
6287sugared type. Given
6288  class X {};
6289  typedef X Y;
6290  Y y;
6291in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6292typedefDecl. A common use case is to match the underlying, desugared type.
6293This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6294  varDecl(hasType(hasUnqualifiedDesugaredType(
6295      recordType(hasDeclaration(decl())))))
6296In this matcher, the decl will match the CXXRecordDecl of class X.
6297
6298Usable 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;,
6299  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;,
6300  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;,
6301  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;,
6302  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;,
6303  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;,
6304  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6305</pre></td></tr>
6306
6307
6308<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>
6309<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
6310
6311(Note: Clang's AST refers to other conversions as "casts" too, and calls
6312actual casts "explicit" casts.)
6313</pre></td></tr>
6314
6315
6316<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>
6317<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
6318declaration's type.
6319
6320In case of a value declaration (for example a variable declaration),
6321this resolves one layer of indirection. For example, in the value
6322declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6323X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6324declaration of x.
6325
6326Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6327            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6328            and friend class X (matcher = friendDecl(hasType("X"))
6329 class X {};
6330 void y(X &amp;x) { x; X z; }
6331 class Y { friend class X; };
6332
6333Example matches class Derived
6334(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6335class Base {};
6336class Derived : Base {};
6337
6338Usable 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;,
6339Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6340</pre></td></tr>
6341
6342
6343<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>
6344<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
6345matcher.
6346
6347Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6348            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6349            and U (matcher = typedefDecl(hasType(asString("int")))
6350            and friend class X (matcher = friendDecl(hasType("X"))
6351 class X {};
6352 void y(X &amp;x) { x; X z; }
6353 typedef int U;
6354 class Y { friend class X; };
6355</pre></td></tr>
6356
6357
6358<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>
6359<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
6360elidable constructor and other corresponding bookkeeping nodes.
6361
6362In C++17, elidable copy constructors are no longer being generated in the
6363AST as it is not permitted by the standard. They are, however, part of the
6364AST in C++14 and earlier. So, a matcher must abstract over these differences
6365to work in all language modes. This matcher skips elidable constructor-call
6366AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
6367various implicit nodes inside the constructor calls, all of which will not
6368appear in the C++17 AST.
6369
6370Given
6371
6372struct H {};
6373H G();
6374void f() {
6375  H D = G();
6376}
6377
6378``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
6379matches ``H D = G()`` in C++11 through C++17 (and beyond).
6380</pre></td></tr>
6381
6382
6383<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>
6384<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
6385are stripped off.
6386
6387Parentheses and explicit casts are not discarded.
6388Given
6389  int arr[5];
6390  int a = 0;
6391  char b = 0;
6392  const int c = a;
6393  int *d = arr;
6394  long e = (long) 0l;
6395The matchers
6396   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
6397   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
6398would match the declarations for a, b, c, and d, but not e.
6399While
6400   varDecl(hasInitializer(integerLiteral()))
6401   varDecl(hasInitializer(declRefExpr()))
6402only match the declarations for b, c, and d.
6403</pre></td></tr>
6404
6405
6406<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>
6407<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
6408nodes are stripped off.
6409
6410Parentheses and explicit casts are not discarded.
6411Given
6412  class C {};
6413  C a = C();
6414  C b;
6415  C c = b;
6416The matchers
6417   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
6418would match the declarations for a, b, and c.
6419While
6420   varDecl(hasInitializer(cxxConstructExpr()))
6421only match the declarations for b and c.
6422</pre></td></tr>
6423
6424
6425<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>
6426<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
6427casts are stripped off.
6428
6429Implicit and non-C Style casts are also discarded.
6430Given
6431  int a = 0;
6432  char b = (0);
6433  void* c = reinterpret_cast&lt;char*&gt;(0);
6434  char d = char(0);
6435The matcher
6436   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
6437would match the declarations for a, b, c, and d.
6438while
6439   varDecl(hasInitializer(integerLiteral()))
6440only match the declaration for a.
6441</pre></td></tr>
6442
6443
6444<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>
6445<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
6446parentheses are stripped off.
6447
6448Explicit casts are not discarded.
6449Given
6450  int arr[5];
6451  int a = 0;
6452  char b = (0);
6453  const int c = a;
6454  int *d = (arr);
6455  long e = ((long) 0l);
6456The matchers
6457   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
6458   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
6459would match the declarations for a, b, c, and d, but not e.
6460while
6461   varDecl(hasInitializer(integerLiteral()))
6462   varDecl(hasInitializer(declRefExpr()))
6463would only match the declaration for a.
6464</pre></td></tr>
6465
6466
6467<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>
6468<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
6469
6470Given
6471  const char* str = ("my-string");
6472The matcher
6473  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
6474would match the implicit cast resulting from the assignment.
6475</pre></td></tr>
6476
6477
6478<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>
6479<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
6480
6481Given
6482  class C {
6483    int a = 2;
6484    int b = 3;
6485    int c;
6486  };
6487fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
6488  matches 'int a;' but not 'int b;'.
6489fieldDecl(hasInClassInitializer(anything()))
6490  matches 'int a;' and 'int b;' but not 'int c;'.
6491</pre></td></tr>
6492
6493
6494<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>
6495<tr><td colspan="4" class="doc" id="hasBody1"><pre></pre></td></tr>
6496
6497
6498<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>
6499<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
6500switch statement or conditional operator.
6501
6502Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6503  if (true) {}
6504</pre></td></tr>
6505
6506
6507<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>
6508<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
6509
6510Example:
6511    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
6512matches '++x' in
6513    for (x; x &lt; N; ++x) { }
6514</pre></td></tr>
6515
6516
6517<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>
6518<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
6519
6520Example:
6521    forStmt(hasLoopInit(declStmt()))
6522matches 'int x = 0' in
6523    for (int x = 0; x &lt; N; ++x) { }
6524</pre></td></tr>
6525
6526
6527<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>
6528<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
6529declaration's type.
6530
6531In case of a value declaration (for example a variable declaration),
6532this resolves one layer of indirection. For example, in the value
6533declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6534X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6535declaration of x.
6536
6537Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6538            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6539            and friend class X (matcher = friendDecl(hasType("X"))
6540 class X {};
6541 void y(X &amp;x) { x; X z; }
6542 class Y { friend class X; };
6543
6544Example matches class Derived
6545(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
6546class Base {};
6547class Derived : Base {};
6548
6549Usable 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;,
6550Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
6551</pre></td></tr>
6552
6553
6554<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>
6555<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6556matcher.
6557
6558Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6559            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6560            and U (matcher = typedefDecl(hasType(asString("int")))
6561            and friend class X (matcher = friendDecl(hasType("X"))
6562 class X {};
6563 void y(X &amp;x) { x; X z; }
6564 typedef int U;
6565 class Y { friend class X; };
6566</pre></td></tr>
6567
6568
6569<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>
6570<tr><td colspan="4" class="doc" id="hasAnyBody0"><pre>Matches a function declaration that has a given body present in the AST.
6571Note that this matcher matches all the declarations of a function whose
6572body is present in the AST.
6573
6574Given
6575  void f();
6576  void f() {}
6577  void g();
6578hasAnyBody(functionDecl())
6579  matches both 'void f();'
6580  and 'void f() {}'
6581with compoundStmt()
6582  matching '{}'
6583  but does not match 'void g();'
6584</pre></td></tr>
6585
6586
6587<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>
6588<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6589block.
6590
6591Does not match the 'this' parameter of a method.
6592
6593Given
6594  class X { void f(int x, int y, int z) {} };
6595cxxMethodDecl(hasAnyParameter(hasName("y")))
6596  matches f(int x, int y, int z) {}
6597with hasAnyParameter(...)
6598  matching int y
6599
6600For ObjectiveC, given
6601  @interface I - (void) f:(int) y; @end
6602
6603the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6604matches the declaration of method f with hasParameter
6605matching y.
6606
6607For blocks, given
6608  b = ^(int y) { printf("%d", y) };
6609
6610the matcher blockDecl(hasAnyParameter(hasName("y")))
6611matches the declaration of the block b with hasParameter
6612matching y.
6613</pre></td></tr>
6614
6615
6616<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('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>
6617<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6618functionDecl that have at least one TemplateArgument matching the given
6619InnerMatcher.
6620
6621Given
6622  template&lt;typename T&gt; class A {};
6623  template&lt;&gt; class A&lt;double&gt; {};
6624  A&lt;int&gt; a;
6625
6626  template&lt;typename T&gt; f() {};
6627  void func() { f&lt;int&gt;(); };
6628
6629classTemplateSpecializationDecl(hasAnyTemplateArgument(
6630    refersToType(asString("int"))))
6631  matches the specialization A&lt;int&gt;
6632
6633functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6634  matches the specialization f&lt;int&gt;
6635</pre></td></tr>
6636
6637
6638<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>
6639<tr><td colspan="4" class="doc" id="hasBody4"><pre></pre></td></tr>
6640
6641
6642<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>
6643<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6644declaration.
6645
6646Given
6647  template&lt;bool b&gt;
6648  struct S {
6649    S(int); // #1
6650    explicit S(double); // #2
6651    operator int(); // #3
6652    explicit operator bool(); // #4
6653    explicit(false) S(bool) // # 7
6654    explicit(true) S(char) // # 8
6655    explicit(b) S(S) // # 9
6656  };
6657  S(int) -&gt; S&lt;true&gt; // #5
6658  explicit S(double) -&gt; S&lt;false&gt; // #6
6659cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6660cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6661cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6662</pre></td></tr>
6663
6664
6665<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>
6666<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6667declaration or a block.
6668
6669Given
6670  class X { void f(int x) {} };
6671cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6672  matches f(int x) {}
6673with hasParameter(...)
6674  matching int x
6675
6676For ObjectiveC, given
6677  @interface I - (void) f:(int) y; @end
6678
6679the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6680matches the declaration of method f with hasParameter
6681matching y.
6682</pre></td></tr>
6683
6684
6685<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>
6686<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6687functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6688
6689Given
6690  template&lt;typename T, typename U&gt; class A {};
6691  A&lt;bool, int&gt; b;
6692  A&lt;int, bool&gt; c;
6693
6694  template&lt;typename T&gt; void f() {}
6695  void func() { f&lt;int&gt;(); };
6696classTemplateSpecializationDecl(hasTemplateArgument(
6697    1, refersToType(asString("int"))))
6698  matches the specialization A&lt;bool, int&gt;
6699
6700functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6701  matches the specialization f&lt;int&gt;
6702</pre></td></tr>
6703
6704
6705<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>
6706<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6707
6708Given:
6709  class X { int f() { return 1; } };
6710cxxMethodDecl(returns(asString("int")))
6711  matches int f() { return 1; }
6712</pre></td></tr>
6713
6714
6715<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>
6716<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6717switch statement or conditional operator.
6718
6719Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6720  if (true) {}
6721</pre></td></tr>
6722
6723
6724<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>
6725<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6726
6727Given
6728  if (A* a = GetAPointer()) {}
6729hasConditionVariableStatement(...)
6730  matches 'A* a = GetAPointer()'.
6731</pre></td></tr>
6732
6733
6734<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>
6735<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6736
6737Examples matches the if statement
6738  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6739  if (false) false; else true;
6740</pre></td></tr>
6741
6742
6743<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>
6744<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
6745
6746Given:
6747 void foo() {
6748   if (int i = foobar(); i &gt; 0) {}
6749   switch (int i = foobar(); i) {}
6750   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6751 }
6752 void bar() {
6753   if (foobar() &gt; 0) {}
6754   switch (foobar()) {}
6755   for (auto&amp; x : get_range()) {}
6756 }
6757ifStmt(hasInitStatement(anything()))
6758  matches the if statement in foo but not in bar.
6759switchStmt(hasInitStatement(anything()))
6760  matches the switch statement in foo but not in bar.
6761cxxForRangeStmt(hasInitStatement(anything()))
6762  matches the range for statement in foo but not in bar.
6763</pre></td></tr>
6764
6765
6766<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>
6767<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6768
6769Examples matches the if statement
6770  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6771  if (false) true; else false;
6772</pre></td></tr>
6773
6774
6775<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>
6776<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6777matcher.
6778
6779FIXME: Unit test this matcher
6780</pre></td></tr>
6781
6782
6783<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>
6784<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6785
6786Example matches y.
6787    (matcher = initListExpr(hasInit(0, expr())))
6788  int x{y}.
6789</pre></td></tr>
6790
6791
6792<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>
6793<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6794(if expression have it).
6795</pre></td></tr>
6796
6797
6798<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>
6799<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6800matches the given matcher.
6801
6802The associated declaration is:
6803- for type nodes, the declaration of the underlying type
6804- for CallExpr, the declaration of the callee
6805- for MemberExpr, the declaration of the referenced member
6806- for CXXConstructExpr, the declaration of the constructor
6807- for CXXNewExpr, the declaration of the operator new
6808- for ObjCIvarExpr, the declaration of the ivar
6809
6810For type nodes, hasDeclaration will generally match the declaration of the
6811sugared type. Given
6812  class X {};
6813  typedef X Y;
6814  Y y;
6815in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6816typedefDecl. A common use case is to match the underlying, desugared type.
6817This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6818  varDecl(hasType(hasUnqualifiedDesugaredType(
6819      recordType(hasDeclaration(decl())))))
6820In this matcher, the decl will match the CXXRecordDecl of class X.
6821
6822Usable 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;,
6823  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;,
6824  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;,
6825  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;,
6826  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;,
6827  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;,
6828  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6829</pre></td></tr>
6830
6831
6832<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>
6833<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6834matches the given matcher.
6835
6836The associated declaration is:
6837- for type nodes, the declaration of the underlying type
6838- for CallExpr, the declaration of the callee
6839- for MemberExpr, the declaration of the referenced member
6840- for CXXConstructExpr, the declaration of the constructor
6841- for CXXNewExpr, the declaration of the operator new
6842- for ObjCIvarExpr, the declaration of the ivar
6843
6844For type nodes, hasDeclaration will generally match the declaration of the
6845sugared type. Given
6846  class X {};
6847  typedef X Y;
6848  Y y;
6849in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6850typedefDecl. A common use case is to match the underlying, desugared type.
6851This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6852  varDecl(hasType(hasUnqualifiedDesugaredType(
6853      recordType(hasDeclaration(decl())))))
6854In this matcher, the decl will match the CXXRecordDecl of class X.
6855
6856Usable 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;,
6857  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;,
6858  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;,
6859  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;,
6860  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;,
6861  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;,
6862  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6863</pre></td></tr>
6864
6865
6866<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>
6867<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
6868
6869Given
6870  struct foo {
6871    void bar() {
6872      auto f = [this](){};
6873    }
6874  }
6875lambdaExpr(hasAnyCapture(cxxThisExpr()))
6876  matches [this](){};
6877</pre></td></tr>
6878
6879
6880<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>
6881<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
6882
6883Given
6884  void foo() {
6885    int x;
6886    auto f = [x](){};
6887  }
6888lambdaExpr(hasAnyCapture(anything()))
6889  matches [x](){};
6890</pre></td></tr>
6891
6892
6893<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>
6894<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6895matches the given matcher.
6896
6897The associated declaration is:
6898- for type nodes, the declaration of the underlying type
6899- for CallExpr, the declaration of the callee
6900- for MemberExpr, the declaration of the referenced member
6901- for CXXConstructExpr, the declaration of the constructor
6902- for CXXNewExpr, the declaration of the operator new
6903- for ObjCIvarExpr, the declaration of the ivar
6904
6905For type nodes, hasDeclaration will generally match the declaration of the
6906sugared type. Given
6907  class X {};
6908  typedef X Y;
6909  Y y;
6910in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6911typedefDecl. A common use case is to match the underlying, desugared type.
6912This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6913  varDecl(hasType(hasUnqualifiedDesugaredType(
6914      recordType(hasDeclaration(decl())))))
6915In this matcher, the decl will match the CXXRecordDecl of class X.
6916
6917Usable 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;,
6918  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;,
6919  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;,
6920  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;,
6921  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;,
6922  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;,
6923  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6924</pre></td></tr>
6925
6926
6927<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>
6928<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6929given matcher. Implicit object expressions are included; that is, it matches
6930use of implicit `this`.
6931
6932Given
6933  struct X {
6934    int m;
6935    int f(X x) { x.m; return m; }
6936  };
6937memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6938  matches `x.m`, but not `m`; however,
6939memberExpr(hasObjectExpression(hasType(pointsTo(
6940     cxxRecordDecl(hasName("X"))))))
6941  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6942</pre></td></tr>
6943
6944
6945<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>
6946<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6947given matcher.
6948
6949Given
6950  struct { int first, second; } first, second;
6951  int i(second.first);
6952  int j(first.second);
6953memberExpr(member(hasName("first")))
6954  matches second.first
6955  but not first.second (because the member name there is "second").
6956</pre></td></tr>
6957
6958
6959<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>
6960<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6961pointee matches a given matcher.
6962
6963Given
6964  int *a;
6965  int const *b;
6966  float const *f;
6967pointerType(pointee(isConstQualified(), isInteger()))
6968  matches "int const *b"
6969
6970Usable 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;,
6971  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;
6972</pre></td></tr>
6973
6974
6975<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>
6976<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6977matcher.
6978
6979Given
6980  namespace N { template&lt;class T&gt; void f(T t); }
6981  template &lt;class T&gt; void g() { using N::f; f(T()); }
6982unresolvedLookupExpr(hasAnyDeclaration(
6983    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6984  matches the use of f in g() .
6985</pre></td></tr>
6986
6987
6988<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>
6989<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6990
6991Given
6992  struct A { struct B { struct C {}; }; };
6993  A::B::C c;
6994nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6995  matches "A::"
6996</pre></td></tr>
6997
6998
6999<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('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>
7000<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7001NestedNameSpecifier-matcher matches.
7002</pre></td></tr>
7003
7004
7005<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>
7006<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
7007given TypeLoc.
7008
7009Given
7010  struct A { struct B { struct C {}; }; };
7011  A::B::C c;
7012nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
7013  hasDeclaration(cxxRecordDecl(hasName("A")))))))
7014  matches "A::"
7015</pre></td></tr>
7016
7017
7018<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>
7019<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
7020
7021Given
7022  struct A { struct B { struct C {}; }; };
7023  A::B::C c;
7024nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
7025  matches "A::"
7026</pre></td></tr>
7027
7028
7029<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('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>
7030<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
7031given namespace matcher.
7032
7033Given
7034  namespace ns { struct A {}; }
7035  ns::A a;
7036nestedNameSpecifier(specifiesNamespace(hasName("ns")))
7037  matches "ns::"
7038</pre></td></tr>
7039
7040
7041<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>
7042<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
7043given QualType matcher without qualifiers.
7044
7045Given
7046  struct A { struct B { struct C {}; }; };
7047  A::B::C c;
7048nestedNameSpecifier(specifiesType(
7049  hasDeclaration(cxxRecordDecl(hasName("A")))
7050))
7051  matches "A::"
7052</pre></td></tr>
7053
7054
7055<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>
7056<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
7057
7058Given
7059
7060  #pragma omp parallel
7061  #pragma omp parallel default(none)
7062
7063``ompExecutableDirective(hasAnyClause(anything()))`` matches
7064``omp parallel default(none)``.
7065</pre></td></tr>
7066
7067
7068<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>
7069<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
7070
7071Prerequisite: the executable directive must not be standalone directive.
7072If it is, it will never match.
7073
7074Given
7075
7076   #pragma omp parallel
7077   ;
7078   #pragma omp parallel
7079   {}
7080
7081``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
7082</pre></td></tr>
7083
7084
7085<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>
7086<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
7087matching Base, or Objective-C classes that directly or indirectly
7088subclass a class matching Base.
7089
7090Note that a class is not considered to be derived from itself.
7091
7092Example matches Y, Z, C (Base == hasName("X"))
7093  class X;
7094  class Y : public X {};  // directly derived
7095  class Z : public Y {};  // indirectly derived
7096  typedef X A;
7097  typedef A B;
7098  class C : public B {};  // derived from a typedef of X
7099
7100In the following example, Bar matches isDerivedFrom(hasName("X")):
7101  class Foo;
7102  typedef Foo X;
7103  class Bar : public Foo {};  // derived from a type that X is a typedef of
7104
7105In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
7106  @interface NSObject @end
7107  @interface Bar : NSObject @end
7108
7109Usable 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;
7110</pre></td></tr>
7111
7112
7113<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>
7114<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
7115matching Base.
7116
7117Note that a class is not considered to be derived from itself.
7118
7119Example matches Y, C (Base == hasName("X"))
7120  class X;
7121  class Y : public X {};  // directly derived
7122  class Z : public Y {};  // indirectly derived
7123  typedef X A;
7124  typedef A B;
7125  class C : public B {};  // derived from a typedef of X
7126
7127In the following example, Bar matches isDerivedFrom(hasName("X")):
7128  class Foo;
7129  typedef Foo X;
7130  class Bar : public Foo {};  // derived from a type that X is a typedef of
7131</pre></td></tr>
7132
7133
7134<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>
7135<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
7136match Base.
7137</pre></td></tr>
7138
7139
7140<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>
7141<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
7142expression, or an ObjC-message-send expression.
7143
7144Given
7145  void x(int, int, int) { int y; x(1, y, 42); }
7146callExpr(hasAnyArgument(declRefExpr()))
7147  matches x(1, y, 42)
7148with hasAnyArgument(...)
7149  matching y
7150
7151For ObjectiveC, given
7152  @interface I - (void) f:(int) y; @end
7153  void foo(I *i) { [i f:12]; }
7154objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
7155  matches [i f:12]
7156</pre></td></tr>
7157
7158
7159<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>
7160<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
7161call expression.
7162
7163Example matches y in x(y)
7164    (matcher = callExpr(hasArgument(0, declRefExpr())))
7165  void x(int) { int y; x(y); }
7166</pre></td></tr>
7167
7168
7169<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>
7170<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
7171and the inner matcher matches on that instance.
7172
7173For example the method call in
7174  NSString *x = @"hello";
7175  [x containsString:@"h"];
7176is matched by
7177objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
7178</pre></td></tr>
7179
7180
7181<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>
7182<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
7183
7184Example
7185matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
7186matches the [webView ...] message invocation.
7187  NSString *webViewJavaScript = ...
7188  UIWebView *webView = ...
7189  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
7190</pre></td></tr>
7191
7192
7193<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>
7194<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
7195block.
7196
7197Does not match the 'this' parameter of a method.
7198
7199Given
7200  class X { void f(int x, int y, int z) {} };
7201cxxMethodDecl(hasAnyParameter(hasName("y")))
7202  matches f(int x, int y, int z) {}
7203with hasAnyParameter(...)
7204  matching int y
7205
7206For ObjectiveC, given
7207  @interface I - (void) f:(int) y; @end
7208
7209the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
7210matches the declaration of method f with hasParameter
7211matching y.
7212
7213For blocks, given
7214  b = ^(int y) { printf("%d", y) };
7215
7216the matcher blockDecl(hasAnyParameter(hasName("y")))
7217matches the declaration of the block b with hasParameter
7218matching y.
7219</pre></td></tr>
7220
7221
7222<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>
7223<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
7224declaration or a block.
7225
7226Given
7227  class X { void f(int x) {} };
7228cxxMethodDecl(hasParameter(0, hasType(varDecl())))
7229  matches f(int x) {}
7230with hasParameter(...)
7231  matching int x
7232
7233For ObjectiveC, given
7234  @interface I - (void) f:(int) y; @end
7235
7236the matcher objcMethodDecl(hasParameter(0, hasName("y")))
7237matches the declaration of method f with hasParameter
7238matching y.
7239</pre></td></tr>
7240
7241
7242<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>
7243<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
7244or opaque value's source expression matches the given matcher.
7245
7246Example 1: matches "a string"
7247(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
7248class URL { URL(string); };
7249URL url = "a string";
7250
7251Example 2: matches 'b' (matcher =
7252opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
7253int a = b ?: 1;
7254</pre></td></tr>
7255
7256
7257<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>
7258<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
7259overloads matches the given matcher.
7260
7261Given
7262  template &lt;typename T&gt; void foo(T);
7263  template &lt;typename T&gt; void bar(T);
7264  template &lt;typename T&gt; void baz(T t) {
7265    foo(t);
7266    bar(t);
7267  }
7268unresolvedLookupExpr(hasAnyDeclaration(
7269    functionTemplateDecl(hasName("foo"))))
7270  matches foo in foo(t); but not bar in bar(t);
7271</pre></td></tr>
7272
7273
7274<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>
7275<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
7276
7277Given
7278  int (*ptr_to_array)[4];
7279  int (*ptr_to_func)(int);
7280
7281varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
7282ptr_to_func but not ptr_to_array.
7283
7284Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
7285</pre></td></tr>
7286
7287
7288<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>
7289<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
7290pointee matches a given matcher.
7291
7292Given
7293  int *a;
7294  int const *b;
7295  float const *f;
7296pointerType(pointee(isConstQualified(), isInteger()))
7297  matches "int const *b"
7298
7299Usable 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;,
7300  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;
7301</pre></td></tr>
7302
7303
7304<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>
7305<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
7306
7307Given:
7308  typedef int &amp;int_ref;
7309  int a;
7310  int_ref b = a;
7311
7312varDecl(hasType(qualType(referenceType()))))) will not match the
7313declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
7314</pre></td></tr>
7315
7316
7317<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>
7318<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
7319matches the given matcher.
7320
7321The associated declaration is:
7322- for type nodes, the declaration of the underlying type
7323- for CallExpr, the declaration of the callee
7324- for MemberExpr, the declaration of the referenced member
7325- for CXXConstructExpr, the declaration of the constructor
7326- for CXXNewExpr, the declaration of the operator new
7327- for ObjCIvarExpr, the declaration of the ivar
7328
7329For type nodes, hasDeclaration will generally match the declaration of the
7330sugared type. Given
7331  class X {};
7332  typedef X Y;
7333  Y y;
7334in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7335typedefDecl. A common use case is to match the underlying, desugared type.
7336This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7337  varDecl(hasType(hasUnqualifiedDesugaredType(
7338      recordType(hasDeclaration(decl())))))
7339In this matcher, the decl will match the CXXRecordDecl of class X.
7340
7341Usable 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;,
7342  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;,
7343  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;,
7344  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;,
7345  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;,
7346  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;,
7347  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7348</pre></td></tr>
7349
7350
7351<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>
7352<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
7353
7354Given
7355  void (*fp)(void);
7356The matcher
7357  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
7358would match the declaration for fp.
7359</pre></td></tr>
7360
7361
7362<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('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>
7363<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
7364</pre></td></tr>
7365
7366
7367<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>
7368<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
7369matches the specified matcher.
7370
7371Example matches y-&gt;x()
7372  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
7373     cxxRecordDecl(hasName("Y")))))))
7374  class Y { public: void x(); };
7375  void z() { Y *y; y-&gt;x(); }
7376</pre></td></tr>
7377
7378
7379<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>
7380<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
7381</pre></td></tr>
7382
7383
7384<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>
7385<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
7386type matches the specified matcher.
7387
7388Example matches X &amp;x and const X &amp;y
7389    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
7390  class X {
7391    void a(X b) {
7392      X &amp;x = b;
7393      const X &amp;y = b;
7394    }
7395  };
7396</pre></td></tr>
7397
7398
7399<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>
7400<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
7401matches the given matcher.
7402
7403The associated declaration is:
7404- for type nodes, the declaration of the underlying type
7405- for CallExpr, the declaration of the callee
7406- for MemberExpr, the declaration of the referenced member
7407- for CXXConstructExpr, the declaration of the constructor
7408- for CXXNewExpr, the declaration of the operator new
7409- for ObjCIvarExpr, the declaration of the ivar
7410
7411For type nodes, hasDeclaration will generally match the declaration of the
7412sugared type. Given
7413  class X {};
7414  typedef X Y;
7415  Y y;
7416in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7417typedefDecl. A common use case is to match the underlying, desugared type.
7418This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7419  varDecl(hasType(hasUnqualifiedDesugaredType(
7420      recordType(hasDeclaration(decl())))))
7421In this matcher, the decl will match the CXXRecordDecl of class X.
7422
7423Usable 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;,
7424  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;,
7425  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;,
7426  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;,
7427  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;,
7428  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;,
7429  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7430</pre></td></tr>
7431
7432
7433<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>
7434<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
7435pointee matches a given matcher.
7436
7437Given
7438  int *a;
7439  int const *b;
7440  float const *f;
7441pointerType(pointee(isConstQualified(), isInteger()))
7442  matches "int const *b"
7443
7444Usable 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;,
7445  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;
7446</pre></td></tr>
7447
7448
7449<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>
7450<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
7451
7452Given
7453  return a + b;
7454hasReturnValue(binaryOperator())
7455  matches 'return a + b'
7456with binaryOperator()
7457  matching 'a + b'
7458</pre></td></tr>
7459
7460
7461<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>
7462<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
7463a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7464
7465Given
7466  { {}; 1+2; }
7467hasAnySubstatement(compoundStmt())
7468  matches '{ {}; 1+2; }'
7469with compoundStmt()
7470  matching '{}'
7471</pre></td></tr>
7472
7473
7474<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>
7475<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7476alignof.
7477</pre></td></tr>
7478
7479
7480<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>
7481<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
7482
7483Given:
7484F&amp; operator=(const F&amp; o) {
7485  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
7486  return *this;
7487}
7488returnStmt(forFunction(hasName("operator=")))
7489  matches 'return *this'
7490  but does not match 'return v &gt; 0'
7491</pre></td></tr>
7492
7493
7494<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>
7495<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7496sizeof.
7497</pre></td></tr>
7498
7499
7500<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>
7501<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
7502type that matches the provided matcher.
7503
7504Given
7505  template &lt;typename T&gt;
7506  double F(T t);
7507  int i;
7508  double j = F(i);
7509
7510substTemplateTypeParmType(hasReplacementType(type())) matches int
7511</pre></td></tr>
7512
7513
7514<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>
7515<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
7516statement. This matcher may produce multiple matches.
7517
7518Given
7519  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
7520switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
7521  matches four times, with "c" binding each of "case 1:", "case 2:",
7522"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
7523"switch (1)", "switch (2)" and "switch (2)".
7524</pre></td></tr>
7525
7526
7527<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>
7528<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
7529switch statement or conditional operator.
7530
7531Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7532  if (true) {}
7533</pre></td></tr>
7534
7535
7536<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>
7537<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
7538
7539Given:
7540 void foo() {
7541   if (int i = foobar(); i &gt; 0) {}
7542   switch (int i = foobar(); i) {}
7543   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7544 }
7545 void bar() {
7546   if (foobar() &gt; 0) {}
7547   switch (foobar()) {}
7548   for (auto&amp; x : get_range()) {}
7549 }
7550ifStmt(hasInitStatement(anything()))
7551  matches the if statement in foo but not in bar.
7552switchStmt(hasInitStatement(anything()))
7553  matches the switch statement in foo but not in bar.
7554cxxForRangeStmt(hasInitStatement(anything()))
7555  matches the range for statement in foo but not in bar.
7556</pre></td></tr>
7557
7558
7559<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>
7560<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
7561matches the given matcher.
7562
7563The associated declaration is:
7564- for type nodes, the declaration of the underlying type
7565- for CallExpr, the declaration of the callee
7566- for MemberExpr, the declaration of the referenced member
7567- for CXXConstructExpr, the declaration of the constructor
7568- for CXXNewExpr, the declaration of the operator new
7569- for ObjCIvarExpr, the declaration of the ivar
7570
7571For type nodes, hasDeclaration will generally match the declaration of the
7572sugared type. Given
7573  class X {};
7574  typedef X Y;
7575  Y y;
7576in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7577typedefDecl. A common use case is to match the underlying, desugared type.
7578This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7579  varDecl(hasType(hasUnqualifiedDesugaredType(
7580      recordType(hasDeclaration(decl())))))
7581In this matcher, the decl will match the CXXRecordDecl of class X.
7582
7583Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;,
7584  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;,
7585  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;,
7586  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;,
7587  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;,
7588  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;,
7589  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7590</pre></td></tr>
7591
7592
7593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
7594<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
7595
7596Given
7597  struct B { int next; };
7598  template&lt;int(B::*next_ptr)&gt; struct A {};
7599  A&lt;&amp;B::next&gt; a;
7600templateSpecializationType(hasAnyTemplateArgument(
7601  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
7602  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7603    B::next
7604</pre></td></tr>
7605
7606
7607<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>
7608<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
7609declaration.
7610
7611Given
7612  struct B { int next; };
7613  template&lt;int(B::*next_ptr)&gt; struct A {};
7614  A&lt;&amp;B::next&gt; a;
7615classTemplateSpecializationDecl(hasAnyTemplateArgument(
7616    refersToDeclaration(fieldDecl(hasName("next")))))
7617  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7618    B::next
7619</pre></td></tr>
7620
7621
7622<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>
7623<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that refers to an integral type.
7624
7625Given
7626  template&lt;int T&gt; struct C {};
7627  C&lt;42&gt; c;
7628classTemplateSpecializationDecl(
7629  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
7630  matches the implicit instantiation of C in C&lt;42&gt;.
7631</pre></td></tr>
7632
7633
7634<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>
7635<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
7636
7637Given
7638  template&lt;template &lt;typename&gt; class S&gt; class X {};
7639  template&lt;typename T&gt; class Y {};
7640  X&lt;Y&gt; xi;
7641classTemplateSpecializationDecl(hasAnyTemplateArgument(
7642    refersToTemplate(templateName())))
7643  matches the specialization X&lt;Y&gt;
7644</pre></td></tr>
7645
7646
7647<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>
7648<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
7649
7650Given
7651  struct X {};
7652  template&lt;typename T&gt; struct A {};
7653  A&lt;X&gt; a;
7654classTemplateSpecializationDecl(hasAnyTemplateArgument(
7655    refersToType(class(hasName("X")))))
7656  matches the specialization A&lt;X&gt;
7657</pre></td></tr>
7658
7659
7660<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>
7661<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7662functionDecl that have at least one TemplateArgument matching the given
7663InnerMatcher.
7664
7665Given
7666  template&lt;typename T&gt; class A {};
7667  template&lt;&gt; class A&lt;double&gt; {};
7668  A&lt;int&gt; a;
7669
7670  template&lt;typename T&gt; f() {};
7671  void func() { f&lt;int&gt;(); };
7672
7673classTemplateSpecializationDecl(hasAnyTemplateArgument(
7674    refersToType(asString("int"))))
7675  matches the specialization A&lt;int&gt;
7676
7677functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7678  matches the specialization f&lt;int&gt;
7679</pre></td></tr>
7680
7681
7682<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>
7683<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
7684matches the given matcher.
7685
7686The associated declaration is:
7687- for type nodes, the declaration of the underlying type
7688- for CallExpr, the declaration of the callee
7689- for MemberExpr, the declaration of the referenced member
7690- for CXXConstructExpr, the declaration of the constructor
7691- for CXXNewExpr, the declaration of the operator new
7692- for ObjCIvarExpr, the declaration of the ivar
7693
7694For type nodes, hasDeclaration will generally match the declaration of the
7695sugared type. Given
7696  class X {};
7697  typedef X Y;
7698  Y y;
7699in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7700typedefDecl. A common use case is to match the underlying, desugared type.
7701This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7702  varDecl(hasType(hasUnqualifiedDesugaredType(
7703      recordType(hasDeclaration(decl())))))
7704In this matcher, the decl will match the CXXRecordDecl of class X.
7705
7706Usable 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;,
7707  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;,
7708  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;,
7709  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;,
7710  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;,
7711  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;,
7712  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7713</pre></td></tr>
7714
7715
7716<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>
7717<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7718functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7719
7720Given
7721  template&lt;typename T, typename U&gt; class A {};
7722  A&lt;bool, int&gt; b;
7723  A&lt;int, bool&gt; c;
7724
7725  template&lt;typename T&gt; void f() {}
7726  void func() { f&lt;int&gt;(); };
7727classTemplateSpecializationDecl(hasTemplateArgument(
7728    1, refersToType(asString("int"))))
7729  matches the specialization A&lt;bool, int&gt;
7730
7731functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7732  matches the specialization f&lt;int&gt;
7733</pre></td></tr>
7734
7735
7736<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>
7737<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7738matches the given matcher.
7739
7740The associated declaration is:
7741- for type nodes, the declaration of the underlying type
7742- for CallExpr, the declaration of the callee
7743- for MemberExpr, the declaration of the referenced member
7744- for CXXConstructExpr, the declaration of the constructor
7745- for CXXNewExpr, the declaration of the operator new
7746- for ObjCIvarExpr, the declaration of the ivar
7747
7748For type nodes, hasDeclaration will generally match the declaration of the
7749sugared type. Given
7750  class X {};
7751  typedef X Y;
7752  Y y;
7753in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7754typedefDecl. A common use case is to match the underlying, desugared type.
7755This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7756  varDecl(hasType(hasUnqualifiedDesugaredType(
7757      recordType(hasDeclaration(decl())))))
7758In this matcher, the decl will match the CXXRecordDecl of class X.
7759
7760Usable 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;,
7761  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;,
7762  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;,
7763  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;,
7764  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;,
7765  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;,
7766  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7767</pre></td></tr>
7768
7769
7770<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>
7771<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7772QualType-matcher matches.
7773</pre></td></tr>
7774
7775
7776<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>
7777<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7778matcher.
7779
7780Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7781            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7782            and U (matcher = typedefDecl(hasType(asString("int")))
7783            and friend class X (matcher = friendDecl(hasType("X"))
7784 class X {};
7785 void y(X &amp;x) { x; X z; }
7786 typedef int U;
7787 class Y { friend class X; };
7788</pre></td></tr>
7789
7790
7791<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>
7792<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7793matches the given matcher.
7794
7795The associated declaration is:
7796- for type nodes, the declaration of the underlying type
7797- for CallExpr, the declaration of the callee
7798- for MemberExpr, the declaration of the referenced member
7799- for CXXConstructExpr, the declaration of the constructor
7800- for CXXNewExpr, the declaration of the operator new
7801- for ObjCIvarExpr, the declaration of the ivar
7802
7803For type nodes, hasDeclaration will generally match the declaration of the
7804sugared type. Given
7805  class X {};
7806  typedef X Y;
7807  Y y;
7808in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7809typedefDecl. A common use case is to match the underlying, desugared type.
7810This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7811  varDecl(hasType(hasUnqualifiedDesugaredType(
7812      recordType(hasDeclaration(decl())))))
7813In this matcher, the decl will match the CXXRecordDecl of class X.
7814
7815Usable 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;,
7816  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;,
7817  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;,
7818  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;,
7819  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;,
7820  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;,
7821  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7822</pre></td></tr>
7823
7824
7825<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>
7826<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7827type of the matched node.
7828
7829For example, in:
7830  class A {};
7831  using B = A;
7832The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7833both B and A.
7834</pre></td></tr>
7835
7836
7837<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>
7838<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7839
7840Given
7841  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7842unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7843  matches sizeof(a) and alignof(c)
7844</pre></td></tr>
7845
7846
7847<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>
7848<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7849
7850Example matches true (matcher = hasUnaryOperand(
7851                                  cxxBoolLiteral(equals(true))))
7852  !true
7853</pre></td></tr>
7854
7855
7856<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>
7857<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7858given matcher. Implicit object expressions are included; that is, it matches
7859use of implicit `this`.
7860
7861Given
7862  struct X {
7863    int m;
7864    int f(X x) { x.m; return m; }
7865  };
7866memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7867  matches `x.m`, but not `m`; however,
7868memberExpr(hasObjectExpression(hasType(pointsTo(
7869     cxxRecordDecl(hasName("X"))))))
7870  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7871</pre></td></tr>
7872
7873
7874<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>
7875<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7876matches the given matcher.
7877
7878The associated declaration is:
7879- for type nodes, the declaration of the underlying type
7880- for CallExpr, the declaration of the callee
7881- for MemberExpr, the declaration of the referenced member
7882- for CXXConstructExpr, the declaration of the constructor
7883- for CXXNewExpr, the declaration of the operator new
7884- for ObjCIvarExpr, the declaration of the ivar
7885
7886For type nodes, hasDeclaration will generally match the declaration of the
7887sugared type. Given
7888  class X {};
7889  typedef X Y;
7890  Y y;
7891in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7892typedefDecl. A common use case is to match the underlying, desugared type.
7893This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7894  varDecl(hasType(hasUnqualifiedDesugaredType(
7895      recordType(hasDeclaration(decl())))))
7896In this matcher, the decl will match the CXXRecordDecl of class X.
7897
7898Usable 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;,
7899  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;,
7900  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;,
7901  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;,
7902  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;,
7903  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;,
7904  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7905</pre></td></tr>
7906
7907
7908<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>
7909<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7910
7911Given
7912  namespace X { void b(); }
7913  using X::b;
7914usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7915  matches using X::b </pre></td></tr>
7916
7917
7918<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>
7919<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7920matched by the given matcher.
7921
7922Given
7923  namespace X { int a; void b(); }
7924  using X::a;
7925  using X::b;
7926usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7927  matches using X::b but not using X::a </pre></td></tr>
7928
7929
7930<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>
7931<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7932declaration's type.
7933
7934In case of a value declaration (for example a variable declaration),
7935this resolves one layer of indirection. For example, in the value
7936declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7937X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7938declaration of x.
7939
7940Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7941            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7942            and friend class X (matcher = friendDecl(hasType("X"))
7943 class X {};
7944 void y(X &amp;x) { x; X z; }
7945 class Y { friend class X; };
7946
7947Example matches class Derived
7948(matcher = cxxRecordDecl(hasAnyBase(hasType(cxxRecordDecl(hasName("Base"))))))
7949class Base {};
7950class Derived : Base {};
7951
7952Usable 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;,
7953Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html">CXXBaseSpecifier</a>&gt;
7954</pre></td></tr>
7955
7956
7957<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>
7958<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7959matcher.
7960
7961Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7962            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7963            and U (matcher = typedefDecl(hasType(asString("int")))
7964            and friend class X (matcher = friendDecl(hasType("X"))
7965 class X {};
7966 void y(X &amp;x) { x; X z; }
7967 typedef int U;
7968 class Y { friend class X; };
7969</pre></td></tr>
7970
7971
7972<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>
7973<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7974that matches the given matcher.
7975
7976Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7977  bool y() { return true; }
7978  bool x = y();
7979</pre></td></tr>
7980
7981
7982<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>
7983<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7984expression.
7985
7986Given
7987  void f(int b) {
7988    int a[b];
7989  }
7990variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7991  varDecl(hasName("b")))))))
7992  matches "int a[b]"
7993</pre></td></tr>
7994
7995
7996<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>
7997<tr><td colspan="4" class="doc" id="hasBody2"><pre></pre></td></tr>
7998
7999
8000<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>
8001<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
8002switch statement or conditional operator.
8003
8004Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
8005  if (true) {}
8006</pre></td></tr>
8007
8008<!--END_TRAVERSAL_MATCHERS -->
8009</table>
8010
8011</div>
8012</body>
8013</html>
8014
8015
8016