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