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