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