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