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