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('isDirectlyDerivedFrom1')"><a name="isDirectlyDerivedFrom1Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
2585<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
2586</pre></td></tr>
2587
2588
2589<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>
2590<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2591static member variable template instantiations.
2592
2593Given
2594  template&lt;typename T&gt; void A(T t) { }
2595  template&lt;&gt; void A(int N) { }
2596functionDecl(isExplicitTemplateSpecialization())
2597  matches the specialization A&lt;int&gt;().
2598
2599Usable 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;
2600</pre></td></tr>
2601
2602
2603<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>
2604<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2605
2606Given:
2607  class A final {};
2608
2609  struct B {
2610    virtual void f();
2611  };
2612
2613  struct C : B {
2614    void f() final;
2615  };
2616matches A and C::f, but not B, C, or B::f
2617</pre></td></tr>
2618
2619
2620<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>
2621<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2622
2623Given:
2624  auto x = []{};
2625
2626cxxRecordDecl(isLambda()) matches the implicit class declaration of
2627decltype(x)
2628</pre></td></tr>
2629
2630
2631<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>
2632<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
2633isSameOrDerivedFrom(hasName(...)).
2634</pre></td></tr>
2635
2636
2637<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>
2638<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2639member variable template instantiations.
2640
2641Given
2642  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2643or
2644  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2645or
2646  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
2647cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2648  matches the template instantiation of X&lt;A&gt;.
2649
2650But given
2651  template &lt;typename T&gt;  class X {}; class A {};
2652  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2653cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2654  does not match, as X&lt;A&gt; is an explicit template specialization.
2655
2656Usable 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;
2657</pre></td></tr>
2658
2659
2660<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>
2661<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2662a specific number of arguments (including absent default arguments).
2663
2664Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2665  void f(int x, int y);
2666  f(0, 0);
2667</pre></td></tr>
2668
2669
2670<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>
2671<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
2672
2673Example matches y(x) but not y(42) or NS::y(x).
2674  namespace NS {
2675    struct X {};
2676    void y(X);
2677  }
2678
2679  void y(...);
2680
2681  void test() {
2682    NS::X x;
2683    y(x); // Matches
2684    NS::y(x); // Doesn't match
2685    y(42); // Doesn't match
2686    using NS::y;
2687    y(x); // Found by both unqualified lookup and ADL, doesn't match
2688   }
2689</pre></td></tr>
2690
2691
2692<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>
2693<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2694
2695Example: matches the implicit cast around 0
2696(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2697  int *p = 0;
2698
2699If the matcher is use from clang-query, CastKind parameter
2700should be passed as a quoted string. e.g., ofKind("CK_NullToPointer").
2701</pre></td></tr>
2702
2703
2704<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>
2705<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2706
2707
2708<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>
2709<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2710
2711Given
2712  f('false, 3.14, 42);
2713characterLiteral(equals(0))
2714  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2715  match false
2716floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2717  match 3.14
2718integerLiteral(equals(42))
2719  matches 42
2720
2721Note that you cannot directly match a negative numeric literal because the
2722minus sign is not part of the literal: It is a unary operator whose operand
2723is the positive numeric literal. Instead, you must use a unaryOperator()
2724matcher to match the minus sign:
2725
2726unaryOperator(hasOperatorName("-"),
2727              hasUnaryOperand(integerLiteral(equals(13))))
2728
2729Usable 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;,
2730           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;
2731</pre></td></tr>
2732
2733
2734<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>
2735<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2736
2737
2738<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>
2739<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2740
2741
2742<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>
2743<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2744
2745Given
2746  template&lt;typename T&gt; struct C {};
2747  C&lt;int&gt; c;
2748classTemplateSpecializationDecl(templateArgumentCountIs(1))
2749  matches C&lt;int&gt;.
2750</pre></td></tr>
2751
2752
2753<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>
2754<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2755child statements.
2756
2757Example: Given
2758  { for (;;) {} }
2759compoundStmt(statementCountIs(0)))
2760  matches '{}'
2761  but does not match the outer compound statement.
2762</pre></td></tr>
2763
2764
2765<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>
2766<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2767
2768Given
2769  int a[42];
2770  int b[2 * 21];
2771  int c[41], d[43];
2772  char *s = "abcd";
2773  wchar_t *ws = L"abcd";
2774  char *w = "a";
2775constantArrayType(hasSize(42))
2776  matches "int a[42]" and "int b[2 * 21]"
2777stringLiteral(hasSize(4))
2778  matches "abcd", L"abcd"
2779</pre></td></tr>
2780
2781
2782<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>
2783<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2784declarations.
2785
2786Example: Given
2787  int a, b;
2788  int c;
2789  int d = 2, e;
2790declCountIs(2)
2791  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2792</pre></td></tr>
2793
2794
2795<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>
2796<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2797
2798Matches a node if it equals the node previously bound to ID.
2799
2800Given
2801  class X { int a; int b; };
2802cxxRecordDecl(
2803    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2804    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2805  matches the class X, as a and b have the same type.
2806
2807Note that when multiple matches are involved via forEach* matchers,
2808equalsBoundNodes acts as a filter.
2809For example:
2810compoundStmt(
2811    forEachDescendant(varDecl().bind("d")),
2812    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2813will trigger a match for each combination of variable declaration
2814and reference to that variable declaration within a compound statement.
2815</pre></td></tr>
2816
2817
2818<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>
2819<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2820
2821Decl has pointer identity in the AST.
2822</pre></td></tr>
2823
2824
2825<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>
2826<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2827
2828Given
2829  __attribute__((device)) void f() { ... }
2830decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2831f. If the matcher is used from clang-query, attr::Kind parameter should be
2832passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2833</pre></td></tr>
2834
2835
2836<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>
2837<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2838partially matching a given regex.
2839
2840Example matches Y but not X
2841    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2842  #include "ASTMatcher.h"
2843  class X {};
2844ASTMatcher.h:
2845  class Y {};
2846
2847Usable 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;
2848</pre></td></tr>
2849
2850
2851<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>
2852<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2853
2854Example matches X but not Y
2855  (matcher = cxxRecordDecl(isExpansionInMainFile())
2856  #include &lt;Y.h&gt;
2857  class X {};
2858Y.h:
2859  class Y {};
2860
2861Usable 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;
2862</pre></td></tr>
2863
2864
2865<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>
2866<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2867
2868Example matches Y but not X
2869    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2870  #include &lt;SystemHeader.h&gt;
2871  class X {};
2872SystemHeader.h:
2873  class Y {};
2874
2875Usable 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;
2876</pre></td></tr>
2877
2878
2879<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
2880<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2881by the compiler (eg. implicit default/copy constructors).
2882</pre></td></tr>
2883
2884
2885<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>
2886<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
2887
2888Given
2889  class vector {};
2890  namespace foo {
2891    class vector {};
2892    namespace std {
2893      class vector {};
2894    }
2895  }
2896  namespace std {
2897    inline namespace __1 {
2898      class vector {}; // #1
2899      namespace experimental {
2900        class vector {};
2901      }
2902    }
2903  }
2904cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
2905</pre></td></tr>
2906
2907
2908<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
2909<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2910
2911Given
2912  class C {
2913  public:    int a;
2914  protected: int b;
2915  private:   int c;
2916  };
2917fieldDecl(isPrivate())
2918  matches 'int c;'
2919</pre></td></tr>
2920
2921
2922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
2923<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2924
2925Given
2926  class C {
2927  public:    int a;
2928  protected: int b;
2929  private:   int c;
2930  };
2931fieldDecl(isProtected())
2932  matches 'int b;'
2933</pre></td></tr>
2934
2935
2936<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>
2937<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2938
2939Given
2940  class C {
2941  public:    int a;
2942  protected: int b;
2943  private:   int c;
2944  };
2945fieldDecl(isPublic())
2946  matches 'int a;'
2947</pre></td></tr>
2948
2949
2950<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>
2951<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2952a specific number of designators.
2953
2954Example: Given
2955  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2956  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2957designatorCountIs(2)
2958  matches '{ [2].y = 1.0, [0].x = 1.0 }',
2959  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2960</pre></td></tr>
2961
2962
2963<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>
2964<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2965
2966Example matches Y (matcher = enumDecl(isScoped()))
2967enum X {};
2968enum class Y {};
2969</pre></td></tr>
2970
2971
2972<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>
2973<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
2974neither type- nor value-dependent.
2975
2976In the following example, the expression sizeof(sizeof(T() + T()))
2977is instantiation-dependent (since it involves a template parameter T),
2978but is neither type- nor value-dependent, since the type of the inner
2979sizeof is known (std::size_t) and therefore the size of the outer
2980sizeof is known.
2981  template&lt;typename T&gt;
2982  void f(T x, T y) { sizeof(sizeof(T() + T()); }
2983expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
2984</pre></td></tr>
2985
2986
2987<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>
2988<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
2989is not yet instantiated.
2990
2991For example, the expressions "x" and "x + y" are type-dependent in
2992the following code, but "y" is not type-dependent:
2993  template&lt;typename T&gt;
2994  void add(T x, int y) {
2995    x + y;
2996  }
2997expr(isTypeDependent()) matches x + y
2998</pre></td></tr>
2999
3000
3001<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>
3002<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3003non-type template parameter.
3004
3005For example, the array bound of "Chars" in the following example is
3006value-dependent.
3007  template&lt;int Size&gt; int f() { return Size; }
3008expr(isValueDependent()) matches return Size
3009</pre></td></tr>
3010
3011
3012<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>
3013<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3014bit width.
3015
3016Given
3017  class C {
3018    int a : 2;
3019    int b : 4;
3020    int c : 2;
3021  };
3022fieldDecl(hasBitWidth(2))
3023  matches 'int a;' and 'int c;' but not 'int b;'.
3024</pre></td></tr>
3025
3026
3027<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>
3028<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3029
3030Given
3031  class C {
3032    int a : 2;
3033    int b;
3034  };
3035fieldDecl(isBitField())
3036  matches 'int a;' but not 'int b;'.
3037</pre></td></tr>
3038
3039
3040<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>
3041<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
3042
3043Given
3044  f('false, 3.14, 42);
3045characterLiteral(equals(0))
3046  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3047  match false
3048floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3049  match 3.14
3050integerLiteral(equals(42))
3051  matches 42
3052
3053Note that you cannot directly match a negative numeric literal because the
3054minus sign is not part of the literal: It is a unary operator whose operand
3055is the positive numeric literal. Instead, you must use a unaryOperator()
3056matcher to match the minus sign:
3057
3058unaryOperator(hasOperatorName("-"),
3059              hasUnaryOperand(integerLiteral(equals(13))))
3060
3061Usable 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;,
3062           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;
3063</pre></td></tr>
3064
3065
3066<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>
3067<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3068
3069
3070<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>
3071<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3072
3073Given:
3074  void f();
3075  void g() noexcept;
3076  void h() noexcept(true);
3077  void i() noexcept(false);
3078  void j() throw();
3079  void k() throw(int);
3080  void l() throw(...);
3081functionDecl(hasDynamicExceptionSpec()) and
3082  functionProtoType(hasDynamicExceptionSpec())
3083  match the declarations of j, k, and l, but not f, g, h, or i.
3084</pre></td></tr>
3085
3086
3087<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>
3088<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3089
3090Matches overloaded operator names specified in strings without the
3091"operator" prefix: e.g. "&lt;&lt;".
3092
3093Given:
3094  class A { int operator*(); };
3095  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3096  A a;
3097  a &lt;&lt; a;   // &lt;-- This matches
3098
3099cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3100specified line and
3101cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3102matches the declaration of A.
3103
3104Usable 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;
3105</pre></td></tr>
3106
3107
3108<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>
3109<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3110
3111Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3112int X() {}
3113auto Y() -&gt; int {}
3114</pre></td></tr>
3115
3116
3117<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>
3118<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3119       and if constexpr.
3120
3121Given:
3122  constexpr int foo = 42;
3123  constexpr int bar();
3124  void baz() { if constexpr(1 &gt; 0) {} }
3125varDecl(isConstexpr())
3126  matches the declaration of foo.
3127functionDecl(isConstexpr())
3128  matches the declaration of bar.
3129ifStmt(isConstexpr())
3130  matches the if statement in baz.
3131</pre></td></tr>
3132
3133
3134<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>
3135<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3136
3137Given:
3138  class A { ~A(); };
3139  class B { ~B() = default; };
3140functionDecl(isDefaulted())
3141  matches the declaration of ~B, but not ~A.
3142</pre></td></tr>
3143
3144
3145<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>
3146<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
3147
3148Example matches A, va, fa
3149  class A {};
3150  class B;  // Doesn't match, as it has no body.
3151  int va;
3152  extern int vb;  // Doesn't match, as it doesn't define the variable.
3153  void fa() {}
3154  void fb();  // Doesn't match, as it has no body.
3155  @interface X
3156  - (void)ma; // Doesn't match, interface is declaration.
3157  @end
3158  @implementation X
3159  - (void)ma {}
3160  @end
3161
3162Usable 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;,
3163  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3164</pre></td></tr>
3165
3166
3167<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>
3168<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3169
3170Given:
3171  void Func();
3172  void DeletedFunc() = delete;
3173functionDecl(isDeleted())
3174  matches the declaration of DeletedFunc, but not Func.
3175</pre></td></tr>
3176
3177
3178<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>
3179<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3180static member variable template instantiations.
3181
3182Given
3183  template&lt;typename T&gt; void A(T t) { }
3184  template&lt;&gt; void A(int N) { }
3185functionDecl(isExplicitTemplateSpecialization())
3186  matches the specialization A&lt;int&gt;().
3187
3188Usable 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;
3189</pre></td></tr>
3190
3191
3192<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>
3193<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
3194
3195Given:
3196  extern "C" void f() {}
3197  extern "C" { void g() {} }
3198  void h() {}
3199  extern "C" int x = 1;
3200  extern "C" int y = 2;
3201  int z = 3;
3202functionDecl(isExternC())
3203  matches the declaration of f and g, but not the declaration of h.
3204varDecl(isExternC())
3205  matches the declaration of x and y, but not the declaration of z.
3206</pre></td></tr>
3207
3208
3209<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>
3210<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3211the inline keyword.
3212
3213Given
3214  inline void f();
3215  void g();
3216  namespace n {
3217  inline namespace m {}
3218  }
3219functionDecl(isInline()) will match ::f().
3220namespaceDecl(isInline()) will match n::m.
3221</pre></td></tr>
3222
3223
3224<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>
3225<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3226into an executable program.
3227</pre></td></tr>
3228
3229
3230<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>
3231<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3232
3233Given
3234  void nope();
3235  [[noreturn]] void a();
3236  __attribute__((noreturn)) void b();
3237  struct c { [[noreturn]] c(); };
3238functionDecl(isNoReturn())
3239  matches all of those except
3240  void nope();
3241</pre></td></tr>
3242
3243
3244<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>
3245<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3246
3247Given:
3248  void f();
3249  void g() noexcept;
3250  void h() throw();
3251  void i() throw(int);
3252  void j() noexcept(false);
3253functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3254  match the declarations of g, and h, but not f, i or j.
3255</pre></td></tr>
3256
3257
3258<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>
3259<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
3260class specifier ("static" keyword) written in the source.
3261
3262Given:
3263  static void f() {}
3264  static int i = 0;
3265  extern int j;
3266  int k;
3267functionDecl(isStaticStorageClass())
3268  matches the function declaration f.
3269varDecl(isStaticStorageClass())
3270  matches the variable declaration i.
3271</pre></td></tr>
3272
3273
3274<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>
3275<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3276member variable template instantiations.
3277
3278Given
3279  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3280or
3281  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3282or
3283  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3284cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3285  matches the template instantiation of X&lt;A&gt;.
3286
3287But given
3288  template &lt;typename T&gt;  class X {}; class A {};
3289  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3290cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3291  does not match, as X&lt;A&gt; is an explicit template specialization.
3292
3293Usable 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;
3294</pre></td></tr>
3295
3296
3297<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>
3298<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3299
3300Example matches f, but not g or h. The function i will not match, even when
3301compiled in C mode.
3302  void f(...);
3303  void g(int);
3304  template &lt;typename... Ts&gt; void h(Ts...);
3305  void i();
3306</pre></td></tr>
3307
3308
3309<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>
3310<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3311specific parameter count.
3312
3313Given
3314  void f(int i) {}
3315  void g(int i, int j) {}
3316  void h(int i, int j);
3317  void j(int i);
3318  void k(int x, int y, int z, ...);
3319functionDecl(parameterCountIs(2))
3320  matches g and h
3321functionProtoType(parameterCountIs(2))
3322  matches g and h
3323functionProtoType(parameterCountIs(3))
3324  matches k
3325</pre></td></tr>
3326
3327
3328<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>
3329<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3330
3331Given:
3332  void f();
3333  void g() noexcept;
3334  void h() noexcept(true);
3335  void i() noexcept(false);
3336  void j() throw();
3337  void k() throw(int);
3338  void l() throw(...);
3339functionDecl(hasDynamicExceptionSpec()) and
3340  functionProtoType(hasDynamicExceptionSpec())
3341  match the declarations of j, k, and l, but not f, g, h, or i.
3342</pre></td></tr>
3343
3344
3345<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>
3346<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3347
3348Given:
3349  void f();
3350  void g() noexcept;
3351  void h() throw();
3352  void i() throw(int);
3353  void j() noexcept(false);
3354functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3355  match the declarations of g, and h, but not f, i or j.
3356</pre></td></tr>
3357
3358
3359<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>
3360<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3361specific parameter count.
3362
3363Given
3364  void f(int i) {}
3365  void g(int i, int j) {}
3366  void h(int i, int j);
3367  void j(int i);
3368  void k(int x, int y, int z, ...);
3369functionDecl(parameterCountIs(2))
3370  matches g and h
3371functionProtoType(parameterCountIs(2))
3372  matches g and h
3373functionProtoType(parameterCountIs(3))
3374  matches k
3375</pre></td></tr>
3376
3377
3378<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>
3379<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3380       and if constexpr.
3381
3382Given:
3383  constexpr int foo = 42;
3384  constexpr int bar();
3385  void baz() { if constexpr(1 &gt; 0) {} }
3386varDecl(isConstexpr())
3387  matches the declaration of foo.
3388functionDecl(isConstexpr())
3389  matches the declaration of bar.
3390ifStmt(isConstexpr())
3391  matches the if statement in baz.
3392</pre></td></tr>
3393
3394
3395<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>
3396<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3397
3398
3399<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>
3400<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3401
3402Given
3403  f('false, 3.14, 42);
3404characterLiteral(equals(0))
3405  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3406  match false
3407floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3408  match 3.14
3409integerLiteral(equals(42))
3410  matches 42
3411
3412Note that you cannot directly match a negative numeric literal because the
3413minus sign is not part of the literal: It is a unary operator whose operand
3414is the positive numeric literal. Instead, you must use a unaryOperator()
3415matcher to match the minus sign:
3416
3417unaryOperator(hasOperatorName("-"),
3418              hasUnaryOperand(integerLiteral(equals(13))))
3419
3420Usable 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;,
3421           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;
3422</pre></td></tr>
3423
3424
3425<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>
3426<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3427
3428
3429<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>
3430<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3431
3432
3433<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>
3434<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3435to '.'.
3436
3437Member calls on the implicit this pointer match as called with '-&gt;'.
3438
3439Given
3440  class Y {
3441    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3442    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3443    int a;
3444    static int b;
3445  };
3446  template &lt;class T&gt;
3447  class Z {
3448    void x() { this-&gt;m; }
3449  };
3450memberExpr(isArrow())
3451  matches this-&gt;x, x, y.x, a, this-&gt;b
3452cxxDependentScopeMemberExpr(isArrow())
3453  matches this-&gt;m
3454unresolvedMemberExpr(isArrow())
3455  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3456</pre></td></tr>
3457
3458
3459<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>
3460<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3461
3462Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3463void f() {
3464  int x;
3465  static int y;
3466}
3467int z;
3468
3469Example matches f() because it has external formal linkage despite being
3470unique to the translation unit as though it has internal likage
3471(matcher = functionDecl(hasExternalFormalLinkage()))
3472
3473namespace {
3474void f() {}
3475}
3476</pre></td></tr>
3477
3478
3479<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>
3480<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3481
3482Supports specifying enclosing namespaces or classes by prefixing the name
3483with '&lt;enclosing&gt;::'.
3484Does not match typedefs of an underlying type with the given name.
3485
3486Example matches X (Name == "X")
3487  class X;
3488
3489Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3490  namespace a { namespace b { class X; } }
3491</pre></td></tr>
3492
3493
3494<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>
3495<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3496a substring matched by the given RegExp.
3497
3498Supports specifying enclosing namespaces or classes by
3499prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3500of an underlying type with the given name.
3501
3502Example matches X (regexp == "::X")
3503  class X;
3504
3505Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3506  namespace foo { namespace bar { class X; } }
3507</pre></td></tr>
3508
3509
3510<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>
3511<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3512
3513Given
3514  namespace n {
3515  namespace {} // #1
3516  }
3517namespaceDecl(isAnonymous()) will match #1 but not ::n.
3518</pre></td></tr>
3519
3520
3521<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>
3522<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3523the inline keyword.
3524
3525Given
3526  inline void f();
3527  void g();
3528  namespace n {
3529  inline namespace m {}
3530  }
3531functionDecl(isInline()) will match ::f().
3532namespaceDecl(isInline()) will match n::m.
3533</pre></td></tr>
3534
3535
3536<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>
3537<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3538
3539Given
3540
3541  #pragma omp parallel
3542  #pragma omp parallel default(none)
3543  #pragma omp parallel default(shared)
3544
3545``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3546</pre></td></tr>
3547
3548
3549<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>
3550<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3551
3552Given
3553
3554  #pragma omp parallel
3555  #pragma omp parallel default(none)
3556  #pragma omp parallel default(shared)
3557
3558``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3559</pre></td></tr>
3560
3561
3562<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>
3563<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3564clause kind.
3565
3566Given
3567
3568  #pragma omp parallel
3569  #pragma omp parallel for
3570  #pragma omp          for
3571
3572`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3573``omp parallel`` and ``omp parallel for``.
3574
3575If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3576should be passed as a quoted string. e.g.,
3577``isAllowedToContainClauseKind("OMPC_default").``
3578</pre></td></tr>
3579
3580
3581<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>
3582<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3583i.e., directives that can't have a structured block.
3584
3585Given
3586
3587  #pragma omp parallel
3588  {}
3589  #pragma omp taskyield
3590
3591``ompExecutableDirective(isStandaloneDirective()))`` matches
3592``omp taskyield``.
3593</pre></td></tr>
3594
3595
3596<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>
3597<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3598a specific number of arguments (including absent default arguments).
3599
3600Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3601  void f(int x, int y);
3602  f(0, 0);
3603</pre></td></tr>
3604
3605
3606<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>
3607<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3608
3609objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3610message expression in
3611
3612  UIWebView *webView = ...;
3613  CGRect bodyFrame = webView.frame;
3614  bodyFrame.size.height = self.bodyContentHeight;
3615  webView.frame = bodyFrame;
3616  //     ^---- matches here
3617</pre></td></tr>
3618
3619
3620<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>
3621<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3622
3623Matches only when the selector of the objCMessageExpr is NULL. This may
3624represent an error condition in the tree!
3625</pre></td></tr>
3626
3627
3628<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>
3629<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3630
3631 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3632 matches the outer message expr in the code below, but NOT the message
3633 invocation for self.bodyView.
3634    [self.bodyView loadHTMLString:html baseURL:NULL];
3635</pre></td></tr>
3636
3637
3638<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>
3639<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3640
3641 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3642 matches self.bodyView in the code below, but NOT the outer message
3643 invocation of "loadHTMLString:baseURL:".
3644    [self.bodyView loadHTMLString:html baseURL:NULL];
3645</pre></td></tr>
3646
3647
3648<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>
3649<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3650
3651Example
3652matcher = objcMessageExpr(isClassMessage())
3653matches
3654  [NSString stringWithFormat:@"format"];
3655but not
3656  NSString *x = @"hello";
3657  [x containsString:@"h"];
3658</pre></td></tr>
3659
3660
3661<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>
3662<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3663
3664Example
3665matcher = objcMessageExpr(isInstanceMessage())
3666matches
3667  NSString *x = @"hello";
3668  [x containsString:@"h"];
3669but not
3670  [NSString stringWithFormat:@"format"];
3671</pre></td></tr>
3672
3673
3674<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>
3675<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3676a substring matched by the given RegExp.
3677 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3678 invocation for self.bodyView.
3679    [self.bodyView loadHTMLString:html baseURL:NULL];
3680</pre></td></tr>
3681
3682
3683<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>
3684<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3685
3686 matcher = objCMessageExpr(numSelectorArgs(0));
3687 matches self.bodyView in the code below
3688
3689 matcher = objCMessageExpr(numSelectorArgs(2));
3690 matches the invocation of "loadHTMLString:baseURL:" but not that
3691 of self.bodyView
3692    [self.bodyView loadHTMLString:html baseURL:NULL];
3693</pre></td></tr>
3694
3695
3696<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>
3697<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
3698
3699Example
3700matcher = objcMethodDecl(isClassMethod())
3701matches
3702@interface I + (void)foo; @end
3703but not
3704@interface I - (void)bar; @end
3705</pre></td></tr>
3706
3707
3708<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>
3709<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3710
3711Example matches A, va, fa
3712  class A {};
3713  class B;  // Doesn't match, as it has no body.
3714  int va;
3715  extern int vb;  // Doesn't match, as it doesn't define the variable.
3716  void fa() {}
3717  void fb();  // Doesn't match, as it has no body.
3718  @interface X
3719  - (void)ma; // Doesn't match, interface is declaration.
3720  @end
3721  @implementation X
3722  - (void)ma {}
3723  @end
3724
3725Usable 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;,
3726  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3727</pre></td></tr>
3728
3729
3730<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>
3731<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
3732
3733Example
3734matcher = objcMethodDecl(isInstanceMethod())
3735matches
3736@interface I - (void)bar; @end
3737but not
3738@interface I + (void)foo; @end
3739</pre></td></tr>
3740
3741
3742<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>
3743<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3744
3745Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3746void x(int val) {}
3747void y(int val = 0) {}
3748</pre></td></tr>
3749
3750
3751<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>
3752<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3753
3754Given
3755  class Y { public: void x(); };
3756  void z() { Y* y; y-&gt;x(); }
3757cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3758  matches y-&gt;x()
3759</pre></td></tr>
3760
3761
3762<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>
3763<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3764
3765Matches a node if it equals the node previously bound to ID.
3766
3767Given
3768  class X { int a; int b; };
3769cxxRecordDecl(
3770    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3771    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3772  matches the class X, as a and b have the same type.
3773
3774Note that when multiple matches are involved via forEach* matchers,
3775equalsBoundNodes acts as a filter.
3776For example:
3777compoundStmt(
3778    forEachDescendant(varDecl().bind("d")),
3779    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3780will trigger a match for each combination of variable declaration
3781and reference to that variable declaration within a compound statement.
3782</pre></td></tr>
3783
3784
3785<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>
3786<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3787the node, not hidden within a typedef.
3788
3789Given
3790  typedef const int const_int;
3791  const_int i;
3792  int *const j;
3793  int *volatile k;
3794  int m;
3795varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3796i is const-qualified but the qualifier is not local.
3797</pre></td></tr>
3798
3799
3800<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>
3801<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3802
3803Given
3804  void a(char);
3805  void b(wchar_t);
3806  void c(double);
3807functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3808matches "a(char)", "b(wchar_t)", but not "c(double)".
3809</pre></td></tr>
3810
3811
3812<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>
3813<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3814the Objective-C object pointer type, which is different despite being
3815syntactically similar.
3816
3817Given
3818  int *i = nullptr;
3819
3820  @interface Foo
3821  @end
3822  Foo *f;
3823
3824  int j;
3825varDecl(hasType(isAnyPointer()))
3826  matches "int *i" and "Foo *f", but not "int j".
3827</pre></td></tr>
3828
3829
3830<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>
3831<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3832include "top-level" const.
3833
3834Given
3835  void a(int);
3836  void b(int const);
3837  void c(const int);
3838  void d(const int*);
3839  void e(int const) {};
3840functionDecl(hasAnyParameter(hasType(isConstQualified())))
3841  matches "void b(int const)", "void c(const int)" and
3842  "void e(int const) {}". It does not match d as there
3843  is no top-level const on the parameter type "const int *".
3844</pre></td></tr>
3845
3846
3847<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>
3848<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3849
3850Given
3851  void a(int);
3852  void b(long);
3853  void c(double);
3854functionDecl(hasAnyParameter(hasType(isInteger())))
3855matches "a(int)", "b(long)", but not "c(double)".
3856</pre></td></tr>
3857
3858
3859<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>
3860<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3861
3862Given
3863  void a(int);
3864  void b(unsigned long);
3865  void c(double);
3866functionDecl(hasAnyParameter(hasType(isSignedInteger())))
3867matches "a(int)", but not "b(unsigned long)" and "c(double)".
3868</pre></td></tr>
3869
3870
3871<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>
3872<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3873
3874Given
3875  void a(int);
3876  void b(unsigned long);
3877  void c(double);
3878functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
3879matches "b(unsigned long)", but not "a(int)" and "c(double)".
3880</pre></td></tr>
3881
3882
3883<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>
3884<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3885include "top-level" volatile.
3886
3887Given
3888  void a(int);
3889  void b(int volatile);
3890  void c(volatile int);
3891  void d(volatile int*);
3892  void e(int volatile) {};
3893functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3894  matches "void b(int volatile)", "void c(volatile int)" and
3895  "void e(int volatile) {}". It does not match d as there
3896  is no top-level volatile on the parameter type "volatile int *".
3897</pre></td></tr>
3898
3899
3900<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>
3901<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3902
3903Example matches C, but not S or U.
3904  struct S {};
3905  class C {};
3906  union U {};
3907</pre></td></tr>
3908
3909
3910<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>
3911<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3912
3913Example matches S, but not C or U.
3914  struct S {};
3915  class C {};
3916  union U {};
3917</pre></td></tr>
3918
3919
3920<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>
3921<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3922
3923Example matches U, but not C or S.
3924  struct S {};
3925  class C {};
3926  union U {};
3927</pre></td></tr>
3928
3929
3930<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>
3931<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3932
3933Matches a node if it equals the node previously bound to ID.
3934
3935Given
3936  class X { int a; int b; };
3937cxxRecordDecl(
3938    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3939    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3940  matches the class X, as a and b have the same type.
3941
3942Note that when multiple matches are involved via forEach* matchers,
3943equalsBoundNodes acts as a filter.
3944For example:
3945compoundStmt(
3946    forEachDescendant(varDecl().bind("d")),
3947    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3948will trigger a match for each combination of variable declaration
3949and reference to that variable declaration within a compound statement.
3950</pre></td></tr>
3951
3952
3953<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>
3954<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
3955
3956Stmt has pointer identity in the AST.
3957</pre></td></tr>
3958
3959
3960<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>
3961<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
3962partially matching a given regex.
3963
3964Example matches Y but not X
3965    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
3966  #include "ASTMatcher.h"
3967  class X {};
3968ASTMatcher.h:
3969  class Y {};
3970
3971Usable 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;
3972</pre></td></tr>
3973
3974
3975<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>
3976<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
3977
3978Example matches X but not Y
3979  (matcher = cxxRecordDecl(isExpansionInMainFile())
3980  #include &lt;Y.h&gt;
3981  class X {};
3982Y.h:
3983  class Y {};
3984
3985Usable 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;
3986</pre></td></tr>
3987
3988
3989<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>
3990<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
3991
3992Example matches Y but not X
3993    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
3994  #include &lt;SystemHeader.h&gt;
3995  class X {};
3996SystemHeader.h:
3997  class Y {};
3998
3999Usable 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;
4000</pre></td></tr>
4001
4002
4003<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>
4004<tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block
4005of an OpenMP executable directive.
4006
4007Given
4008
4009   #pragma omp parallel
4010   {}
4011
4012``stmt(isOMPStructuredBlock()))`` matches ``{}``.
4013</pre></td></tr>
4014
4015
4016<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>
4017<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4018
4019Given
4020  int a[42];
4021  int b[2 * 21];
4022  int c[41], d[43];
4023  char *s = "abcd";
4024  wchar_t *ws = L"abcd";
4025  char *w = "a";
4026constantArrayType(hasSize(42))
4027  matches "int a[42]" and "int b[2 * 21]"
4028stringLiteral(hasSize(4))
4029  matches "abcd", L"abcd"
4030</pre></td></tr>
4031
4032
4033<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>
4034<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4035
4036Example matches A, va, fa
4037  class A {};
4038  class B;  // Doesn't match, as it has no body.
4039  int va;
4040  extern int vb;  // Doesn't match, as it doesn't define the variable.
4041  void fa() {}
4042  void fb();  // Doesn't match, as it has no body.
4043  @interface X
4044  - (void)ma; // Doesn't match, interface is declaration.
4045  @end
4046  @implementation X
4047  - (void)ma {}
4048  @end
4049
4050Usable 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;,
4051  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4052</pre></td></tr>
4053
4054
4055<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>
4056<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4057
4058Note that 'Value' is a string as the template argument's value is
4059an arbitrary precision integer. 'Value' must be euqal to the canonical
4060representation of that integral value in base 10.
4061
4062Given
4063  template&lt;int T&gt; struct C {};
4064  C&lt;42&gt; c;
4065classTemplateSpecializationDecl(
4066  hasAnyTemplateArgument(equalsIntegralValue("42")))
4067  matches the implicit instantiation of C in C&lt;42&gt;.
4068</pre></td></tr>
4069
4070
4071<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>
4072<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4073
4074Given
4075  template&lt;int T&gt; struct C {};
4076  C&lt;42&gt; c;
4077classTemplateSpecializationDecl(
4078  hasAnyTemplateArgument(isIntegral()))
4079  matches the implicit instantiation of C in C&lt;42&gt;
4080  with isIntegral() matching 42.
4081</pre></td></tr>
4082
4083
4084<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>
4085<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4086
4087Given
4088  template&lt;typename T&gt; struct C {};
4089  C&lt;int&gt; c;
4090classTemplateSpecializationDecl(templateArgumentCountIs(1))
4091  matches C&lt;int&gt;.
4092</pre></td></tr>
4093
4094
4095<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>
4096<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4097partially matching a given regex.
4098
4099Example matches Y but not X
4100    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4101  #include "ASTMatcher.h"
4102  class X {};
4103ASTMatcher.h:
4104  class Y {};
4105
4106Usable 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;
4107</pre></td></tr>
4108
4109
4110<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>
4111<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4112
4113Example matches X but not Y
4114  (matcher = cxxRecordDecl(isExpansionInMainFile())
4115  #include &lt;Y.h&gt;
4116  class X {};
4117Y.h:
4118  class Y {};
4119
4120Usable 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;
4121</pre></td></tr>
4122
4123
4124<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>
4125<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4126
4127Example matches Y but not X
4128    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4129  #include &lt;SystemHeader.h&gt;
4130  class X {};
4131SystemHeader.h:
4132  class Y {};
4133
4134Usable 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;
4135</pre></td></tr>
4136
4137
4138<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>
4139<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4140
4141Given
4142 struct S { bool func(); };
4143functionDecl(returns(booleanType()))
4144  matches "bool func();"
4145</pre></td></tr>
4146
4147
4148<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>
4149<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4150
4151Matches a node if it equals the node previously bound to ID.
4152
4153Given
4154  class X { int a; int b; };
4155cxxRecordDecl(
4156    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4157    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4158  matches the class X, as a and b have the same type.
4159
4160Note that when multiple matches are involved via forEach* matchers,
4161equalsBoundNodes acts as a filter.
4162For example:
4163compoundStmt(
4164    forEachDescendant(varDecl().bind("d")),
4165    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4166will trigger a match for each combination of variable declaration
4167and reference to that variable declaration within a compound statement.
4168</pre></td></tr>
4169
4170
4171<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>
4172<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4173
4174Type has pointer identity in the AST.
4175</pre></td></tr>
4176
4177
4178<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>
4179<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4180
4181Given
4182  int i;
4183  float f;
4184realFloatingPointType()
4185  matches "float f" but not "int i"
4186</pre></td></tr>
4187
4188
4189<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>
4190<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4191
4192Given
4193 struct S { void func(); };
4194functionDecl(returns(voidType()))
4195  matches "void func();"
4196</pre></td></tr>
4197
4198
4199<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>
4200<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4201
4202Given
4203  int x;
4204  int s = sizeof(x) + alignof(x)
4205unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4206  matches sizeof(x)
4207
4208If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4209should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4210</pre></td></tr>
4211
4212
4213<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>
4214<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4215unary).
4216
4217Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4218  !(a || b)
4219</pre></td></tr>
4220
4221
4222<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>
4223<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4224to '.'.
4225
4226Member calls on the implicit this pointer match as called with '-&gt;'.
4227
4228Given
4229  class Y {
4230    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4231    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4232    int a;
4233    static int b;
4234  };
4235  template &lt;class T&gt;
4236  class Z {
4237    void x() { this-&gt;m; }
4238  };
4239memberExpr(isArrow())
4240  matches this-&gt;x, x, y.x, a, this-&gt;b
4241cxxDependentScopeMemberExpr(isArrow())
4242  matches this-&gt;m
4243unresolvedMemberExpr(isArrow())
4244  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4245</pre></td></tr>
4246
4247
4248<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>
4249<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4250
4251Example matches x, but not y, z, or a.
4252(matcher = varDecl(hasAutomaticStorageDuration())
4253void f() {
4254  int x;
4255  static int y;
4256  thread_local int z;
4257}
4258int a;
4259</pre></td></tr>
4260
4261
4262<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>
4263<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4264
4265Example matches y and z (matcher = varDecl(hasGlobalStorage())
4266void f() {
4267  int x;
4268  static int y;
4269}
4270int z;
4271</pre></td></tr>
4272
4273
4274<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>
4275<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4276non-static local variable.
4277
4278Example matches x (matcher = varDecl(hasLocalStorage())
4279void f() {
4280  int x;
4281  static int y;
4282}
4283int z;
4284</pre></td></tr>
4285
4286
4287<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>
4288<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4289It includes the variable declared at namespace scope and those declared
4290with "static" and "extern" storage class specifiers.
4291
4292void f() {
4293  int x;
4294  static int y;
4295  thread_local int z;
4296}
4297int a;
4298static int b;
4299extern int c;
4300varDecl(hasStaticStorageDuration())
4301  matches the function declaration y, a, b and c.
4302</pre></td></tr>
4303
4304
4305<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>
4306<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4307
4308Example matches z, but not x, z, or a.
4309(matcher = varDecl(hasThreadStorageDuration())
4310void f() {
4311  int x;
4312  static int y;
4313  thread_local int z;
4314}
4315int a;
4316</pre></td></tr>
4317
4318
4319<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>
4320<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4321       and if constexpr.
4322
4323Given:
4324  constexpr int foo = 42;
4325  constexpr int bar();
4326  void baz() { if constexpr(1 &gt; 0) {} }
4327varDecl(isConstexpr())
4328  matches the declaration of foo.
4329functionDecl(isConstexpr())
4330  matches the declaration of bar.
4331ifStmt(isConstexpr())
4332  matches the if statement in baz.
4333</pre></td></tr>
4334
4335
4336<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>
4337<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4338
4339Example matches A, va, fa
4340  class A {};
4341  class B;  // Doesn't match, as it has no body.
4342  int va;
4343  extern int vb;  // Doesn't match, as it doesn't define the variable.
4344  void fa() {}
4345  void fb();  // Doesn't match, as it has no body.
4346  @interface X
4347  - (void)ma; // Doesn't match, interface is declaration.
4348  @end
4349  @implementation X
4350  - (void)ma {}
4351  @end
4352
4353Usable 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;,
4354  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4355</pre></td></tr>
4356
4357
4358<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>
4359<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4360a C++ catch block, or an Objective-C statement.
4361
4362Example matches x (matcher = varDecl(isExceptionVariable())
4363void f(int y) {
4364  try {
4365  } catch (int x) {
4366  }
4367}
4368</pre></td></tr>
4369
4370
4371<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>
4372<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4373static member variable template instantiations.
4374
4375Given
4376  template&lt;typename T&gt; void A(T t) { }
4377  template&lt;&gt; void A(int N) { }
4378functionDecl(isExplicitTemplateSpecialization())
4379  matches the specialization A&lt;int&gt;().
4380
4381Usable 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;
4382</pre></td></tr>
4383
4384
4385<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>
4386<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4387
4388Given:
4389  extern "C" void f() {}
4390  extern "C" { void g() {} }
4391  void h() {}
4392  extern "C" int x = 1;
4393  extern "C" int y = 2;
4394  int z = 3;
4395functionDecl(isExternC())
4396  matches the declaration of f and g, but not the declaration of h.
4397varDecl(isExternC())
4398  matches the declaration of x and y, but not the declaration of z.
4399</pre></td></tr>
4400
4401
4402<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>
4403<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4404
4405Example matches y (matcher = varDecl(isStaticLocal()))
4406void f() {
4407  int x;
4408  static int y;
4409}
4410static int z;
4411</pre></td></tr>
4412
4413
4414<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>
4415<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4416class specifier ("static" keyword) written in the source.
4417
4418Given:
4419  static void f() {}
4420  static int i = 0;
4421  extern int j;
4422  int k;
4423functionDecl(isStaticStorageClass())
4424  matches the function declaration f.
4425varDecl(isStaticStorageClass())
4426  matches the variable declaration i.
4427</pre></td></tr>
4428
4429
4430<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>
4431<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4432member variable template instantiations.
4433
4434Given
4435  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4436or
4437  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4438or
4439  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4440cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4441  matches the template instantiation of X&lt;A&gt;.
4442
4443But given
4444  template &lt;typename T&gt;  class X {}; class A {};
4445  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4446cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4447  does not match, as X&lt;A&gt; is an explicit template specialization.
4448
4449Usable 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;
4450</pre></td></tr>
4451
4452
4453<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>
4454<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4455template instantiations.
4456
4457Given
4458  template&lt;typename T&gt; void A(T t) { T i; }
4459  A(0);
4460  A(0U);
4461functionDecl(isInstantiated())
4462  matches 'A(int) {...};' and 'A(unsigned) {...}'.
4463</pre></td></tr>
4464
4465
4466<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>
4467<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
4468GNU's __null, C++11's nullptr, or C's NULL macro.
4469
4470Given:
4471  void *v1 = NULL;
4472  void *v2 = nullptr;
4473  void *v3 = __null; // GNU extension
4474  char *cp = (char *)0;
4475  int *ip = 0;
4476  int i = 0;
4477expr(nullPointerConstant())
4478  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
4479  initializer for i.
4480</pre></td></tr>
4481
4482
4483<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>
4484<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4485
4486This matcher is only provided as a performance optimization of hasName.
4487    hasAnyName(a, b, c)
4488 is equivalent to, but faster than
4489    anyOf(hasName(a), hasName(b), hasName(c))
4490</pre></td></tr>
4491
4492
4493<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>
4494<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4495Selector.getAsString()
4496
4497 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4498 matches both of the expressions below:
4499    [myObj methodA:argA];
4500    [myObj methodB:argB];
4501</pre></td></tr>
4502
4503
4504<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>
4505<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4506
4507Given
4508  int j;
4509  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4510  A(0);
4511  A(0U);
4512declStmt(isInTemplateInstantiation())
4513  matches 'int i;' and 'unsigned i'.
4514unless(stmt(isInTemplateInstantiation()))
4515  will NOT match j += 42; as it's shared between the template definition and
4516  instantiation.
4517</pre></td></tr>
4518
4519<!--END_NARROWING_MATCHERS -->
4520</table>
4521
4522<!-- ======================================================================= -->
4523<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4524<!-- ======================================================================= -->
4525
4526<p>Traversal matchers specify the relationship to other nodes that are
4527reachable from the current node.</p>
4528
4529<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4530forEachDescendant) which work on all nodes and allow users to write more generic
4531match expressions.</p>
4532
4533<table>
4534<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4535<!-- START_TRAVERSAL_MATCHERS -->
4536
4537<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>
4538<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4539
4540Unlike anyOf, eachOf will generate a match result for each
4541matching submatcher.
4542
4543For example, in:
4544  class A { int a; int b; };
4545The matcher:
4546  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4547                       has(fieldDecl(hasName("b")).bind("v"))))
4548will generate two results binding "v", the first of which binds
4549the field declaration of a, the second the field declaration of
4550b.
4551
4552Usable as: Any Matcher
4553</pre></td></tr>
4554
4555
4556<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4557<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4558provided matcher.
4559
4560Example matches X, A, A::X, B, B::C, B::C::X
4561  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4562  class X {};
4563  class A { class X {}; };  // Matches A, because A::X is a class of name
4564                            // X inside A.
4565  class B { class C { class X {}; }; };
4566
4567DescendantT must be an AST base type.
4568
4569As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4570each result that matches instead of only on the first one.
4571
4572Note: Recursively combined ForEachDescendant can cause many matches:
4573  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4574    forEachDescendant(cxxRecordDecl())
4575  )))
4576will match 10 times (plus injected class name matches) on:
4577  class A { class B { class C { class D { class E {}; }; }; }; };
4578
4579Usable as: Any Matcher
4580</pre></td></tr>
4581
4582
4583<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4584<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4585provided matcher.
4586
4587Example matches X, Y, Y::X, Z::Y, Z::Y::X
4588  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4589  class X {};
4590  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
4591                            // inside Y.
4592  class Z { class Y { class X {}; }; };  // Does not match Z.
4593
4594ChildT must be an AST base type.
4595
4596As opposed to 'has', 'forEach' will cause a match for each result that
4597matches instead of only on the first one.
4598
4599Usable as: Any Matcher
4600</pre></td></tr>
4601
4602
4603<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4604<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4605matcher.
4606
4607Given
4608void f() { if (true) { int x = 42; } }
4609void g() { for (;;) { int x = 43; } }
4610expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4611
4612Usable as: Any Matcher
4613</pre></td></tr>
4614
4615
4616<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4617<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4618provided matcher.
4619
4620Example matches X, Y, Z
4621    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4622  class X {};  // Matches X, because X::X is a class of name X inside X.
4623  class Y { class X {}; };
4624  class Z { class Y { class X {}; }; };
4625
4626DescendantT must be an AST base type.
4627
4628Usable as: Any Matcher
4629</pre></td></tr>
4630
4631
4632<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4633<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4634provided matcher.
4635
4636Example matches X, Y
4637  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4638  class X {};  // Matches X, because X::X is a class of name X inside X.
4639  class Y { class X {}; };
4640  class Z { class Y { class X {}; }; };  // Does not match Z.
4641
4642ChildT must be an AST base type.
4643
4644Usable as: Any Matcher
4645Note that has is direct matcher, so it also matches things like implicit
4646casts and paren casts. If you are matching with expr then you should
4647probably consider using ignoringParenImpCasts like:
4648has(ignoringParenImpCasts(expr())).
4649</pre></td></tr>
4650
4651
4652<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4653<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4654matcher.
4655
4656Given
4657void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4658compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4659
4660Usable as: Any Matcher
4661</pre></td></tr>
4662
4663
4664<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>
4665<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4666switch statement or conditional operator.
4667
4668Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4669  if (true) {}
4670</pre></td></tr>
4671
4672
4673<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>
4674<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4675(binary or ternary).
4676
4677Example matches b
4678  condition ? a : b
4679  condition ?: b
4680</pre></td></tr>
4681
4682
4683<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>
4684<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4685
4686Example 1 (conditional ternary operator): matches a
4687  condition ? a : b
4688
4689Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4690  condition ?: b
4691</pre></td></tr>
4692
4693
4694<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>
4695<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
4696matches the given matcher.
4697
4698The associated declaration is:
4699- for type nodes, the declaration of the underlying type
4700- for CallExpr, the declaration of the callee
4701- for MemberExpr, the declaration of the referenced member
4702- for CXXConstructExpr, the declaration of the constructor
4703- for CXXNewExpr, the declaration of the operator new
4704- for ObjCIvarExpr, the declaration of the ivar
4705
4706For type nodes, hasDeclaration will generally match the declaration of the
4707sugared type. Given
4708  class X {};
4709  typedef X Y;
4710  Y y;
4711in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4712typedefDecl. A common use case is to match the underlying, desugared type.
4713This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4714  varDecl(hasType(hasUnqualifiedDesugaredType(
4715      recordType(hasDeclaration(decl())))))
4716In this matcher, the decl will match the CXXRecordDecl of class X.
4717
4718Usable 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;,
4719  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;,
4720  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;,
4721  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;,
4722  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;,
4723  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;,
4724  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4725</pre></td></tr>
4726
4727
4728<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>
4729<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4730
4731Given
4732  int i[5];
4733  void f() { i[1] = 42; }
4734arraySubscriptExpression(hasBase(implicitCastExpr(
4735    hasSourceExpression(declRefExpr()))))
4736  matches i[1] with the declRefExpr() matching i
4737</pre></td></tr>
4738
4739
4740<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>
4741<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4742
4743Given
4744  int i[5];
4745  void f() { i[1] = 42; }
4746arraySubscriptExpression(hasIndex(integerLiteral()))
4747  matches i[1] with the integerLiteral() matching 1
4748</pre></td></tr>
4749
4750
4751<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>
4752<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4753
4754Example matches a (matcher = binaryOperator(hasLHS()))
4755  a || b
4756</pre></td></tr>
4757
4758
4759<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>
4760<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4761
4762Example matches b (matcher = binaryOperator(hasRHS()))
4763  a || b
4764</pre></td></tr>
4765
4766
4767<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>
4768<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4769type.
4770
4771Given
4772  struct A {};
4773  A a[7];
4774  int b[7];
4775arrayType(hasElementType(builtinType()))
4776  matches "int b[7]"
4777
4778Usable 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;
4779</pre></td></tr>
4780
4781
4782<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>
4783<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4784
4785Given
4786  _Atomic(int) i;
4787  _Atomic(float) f;
4788atomicType(hasValueType(isInteger()))
4789 matches "_Atomic(int) i"
4790
4791Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4792</pre></td></tr>
4793
4794
4795<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>
4796<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4797
4798Note: There is no TypeLoc for the deduced type and thus no
4799getDeducedLoc() matcher.
4800
4801Given
4802  auto a = 1;
4803  auto b = 2.0;
4804autoType(hasDeducedType(isInteger()))
4805  matches "auto a"
4806
4807Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
4808</pre></td></tr>
4809
4810
4811<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>
4812<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4813binary operator matches.
4814</pre></td></tr>
4815
4816
4817<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>
4818<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4819
4820Example matches a (matcher = binaryOperator(hasLHS()))
4821  a || b
4822</pre></td></tr>
4823
4824
4825<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>
4826<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4827
4828Example matches b (matcher = binaryOperator(hasRHS()))
4829  a || b
4830</pre></td></tr>
4831
4832
4833<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>
4834<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
4835block.
4836
4837Does not match the 'this' parameter of a method.
4838
4839Given
4840  class X { void f(int x, int y, int z) {} };
4841cxxMethodDecl(hasAnyParameter(hasName("y")))
4842  matches f(int x, int y, int z) {}
4843with hasAnyParameter(...)
4844  matching int y
4845
4846For ObjectiveC, given
4847  @interface I - (void) f:(int) y; @end
4848
4849the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
4850matches the declaration of method f with hasParameter
4851matching y.
4852
4853For blocks, given
4854  b = ^(int y) { printf("%d", y) };
4855
4856the matcher blockDecl(hasAnyParameter(hasName("y")))
4857matches the declaration of the block b with hasParameter
4858matching y.
4859</pre></td></tr>
4860
4861
4862<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>
4863<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
4864declaration or a block.
4865
4866Given
4867  class X { void f(int x) {} };
4868cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4869  matches f(int x) {}
4870with hasParameter(...)
4871  matching int x
4872
4873For ObjectiveC, given
4874  @interface I - (void) f:(int) y; @end
4875
4876the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4877matches the declaration of method f with hasParameter
4878matching y.
4879</pre></td></tr>
4880
4881
4882<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>
4883<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4884pointee matches a given matcher.
4885
4886Given
4887  int *a;
4888  int const *b;
4889  float const *f;
4890pointerType(pointee(isConstQualified(), isInteger()))
4891  matches "int const *b"
4892
4893Usable 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;,
4894  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;
4895</pre></td></tr>
4896
4897
4898<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>
4899<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4900
4901Given
4902  void f(int i);
4903  int y;
4904  f(y);
4905callExpr(
4906  forEachArgumentWithParam(
4907    declRefExpr(to(varDecl(hasName("y")))),
4908    parmVarDecl(hasType(isInteger()))
4909))
4910  matches f(y);
4911with declRefExpr(...)
4912  matching int y
4913and parmVarDecl(...)
4914  matching int i
4915</pre></td></tr>
4916
4917
4918<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>
4919<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4920expression, or an ObjC-message-send expression.
4921
4922Given
4923  void x(int, int, int) { int y; x(1, y, 42); }
4924callExpr(hasAnyArgument(declRefExpr()))
4925  matches x(1, y, 42)
4926with hasAnyArgument(...)
4927  matching y
4928
4929For ObjectiveC, given
4930  @interface I - (void) f:(int) y; @end
4931  void foo(I *i) { [i f:12]; }
4932objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4933  matches [i f:12]
4934</pre></td></tr>
4935
4936
4937<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>
4938<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4939call expression.
4940
4941Example matches y in x(y)
4942    (matcher = callExpr(hasArgument(0, declRefExpr())))
4943  void x(int) { int y; x(y); }
4944</pre></td></tr>
4945
4946
4947<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>
4948<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
4949matches the given matcher.
4950
4951The associated declaration is:
4952- for type nodes, the declaration of the underlying type
4953- for CallExpr, the declaration of the callee
4954- for MemberExpr, the declaration of the referenced member
4955- for CXXConstructExpr, the declaration of the constructor
4956- for CXXNewExpr, the declaration of the operator new
4957- for ObjCIvarExpr, the declaration of the ivar
4958
4959For type nodes, hasDeclaration will generally match the declaration of the
4960sugared type. Given
4961  class X {};
4962  typedef X Y;
4963  Y y;
4964in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4965typedefDecl. A common use case is to match the underlying, desugared type.
4966This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4967  varDecl(hasType(hasUnqualifiedDesugaredType(
4968      recordType(hasDeclaration(decl())))))
4969In this matcher, the decl will match the CXXRecordDecl of class X.
4970
4971Usable 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;,
4972  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;,
4973  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;,
4974  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;,
4975  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;,
4976  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;,
4977  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4978</pre></td></tr>
4979
4980
4981<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>
4982<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
4983
4984Given
4985  class A { A() : i(42), j(42) {} int i; int j; };
4986cxxConstructorDecl(forEachConstructorInitializer(
4987  forField(decl().bind("x"))
4988))
4989  will trigger two matches, binding for 'i' and 'j' respectively.
4990</pre></td></tr>
4991
4992
4993<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>
4994<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
4995
4996Given
4997  struct Foo {
4998    Foo() : foo_(1) { }
4999    int foo_;
5000  };
5001cxxRecordDecl(has(cxxConstructorDecl(
5002  hasAnyConstructorInitializer(anything())
5003)))
5004  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5005</pre></td></tr>
5006
5007
5008<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>
5009<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5010
5011Given
5012  struct Foo {
5013    Foo() : foo_(1) { }
5014    int foo_;
5015  };
5016cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5017    forField(hasName("foo_"))))))
5018  matches Foo
5019with forField matching foo_
5020</pre></td></tr>
5021
5022
5023<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>
5024<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5025
5026Given
5027  struct Foo {
5028    Foo() : foo_(1) { }
5029    int foo_;
5030  };
5031cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5032    withInitializer(integerLiteral(equals(1)))))))
5033  matches Foo
5034with withInitializer matching (1)
5035</pre></td></tr>
5036
5037
5038<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>
5039<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5040given matcher. Implicit object expressions are included; that is, it matches
5041use of implicit `this`.
5042
5043Given
5044  struct X {
5045    int m;
5046    int f(X x) { x.m; return m; }
5047  };
5048memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5049  matches `x.m`, but not `m`; however,
5050memberExpr(hasObjectExpression(hasType(pointsTo(
5051     cxxRecordDecl(hasName("X"))))))
5052  matches `m` (aka. `this-&gt;m`), but not `x.m`.
5053</pre></td></tr>
5054
5055
5056<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>
5057<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
5058definition that has a given body.
5059
5060Given
5061  for (;;) {}
5062hasBody(compoundStmt())
5063  matches 'for (;;) {}'
5064with compoundStmt()
5065  matching '{}'
5066</pre></td></tr>
5067
5068
5069<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>
5070<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5071
5072Example:
5073    forStmt(hasLoopVariable(anything()))
5074matches 'int x' in
5075    for (int x : a) { }
5076</pre></td></tr>
5077
5078
5079<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>
5080<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5081
5082Example:
5083    forStmt(hasRangeInit(anything()))
5084matches 'a' in
5085    for (int x : a) { }
5086</pre></td></tr>
5087
5088
5089<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>
5090<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5091`on`, matches the argument directly without stripping away anything.
5092
5093Given
5094  class Y { public: void m(); };
5095  Y g();
5096  class X : public Y { void g(); };
5097  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5098cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5099    cxxRecordDecl(hasName("Y")))))
5100  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5101cxxMemberCallExpr(on(callExpr()))
5102  does not match `(g()).m()`, because the parens are not ignored.
5103
5104FIXME: Overload to allow directly matching types?
5105</pre></td></tr>
5106
5107
5108<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>
5109<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5110stripping off any parentheses or implicit casts.
5111
5112Given
5113  class Y { public: void m(); };
5114  Y g();
5115  class X : public Y {};
5116  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5117cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5118  matches `y.m()` and `(g()).m()`.
5119cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5120  matches `x.m()`.
5121cxxMemberCallExpr(on(callExpr()))
5122  matches `(g()).m()`.
5123
5124FIXME: Overload to allow directly matching types?
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('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>
5129<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5130</pre></td></tr>
5131
5132
5133<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>
5134<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5135matches the InnerMatcher, or is a pointer to a type that matches the
5136InnerMatcher.
5137
5138Given
5139  class Y { public: void m(); };
5140  class X : public Y { void g(); };
5141  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5142cxxMemberCallExpr(thisPointerType(hasDeclaration(
5143    cxxRecordDecl(hasName("Y")))))
5144  matches `y.m()`, `p-&gt;m()` and `x.m()`.
5145cxxMemberCallExpr(thisPointerType(hasDeclaration(
5146    cxxRecordDecl(hasName("X")))))
5147  matches `x.g()`.
5148</pre></td></tr>
5149
5150
5151<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>
5152<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5153produce multiple matches.
5154
5155Given
5156  class A { virtual void f(); };
5157  class B : public A { void f(); };
5158  class C : public B { void f(); };
5159cxxMethodDecl(ofClass(hasName("C")),
5160              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5161  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5162  that B::f is not overridden by C::f).
5163
5164The check can produce multiple matches in case of multiple inheritance, e.g.
5165  class A1 { virtual void f(); };
5166  class A2 { virtual void f(); };
5167  class C : public A1, public A2 { void f(); };
5168cxxMethodDecl(ofClass(hasName("C")),
5169              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5170  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5171  once with "b" binding "A2::f" and "d" binding "C::f".
5172</pre></td></tr>
5173
5174
5175<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>
5176<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5177belongs to.
5178
5179FIXME: Generalize this for other kinds of declarations.
5180FIXME: What other kind of declarations would we need to generalize
5181this to?
5182
5183Example matches A() in the last line
5184    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5185        ofClass(hasName("A"))))))
5186  class A {
5187   public:
5188    A();
5189  };
5190  A a = A();
5191</pre></td></tr>
5192
5193
5194<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>
5195<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5196
5197Given:
5198  MyClass *p1 = new MyClass[10];
5199cxxNewExpr(hasArraySize(intgerLiteral(equals(10))))
5200  matches the expression 'new MyClass[10]'.
5201</pre></td></tr>
5202
5203
5204<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>
5205<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5206matches the given matcher.
5207
5208The associated declaration is:
5209- for type nodes, the declaration of the underlying type
5210- for CallExpr, the declaration of the callee
5211- for MemberExpr, the declaration of the referenced member
5212- for CXXConstructExpr, the declaration of the constructor
5213- for CXXNewExpr, the declaration of the operator new
5214- for ObjCIvarExpr, the declaration of the ivar
5215
5216For type nodes, hasDeclaration will generally match the declaration of the
5217sugared type. Given
5218  class X {};
5219  typedef X Y;
5220  Y y;
5221in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5222typedefDecl. A common use case is to match the underlying, desugared type.
5223This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5224  varDecl(hasType(hasUnqualifiedDesugaredType(
5225      recordType(hasDeclaration(decl())))))
5226In this matcher, the decl will match the CXXRecordDecl of class X.
5227
5228Usable 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;,
5229  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;,
5230  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;,
5231  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;,
5232  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;,
5233  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;,
5234  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5235</pre></td></tr>
5236
5237
5238<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>
5239<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5240
5241Given:
5242  class A { void func(); };
5243  class B { void member(); };
5244
5245cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5246A but not B.
5247</pre></td></tr>
5248
5249
5250<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>
5251<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
5252a class matching Base.
5253
5254Note that a class is not considered to be derived from itself.
5255
5256Example matches Y, Z, C (Base == hasName("X"))
5257  class X;
5258  class Y : public X {};  // directly derived
5259  class Z : public Y {};  // indirectly derived
5260  typedef X A;
5261  typedef A B;
5262  class C : public B {};  // derived from a typedef of X
5263
5264In the following example, Bar matches isDerivedFrom(hasName("X")):
5265  class Foo;
5266  typedef Foo X;
5267  class Bar : public Foo {};  // derived from a type that X is a typedef of
5268</pre></td></tr>
5269
5270
5271<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom0')"><a name="isDirectlyDerivedFrom0Anchor">isDirectlyDerivedFrom</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
5272<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ classes that are directly derived from a class matching Base.
5273
5274Note that a class is not considered to be derived from itself.
5275
5276Example matches Y, C (Base == hasName("X"))
5277  class X;
5278  class Y : public X {};  // directly derived
5279  class Z : public Y {};  // indirectly derived
5280  typedef X A;
5281  typedef A B;
5282  class C : public B {};  // derived from a typedef of X
5283
5284In the following example, Bar matches isDerivedFrom(hasName("X")):
5285  class Foo;
5286  typedef Foo X;
5287  class Bar : public Foo {};  // derived from a type that X is a typedef of
5288</pre></td></tr>
5289
5290
5291<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>
5292<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5293match Base.
5294</pre></td></tr>
5295
5296
5297<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>
5298<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5299expression, or an ObjC-message-send expression.
5300
5301Given
5302  void x(int, int, int) { int y; x(1, y, 42); }
5303callExpr(hasAnyArgument(declRefExpr()))
5304  matches x(1, y, 42)
5305with hasAnyArgument(...)
5306  matching y
5307
5308For ObjectiveC, given
5309  @interface I - (void) f:(int) y; @end
5310  void foo(I *i) { [i f:12]; }
5311objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5312  matches [i f:12]
5313</pre></td></tr>
5314
5315
5316<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>
5317<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5318given matcher.
5319
5320Example matches y.x() (matcher = callExpr(callee(
5321                                   cxxMethodDecl(hasName("x")))))
5322  class Y { public: void x(); };
5323  void z() { Y y; y.x(); }
5324</pre></td></tr>
5325
5326
5327<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>
5328<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5329
5330Given
5331  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5332  void f() { f(); }
5333callExpr(callee(expr()))
5334  matches this-&gt;x(), x(), y.x(), f()
5335with callee(...)
5336  matching this-&gt;x, x, y.x, f respectively
5337
5338Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
5339because this introduces ambiguous overloads with calls to Callee taking a
5340internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
5341implemented in terms of implicit casts.
5342</pre></td></tr>
5343
5344
5345<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>
5346<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5347
5348Given
5349  void f(int i);
5350  int y;
5351  f(y);
5352callExpr(
5353  forEachArgumentWithParam(
5354    declRefExpr(to(varDecl(hasName("y")))),
5355    parmVarDecl(hasType(isInteger()))
5356))
5357  matches f(y);
5358with declRefExpr(...)
5359  matching int y
5360and parmVarDecl(...)
5361  matching int i
5362</pre></td></tr>
5363
5364
5365<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>
5366<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5367expression, or an ObjC-message-send expression.
5368
5369Given
5370  void x(int, int, int) { int y; x(1, y, 42); }
5371callExpr(hasAnyArgument(declRefExpr()))
5372  matches x(1, y, 42)
5373with hasAnyArgument(...)
5374  matching y
5375
5376For ObjectiveC, given
5377  @interface I - (void) f:(int) y; @end
5378  void foo(I *i) { [i f:12]; }
5379objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5380  matches [i f:12]
5381</pre></td></tr>
5382
5383
5384<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>
5385<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5386call expression.
5387
5388Example matches y in x(y)
5389    (matcher = callExpr(hasArgument(0, declRefExpr())))
5390  void x(int) { int y; x(y); }
5391</pre></td></tr>
5392
5393
5394<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>
5395<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5396matches the given matcher.
5397
5398The associated declaration is:
5399- for type nodes, the declaration of the underlying type
5400- for CallExpr, the declaration of the callee
5401- for MemberExpr, the declaration of the referenced member
5402- for CXXConstructExpr, the declaration of the constructor
5403- for CXXNewExpr, the declaration of the operator new
5404- for ObjCIvarExpr, the declaration of the ivar
5405
5406For type nodes, hasDeclaration will generally match the declaration of the
5407sugared type. Given
5408  class X {};
5409  typedef X Y;
5410  Y y;
5411in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5412typedefDecl. A common use case is to match the underlying, desugared type.
5413This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5414  varDecl(hasType(hasUnqualifiedDesugaredType(
5415      recordType(hasDeclaration(decl())))))
5416In this matcher, the decl will match the CXXRecordDecl of class X.
5417
5418Usable 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;,
5419  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;,
5420  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;,
5421  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;,
5422  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;,
5423  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;,
5424  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5425</pre></td></tr>
5426
5427
5428<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>
5429<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5430extension, matches the constant given in the statement.
5431
5432Given
5433  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5434caseStmt(hasCaseConstant(integerLiteral()))
5435  matches "case 1:"
5436</pre></td></tr>
5437
5438
5439<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>
5440<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5441or opaque value's source expression matches the given matcher.
5442
5443Example 1: matches "a string"
5444(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5445class URL { URL(string); };
5446URL url = "a string";
5447
5448Example 2: matches 'b' (matcher =
5449opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5450int a = b ?: 1;
5451</pre></td></tr>
5452
5453
5454<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>
5455<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5456functionDecl that have at least one TemplateArgument matching the given
5457InnerMatcher.
5458
5459Given
5460  template&lt;typename T&gt; class A {};
5461  template&lt;&gt; class A&lt;double&gt; {};
5462  A&lt;int&gt; a;
5463
5464  template&lt;typename T&gt; f() {};
5465  void func() { f&lt;int&gt;(); };
5466
5467classTemplateSpecializationDecl(hasAnyTemplateArgument(
5468    refersToType(asString("int"))))
5469  matches the specialization A&lt;int&gt;
5470
5471functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5472  matches the specialization f&lt;int&gt;
5473</pre></td></tr>
5474
5475
5476<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>
5477<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5478
5479Given
5480  template&lt;typename T&gt; class A {}; #1
5481  template&lt;&gt; class A&lt;int&gt; {}; #2
5482classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
5483  matches '#2' with classTemplateDecl() matching the class template
5484  declaration of 'A' at #1.
5485</pre></td></tr>
5486
5487
5488<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>
5489<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5490functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5491
5492Given
5493  template&lt;typename T, typename U&gt; class A {};
5494  A&lt;bool, int&gt; b;
5495  A&lt;int, bool&gt; c;
5496
5497  template&lt;typename T&gt; void f() {}
5498  void func() { f&lt;int&gt;(); };
5499classTemplateSpecializationDecl(hasTemplateArgument(
5500    1, refersToType(asString("int"))))
5501  matches the specialization A&lt;bool, int&gt;
5502
5503functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5504  matches the specialization f&lt;int&gt;
5505</pre></td></tr>
5506
5507
5508<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>
5509<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5510type.
5511
5512Given
5513  struct A {};
5514  A a[7];
5515  int b[7];
5516arrayType(hasElementType(builtinType()))
5517  matches "int b[7]"
5518
5519Usable 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;
5520</pre></td></tr>
5521
5522
5523<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>
5524<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
5525a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5526
5527Given
5528  { {}; 1+2; }
5529hasAnySubstatement(compoundStmt())
5530  matches '{ {}; 1+2; }'
5531with compoundStmt()
5532  matching '{}'
5533</pre></td></tr>
5534
5535
5536<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>
5537<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5538</pre></td></tr>
5539
5540
5541<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>
5542<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
5543matches the given matcher.
5544
5545The associated declaration is:
5546- for type nodes, the declaration of the underlying type
5547- for CallExpr, the declaration of the callee
5548- for MemberExpr, the declaration of the referenced member
5549- for CXXConstructExpr, the declaration of the constructor
5550- for CXXNewExpr, the declaration of the operator new
5551- for ObjCIvarExpr, the declaration of the ivar
5552
5553For type nodes, hasDeclaration will generally match the declaration of the
5554sugared type. Given
5555  class X {};
5556  typedef X Y;
5557  Y y;
5558in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5559typedefDecl. A common use case is to match the underlying, desugared type.
5560This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5561  varDecl(hasType(hasUnqualifiedDesugaredType(
5562      recordType(hasDeclaration(decl())))))
5563In this matcher, the decl will match the CXXRecordDecl of class X.
5564
5565Usable 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;,
5566  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;,
5567  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;,
5568  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;,
5569  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;,
5570  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;,
5571  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5572</pre></td></tr>
5573
5574
5575<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>
5576<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5577specific using shadow declaration.
5578
5579Given
5580  namespace a { void f() {} }
5581  using a::f;
5582  void g() {
5583    f();     // Matches this ..
5584    a::f();  // .. but not this.
5585  }
5586declRefExpr(throughUsingDecl(anything()))
5587  matches f()
5588</pre></td></tr>
5589
5590
5591<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>
5592<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5593specified matcher.
5594
5595Example matches x in if(x)
5596    (matcher = declRefExpr(to(varDecl(hasName("x")))))
5597  bool x;
5598  if (x) {}
5599</pre></td></tr>
5600
5601
5602<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>
5603<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5604
5605Note that this does not work for global declarations because the AST
5606breaks up multiple-declaration DeclStmt's into multiple single-declaration
5607DeclStmt's.
5608Example: Given non-global declarations
5609  int a, b = 0;
5610  int c;
5611  int d = 2, e;
5612declStmt(containsDeclaration(
5613      0, varDecl(hasInitializer(anything()))))
5614  matches only 'int d = 2, e;', and
5615declStmt(containsDeclaration(1, varDecl()))
5616  matches 'int a, b = 0' as well as 'int d = 2, e;'
5617  but 'int c;' is not matched.
5618</pre></td></tr>
5619
5620
5621<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>
5622<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5623
5624Given
5625  int a, b;
5626  int c;
5627declStmt(hasSingleDecl(anything()))
5628  matches 'int c;' but not 'int a, b;'.
5629</pre></td></tr>
5630
5631
5632<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>
5633<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5634the inner matcher.
5635
5636Given
5637  int x;
5638declaratorDecl(hasTypeLoc(loc(asString("int"))))
5639  matches int x
5640</pre></td></tr>
5641
5642
5643<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>
5644<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5645Decl, matches InnerMatcher.
5646
5647Given
5648  namespace N {
5649    namespace M {
5650      class D {};
5651    }
5652  }
5653
5654cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5655declaration of class D.
5656</pre></td></tr>
5657
5658
5659<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>
5660<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5661
5662Given
5663  decltype(1) a = 1;
5664  decltype(2.0) b = 2.0;
5665decltypeType(hasUnderlyingType(isInteger()))
5666  matches the type of "a"
5667
5668Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
5669</pre></td></tr>
5670
5671
5672<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>
5673<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5674definition that has a given body.
5675
5676Given
5677  for (;;) {}
5678hasBody(compoundStmt())
5679  matches 'for (;;) {}'
5680with compoundStmt()
5681  matching '{}'
5682</pre></td></tr>
5683
5684
5685<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>
5686<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
5687switch statement or conditional operator.
5688
5689Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5690  if (true) {}
5691</pre></td></tr>
5692
5693
5694<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>
5695<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5696matches InnerMatcher if the qualifier exists.
5697
5698Given
5699  namespace N {
5700    namespace M {
5701      class D {};
5702    }
5703  }
5704  N::M::D d;
5705
5706elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5707matches the type of the variable declaration of d.
5708</pre></td></tr>
5709
5710
5711<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>
5712<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5713
5714Given
5715  namespace N {
5716    namespace M {
5717      class D {};
5718    }
5719  }
5720  N::M::D d;
5721
5722elaboratedType(namesType(recordType(
5723hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5724declaration of d.
5725</pre></td></tr>
5726
5727
5728<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>
5729<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
5730matches the given matcher.
5731
5732The associated declaration is:
5733- for type nodes, the declaration of the underlying type
5734- for CallExpr, the declaration of the callee
5735- for MemberExpr, the declaration of the referenced member
5736- for CXXConstructExpr, the declaration of the constructor
5737- for CXXNewExpr, the declaration of the operator new
5738- for ObjCIvarExpr, the declaration of the ivar
5739
5740For type nodes, hasDeclaration will generally match the declaration of the
5741sugared type. Given
5742  class X {};
5743  typedef X Y;
5744  Y y;
5745in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5746typedefDecl. A common use case is to match the underlying, desugared type.
5747This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5748  varDecl(hasType(hasUnqualifiedDesugaredType(
5749      recordType(hasDeclaration(decl())))))
5750In this matcher, the decl will match the CXXRecordDecl of class X.
5751
5752Usable 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;,
5753  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;,
5754  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;,
5755  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;,
5756  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;,
5757  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;,
5758  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5759</pre></td></tr>
5760
5761
5762<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>
5763<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5764
5765(Note: Clang's AST refers to other conversions as "casts" too, and calls
5766actual casts "explicit" casts.)
5767</pre></td></tr>
5768
5769
5770<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>
5771<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
5772declaration's type.
5773
5774In case of a value declaration (for example a variable declaration),
5775this resolves one layer of indirection. For example, in the value
5776declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5777X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5778declaration of x.
5779
5780Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5781            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5782            and friend class X (matcher = friendDecl(hasType("X"))
5783 class X {};
5784 void y(X &amp;x) { x; X z; }
5785 class Y { friend class X; };
5786
5787Usable 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;
5788</pre></td></tr>
5789
5790
5791<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>
5792<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5793matcher.
5794
5795Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5796            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5797            and U (matcher = typedefDecl(hasType(asString("int")))
5798            and friend class X (matcher = friendDecl(hasType("X"))
5799 class X {};
5800 void y(X &amp;x) { x; X z; }
5801 typedef int U;
5802 class Y { friend class X; };
5803</pre></td></tr>
5804
5805
5806<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>
5807<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
5808elidable constructor.
5809
5810In C++17 copy elidable constructors are no longer being
5811generated in the AST as it is not permitted by the standard. They are
5812however part of the AST in C++14 and earlier. Therefore, to write a matcher
5813that works in all language modes, the matcher has to skip elidable
5814constructor AST nodes if they appear in the AST. This matcher can be used to
5815skip those elidable constructors.
5816
5817Given
5818
5819struct H {};
5820H G();
5821void f() {
5822  H D = G();
5823}
5824
5825``varDecl(hasInitializer(any(
5826      ignoringElidableConstructorCall(callExpr()),
5827      exprWithCleanups(ignoringElidableConstructorCall(callExpr()))))``
5828matches ``H D = G()``
5829</pre></td></tr>
5830
5831
5832<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>
5833<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5834are stripped off.
5835
5836Parentheses and explicit casts are not discarded.
5837Given
5838  int arr[5];
5839  int a = 0;
5840  char b = 0;
5841  const int c = a;
5842  int *d = arr;
5843  long e = (long) 0l;
5844The matchers
5845   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5846   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5847would match the declarations for a, b, c, and d, but not e.
5848While
5849   varDecl(hasInitializer(integerLiteral()))
5850   varDecl(hasInitializer(declRefExpr()))
5851only match the declarations for b, c, and d.
5852</pre></td></tr>
5853
5854
5855<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>
5856<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5857nodes are stripped off.
5858
5859Parentheses and explicit casts are not discarded.
5860Given
5861  class C {};
5862  C a = C();
5863  C b;
5864  C c = b;
5865The matchers
5866   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5867would match the declarations for a, b, and c.
5868While
5869   varDecl(hasInitializer(cxxConstructExpr()))
5870only match the declarations for b and c.
5871</pre></td></tr>
5872
5873
5874<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>
5875<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5876casts are stripped off.
5877
5878Implicit and non-C Style casts are also discarded.
5879Given
5880  int a = 0;
5881  char b = (0);
5882  void* c = reinterpret_cast&lt;char*&gt;(0);
5883  char d = char(0);
5884The matcher
5885   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5886would match the declarations for a, b, c, and d.
5887while
5888   varDecl(hasInitializer(integerLiteral()))
5889only match the declaration for a.
5890</pre></td></tr>
5891
5892
5893<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>
5894<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5895parentheses are stripped off.
5896
5897Explicit casts are not discarded.
5898Given
5899  int arr[5];
5900  int a = 0;
5901  char b = (0);
5902  const int c = a;
5903  int *d = (arr);
5904  long e = ((long) 0l);
5905The matchers
5906   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5907   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5908would match the declarations for a, b, c, and d, but not e.
5909while
5910   varDecl(hasInitializer(integerLiteral()))
5911   varDecl(hasInitializer(declRefExpr()))
5912would only match the declaration for a.
5913</pre></td></tr>
5914
5915
5916<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>
5917<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
5918
5919Given
5920  const char* str = ("my-string");
5921The matcher
5922  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
5923would match the implicit cast resulting from the assignment.
5924</pre></td></tr>
5925
5926
5927<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>
5928<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5929
5930Given
5931  class C {
5932    int a = 2;
5933    int b = 3;
5934    int c;
5935  };
5936fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5937  matches 'int a;' but not 'int b;'.
5938fieldDecl(hasInClassInitializer(anything()))
5939  matches 'int a;' and 'int b;' but not 'int c;'.
5940</pre></td></tr>
5941
5942
5943<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>
5944<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
5945definition that has a given body.
5946
5947Given
5948  for (;;) {}
5949hasBody(compoundStmt())
5950  matches 'for (;;) {}'
5951with compoundStmt()
5952  matching '{}'
5953</pre></td></tr>
5954
5955
5956<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>
5957<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
5958switch statement or conditional operator.
5959
5960Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5961  if (true) {}
5962</pre></td></tr>
5963
5964
5965<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>
5966<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
5967
5968Example:
5969    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
5970matches '++x' in
5971    for (x; x &lt; N; ++x) { }
5972</pre></td></tr>
5973
5974
5975<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>
5976<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
5977
5978Example:
5979    forStmt(hasLoopInit(declStmt()))
5980matches 'int x = 0' in
5981    for (int x = 0; x &lt; N; ++x) { }
5982</pre></td></tr>
5983
5984
5985<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>
5986<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
5987declaration's type.
5988
5989In case of a value declaration (for example a variable declaration),
5990this resolves one layer of indirection. For example, in the value
5991declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5992X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5993declaration of x.
5994
5995Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5996            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5997            and friend class X (matcher = friendDecl(hasType("X"))
5998 class X {};
5999 void y(X &amp;x) { x; X z; }
6000 class Y { friend class X; };
6001
6002Usable 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;
6003</pre></td></tr>
6004
6005
6006<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>
6007<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6008matcher.
6009
6010Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6011            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6012            and U (matcher = typedefDecl(hasType(asString("int")))
6013            and friend class X (matcher = friendDecl(hasType("X"))
6014 class X {};
6015 void y(X &amp;x) { x; X z; }
6016 typedef int U;
6017 class Y { friend class X; };
6018</pre></td></tr>
6019
6020
6021<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>
6022<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6023block.
6024
6025Does not match the 'this' parameter of a method.
6026
6027Given
6028  class X { void f(int x, int y, int z) {} };
6029cxxMethodDecl(hasAnyParameter(hasName("y")))
6030  matches f(int x, int y, int z) {}
6031with hasAnyParameter(...)
6032  matching int y
6033
6034For ObjectiveC, given
6035  @interface I - (void) f:(int) y; @end
6036
6037the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6038matches the declaration of method f with hasParameter
6039matching y.
6040
6041For blocks, given
6042  b = ^(int y) { printf("%d", y) };
6043
6044the matcher blockDecl(hasAnyParameter(hasName("y")))
6045matches the declaration of the block b with hasParameter
6046matching y.
6047</pre></td></tr>
6048
6049
6050<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>
6051<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6052functionDecl that have at least one TemplateArgument matching the given
6053InnerMatcher.
6054
6055Given
6056  template&lt;typename T&gt; class A {};
6057  template&lt;&gt; class A&lt;double&gt; {};
6058  A&lt;int&gt; a;
6059
6060  template&lt;typename T&gt; f() {};
6061  void func() { f&lt;int&gt;(); };
6062
6063classTemplateSpecializationDecl(hasAnyTemplateArgument(
6064    refersToType(asString("int"))))
6065  matches the specialization A&lt;int&gt;
6066
6067functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6068  matches the specialization f&lt;int&gt;
6069</pre></td></tr>
6070
6071
6072<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>
6073<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
6074definition that has a given body.
6075
6076Given
6077  for (;;) {}
6078hasBody(compoundStmt())
6079  matches 'for (;;) {}'
6080with compoundStmt()
6081  matching '{}'
6082</pre></td></tr>
6083
6084
6085<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>
6086<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6087declaration.
6088
6089Given
6090  template&lt;bool b&gt;
6091  struct S {
6092    S(int); // #1
6093    explicit S(double); // #2
6094    operator int(); // #3
6095    explicit operator bool(); // #4
6096    explicit(false) S(bool) // # 7
6097    explicit(true) S(char) // # 8
6098    explicit(b) S(S) // # 9
6099  };
6100  S(int) -&gt; S&lt;true&gt; // #5
6101  explicit S(double) -&gt; S&lt;false&gt; // #6
6102cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6103cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6104cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6105</pre></td></tr>
6106
6107
6108<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>
6109<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6110declaration or a block.
6111
6112Given
6113  class X { void f(int x) {} };
6114cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6115  matches f(int x) {}
6116with hasParameter(...)
6117  matching int x
6118
6119For ObjectiveC, given
6120  @interface I - (void) f:(int) y; @end
6121
6122the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6123matches the declaration of method f with hasParameter
6124matching y.
6125</pre></td></tr>
6126
6127
6128<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>
6129<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6130functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6131
6132Given
6133  template&lt;typename T, typename U&gt; class A {};
6134  A&lt;bool, int&gt; b;
6135  A&lt;int, bool&gt; c;
6136
6137  template&lt;typename T&gt; void f() {}
6138  void func() { f&lt;int&gt;(); };
6139classTemplateSpecializationDecl(hasTemplateArgument(
6140    1, refersToType(asString("int"))))
6141  matches the specialization A&lt;bool, int&gt;
6142
6143functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6144  matches the specialization f&lt;int&gt;
6145</pre></td></tr>
6146
6147
6148<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>
6149<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6150
6151Given:
6152  class X { int f() { return 1; } };
6153cxxMethodDecl(returns(asString("int")))
6154  matches int f() { return 1; }
6155</pre></td></tr>
6156
6157
6158<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>
6159<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6160switch statement or conditional operator.
6161
6162Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6163  if (true) {}
6164</pre></td></tr>
6165
6166
6167<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>
6168<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6169
6170Given
6171  if (A* a = GetAPointer()) {}
6172hasConditionVariableStatement(...)
6173  matches 'A* a = GetAPointer()'.
6174</pre></td></tr>
6175
6176
6177<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>
6178<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6179
6180Examples matches the if statement
6181  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6182  if (false) false; else true;
6183</pre></td></tr>
6184
6185
6186<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>
6187<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6188
6189Examples matches the if statement
6190  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6191  if (false) true; else false;
6192</pre></td></tr>
6193
6194
6195<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>
6196<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6197matcher.
6198
6199FIXME: Unit test this matcher
6200</pre></td></tr>
6201
6202
6203<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>
6204<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6205
6206Example matches y.
6207    (matcher = initListExpr(hasInit(0, expr())))
6208  int x{y}.
6209</pre></td></tr>
6210
6211
6212<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>
6213<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6214(if expression have it).
6215</pre></td></tr>
6216
6217
6218<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>
6219<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6220matches the given matcher.
6221
6222The associated declaration is:
6223- for type nodes, the declaration of the underlying type
6224- for CallExpr, the declaration of the callee
6225- for MemberExpr, the declaration of the referenced member
6226- for CXXConstructExpr, the declaration of the constructor
6227- for CXXNewExpr, the declaration of the operator new
6228- for ObjCIvarExpr, the declaration of the ivar
6229
6230For type nodes, hasDeclaration will generally match the declaration of the
6231sugared type. Given
6232  class X {};
6233  typedef X Y;
6234  Y y;
6235in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6236typedefDecl. A common use case is to match the underlying, desugared type.
6237This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6238  varDecl(hasType(hasUnqualifiedDesugaredType(
6239      recordType(hasDeclaration(decl())))))
6240In this matcher, the decl will match the CXXRecordDecl of class X.
6241
6242Usable 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;,
6243  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;,
6244  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;,
6245  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;,
6246  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;,
6247  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;,
6248  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6249</pre></td></tr>
6250
6251
6252<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>
6253<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6254matches the given matcher.
6255
6256The associated declaration is:
6257- for type nodes, the declaration of the underlying type
6258- for CallExpr, the declaration of the callee
6259- for MemberExpr, the declaration of the referenced member
6260- for CXXConstructExpr, the declaration of the constructor
6261- for CXXNewExpr, the declaration of the operator new
6262- for ObjCIvarExpr, the declaration of the ivar
6263
6264For type nodes, hasDeclaration will generally match the declaration of the
6265sugared type. Given
6266  class X {};
6267  typedef X Y;
6268  Y y;
6269in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6270typedefDecl. A common use case is to match the underlying, desugared type.
6271This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6272  varDecl(hasType(hasUnqualifiedDesugaredType(
6273      recordType(hasDeclaration(decl())))))
6274In this matcher, the decl will match the CXXRecordDecl of class X.
6275
6276Usable 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;,
6277  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;,
6278  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;,
6279  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;,
6280  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;,
6281  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;,
6282  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6283</pre></td></tr>
6284
6285
6286<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>
6287<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6288matches the given matcher.
6289
6290The associated declaration is:
6291- for type nodes, the declaration of the underlying type
6292- for CallExpr, the declaration of the callee
6293- for MemberExpr, the declaration of the referenced member
6294- for CXXConstructExpr, the declaration of the constructor
6295- for CXXNewExpr, the declaration of the operator new
6296- for ObjCIvarExpr, the declaration of the ivar
6297
6298For type nodes, hasDeclaration will generally match the declaration of the
6299sugared type. Given
6300  class X {};
6301  typedef X Y;
6302  Y y;
6303in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6304typedefDecl. A common use case is to match the underlying, desugared type.
6305This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6306  varDecl(hasType(hasUnqualifiedDesugaredType(
6307      recordType(hasDeclaration(decl())))))
6308In this matcher, the decl will match the CXXRecordDecl of class X.
6309
6310Usable 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;,
6311  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;,
6312  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;,
6313  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;,
6314  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;,
6315  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;,
6316  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6317</pre></td></tr>
6318
6319
6320<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>
6321<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6322given matcher. Implicit object expressions are included; that is, it matches
6323use of implicit `this`.
6324
6325Given
6326  struct X {
6327    int m;
6328    int f(X x) { x.m; return m; }
6329  };
6330memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6331  matches `x.m`, but not `m`; however,
6332memberExpr(hasObjectExpression(hasType(pointsTo(
6333     cxxRecordDecl(hasName("X"))))))
6334  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6335</pre></td></tr>
6336
6337
6338<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>
6339<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6340given matcher.
6341
6342Given
6343  struct { int first, second; } first, second;
6344  int i(second.first);
6345  int j(first.second);
6346memberExpr(member(hasName("first")))
6347  matches second.first
6348  but not first.second (because the member name there is "second").
6349</pre></td></tr>
6350
6351
6352<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>
6353<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6354pointee matches a given matcher.
6355
6356Given
6357  int *a;
6358  int const *b;
6359  float const *f;
6360pointerType(pointee(isConstQualified(), isInteger()))
6361  matches "int const *b"
6362
6363Usable 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;,
6364  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;
6365</pre></td></tr>
6366
6367
6368<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>
6369<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6370matcher.
6371
6372Given
6373  namespace N { template&lt;class T&gt; void f(T t); }
6374  template &lt;class T&gt; void g() { using N::f; f(T()); }
6375unresolvedLookupExpr(hasAnyDeclaration(
6376    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6377  matches the use of f in g() .
6378</pre></td></tr>
6379
6380
6381<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>
6382<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6383
6384Given
6385  struct A { struct B { struct C {}; }; };
6386  A::B::C c;
6387nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6388  matches "A::"
6389</pre></td></tr>
6390
6391
6392<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>
6393<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6394given TypeLoc.
6395
6396Given
6397  struct A { struct B { struct C {}; }; };
6398  A::B::C c;
6399nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6400  hasDeclaration(cxxRecordDecl(hasName("A")))))))
6401  matches "A::"
6402</pre></td></tr>
6403
6404
6405<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>
6406<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6407
6408Given
6409  struct A { struct B { struct C {}; }; };
6410  A::B::C c;
6411nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6412  matches "A::"
6413</pre></td></tr>
6414
6415
6416<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>
6417<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6418given namespace matcher.
6419
6420Given
6421  namespace ns { struct A {}; }
6422  ns::A a;
6423nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6424  matches "ns::"
6425</pre></td></tr>
6426
6427
6428<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>
6429<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6430given QualType matcher without qualifiers.
6431
6432Given
6433  struct A { struct B { struct C {}; }; };
6434  A::B::C c;
6435nestedNameSpecifier(specifiesType(
6436  hasDeclaration(cxxRecordDecl(hasName("A")))
6437))
6438  matches "A::"
6439</pre></td></tr>
6440
6441
6442<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>
6443<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6444
6445Given
6446
6447  #pragma omp parallel
6448  #pragma omp parallel default(none)
6449
6450``ompExecutableDirective(hasAnyClause(anything()))`` matches
6451``omp parallel default(none)``.
6452</pre></td></tr>
6453
6454
6455<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>
6456<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6457
6458Prerequisite: the executable directive must not be standalone directive.
6459If it is, it will never match.
6460
6461Given
6462
6463   #pragma omp parallel
6464   ;
6465   #pragma omp parallel
6466   {}
6467
6468``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6469</pre></td></tr>
6470
6471
6472<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>
6473<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
6474expression, or an ObjC-message-send expression.
6475
6476Given
6477  void x(int, int, int) { int y; x(1, y, 42); }
6478callExpr(hasAnyArgument(declRefExpr()))
6479  matches x(1, y, 42)
6480with hasAnyArgument(...)
6481  matching y
6482
6483For ObjectiveC, given
6484  @interface I - (void) f:(int) y; @end
6485  void foo(I *i) { [i f:12]; }
6486objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6487  matches [i f:12]
6488</pre></td></tr>
6489
6490
6491<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>
6492<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6493call expression.
6494
6495Example matches y in x(y)
6496    (matcher = callExpr(hasArgument(0, declRefExpr())))
6497  void x(int) { int y; x(y); }
6498</pre></td></tr>
6499
6500
6501<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>
6502<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
6503and the inner matcher matches on that instance.
6504
6505For example the method call in
6506  NSString *x = @"hello";
6507  [x containsString:@"h"];
6508is matched by
6509objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
6510</pre></td></tr>
6511
6512
6513<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>
6514<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
6515
6516Example
6517matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
6518matches the [webView ...] message invocation.
6519  NSString *webViewJavaScript = ...
6520  UIWebView *webView = ...
6521  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
6522</pre></td></tr>
6523
6524
6525<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>
6526<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
6527block.
6528
6529Does not match the 'this' parameter of a method.
6530
6531Given
6532  class X { void f(int x, int y, int z) {} };
6533cxxMethodDecl(hasAnyParameter(hasName("y")))
6534  matches f(int x, int y, int z) {}
6535with hasAnyParameter(...)
6536  matching int y
6537
6538For ObjectiveC, given
6539  @interface I - (void) f:(int) y; @end
6540
6541the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6542matches the declaration of method f with hasParameter
6543matching y.
6544
6545For blocks, given
6546  b = ^(int y) { printf("%d", y) };
6547
6548the matcher blockDecl(hasAnyParameter(hasName("y")))
6549matches the declaration of the block b with hasParameter
6550matching y.
6551</pre></td></tr>
6552
6553
6554<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>
6555<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
6556declaration or a block.
6557
6558Given
6559  class X { void f(int x) {} };
6560cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6561  matches f(int x) {}
6562with hasParameter(...)
6563  matching int x
6564
6565For ObjectiveC, given
6566  @interface I - (void) f:(int) y; @end
6567
6568the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6569matches the declaration of method f with hasParameter
6570matching y.
6571</pre></td></tr>
6572
6573
6574<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>
6575<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
6576or opaque value's source expression matches the given matcher.
6577
6578Example 1: matches "a string"
6579(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6580class URL { URL(string); };
6581URL url = "a string";
6582
6583Example 2: matches 'b' (matcher =
6584opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6585int a = b ?: 1;
6586</pre></td></tr>
6587
6588
6589<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>
6590<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6591overloads matches the given matcher.
6592
6593Given
6594  template &lt;typename T&gt; void foo(T);
6595  template &lt;typename T&gt; void bar(T);
6596  template &lt;typename T&gt; void baz(T t) {
6597    foo(t);
6598    bar(t);
6599  }
6600unresolvedLookupExpr(hasAnyDeclaration(
6601    functionTemplateDecl(hasName("foo"))))
6602  matches foo in foo(t); but not bar in bar(t);
6603</pre></td></tr>
6604
6605
6606<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>
6607<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6608
6609Given
6610  int (*ptr_to_array)[4];
6611  int (*ptr_to_func)(int);
6612
6613varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6614ptr_to_func but not ptr_to_array.
6615
6616Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
6617</pre></td></tr>
6618
6619
6620<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>
6621<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6622pointee matches a given matcher.
6623
6624Given
6625  int *a;
6626  int const *b;
6627  float const *f;
6628pointerType(pointee(isConstQualified(), isInteger()))
6629  matches "int const *b"
6630
6631Usable 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;,
6632  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;
6633</pre></td></tr>
6634
6635
6636<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>
6637<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
6638
6639Given:
6640  typedef int &amp;int_ref;
6641  int a;
6642  int_ref b = a;
6643
6644varDecl(hasType(qualType(referenceType()))))) will not match the
6645declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
6646</pre></td></tr>
6647
6648
6649<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>
6650<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
6651matches the given matcher.
6652
6653The associated declaration is:
6654- for type nodes, the declaration of the underlying type
6655- for CallExpr, the declaration of the callee
6656- for MemberExpr, the declaration of the referenced member
6657- for CXXConstructExpr, the declaration of the constructor
6658- for CXXNewExpr, the declaration of the operator new
6659- for ObjCIvarExpr, the declaration of the ivar
6660
6661For type nodes, hasDeclaration will generally match the declaration of the
6662sugared type. Given
6663  class X {};
6664  typedef X Y;
6665  Y y;
6666in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6667typedefDecl. A common use case is to match the underlying, desugared type.
6668This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6669  varDecl(hasType(hasUnqualifiedDesugaredType(
6670      recordType(hasDeclaration(decl())))))
6671In this matcher, the decl will match the CXXRecordDecl of class X.
6672
6673Usable 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;,
6674  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;,
6675  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;,
6676  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;,
6677  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;,
6678  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;,
6679  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6680</pre></td></tr>
6681
6682
6683<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>
6684<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
6685
6686Given
6687  void (*fp)(void);
6688The matcher
6689  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
6690would match the declaration for fp.
6691</pre></td></tr>
6692
6693
6694<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>
6695<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
6696</pre></td></tr>
6697
6698
6699<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>
6700<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
6701matches the specified matcher.
6702
6703Example matches y-&gt;x()
6704  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
6705     cxxRecordDecl(hasName("Y")))))))
6706  class Y { public: void x(); };
6707  void z() { Y *y; y-&gt;x(); }
6708</pre></td></tr>
6709
6710
6711<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>
6712<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
6713</pre></td></tr>
6714
6715
6716<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>
6717<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
6718type matches the specified matcher.
6719
6720Example matches X &amp;x and const X &amp;y
6721    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
6722  class X {
6723    void a(X b) {
6724      X &amp;x = b;
6725      const X &amp;y = b;
6726    }
6727  };
6728</pre></td></tr>
6729
6730
6731<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>
6732<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
6733matches the given matcher.
6734
6735The associated declaration is:
6736- for type nodes, the declaration of the underlying type
6737- for CallExpr, the declaration of the callee
6738- for MemberExpr, the declaration of the referenced member
6739- for CXXConstructExpr, the declaration of the constructor
6740- for CXXNewExpr, the declaration of the operator new
6741- for ObjCIvarExpr, the declaration of the ivar
6742
6743For type nodes, hasDeclaration will generally match the declaration of the
6744sugared type. Given
6745  class X {};
6746  typedef X Y;
6747  Y y;
6748in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6749typedefDecl. A common use case is to match the underlying, desugared type.
6750This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6751  varDecl(hasType(hasUnqualifiedDesugaredType(
6752      recordType(hasDeclaration(decl())))))
6753In this matcher, the decl will match the CXXRecordDecl of class X.
6754
6755Usable 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;,
6756  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;,
6757  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;,
6758  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;,
6759  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;,
6760  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;,
6761  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6762</pre></td></tr>
6763
6764
6765<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>
6766<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
6767pointee matches a given matcher.
6768
6769Given
6770  int *a;
6771  int const *b;
6772  float const *f;
6773pointerType(pointee(isConstQualified(), isInteger()))
6774  matches "int const *b"
6775
6776Usable 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;,
6777  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;
6778</pre></td></tr>
6779
6780
6781<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>
6782<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
6783
6784Given
6785  return a + b;
6786hasReturnValue(binaryOperator())
6787  matches 'return a + b'
6788with binaryOperator()
6789  matching 'a + b'
6790</pre></td></tr>
6791
6792
6793<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>
6794<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
6795a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6796
6797Given
6798  { {}; 1+2; }
6799hasAnySubstatement(compoundStmt())
6800  matches '{ {}; 1+2; }'
6801with compoundStmt()
6802  matching '{}'
6803</pre></td></tr>
6804
6805
6806<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>
6807<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6808alignof.
6809</pre></td></tr>
6810
6811
6812<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>
6813<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
6814
6815Given:
6816F&amp; operator=(const F&amp; o) {
6817  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
6818  return *this;
6819}
6820returnStmt(forFunction(hasName("operator=")))
6821  matches 'return *this'
6822  but does match 'return &gt; 0'
6823</pre></td></tr>
6824
6825
6826<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>
6827<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6828sizeof.
6829</pre></td></tr>
6830
6831
6832<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>
6833<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
6834type that matches the provided matcher.
6835
6836Given
6837  template &lt;typename T&gt;
6838  double F(T t);
6839  int i;
6840  double j = F(i);
6841
6842substTemplateTypeParmType(hasReplacementType(type())) matches int
6843</pre></td></tr>
6844
6845
6846<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>
6847<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
6848statement. This matcher may produce multiple matches.
6849
6850Given
6851  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
6852switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
6853  matches four times, with "c" binding each of "case 1:", "case 2:",
6854"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
6855"switch (1)", "switch (2)" and "switch (2)".
6856</pre></td></tr>
6857
6858
6859<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>
6860<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
6861switch statement or conditional operator.
6862
6863Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6864  if (true) {}
6865</pre></td></tr>
6866
6867
6868<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>
6869<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
6870matches the given matcher.
6871
6872The associated declaration is:
6873- for type nodes, the declaration of the underlying type
6874- for CallExpr, the declaration of the callee
6875- for MemberExpr, the declaration of the referenced member
6876- for CXXConstructExpr, the declaration of the constructor
6877- for CXXNewExpr, the declaration of the operator new
6878- for ObjCIvarExpr, the declaration of the ivar
6879
6880For type nodes, hasDeclaration will generally match the declaration of the
6881sugared type. Given
6882  class X {};
6883  typedef X Y;
6884  Y y;
6885in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6886typedefDecl. A common use case is to match the underlying, desugared type.
6887This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6888  varDecl(hasType(hasUnqualifiedDesugaredType(
6889      recordType(hasDeclaration(decl())))))
6890In this matcher, the decl will match the CXXRecordDecl of class X.
6891
6892Usable 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;,
6893  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;,
6894  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;,
6895  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;,
6896  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;,
6897  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;,
6898  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6899</pre></td></tr>
6900
6901
6902<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>
6903<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
6904
6905Given
6906  struct B { int next; };
6907  template&lt;int(B::*next_ptr)&gt; struct A {};
6908  A&lt;&amp;B::next&gt; a;
6909templateSpecializationType(hasAnyTemplateArgument(
6910  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
6911  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6912    B::next
6913</pre></td></tr>
6914
6915
6916<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>
6917<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
6918declaration.
6919
6920Given
6921  struct B { int next; };
6922  template&lt;int(B::*next_ptr)&gt; struct A {};
6923  A&lt;&amp;B::next&gt; a;
6924classTemplateSpecializationDecl(hasAnyTemplateArgument(
6925    refersToDeclaration(fieldDecl(hasName("next")))))
6926  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
6927    B::next
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('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>
6932<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
6933
6934Given
6935  template&lt;int T&gt; struct C {};
6936  C&lt;42&gt; c;
6937classTemplateSpecializationDecl(
6938  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
6939  matches the implicit instantiation of C in C&lt;42&gt;.
6940</pre></td></tr>
6941
6942
6943<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>
6944<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
6945
6946Given
6947  template&lt;template &lt;typename&gt; class S&gt; class X {};
6948  template&lt;typename T&gt; class Y {};
6949  X&lt;Y&gt; xi;
6950classTemplateSpecializationDecl(hasAnyTemplateArgument(
6951    refersToTemplate(templateName())))
6952  matches the specialization X&lt;Y&gt;
6953</pre></td></tr>
6954
6955
6956<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>
6957<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
6958
6959Given
6960  struct X {};
6961  template&lt;typename T&gt; struct A {};
6962  A&lt;X&gt; a;
6963classTemplateSpecializationDecl(hasAnyTemplateArgument(
6964    refersToType(class(hasName("X")))))
6965  matches the specialization A&lt;X&gt;
6966</pre></td></tr>
6967
6968
6969<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>
6970<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6971functionDecl that have at least one TemplateArgument matching the given
6972InnerMatcher.
6973
6974Given
6975  template&lt;typename T&gt; class A {};
6976  template&lt;&gt; class A&lt;double&gt; {};
6977  A&lt;int&gt; a;
6978
6979  template&lt;typename T&gt; f() {};
6980  void func() { f&lt;int&gt;(); };
6981
6982classTemplateSpecializationDecl(hasAnyTemplateArgument(
6983    refersToType(asString("int"))))
6984  matches the specialization A&lt;int&gt;
6985
6986functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6987  matches the specialization f&lt;int&gt;
6988</pre></td></tr>
6989
6990
6991<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>
6992<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
6993matches the given matcher.
6994
6995The associated declaration is:
6996- for type nodes, the declaration of the underlying type
6997- for CallExpr, the declaration of the callee
6998- for MemberExpr, the declaration of the referenced member
6999- for CXXConstructExpr, the declaration of the constructor
7000- for CXXNewExpr, the declaration of the operator new
7001- for ObjCIvarExpr, the declaration of the ivar
7002
7003For type nodes, hasDeclaration will generally match the declaration of the
7004sugared type. Given
7005  class X {};
7006  typedef X Y;
7007  Y y;
7008in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7009typedefDecl. A common use case is to match the underlying, desugared type.
7010This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7011  varDecl(hasType(hasUnqualifiedDesugaredType(
7012      recordType(hasDeclaration(decl())))))
7013In this matcher, the decl will match the CXXRecordDecl of class X.
7014
7015Usable 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;,
7016  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;,
7017  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;,
7018  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;,
7019  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;,
7020  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;,
7021  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7022</pre></td></tr>
7023
7024
7025<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>
7026<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7027functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7028
7029Given
7030  template&lt;typename T, typename U&gt; class A {};
7031  A&lt;bool, int&gt; b;
7032  A&lt;int, bool&gt; c;
7033
7034  template&lt;typename T&gt; void f() {}
7035  void func() { f&lt;int&gt;(); };
7036classTemplateSpecializationDecl(hasTemplateArgument(
7037    1, refersToType(asString("int"))))
7038  matches the specialization A&lt;bool, int&gt;
7039
7040functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7041  matches the specialization f&lt;int&gt;
7042</pre></td></tr>
7043
7044
7045<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>
7046<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7047matches the given matcher.
7048
7049The associated declaration is:
7050- for type nodes, the declaration of the underlying type
7051- for CallExpr, the declaration of the callee
7052- for MemberExpr, the declaration of the referenced member
7053- for CXXConstructExpr, the declaration of the constructor
7054- for CXXNewExpr, the declaration of the operator new
7055- for ObjCIvarExpr, the declaration of the ivar
7056
7057For type nodes, hasDeclaration will generally match the declaration of the
7058sugared type. Given
7059  class X {};
7060  typedef X Y;
7061  Y y;
7062in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7063typedefDecl. A common use case is to match the underlying, desugared type.
7064This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7065  varDecl(hasType(hasUnqualifiedDesugaredType(
7066      recordType(hasDeclaration(decl())))))
7067In this matcher, the decl will match the CXXRecordDecl of class X.
7068
7069Usable 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;,
7070  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;,
7071  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;,
7072  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;,
7073  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;,
7074  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;,
7075  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7076</pre></td></tr>
7077
7078
7079<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>
7080<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
7081
7082Generates results for each match.
7083
7084For example, in:
7085  class A { class B {}; class C {}; };
7086The matcher:
7087  cxxRecordDecl(hasName("::A"),
7088                findAll(cxxRecordDecl(isDefinition()).bind("m")))
7089will generate results for A, B and C.
7090
7091Usable as: Any Matcher
7092</pre></td></tr>
7093
7094
7095<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>
7096<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7097matcher.
7098
7099Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7100            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7101            and U (matcher = typedefDecl(hasType(asString("int")))
7102            and friend class X (matcher = friendDecl(hasType("X"))
7103 class X {};
7104 void y(X &amp;x) { x; X z; }
7105 typedef int U;
7106 class Y { friend class X; };
7107</pre></td></tr>
7108
7109
7110<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>
7111<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7112matches the given matcher.
7113
7114The associated declaration is:
7115- for type nodes, the declaration of the underlying type
7116- for CallExpr, the declaration of the callee
7117- for MemberExpr, the declaration of the referenced member
7118- for CXXConstructExpr, the declaration of the constructor
7119- for CXXNewExpr, the declaration of the operator new
7120- for ObjCIvarExpr, the declaration of the ivar
7121
7122For type nodes, hasDeclaration will generally match the declaration of the
7123sugared type. Given
7124  class X {};
7125  typedef X Y;
7126  Y y;
7127in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7128typedefDecl. A common use case is to match the underlying, desugared type.
7129This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7130  varDecl(hasType(hasUnqualifiedDesugaredType(
7131      recordType(hasDeclaration(decl())))))
7132In this matcher, the decl will match the CXXRecordDecl of class X.
7133
7134Usable 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;,
7135  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;,
7136  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;,
7137  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;,
7138  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;,
7139  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;,
7140  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7141</pre></td></tr>
7142
7143
7144<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>
7145<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7146type of the matched node.
7147
7148For example, in:
7149  class A {};
7150  using B = A;
7151The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7152both B and A.
7153</pre></td></tr>
7154
7155
7156<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>
7157<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7158
7159Given
7160  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7161unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7162  matches sizeof(a) and alignof(c)
7163</pre></td></tr>
7164
7165
7166<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>
7167<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7168
7169Example matches true (matcher = hasUnaryOperand(
7170                                  cxxBoolLiteral(equals(true))))
7171  !true
7172</pre></td></tr>
7173
7174
7175<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>
7176<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7177given matcher. Implicit object expressions are included; that is, it matches
7178use of implicit `this`.
7179
7180Given
7181  struct X {
7182    int m;
7183    int f(X x) { x.m; return m; }
7184  };
7185memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7186  matches `x.m`, but not `m`; however,
7187memberExpr(hasObjectExpression(hasType(pointsTo(
7188     cxxRecordDecl(hasName("X"))))))
7189  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7190</pre></td></tr>
7191
7192
7193<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>
7194<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7195matches the given matcher.
7196
7197The associated declaration is:
7198- for type nodes, the declaration of the underlying type
7199- for CallExpr, the declaration of the callee
7200- for MemberExpr, the declaration of the referenced member
7201- for CXXConstructExpr, the declaration of the constructor
7202- for CXXNewExpr, the declaration of the operator new
7203- for ObjCIvarExpr, the declaration of the ivar
7204
7205For type nodes, hasDeclaration will generally match the declaration of the
7206sugared type. Given
7207  class X {};
7208  typedef X Y;
7209  Y y;
7210in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7211typedefDecl. A common use case is to match the underlying, desugared type.
7212This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7213  varDecl(hasType(hasUnqualifiedDesugaredType(
7214      recordType(hasDeclaration(decl())))))
7215In this matcher, the decl will match the CXXRecordDecl of class X.
7216
7217Usable 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;,
7218  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;,
7219  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;,
7220  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;,
7221  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;,
7222  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;,
7223  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7224</pre></td></tr>
7225
7226
7227<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>
7228<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7229
7230Given
7231  namespace X { void b(); }
7232  using X::b;
7233usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7234  matches using X::b </pre></td></tr>
7235
7236
7237<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>
7238<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7239matched by the given matcher.
7240
7241Given
7242  namespace X { int a; void b(); }
7243  using X::a;
7244  using X::b;
7245usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7246  matches using X::b but not using X::a </pre></td></tr>
7247
7248
7249<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>
7250<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7251declaration's type.
7252
7253In case of a value declaration (for example a variable declaration),
7254this resolves one layer of indirection. For example, in the value
7255declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7256X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7257declaration of x.
7258
7259Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7260            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7261            and friend class X (matcher = friendDecl(hasType("X"))
7262 class X {};
7263 void y(X &amp;x) { x; X z; }
7264 class Y { friend class X; };
7265
7266Usable 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;
7267</pre></td></tr>
7268
7269
7270<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>
7271<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7272matcher.
7273
7274Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7275            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7276            and U (matcher = typedefDecl(hasType(asString("int")))
7277            and friend class X (matcher = friendDecl(hasType("X"))
7278 class X {};
7279 void y(X &amp;x) { x; X z; }
7280 typedef int U;
7281 class Y { friend class X; };
7282</pre></td></tr>
7283
7284
7285<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>
7286<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7287that matches the given matcher.
7288
7289Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7290  bool y() { return true; }
7291  bool x = y();
7292</pre></td></tr>
7293
7294
7295<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>
7296<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7297expression.
7298
7299Given
7300  void f(int b) {
7301    int a[b];
7302  }
7303variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7304  varDecl(hasName("b")))))))
7305  matches "int a[b]"
7306</pre></td></tr>
7307
7308
7309<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>
7310<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7311definition that has a given body.
7312
7313Given
7314  for (;;) {}
7315hasBody(compoundStmt())
7316  matches 'for (;;) {}'
7317with compoundStmt()
7318  matching '{}'
7319</pre></td></tr>
7320
7321
7322<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>
7323<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
7324switch statement or conditional operator.
7325
7326Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7327  if (true) {}
7328</pre></td></tr>
7329
7330
7331<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>
7332<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7333NestedNameSpecifier-matcher matches.
7334</pre></td></tr>
7335
7336
7337<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>
7338<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7339QualType-matcher matches.
7340</pre></td></tr>
7341
7342<!--END_TRAVERSAL_MATCHERS -->
7343</table>
7344
7345</div>
7346</body>
7347</html>
7348
7349
7350