1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2          "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10  padding: .33em;
11}
12td.doc {
13  display: none;
14  border-bottom: 1px solid black;
15}
16td.name:hover {
17  color: blue;
18  cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23  if (!id) return;
24  row = document.getElementById(id);
25  if (row.style.display != 'table-cell')
26    row.style.display = 'table-cell';
27  else
28    row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66    ifStmt(hasTrueExpression(
67        expr(hasDescendant(
68            ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
103<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('cxxCtorInitializer0')"><a name="cxxCtorInitializer0Anchor">cxxCtorInitializer</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107  class C {
108    C() : i(42) {}
109    int i;
110  };
111</pre></td></tr>
112
113
114<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('accessSpecDecl0')"><a name="accessSpecDecl0Anchor">accessSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AccessSpecDecl.html">AccessSpecDecl</a>&gt;...</td></tr>
115<tr><td colspan="4" class="doc" id="accessSpecDecl0"><pre>Matches C++ access specifier declarations.
116
117Given
118  class C {
119  public:
120    int a;
121  };
122accessSpecDecl()
123  matches 'public:'
124</pre></td></tr>
125
126
127<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('blockDecl0')"><a name="blockDecl0Anchor">blockDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockDecl.html">BlockDecl</a>&gt;...</td></tr>
128<tr><td colspan="4" class="doc" id="blockDecl0"><pre>Matches block declarations.
129
130Example matches the declaration of the nameless block printing an input
131integer.
132
133  myFunc(^(int p) {
134    printf("%d", p);
135  })
136</pre></td></tr>
137
138
139<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateDecl0')"><a name="classTemplateDecl0Anchor">classTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
140<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
141
142Example matches Z
143  template&lt;class T&gt; class Z {};
144</pre></td></tr>
145
146
147<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplatePartialSpecializationDecl0')"><a name="classTemplatePartialSpecializationDecl0Anchor">classTemplatePartialSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplatePartialSpecializationDecl.html">ClassTemplatePartialSpecializationDecl</a>&gt;...</td></tr>
148<tr><td colspan="4" class="doc" id="classTemplatePartialSpecializationDecl0"><pre>Matches C++ class template partial specializations.
149
150Given
151  template&lt;class T1, class T2, int I&gt;
152  class A {};
153
154  template&lt;class T, int I&gt;
155  class A&lt;T, T*, I&gt; {};
156
157  template&lt;&gt;
158  class A&lt;int, int, 1&gt; {};
159classTemplatePartialSpecializationDecl()
160  matches the specialization A&lt;T,T*,I&gt; but not A&lt;int,int,1&gt;
161</pre></td></tr>
162
163
164<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('classTemplateSpecializationDecl0')"><a name="classTemplateSpecializationDecl0Anchor">classTemplateSpecializationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
165<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
166
167Given
168  template&lt;typename T&gt; class A {};
169  template&lt;&gt; class A&lt;double&gt; {};
170  A&lt;int&gt; a;
171classTemplateSpecializationDecl()
172  matches the specializations A&lt;int&gt; and A&lt;double&gt;
173</pre></td></tr>
174
175
176<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConstructorDecl0')"><a name="cxxConstructorDecl0Anchor">cxxConstructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
177<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
178
179Example matches Foo::Foo() and Foo::Foo(int)
180  class Foo {
181   public:
182    Foo();
183    Foo(int);
184    int DoSomething();
185  };
186</pre></td></tr>
187
188
189<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxConversionDecl0')"><a name="cxxConversionDecl0Anchor">cxxConversionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
190<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
191
192Example matches the operator.
193  class X { operator int() const; };
194</pre></td></tr>
195
196
197<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDeductionGuideDecl0')"><a name="cxxDeductionGuideDecl0Anchor">cxxDeductionGuideDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;...</td></tr>
198<tr><td colspan="4" class="doc" id="cxxDeductionGuideDecl0"><pre>Matches user-defined and implicitly generated deduction guide.
199
200Example matches the deduction guide.
201  template&lt;typename T&gt;
202  class X { X(int) };
203  X(int) -&gt; X&lt;int&gt;;
204</pre></td></tr>
205
206
207<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxDestructorDecl0')"><a name="cxxDestructorDecl0Anchor">cxxDestructorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
208<tr><td colspan="4" class="doc" id="cxxDestructorDecl0"><pre>Matches explicit C++ destructor declarations.
209
210Example matches Foo::~Foo()
211  class Foo {
212   public:
213    virtual ~Foo();
214  };
215</pre></td></tr>
216
217
218<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxMethodDecl0')"><a name="cxxMethodDecl0Anchor">cxxMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
219<tr><td colspan="4" class="doc" id="cxxMethodDecl0"><pre>Matches method declarations.
220
221Example matches y
222  class X { void y(); };
223</pre></td></tr>
224
225
226<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('cxxRecordDecl0')"><a name="cxxRecordDecl0Anchor">cxxRecordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
227<tr><td colspan="4" class="doc" id="cxxRecordDecl0"><pre>Matches C++ class declarations.
228
229Example matches X, Z
230  class X;
231  template&lt;class T&gt; class Z {};
232</pre></td></tr>
233
234
235<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('decl0')"><a name="decl0Anchor">decl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
236<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
237
238Examples matches X, C, and the friend declaration inside C;
239  void X();
240  class C {
241    friend X;
242  };
243</pre></td></tr>
244
245
246<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('declaratorDecl0')"><a name="declaratorDecl0Anchor">declaratorDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
247<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
248and non-type template parameter declarations).
249
250Given
251  class X { int y; };
252declaratorDecl()
253  matches int y.
254</pre></td></tr>
255
256
257<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumConstantDecl0')"><a name="enumConstantDecl0Anchor">enumConstantDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
258<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
259
260Example matches A, B, C
261  enum X {
262    A, B, C
263  };
264</pre></td></tr>
265
266
267<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('enumDecl0')"><a name="enumDecl0Anchor">enumDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
268<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
269
270Example matches X
271  enum X {
272    A, B, C
273  };
274</pre></td></tr>
275
276
277<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('fieldDecl0')"><a name="fieldDecl0Anchor">fieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
278<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
279
280Given
281  class X { int m; };
282fieldDecl()
283  matches 'm'.
284</pre></td></tr>
285
286
287<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('friendDecl0')"><a name="friendDecl0Anchor">friendDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
288<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
289
290Given
291  class X { friend void foo(); };
292friendDecl()
293  matches 'friend void foo()'.
294</pre></td></tr>
295
296
297<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionDecl0')"><a name="functionDecl0Anchor">functionDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
298<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
299
300Example matches f
301  void f();
302</pre></td></tr>
303
304
305<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('functionTemplateDecl0')"><a name="functionTemplateDecl0Anchor">functionTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
306<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
307
308Example matches f
309  template&lt;class T&gt; void f(T t) {}
310</pre></td></tr>
311
312
313<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('indirectFieldDecl0')"><a name="indirectFieldDecl0Anchor">indirectFieldDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IndirectFieldDecl.html">IndirectFieldDecl</a>&gt;...</td></tr>
314<tr><td colspan="4" class="doc" id="indirectFieldDecl0"><pre>Matches indirect field declarations.
315
316Given
317  struct X { struct { int a; }; };
318indirectFieldDecl()
319  matches 'a'.
320</pre></td></tr>
321
322
323<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('labelDecl0')"><a name="labelDecl0Anchor">labelDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelDecl.html">LabelDecl</a>&gt;...</td></tr>
324<tr><td colspan="4" class="doc" id="labelDecl0"><pre>Matches a declaration of label.
325
326Given
327  goto FOO;
328  FOO: bar();
329labelDecl()
330  matches 'FOO:'
331</pre></td></tr>
332
333
334<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('linkageSpecDecl0')"><a name="linkageSpecDecl0Anchor">linkageSpecDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
335<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
336
337Given
338  extern "C" {}
339linkageSpecDecl()
340  matches "extern "C" {}"
341</pre></td></tr>
342
343
344<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namedDecl0')"><a name="namedDecl0Anchor">namedDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
345<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
346
347Example matches X, S, the anonymous union type, i, and U;
348  typedef int X;
349  struct S {
350    union {
351      int i;
352    } U;
353  };
354</pre></td></tr>
355
356
357<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceAliasDecl0')"><a name="namespaceAliasDecl0Anchor">namespaceAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
358<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
359
360Given
361  namespace test {}
362  namespace alias = ::test;
363namespaceAliasDecl()
364  matches "namespace alias" but not "namespace test"
365</pre></td></tr>
366
367
368<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('namespaceDecl0')"><a name="namespaceDecl0Anchor">namespaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
369<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
370
371Given
372  namespace {}
373  namespace test {}
374namespaceDecl()
375  matches "namespace {}" and "namespace test {}"
376</pre></td></tr>
377
378
379<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('nonTypeTemplateParmDecl0')"><a name="nonTypeTemplateParmDecl0Anchor">nonTypeTemplateParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NonTypeTemplateParmDecl.html">NonTypeTemplateParmDecl</a>&gt;...</td></tr>
380<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
381
382Given
383  template &lt;typename T, int N&gt; struct C {};
384nonTypeTemplateParmDecl()
385  matches 'N', but not 'T'.
386</pre></td></tr>
387
388
389<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryDecl0')"><a name="objcCategoryDecl0Anchor">objcCategoryDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryDecl.html">ObjCCategoryDecl</a>&gt;...</td></tr>
390<tr><td colspan="4" class="doc" id="objcCategoryDecl0"><pre>Matches Objective-C category declarations.
391
392Example matches Foo (Additions)
393  @interface Foo (Additions)
394  @end
395</pre></td></tr>
396
397
398<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcCategoryImplDecl0')"><a name="objcCategoryImplDecl0Anchor">objcCategoryImplDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCCategoryImplDecl.html">ObjCCategoryImplDecl</a>&gt;...</td></tr>
399<tr><td colspan="4" class="doc" id="objcCategoryImplDecl0"><pre>Matches Objective-C category definitions.
400
401Example matches Foo (Additions)
402  @implementation Foo (Additions)
403  @end
404</pre></td></tr>
405
406
407<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcImplementationDecl0')"><a name="objcImplementationDecl0Anchor">objcImplementationDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCImplementationDecl.html">ObjCImplementationDecl</a>&gt;...</td></tr>
408<tr><td colspan="4" class="doc" id="objcImplementationDecl0"><pre>Matches Objective-C implementation declarations.
409
410Example matches Foo
411  @implementation Foo
412  @end
413</pre></td></tr>
414
415
416<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcInterfaceDecl0')"><a name="objcInterfaceDecl0Anchor">objcInterfaceDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCInterfaceDecl.html">ObjCInterfaceDecl</a>&gt;...</td></tr>
417<tr><td colspan="4" class="doc" id="objcInterfaceDecl0"><pre>Matches Objective-C interface declarations.
418
419Example matches Foo
420  @interface Foo
421  @end
422</pre></td></tr>
423
424
425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcIvarDecl0')"><a name="objcIvarDecl0Anchor">objcIvarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarDecl.html">ObjCIvarDecl</a>&gt;...</td></tr>
426<tr><td colspan="4" class="doc" id="objcIvarDecl0"><pre>Matches Objective-C instance variable declarations.
427
428Example matches _enabled
429  @implementation Foo {
430    BOOL _enabled;
431  }
432  @end
433</pre></td></tr>
434
435
436<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcMethodDecl0')"><a name="objcMethodDecl0Anchor">objcMethodDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;...</td></tr>
437<tr><td colspan="4" class="doc" id="objcMethodDecl0"><pre>Matches Objective-C method declarations.
438
439Example matches both declaration and definition of -[Foo method]
440  @interface Foo
441  - (void)method;
442  @end
443
444  @implementation Foo
445  - (void)method {}
446  @end
447</pre></td></tr>
448
449
450<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcPropertyDecl0')"><a name="objcPropertyDecl0Anchor">objcPropertyDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCPropertyDecl.html">ObjCPropertyDecl</a>&gt;...</td></tr>
451<tr><td colspan="4" class="doc" id="objcPropertyDecl0"><pre>Matches Objective-C property declarations.
452
453Example matches enabled
454  @interface Foo
455  @property BOOL enabled;
456  @end
457</pre></td></tr>
458
459
460<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('objcProtocolDecl0')"><a name="objcProtocolDecl0Anchor">objcProtocolDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCProtocolDecl.html">ObjCProtocolDecl</a>&gt;...</td></tr>
461<tr><td colspan="4" class="doc" id="objcProtocolDecl0"><pre>Matches Objective-C protocol declarations.
462
463Example matches FooDelegate
464  @protocol FooDelegate
465  @end
466</pre></td></tr>
467
468
469<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('parmVarDecl0')"><a name="parmVarDecl0Anchor">parmVarDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
470<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
471
472Given
473  void f(int x);
474parmVarDecl()
475  matches int x.
476</pre></td></tr>
477
478
479<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('recordDecl0')"><a name="recordDecl0Anchor">recordDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;...</td></tr>
480<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
481
482Example matches X, Z, U, and S
483  class X;
484  template&lt;class T&gt; class Z {};
485  struct S {};
486  union U {};
487</pre></td></tr>
488
489
490<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('staticAssertDecl0')"><a name="staticAssertDecl0Anchor">staticAssertDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
491<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
492
493Example:
494  staticAssertExpr()
495matches
496  static_assert(sizeof(S) == sizeof(int))
497in
498  struct S {
499    int x;
500  };
501  static_assert(sizeof(S) == sizeof(int));
502</pre></td></tr>
503
504
505<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
506<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
507
508Given
509  template &lt;typename T, int N&gt; struct C {};
510templateTypeParmDecl()
511  matches 'T', but not 'N'.
512</pre></td></tr>
513
514
515<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
516<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
517
518Given
519  int X;
520  namespace NS {
521  int Y;
522  }  // namespace NS
523decl(hasDeclContext(translationUnitDecl()))
524  matches "int X", but not "int Y".
525</pre></td></tr>
526
527
528<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasDecl0')"><a name="typeAliasDecl0Anchor">typeAliasDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasDecl.html">TypeAliasDecl</a>&gt;...</td></tr>
529<tr><td colspan="4" class="doc" id="typeAliasDecl0"><pre>Matches type alias declarations.
530
531Given
532  typedef int X;
533  using Y = int;
534typeAliasDecl()
535  matches "using Y = int", but not "typedef int X"
536</pre></td></tr>
537
538
539<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typeAliasTemplateDecl0')"><a name="typeAliasTemplateDecl0Anchor">typeAliasTemplateDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeAliasTemplateDecl.html">TypeAliasTemplateDecl</a>&gt;...</td></tr>
540<tr><td colspan="4" class="doc" id="typeAliasTemplateDecl0"><pre>Matches type alias template declarations.
541
542typeAliasTemplateDecl() matches
543  template &lt;typename T&gt;
544  using Y = X&lt;T&gt;;
545</pre></td></tr>
546
547
548<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
549<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
550
551Given
552  typedef int X;
553  using Y = int;
554typedefDecl()
555  matches "typedef int X", but not "using Y = int"
556</pre></td></tr>
557
558
559<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefNameDecl0')"><a name="typedefNameDecl0Anchor">typedefNameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefNameDecl.html">TypedefNameDecl</a>&gt;...</td></tr>
560<tr><td colspan="4" class="doc" id="typedefNameDecl0"><pre>Matches typedef name declarations.
561
562Given
563  typedef int X;
564  using Y = int;
565typedefNameDecl()
566  matches "typedef int X" and "using Y = int"
567</pre></td></tr>
568
569
570<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingTypenameDecl0')"><a name="unresolvedUsingTypenameDecl0Anchor">unresolvedUsingTypenameDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingTypenameDecl.html">UnresolvedUsingTypenameDecl</a>&gt;...</td></tr>
571<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
572typename.
573
574Given
575  template &lt;typename T&gt;
576  struct Base { typedef T Foo; };
577
578  template&lt;typename T&gt;
579  struct S : private Base&lt;T&gt; {
580    using typename Base&lt;T&gt;::Foo;
581  };
582unresolvedUsingTypenameDecl()
583  matches using Base&lt;T&gt;::Foo </pre></td></tr>
584
585
586<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('unresolvedUsingValueDecl0')"><a name="unresolvedUsingValueDecl0Anchor">unresolvedUsingValueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
587<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
588
589Given
590  template&lt;typename X&gt;
591  class C : private X {
592    using X::x;
593  };
594unresolvedUsingValueDecl()
595  matches using X::x </pre></td></tr>
596
597
598<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDecl0')"><a name="usingDecl0Anchor">usingDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
599<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
600
601Given
602  namespace X { int x; }
603  using X::x;
604usingDecl()
605  matches using X::x </pre></td></tr>
606
607
608<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('usingDirectiveDecl0')"><a name="usingDirectiveDecl0Anchor">usingDirectiveDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
609<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
610
611Given
612  namespace X { int x; }
613  using namespace X;
614usingDirectiveDecl()
615  matches using namespace X </pre></td></tr>
616
617
618<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('valueDecl0')"><a name="valueDecl0Anchor">valueDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
619<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
620
621Example matches A, B, C and F
622  enum X { A, B, C };
623  void F();
624</pre></td></tr>
625
626
627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('varDecl0')"><a name="varDecl0Anchor">varDecl</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
628<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
629
630Note: this does not match declarations of member variables, which are
631"field" declarations in Clang parlance.
632
633Example matches a
634  int a;
635</pre></td></tr>
636
637
638<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifierLoc0')"><a name="nestedNameSpecifierLoc0Anchor">nestedNameSpecifierLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
639<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
640</pre></td></tr>
641
642
643<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;</td><td class="name" onclick="toggle('nestedNameSpecifier0')"><a name="nestedNameSpecifier0Anchor">nestedNameSpecifier</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
644<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
645
646Given
647  namespace ns {
648    struct A { static void f(); };
649    void A::f() {}
650    void g() { A::f(); }
651  }
652  ns::A a;
653nestedNameSpecifier()
654  matches "ns::" and both "A::"
655</pre></td></tr>
656
657
658<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPClause.html">OMPClause</a>&gt;</td><td class="name" onclick="toggle('ompDefaultClause0')"><a name="ompDefaultClause0Anchor">ompDefaultClause</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPDefaultClause.html">OMPDefaultClause</a>&gt;...</td></tr>
659<tr><td colspan="4" class="doc" id="ompDefaultClause0"><pre>Matches OpenMP ``default`` clause.
660
661Given
662
663  #pragma omp parallel default(none)
664  #pragma omp parallel default(shared)
665  #pragma omp parallel
666
667``ompDefaultClause()`` matches ``default(none)`` and ``default(shared)``.
668</pre></td></tr>
669
670
671<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('qualType0')"><a name="qualType0Anchor">qualType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
672<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
673</pre></td></tr>
674
675
676<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('addrLabelExpr0')"><a name="addrLabelExpr0Anchor">addrLabelExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;...</td></tr>
677<tr><td colspan="4" class="doc" id="addrLabelExpr0"><pre>Matches address of label statements (GNU extension).
678
679Given
680  FOO: bar();
681  void *ptr = &amp;&amp;FOO;
682  goto *bar;
683addrLabelExpr()
684  matches '&amp;&amp;FOO'
685</pre></td></tr>
686
687
688<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('arraySubscriptExpr0')"><a name="arraySubscriptExpr0Anchor">arraySubscriptExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
689<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
690
691Given
692  int i = a[1];
693arraySubscriptExpr()
694  matches "a[1]"
695</pre></td></tr>
696
697
698<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('asmStmt0')"><a name="asmStmt0Anchor">asmStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
699<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
700
701 int i = 100;
702  __asm("mov al, 2");
703asmStmt()
704  matches '__asm("mov al, 2")'
705</pre></td></tr>
706
707
708<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('atomicExpr0')"><a name="atomicExpr0Anchor">atomicExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicExpr.html">AtomicExpr</a>&gt;...</td></tr>
709<tr><td colspan="4" class="doc" id="atomicExpr0"><pre>Matches atomic builtins.
710Example matches __atomic_load_n(ptr, 1)
711  void foo() { int *ptr; __atomic_load_n(ptr, 1); }
712</pre></td></tr>
713
714
715<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('autoreleasePoolStmt0')"><a name="autoreleasePoolStmt0Anchor">autoreleasePoolStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAutoreleasePoolStmt.html">ObjCAutoreleasePoolStmt</a>&gt;...</td></tr>
716<tr><td colspan="4" class="doc" id="autoreleasePoolStmt0"><pre>Matches an Objective-C autorelease pool statement.
717
718Given
719  @autoreleasepool {
720    int x = 0;
721  }
722autoreleasePoolStmt(stmt()) matches the declaration of "x"
723inside the autorelease pool.
724</pre></td></tr>
725
726
727<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryConditionalOperator0')"><a name="binaryConditionalOperator0Anchor">binaryConditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryConditionalOperator.html">BinaryConditionalOperator</a>&gt;...</td></tr>
728<tr><td colspan="4" class="doc" id="binaryConditionalOperator0"><pre>Matches binary conditional operator expressions (GNU extension).
729
730Example matches a ?: b
731  (a ?: b) + 42;
732</pre></td></tr>
733
734
735<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('binaryOperator0')"><a name="binaryOperator0Anchor">binaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
736<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
737
738Example matches a || b
739  !(a || b)
740</pre></td></tr>
741
742
743<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('blockExpr0')"><a name="blockExpr0Anchor">blockExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockExpr.html">BlockExpr</a>&gt;...</td></tr>
744<tr><td colspan="4" class="doc" id="blockExpr0"><pre>Matches a reference to a block.
745
746Example: matches "^{}":
747  void f() { ^{}(); }
748</pre></td></tr>
749
750
751<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('breakStmt0')"><a name="breakStmt0Anchor">breakStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
752<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
753
754Given
755  while (true) { break; }
756breakStmt()
757  matches 'break'
758</pre></td></tr>
759
760
761<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cStyleCastExpr0')"><a name="cStyleCastExpr0Anchor">cStyleCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
762<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
763
764Example: Matches (int) 2.2f in
765  int i = (int) 2.2f;
766</pre></td></tr>
767
768
769<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('callExpr0')"><a name="callExpr0Anchor">callExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
770<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
771
772Example matches x.y() and y()
773  X x;
774  x.y();
775  y();
776</pre></td></tr>
777
778
779<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('caseStmt0')"><a name="caseStmt0Anchor">caseStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
780<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
781
782Given
783  switch(a) { case 42: break; default: break; }
784caseStmt()
785  matches 'case 42:'.
786</pre></td></tr>
787
788
789<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('castExpr0')"><a name="castExpr0Anchor">castExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
790<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
791
792Example: castExpr() matches each of the following:
793  (int) 3;
794  const_cast&lt;Expr *&gt;(SubExpr);
795  char c = 0;
796but does not match
797  int i = (0);
798  int k = 0;
799</pre></td></tr>
800
801
802<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('characterLiteral0')"><a name="characterLiteral0Anchor">characterLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
803<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
804
805Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
806though.
807
808Example matches 'a', L'a'
809  char ch = 'a';
810  wchar_t chw = L'a';
811</pre></td></tr>
812
813
814<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('chooseExpr0')"><a name="chooseExpr0Anchor">chooseExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ChooseExpr.html">ChooseExpr</a>&gt;...</td></tr>
815<tr><td colspan="4" class="doc" id="chooseExpr0"><pre>Matches GNU __builtin_choose_expr.
816</pre></td></tr>
817
818
819<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundLiteralExpr0')"><a name="compoundLiteralExpr0Anchor">compoundLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
820<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
821
822Example match: {1}, (1, 2)
823  int array[4] = {1};
824  vector int myvec = (vector int)(1, 2);
825</pre></td></tr>
826
827
828<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('compoundStmt0')"><a name="compoundStmt0Anchor">compoundStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
829<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
830
831Example matches '{}' and '{{}}' in 'for (;;) {{}}'
832  for (;;) {{}}
833</pre></td></tr>
834
835
836<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('conditionalOperator0')"><a name="conditionalOperator0Anchor">conditionalOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
837<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
838
839Example matches a ? b : c
840  (a ? b : c) + 42
841</pre></td></tr>
842
843
844<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constantExpr0')"><a name="constantExpr0Anchor">constantExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantExpr.html">ConstantExpr</a>&gt;...</td></tr>
845<tr><td colspan="4" class="doc" id="constantExpr0"><pre>Matches a constant expression wrapper.
846
847Example matches the constant in the case statement:
848    (matcher = constantExpr())
849  switch (a) {
850  case 37: break;
851  }
852</pre></td></tr>
853
854
855<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('continueStmt0')"><a name="continueStmt0Anchor">continueStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
856<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
857
858Given
859  while (true) { continue; }
860continueStmt()
861  matches 'continue'
862</pre></td></tr>
863
864
865<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cudaKernelCallExpr0')"><a name="cudaKernelCallExpr0Anchor">cudaKernelCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
866<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
867
868Example matches,
869  kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
870</pre></td></tr>
871
872
873<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBindTemporaryExpr0')"><a name="cxxBindTemporaryExpr0Anchor">cxxBindTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
874<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
875
876Example matches FunctionTakesString(GetStringByValue())
877    (matcher = cxxBindTemporaryExpr())
878  FunctionTakesString(GetStringByValue());
879  FunctionTakesStringByPointer(GetStringPointer());
880</pre></td></tr>
881
882
883<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxBoolLiteral0')"><a name="cxxBoolLiteral0Anchor">cxxBoolLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
884<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
885
886Example matches true
887  true
888</pre></td></tr>
889
890
891<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxCatchStmt0')"><a name="cxxCatchStmt0Anchor">cxxCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
892<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
893
894  try {} catch(int i) {}
895cxxCatchStmt()
896  matches 'catch(int i)'
897</pre></td></tr>
898
899
900<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstCastExpr0')"><a name="cxxConstCastExpr0Anchor">cxxConstCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
901<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
902
903Example: Matches const_cast&lt;int*&gt;(&amp;r) in
904  int n = 42;
905  const int &amp;r(n);
906  int* p = const_cast&lt;int*&gt;(&amp;r);
907</pre></td></tr>
908
909
910<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxConstructExpr0')"><a name="cxxConstructExpr0Anchor">cxxConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
911<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
912
913Example matches string(ptr, n) and ptr within arguments of f
914    (matcher = cxxConstructExpr())
915  void f(const string &amp;a, const string &amp;b);
916  char *ptr;
917  int n;
918  f(string(ptr, n), ptr);
919</pre></td></tr>
920
921
922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDefaultArgExpr0')"><a name="cxxDefaultArgExpr0Anchor">cxxDefaultArgExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
923<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
924
925Example matches the CXXDefaultArgExpr placeholder inserted for the
926    default value of the second parameter in the call expression f(42)
927    (matcher = cxxDefaultArgExpr())
928  void f(int x, int y = 0);
929  f(42);
930</pre></td></tr>
931
932
933<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDeleteExpr0')"><a name="cxxDeleteExpr0Anchor">cxxDeleteExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
934<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
935
936Given
937  delete X;
938cxxDeleteExpr()
939  matches 'delete X'.
940</pre></td></tr>
941
942
943<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDependentScopeMemberExpr0')"><a name="cxxDependentScopeMemberExpr0Anchor">cxxDependentScopeMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;...</td></tr>
944<tr><td colspan="4" class="doc" id="cxxDependentScopeMemberExpr0"><pre>Matches member expressions where the actual member referenced could not be
945resolved because the base expression or the member name was dependent.
946
947Given
948  template &lt;class T&gt; void f() { T t; t.g(); }
949cxxDependentScopeMemberExpr()
950  matches t.g
951</pre></td></tr>
952
953
954<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxDynamicCastExpr0')"><a name="cxxDynamicCastExpr0Anchor">cxxDynamicCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
955<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
956
957Example:
958  cxxDynamicCastExpr()
959matches
960  dynamic_cast&lt;D*&gt;(&amp;b);
961in
962  struct B { virtual ~B() {} }; struct D : B {};
963  B b;
964  D* p = dynamic_cast&lt;D*&gt;(&amp;b);
965</pre></td></tr>
966
967
968<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxForRangeStmt0')"><a name="cxxForRangeStmt0Anchor">cxxForRangeStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
969<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
970
971cxxForRangeStmt() matches 'for (auto a : i)'
972  int i[] =  {1, 2, 3}; for (auto a : i);
973  for(int j = 0; j &lt; 5; ++j);
974</pre></td></tr>
975
976
977<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxFunctionalCastExpr0')"><a name="cxxFunctionalCastExpr0Anchor">cxxFunctionalCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
978<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
979
980Example: Matches Foo(bar);
981  Foo f = bar;
982  Foo g = (Foo) bar;
983  Foo h = Foo(bar);
984</pre></td></tr>
985
986
987<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxMemberCallExpr0')"><a name="cxxMemberCallExpr0Anchor">cxxMemberCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
988<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
989
990Example matches x.y()
991  X x;
992  x.y();
993</pre></td></tr>
994
995
996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNewExpr0')"><a name="cxxNewExpr0Anchor">cxxNewExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
997<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
998
999Given
1000  new X;
1001cxxNewExpr()
1002  matches 'new X'.
1003</pre></td></tr>
1004
1005
1006<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxNullPtrLiteralExpr0')"><a name="cxxNullPtrLiteralExpr0Anchor">cxxNullPtrLiteralExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
1007<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
1008</pre></td></tr>
1009
1010
1011<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxOperatorCallExpr0')"><a name="cxxOperatorCallExpr0Anchor">cxxOperatorCallExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
1012<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
1013
1014Note that if an operator isn't overloaded, it won't match. Instead, use
1015binaryOperator matcher.
1016Currently it does not match operators such as new delete.
1017FIXME: figure out why these do not match?
1018
1019Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
1020    (matcher = cxxOperatorCallExpr())
1021  ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
1022  ostream &amp;o; int b = 1, c = 1;
1023  o &lt;&lt; b &lt;&lt; c;
1024</pre></td></tr>
1025
1026
1027<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxReinterpretCastExpr0')"><a name="cxxReinterpretCastExpr0Anchor">cxxReinterpretCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
1028<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
1029
1030Either the source expression or the destination type can be matched
1031using has(), but hasDestinationType() is more specific and can be
1032more readable.
1033
1034Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
1035  void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
1036</pre></td></tr>
1037
1038
1039<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStaticCastExpr0')"><a name="cxxStaticCastExpr0Anchor">cxxStaticCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
1040<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
1041
1042See also: hasDestinationType
1043See also: reinterpretCast
1044
1045Example:
1046  cxxStaticCastExpr()
1047matches
1048  static_cast&lt;long&gt;(8)
1049in
1050  long eight(static_cast&lt;long&gt;(8));
1051</pre></td></tr>
1052
1053
1054<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxStdInitializerListExpr0')"><a name="cxxStdInitializerListExpr0Anchor">cxxStdInitializerListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXStdInitializerListExpr.html">CXXStdInitializerListExpr</a>&gt;...</td></tr>
1055<tr><td colspan="4" class="doc" id="cxxStdInitializerListExpr0"><pre>Matches C++ initializer list expressions.
1056
1057Given
1058  std::vector&lt;int&gt; a({ 1, 2, 3 });
1059  std::vector&lt;int&gt; b = { 4, 5 };
1060  int c[] = { 6, 7 };
1061  std::pair&lt;int, int&gt; d = { 8, 9 };
1062cxxStdInitializerListExpr()
1063  matches "{ 1, 2, 3 }" and "{ 4, 5 }"
1064</pre></td></tr>
1065
1066
1067<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTemporaryObjectExpr0')"><a name="cxxTemporaryObjectExpr0Anchor">cxxTemporaryObjectExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1068<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1069
1070Example: Matches Foo(bar, bar)
1071  Foo h = Foo(bar, bar);
1072</pre></td></tr>
1073
1074
1075<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThisExpr0')"><a name="cxxThisExpr0Anchor">cxxThisExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1076<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
1077
1078Example matches the implicit this expression in "return i".
1079    (matcher = cxxThisExpr())
1080struct foo {
1081  int i;
1082  int f() { return i; }
1083};
1084</pre></td></tr>
1085
1086
1087<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxThrowExpr0')"><a name="cxxThrowExpr0Anchor">cxxThrowExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1088<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
1089
1090  try { throw 5; } catch(int i) {}
1091cxxThrowExpr()
1092  matches 'throw 5'
1093</pre></td></tr>
1094
1095
1096<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxTryStmt0')"><a name="cxxTryStmt0Anchor">cxxTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1097<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
1098
1099  try {} catch(int i) {}
1100cxxTryStmt()
1101  matches 'try {}'
1102</pre></td></tr>
1103
1104
1105<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('cxxUnresolvedConstructExpr0')"><a name="cxxUnresolvedConstructExpr0Anchor">cxxUnresolvedConstructExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1106<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1107
1108Example matches T(t) in return statement of f
1109    (matcher = cxxUnresolvedConstructExpr())
1110  template &lt;typename T&gt;
1111  void f(const T&amp; t) { return T(t); }
1112</pre></td></tr>
1113
1114
1115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declRefExpr0')"><a name="declRefExpr0Anchor">declRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
1116<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
1117
1118Example matches x in if (x)
1119  bool x;
1120  if (x) {}
1121</pre></td></tr>
1122
1123
1124<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('declStmt0')"><a name="declStmt0Anchor">declStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
1125<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
1126
1127Given
1128  int a;
1129declStmt()
1130  matches 'int a'.
1131</pre></td></tr>
1132
1133
1134<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultStmt0')"><a name="defaultStmt0Anchor">defaultStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
1135<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
1136
1137Given
1138  switch(a) { case 42: break; default: break; }
1139defaultStmt()
1140  matches 'default:'.
1141</pre></td></tr>
1142
1143
1144<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('designatedInitExpr0')"><a name="designatedInitExpr0Anchor">designatedInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;...</td></tr>
1145<tr><td colspan="4" class="doc" id="designatedInitExpr0"><pre>Matches C99 designated initializer expressions [C99 6.7.8].
1146
1147Example: Matches { [2].y = 1.0, [0].x = 1.0 }
1148  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
1149</pre></td></tr>
1150
1151
1152<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('doStmt0')"><a name="doStmt0Anchor">doStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
1153<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
1154
1155Given
1156  do {} while (true);
1157doStmt()
1158  matches 'do {} while(true)'
1159</pre></td></tr>
1160
1161
1162<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('explicitCastExpr0')"><a name="explicitCastExpr0Anchor">explicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
1163<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
1164
1165Matches any cast expression written in user code, whether it be a
1166C-style cast, a functional-style cast, or a keyword cast.
1167
1168Does not match implicit conversions.
1169
1170Note: the name "explicitCast" is chosen to match Clang's terminology, as
1171Clang uses the term "cast" to apply to implicit conversions as well as to
1172actual cast expressions.
1173
1174See also: hasDestinationType.
1175
1176Example: matches all five of the casts in
1177  int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
1178but does not match the implicit conversion in
1179  long ell = 42;
1180</pre></td></tr>
1181
1182
1183<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('expr0')"><a name="expr0Anchor">expr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
1184<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
1185
1186Example matches x()
1187  void f() { x(); }
1188</pre></td></tr>
1189
1190
1191<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('exprWithCleanups0')"><a name="exprWithCleanups0Anchor">exprWithCleanups</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
1192<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
1193of the sub-expression's evaluation.
1194
1195Example matches std::string()
1196  const std::string str = std::string();
1197</pre></td></tr>
1198
1199
1200<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('floatLiteral0')"><a name="floatLiteral0Anchor">floatLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
1201<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes / encodings, e.g.
12021.0, 1.0f, 1.0L and 1e10.
1203
1204Does not match implicit conversions such as
1205  float a = 10;
1206</pre></td></tr>
1207
1208
1209<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forStmt0')"><a name="forStmt0Anchor">forStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
1210<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
1211
1212Example matches 'for (;;) {}'
1213  for (;;) {}
1214  int i[] =  {1, 2, 3}; for (auto a : i);
1215</pre></td></tr>
1216
1217
1218<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gnuNullExpr0')"><a name="gnuNullExpr0Anchor">gnuNullExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
1219<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
1220</pre></td></tr>
1221
1222
1223<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('gotoStmt0')"><a name="gotoStmt0Anchor">gotoStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
1224<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
1225
1226Given
1227  goto FOO;
1228  FOO: bar();
1229gotoStmt()
1230  matches 'goto FOO'
1231</pre></td></tr>
1232
1233
1234<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ifStmt0')"><a name="ifStmt0Anchor">ifStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
1235<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
1236
1237Example matches 'if (x) {}'
1238  if (x) {}
1239</pre></td></tr>
1240
1241
1242<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('imaginaryLiteral0')"><a name="imaginaryLiteral0Anchor">imaginaryLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImaginaryLiteral.html">ImaginaryLiteral</a>&gt;...</td></tr>
1243<tr><td colspan="4" class="doc" id="imaginaryLiteral0"><pre>Matches imaginary literals, which are based on integer and floating
1244point literals e.g.: 1i, 1.0i
1245</pre></td></tr>
1246
1247
1248<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitCastExpr0')"><a name="implicitCastExpr0Anchor">implicitCastExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
1249<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
1250
1251This matches many different places, including function call return value
1252eliding, as well as any type conversions.
1253</pre></td></tr>
1254
1255
1256<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('implicitValueInitExpr0')"><a name="implicitValueInitExpr0Anchor">implicitValueInitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ImplicitValueInitExpr.html">ImplicitValueInitExpr</a>&gt;...</td></tr>
1257<tr><td colspan="4" class="doc" id="implicitValueInitExpr0"><pre>Matches implicit initializers of init list expressions.
1258
1259Given
1260  point ptarray[10] = { [2].y = 1.0, [2].x = 2.0, [0].x = 1.0 };
1261implicitValueInitExpr()
1262  matches "[0].y" (implicitly)
1263</pre></td></tr>
1264
1265
1266<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('initListExpr0')"><a name="initListExpr0Anchor">initListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
1267<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
1268
1269Given
1270  int a[] = { 1, 2 };
1271  struct B { int x, y; };
1272  B b = { 5, 6 };
1273initListExpr()
1274  matches "{ 1, 2 }" and "{ 5, 6 }"
1275</pre></td></tr>
1276
1277
1278<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('integerLiteral0')"><a name="integerLiteral0Anchor">integerLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
1279<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes / encodings, e.g.
12801, 1L, 0x1 and 1U.
1281
1282Does not match character-encoded integers such as L'a'.
1283</pre></td></tr>
1284
1285
1286<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('labelStmt0')"><a name="labelStmt0Anchor">labelStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
1287<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
1288
1289Given
1290  goto FOO;
1291  FOO: bar();
1292labelStmt()
1293  matches 'FOO:'
1294</pre></td></tr>
1295
1296
1297<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('lambdaExpr0')"><a name="lambdaExpr0Anchor">lambdaExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
1298<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1299
1300Example matches [&amp;](){return 5;}
1301  [&amp;](){return 5;}
1302</pre></td></tr>
1303
1304
1305<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('materializeTemporaryExpr0')"><a name="materializeTemporaryExpr0Anchor">materializeTemporaryExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
1306<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1307
1308Example: Given
1309  struct T {void func();};
1310  T f();
1311  void g(T);
1312materializeTemporaryExpr() matches 'f()' in these statements
1313  T u(f());
1314  g(f());
1315  f().func();
1316but does not match
1317  f();
1318</pre></td></tr>
1319
1320
1321<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberExpr0')"><a name="memberExpr0Anchor">memberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
1322<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1323
1324Given
1325  class Y {
1326    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1327    int a; static int b;
1328  };
1329memberExpr()
1330  matches this-&gt;x, x, y.x, a, this-&gt;b
1331</pre></td></tr>
1332
1333
1334<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullStmt0')"><a name="nullStmt0Anchor">nullStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
1335<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1336
1337  foo();;
1338nullStmt()
1339  matches the second ';'
1340</pre></td></tr>
1341
1342
1343<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcCatchStmt0')"><a name="objcCatchStmt0Anchor">objcCatchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtCatchStmt.html">ObjCAtCatchStmt</a>&gt;...</td></tr>
1344<tr><td colspan="4" class="doc" id="objcCatchStmt0"><pre>Matches Objective-C @catch statements.
1345
1346Example matches @catch
1347  @try {}
1348  @catch (...) {}
1349</pre></td></tr>
1350
1351
1352<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcFinallyStmt0')"><a name="objcFinallyStmt0Anchor">objcFinallyStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtFinallyStmt.html">ObjCAtFinallyStmt</a>&gt;...</td></tr>
1353<tr><td colspan="4" class="doc" id="objcFinallyStmt0"><pre>Matches Objective-C @finally statements.
1354
1355Example matches @finally
1356  @try {}
1357  @finally {}
1358</pre></td></tr>
1359
1360
1361<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcIvarRefExpr0')"><a name="objcIvarRefExpr0Anchor">objcIvarRefExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCIvarRefExpr.html">ObjCIvarRefExpr</a>&gt;...</td></tr>
1362<tr><td colspan="4" class="doc" id="objcIvarRefExpr0"><pre>Matches a reference to an ObjCIvar.
1363
1364Example: matches "a" in "init" method:
1365@implementation A {
1366  NSString *a;
1367}
1368- (void) init {
1369  a = @"hello";
1370}
1371</pre></td></tr>
1372
1373
1374<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcMessageExpr0')"><a name="objcMessageExpr0Anchor">objcMessageExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
1375<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1376
1377The innermost message send invokes the "alloc" class method on the
1378NSString class, while the outermost message send invokes the
1379"initWithString" instance method on the object returned from
1380NSString's "alloc". This matcher should match both message sends.
1381  [[NSString alloc] initWithString:@"Hello"]
1382</pre></td></tr>
1383
1384
1385<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcThrowStmt0')"><a name="objcThrowStmt0Anchor">objcThrowStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtThrowStmt.html">ObjCAtThrowStmt</a>&gt;...</td></tr>
1386<tr><td colspan="4" class="doc" id="objcThrowStmt0"><pre>Matches Objective-C statements.
1387
1388Example matches @throw obj;
1389</pre></td></tr>
1390
1391
1392<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('objcTryStmt0')"><a name="objcTryStmt0Anchor">objcTryStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCAtTryStmt.html">ObjCAtTryStmt</a>&gt;...</td></tr>
1393<tr><td colspan="4" class="doc" id="objcTryStmt0"><pre>Matches Objective-C @try statements.
1394
1395Example matches @try
1396  @try {}
1397  @catch (...) {}
1398</pre></td></tr>
1399
1400
1401<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>&gt;...</td></tr>
1402<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive.
1403
1404Given
1405
1406  #pragma omp parallel
1407  #pragma omp parallel default(none)
1408  #pragma omp taskyield
1409
1410``ompExecutableDirective()`` matches ``omp parallel``,
1411``omp parallel default(none)`` and ``omp taskyield``.
1412</pre></td></tr>
1413
1414
1415<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>&gt;...</td></tr>
1416<tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers
1417to reference another expressions and can be met
1418in BinaryConditionalOperators, for example.
1419
1420Example matches 'a'
1421  (a ?: c) + 42;
1422</pre></td></tr>
1423
1424
1425<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
1426<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1427
1428Example matches (foo() + 1)
1429  int foo() { return 1; }
1430  int a = (foo() + 1);
1431</pre></td></tr>
1432
1433
1434<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('parenListExpr0')"><a name="parenListExpr0Anchor">parenListExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenListExpr.html">ParenListExpr</a>&gt;...</td></tr>
1435<tr><td colspan="4" class="doc" id="parenListExpr0"><pre>Matches paren list expressions.
1436ParenListExprs don't have a predefined type and are used for late parsing.
1437In the final AST, they can be met in template declarations.
1438
1439Given
1440  template&lt;typename T&gt; class X {
1441    void f() {
1442      X x(*this);
1443      int a = 0, b = 1; int i = (a, b);
1444    }
1445  };
1446parenListExpr() matches "*this" but NOT matches (a, b) because (a, b)
1447has a predefined type and is a ParenExpr, not a ParenListExpr.
1448</pre></td></tr>
1449
1450
1451<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('predefinedExpr0')"><a name="predefinedExpr0Anchor">predefinedExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PredefinedExpr.html">PredefinedExpr</a>&gt;...</td></tr>
1452<tr><td colspan="4" class="doc" id="predefinedExpr0"><pre>Matches predefined identifier expressions [C99 6.4.2.2].
1453
1454Example: Matches __func__
1455  printf("%s", __func__);
1456</pre></td></tr>
1457
1458
1459<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('returnStmt0')"><a name="returnStmt0Anchor">returnStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
1460<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1461
1462Given
1463  return 1;
1464returnStmt()
1465  matches 'return 1'
1466</pre></td></tr>
1467
1468
1469<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmt0')"><a name="stmt0Anchor">stmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
1470<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1471
1472Given
1473  { ++a; }
1474stmt()
1475  matches both the compound statement '{ ++a; }' and '++a'.
1476</pre></td></tr>
1477
1478
1479<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stmtExpr0')"><a name="stmtExpr0Anchor">stmtExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StmtExpr.html">StmtExpr</a>&gt;...</td></tr>
1480<tr><td colspan="4" class="doc" id="stmtExpr0"><pre>Matches statement expression (GNU extension).
1481
1482Example match: ({ int X = 4; X; })
1483  int C = ({ int X = 4; X; });
1484</pre></td></tr>
1485
1486
1487<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('stringLiteral0')"><a name="stringLiteral0Anchor">stringLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
1488<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1489
1490Example matches "abcd", L"abcd"
1491  char *s = "abcd";
1492  wchar_t *ws = L"abcd";
1493</pre></td></tr>
1494
1495
1496<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('substNonTypeTemplateParmExpr0')"><a name="substNonTypeTemplateParmExpr0Anchor">substNonTypeTemplateParmExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
1497<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1498
1499Given
1500  template &lt;int N&gt;
1501  struct A { static const int n = N; };
1502  struct B : public A&lt;42&gt; {};
1503substNonTypeTemplateParmExpr()
1504  matches "N" in the right-hand side of "static const int n = N;"
1505</pre></td></tr>
1506
1507
1508<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchCase0')"><a name="switchCase0Anchor">switchCase</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
1509<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1510
1511Given
1512  switch(a) { case 42: break; default: break; }
1513switchCase()
1514  matches 'case 42:' and 'default:'.
1515</pre></td></tr>
1516
1517
1518<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('switchStmt0')"><a name="switchStmt0Anchor">switchStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
1519<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1520
1521Given
1522  switch(a) { case 42: break; default: break; }
1523switchStmt()
1524  matches 'switch(a)'.
1525</pre></td></tr>
1526
1527
1528<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryExprOrTypeTraitExpr0')"><a name="unaryExprOrTypeTraitExpr0Anchor">unaryExprOrTypeTraitExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
1529<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1530
1531Given
1532  Foo x = bar;
1533  int y = sizeof(x) + alignof(x);
1534unaryExprOrTypeTraitExpr()
1535  matches sizeof(x) and alignof(x)
1536</pre></td></tr>
1537
1538
1539<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unaryOperator0')"><a name="unaryOperator0Anchor">unaryOperator</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
1540<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1541
1542Example matches !a
1543  !a || b
1544</pre></td></tr>
1545
1546
1547<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedLookupExpr0')"><a name="unresolvedLookupExpr0Anchor">unresolvedLookupExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedLookupExpr.html">UnresolvedLookupExpr</a>&gt;...</td></tr>
1548<tr><td colspan="4" class="doc" id="unresolvedLookupExpr0"><pre>Matches reference to a name that can be looked up during parsing
1549but could not be resolved to a specific declaration.
1550
1551Given
1552  template&lt;typename T&gt;
1553  T foo() { T a; return a; }
1554  template&lt;typename T&gt;
1555  void bar() {
1556    foo&lt;T&gt;();
1557  }
1558unresolvedLookupExpr()
1559  matches foo&lt;T&gt;() </pre></td></tr>
1560
1561
1562<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedMemberExpr0')"><a name="unresolvedMemberExpr0Anchor">unresolvedMemberExpr</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedMemberExpr.html">UnresolvedMemberExpr</a>&gt;...</td></tr>
1563<tr><td colspan="4" class="doc" id="unresolvedMemberExpr0"><pre>Matches unresolved member expressions.
1564
1565Given
1566  struct X {
1567    template &lt;class T&gt; void f();
1568    void g();
1569  };
1570  template &lt;class T&gt; void h() { X x; x.f&lt;T&gt;(); x.g(); }
1571unresolvedMemberExpr()
1572  matches x.f&lt;T&gt;
1573</pre></td></tr>
1574
1575
1576<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('userDefinedLiteral0')"><a name="userDefinedLiteral0Anchor">userDefinedLiteral</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
1577<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1578
1579Example match: "foo"_suffix
1580</pre></td></tr>
1581
1582
1583<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('whileStmt0')"><a name="whileStmt0Anchor">whileStmt</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
1584<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1585
1586Given
1587  while (true) {}
1588whileStmt()
1589  matches 'while (true) {}'.
1590</pre></td></tr>
1591
1592
1593<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;</td><td class="name" onclick="toggle('templateArgument0')"><a name="templateArgument0Anchor">templateArgument</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
1594<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1595
1596Given
1597  template &lt;typename T&gt; struct C {};
1598  C&lt;int&gt; c;
1599templateArgument()
1600  matches 'int' in C&lt;int&gt;.
1601</pre></td></tr>
1602
1603
1604<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;</td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>&gt;...</td></tr>
1605<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
1606
1607Given
1608  template &lt;typename T&gt; class X { };
1609  X&lt;int&gt; xi;
1610templateName()
1611  matches 'X' in X&lt;int&gt;.
1612</pre></td></tr>
1613
1614
1615<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
1616<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1617</pre></td></tr>
1618
1619
1620<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('arrayType0')"><a name="arrayType0Anchor">arrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
1621<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1622
1623Given
1624  int a[] = { 2, 3 };
1625  int b[4];
1626  void f() { int c[a[0]]; }
1627arrayType()
1628  matches "int a[]", "int b[4]" and "int c[a[0]]";
1629</pre></td></tr>
1630
1631
1632<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('atomicType0')"><a name="atomicType0Anchor">atomicType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
1633<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1634
1635Given
1636  _Atomic(int) i;
1637atomicType()
1638  matches "_Atomic(int) i"
1639</pre></td></tr>
1640
1641
1642<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('autoType0')"><a name="autoType0Anchor">autoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
1643<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1644
1645Given:
1646  auto n = 4;
1647  int v[] = { 2, 3 }
1648  for (auto i : v) { }
1649autoType()
1650  matches "auto n" and "auto i"
1651</pre></td></tr>
1652
1653
1654<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('blockPointerType0')"><a name="blockPointerType0Anchor">blockPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
1655<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1656"void (^)(int)".
1657
1658The pointee is always required to be a FunctionType.
1659</pre></td></tr>
1660
1661
1662<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('builtinType0')"><a name="builtinType0Anchor">builtinType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
1663<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1664
1665Given
1666  struct A {};
1667  A a;
1668  int b;
1669  float c;
1670  bool d;
1671builtinType()
1672  matches "int b", "float c" and "bool d"
1673</pre></td></tr>
1674
1675
1676<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('complexType0')"><a name="complexType0Anchor">complexType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
1677<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1678
1679Given
1680  _Complex float f;
1681complexType()
1682  matches "_Complex float f"
1683</pre></td></tr>
1684
1685
1686<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('constantArrayType0')"><a name="constantArrayType0Anchor">constantArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
1687<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1688
1689Given
1690  void() {
1691    int a[2];
1692    int b[] = { 2, 3 };
1693    int c[b[0]];
1694  }
1695constantArrayType()
1696  matches "int a[2]"
1697</pre></td></tr>
1698
1699
1700<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
1701<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1702Example matches i[] in declaration of f.
1703    (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1704Example matches i[1].
1705    (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1706  void f(int i[]) {
1707    i[1] = 0;
1708  }
1709</pre></td></tr>
1710
1711
1712<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decltypeType0')"><a name="decltypeType0Anchor">decltypeType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;...</td></tr>
1713<tr><td colspan="4" class="doc" id="decltypeType0"><pre>Matches types nodes representing C++11 decltype(&lt;expr&gt;) types.
1714
1715Given:
1716  short i = 1;
1717  int j = 42;
1718  decltype(i + j) result = i + j;
1719decltypeType()
1720  matches "decltype(i + j)"
1721</pre></td></tr>
1722
1723
1724<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentSizedArrayType0')"><a name="dependentSizedArrayType0Anchor">dependentSizedArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
1725<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1726
1727Given
1728  template&lt;typename T, int Size&gt;
1729  class array {
1730    T data[Size];
1731  };
1732dependentSizedArrayType
1733  matches "T data[Size]"
1734</pre></td></tr>
1735
1736
1737<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('elaboratedType0')"><a name="elaboratedType0Anchor">elaboratedType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
1738<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1739qualified name.
1740
1741Given
1742  namespace N {
1743    namespace M {
1744      class D {};
1745    }
1746  }
1747  class C {};
1748
1749  class C c;
1750  N::M::D d;
1751
1752elaboratedType() matches the type of the variable declarations of both
1753c and d.
1754</pre></td></tr>
1755
1756
1757<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('enumType0')"><a name="enumType0Anchor">enumType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;...</td></tr>
1758<tr><td colspan="4" class="doc" id="enumType0"><pre>Matches enum types.
1759
1760Given
1761  enum C { Green };
1762  enum class S { Red };
1763
1764  C c;
1765  S s;
1766
1767enumType() matches the type of the variable declarations of both c and
1768s.
1769</pre></td></tr>
1770
1771
1772<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1773<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1774
1775Given
1776  int (*f)(int);
1777  void g();
1778functionProtoType()
1779  matches "int (*f)(int)" and the type of "g" in C++ mode.
1780  In C mode, "g" is not matched because it does not contain a prototype.
1781</pre></td></tr>
1782
1783
1784<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionType0')"><a name="functionType0Anchor">functionType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
1785<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1786
1787Given
1788  int (*f)(int);
1789  void g();
1790functionType()
1791  matches "int (*f)(int)" and the type of "g".
1792</pre></td></tr>
1793
1794
1795<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('incompleteArrayType0')"><a name="incompleteArrayType0Anchor">incompleteArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
1796<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1797
1798Given
1799  int a[] = { 2, 3 };
1800  int b[42];
1801  void f(int c[]) { int d[a[0]]; };
1802incompleteArrayType()
1803  matches "int a[]" and "int c[]"
1804</pre></td></tr>
1805
1806
1807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('injectedClassNameType0')"><a name="injectedClassNameType0Anchor">injectedClassNameType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;...</td></tr>
1808<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1809
1810Example matches S s, but not S&lt;T&gt; s.
1811    (matcher = parmVarDecl(hasType(injectedClassNameType())))
1812  template &lt;typename T&gt; struct S {
1813    void f(S s);
1814    void g(S&lt;T&gt; s);
1815  };
1816</pre></td></tr>
1817
1818
1819<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('lValueReferenceType0')"><a name="lValueReferenceType0Anchor">lValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
1820<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1821
1822Given:
1823  int *a;
1824  int &amp;b = *a;
1825  int &amp;&amp;c = 1;
1826  auto &amp;d = b;
1827  auto &amp;&amp;e = c;
1828  auto &amp;&amp;f = 2;
1829  int g = 5;
1830
1831lValueReferenceType() matches the types of b, d, and e. e is
1832matched since the type is deduced as int&amp; by reference collapsing rules.
1833</pre></td></tr>
1834
1835
1836<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('memberPointerType0')"><a name="memberPointerType0Anchor">memberPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
1837<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1838Given
1839  struct A { int i; }
1840  A::* ptr = A::i;
1841memberPointerType()
1842  matches "A::* ptr"
1843</pre></td></tr>
1844
1845
1846<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('objcObjectPointerType0')"><a name="objcObjectPointerType0Anchor">objcObjectPointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCObjectPointerType.html">ObjCObjectPointerType</a>&gt;...</td></tr>
1847<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1848a pointer type, despite being syntactically similar.
1849
1850Given
1851  int *a;
1852
1853  @interface Foo
1854  @end
1855  Foo *f;
1856pointerType()
1857  matches "Foo *f", but does not match "int *a".
1858</pre></td></tr>
1859
1860
1861<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
1862<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1863
1864Given
1865  int (*ptr_to_array)[4];
1866  int *array_of_ptrs[4];
1867
1868varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1869array_of_ptrs.
1870</pre></td></tr>
1871
1872
1873<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
1874<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1875types.
1876
1877Given
1878  int *a;
1879  int &amp;b = *a;
1880  int c = 5;
1881
1882  @interface Foo
1883  @end
1884  Foo *f;
1885pointerType()
1886  matches "int *a", but does not match "Foo *f".
1887</pre></td></tr>
1888
1889
1890<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('rValueReferenceType0')"><a name="rValueReferenceType0Anchor">rValueReferenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
1891<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1892
1893Given:
1894  int *a;
1895  int &amp;b = *a;
1896  int &amp;&amp;c = 1;
1897  auto &amp;d = b;
1898  auto &amp;&amp;e = c;
1899  auto &amp;&amp;f = 2;
1900  int g = 5;
1901
1902rValueReferenceType() matches the types of c and f. e is not
1903matched as it is deduced to int&amp; by reference collapsing rules.
1904</pre></td></tr>
1905
1906
1907<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('recordType0')"><a name="recordType0Anchor">recordType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
1908<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1909
1910Given
1911  class C {};
1912  struct S {};
1913
1914  C c;
1915  S s;
1916
1917recordType() matches the type of the variable declarations of both c
1918and s.
1919</pre></td></tr>
1920
1921
1922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('referenceType0')"><a name="referenceType0Anchor">referenceType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
1923<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1924
1925Given
1926  int *a;
1927  int &amp;b = *a;
1928  int &amp;&amp;c = 1;
1929  auto &amp;d = b;
1930  auto &amp;&amp;e = c;
1931  auto &amp;&amp;f = 2;
1932  int g = 5;
1933
1934referenceType() matches the types of b, c, d, e, and f.
1935</pre></td></tr>
1936
1937
1938<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('substTemplateTypeParmType0')"><a name="substTemplateTypeParmType0Anchor">substTemplateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html">SubstTemplateTypeParmType</a>&gt;...</td></tr>
1939<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1940template type parameter.
1941
1942Given
1943  template &lt;typename T&gt;
1944  void F(T t) {
1945    int i = 1 + t;
1946  }
1947
1948substTemplateTypeParmType() matches the type of 't' but not '1'
1949</pre></td></tr>
1950
1951
1952<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('tagType0')"><a name="tagType0Anchor">tagType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;...</td></tr>
1953<tr><td colspan="4" class="doc" id="tagType0"><pre>Matches tag types (record and enum types).
1954
1955Given
1956  enum E {};
1957  class C {};
1958
1959  E e;
1960  C c;
1961
1962tagType() matches the type of the variable declarations of both e
1963and c.
1964</pre></td></tr>
1965
1966
1967<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateSpecializationType0')"><a name="templateSpecializationType0Anchor">templateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
1968<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1969
1970Given
1971  template &lt;typename T&gt;
1972  class C { };
1973
1974  template class C&lt;int&gt;;  // A
1975  C&lt;char&gt; var;            // B
1976
1977templateSpecializationType() matches the type of the explicit
1978instantiation in A and the type of the variable declaration in B.
1979</pre></td></tr>
1980
1981
1982<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmType0')"><a name="templateTypeParmType0Anchor">templateTypeParmType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;...</td></tr>
1983<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1984
1985Example matches T, but not int.
1986    (matcher = templateTypeParmType())
1987  template &lt;typename T&gt; void f(int i);
1988</pre></td></tr>
1989
1990
1991<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('type0')"><a name="type0Anchor">type</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
1992<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1993</pre></td></tr>
1994
1995
1996<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('typedefType0')"><a name="typedefType0Anchor">typedefType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
1997<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1998
1999Given
2000  typedef int X;
2001typedefType()
2002  matches "typedef int X"
2003</pre></td></tr>
2004
2005
2006<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('unaryTransformType0')"><a name="unaryTransformType0Anchor">unaryTransformType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
2007<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
2008
2009Given:
2010  typedef __underlying_type(T) type;
2011unaryTransformType()
2012  matches "__underlying_type(T)"
2013</pre></td></tr>
2014
2015
2016<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('variableArrayType0')"><a name="variableArrayType0Anchor">variableArrayType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
2017<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
2018integer-constant-expression.
2019
2020Given
2021  void f() {
2022    int a[] = { 2, 3 }
2023    int b[42];
2024    int c[a[0]];
2025  }
2026variableArrayType()
2027  matches "int c[a[0]]"
2028</pre></td></tr>
2029
2030<!--END_DECL_MATCHERS -->
2031</table>
2032
2033<!-- ======================================================================= -->
2034<h2 id="narrowing-matchers">Narrowing Matchers</h2>
2035<!-- ======================================================================= -->
2036
2037<p>Narrowing matchers match certain attributes on the current node, thus
2038narrowing down the set of nodes of the current type to match on.</p>
2039
2040<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
2041which allow users to create more powerful match expressions.</p>
2042
2043<table>
2044<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2045<!-- START_NARROWING_MATCHERS -->
2046
2047<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('allOf0')"><a name="allOf0Anchor">allOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2048<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
2049
2050Usable as: Any Matcher
2051</pre></td></tr>
2052
2053
2054<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anyOf0')"><a name="anyOf0Anchor">anyOf</a></td><td>Matcher&lt;*&gt;, ..., Matcher&lt;*&gt;</td></tr>
2055<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
2056
2057Usable as: Any Matcher
2058</pre></td></tr>
2059
2060
2061<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
2062<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
2063
2064Useful when another matcher requires a child matcher, but there's no
2065additional constraint. This will often be used with an explicit conversion
2066to an internal::Matcher&lt;&gt; type such as TypeMatcher.
2067
2068Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
2069"int* p" and "void f()" in
2070  int* p;
2071  void f();
2072
2073Usable as: Any Matcher
2074</pre></td></tr>
2075
2076
2077<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
2078<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
2079
2080Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
2081  class X {};
2082  class Y {};
2083
2084Usable as: Any Matcher
2085</pre></td></tr>
2086
2087
2088<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasOperatorName0')"><a name="hasOperatorName0Anchor">hasOperatorName</a></td><td>std::string Name</td></tr>
2089<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
2090unary).
2091
2092Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2093  !(a || b)
2094</pre></td></tr>
2095
2096
2097<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td><td></td></tr>
2098<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators.
2099
2100Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2101  if (a == b)
2102    a += b;
2103
2104Example 2: matches s1 = s2
2105           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2106  struct S { S&amp; operator=(const S&amp;); };
2107  void x() { S s1, s2; s1 = s2; })
2108</pre></td></tr>
2109
2110
2111<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr>
2112<tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr>
2113
2114
2115<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2116<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value of type ValueT.
2117
2118Given
2119  f('false, 3.14, 42);
2120characterLiteral(equals(0))
2121  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2122  match false
2123floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2124  match 3.14
2125integerLiteral(equals(42))
2126  matches 42
2127
2128Note that you cannot directly match a negative numeric literal because the
2129minus sign is not part of the literal: It is a unary operator whose operand
2130is the positive numeric literal. Instead, you must use a unaryOperator()
2131matcher to match the minus sign:
2132
2133unaryOperator(hasOperatorName("-"),
2134              hasUnaryOperand(integerLiteral(equals(13))))
2135
2136Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2137           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2138</pre></td></tr>
2139
2140
2141<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals11')"><a name="equals11Anchor">equals</a></td><td>double Value</td></tr>
2142<tr><td colspan="4" class="doc" id="equals11"><pre></pre></td></tr>
2143
2144
2145<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;</td><td class="name" onclick="toggle('equals8')"><a name="equals8Anchor">equals</a></td><td>unsigned Value</td></tr>
2146<tr><td colspan="4" class="doc" id="equals8"><pre></pre></td></tr>
2147
2148
2149<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;</td><td class="name" onclick="toggle('isCatchAll0')"><a name="isCatchAll0Anchor">isCatchAll</a></td><td></td></tr>
2150<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
2151
2152Given
2153  try {
2154    // ...
2155  } catch (int) {
2156    // ...
2157  } catch (...) {
2158    // ...
2159  }
2160cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
2161</pre></td></tr>
2162
2163
2164<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs1')"><a name="argumentCountIs1Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2165<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
2166a specific number of arguments (including absent default arguments).
2167
2168Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2169  void f(int x, int y);
2170  f(0, 0);
2171</pre></td></tr>
2172
2173
2174<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('isListInitialization0')"><a name="isListInitialization0Anchor">isListInitialization</a></td><td></td></tr>
2175<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
2176</pre></td></tr>
2177
2178
2179<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('requiresZeroInitialization0')"><a name="requiresZeroInitialization0Anchor">requiresZeroInitialization</a></td><td></td></tr>
2180<tr><td colspan="4" class="doc" id="requiresZeroInitialization0"><pre>Matches a constructor call expression which requires
2181zero initialization.
2182
2183Given
2184void foo() {
2185  struct point { double x; double y; };
2186  point pt[2] = { { 1.0, 2.0 } };
2187}
2188initListExpr(has(cxxConstructExpr(requiresZeroInitialization()))
2189will match the implicit array filler for pt[1].
2190</pre></td></tr>
2191
2192
2193<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyConstructor0')"><a name="isCopyConstructor0Anchor">isCopyConstructor</a></td><td></td></tr>
2194<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
2195
2196Given
2197  struct S {
2198    S(); // #1
2199    S(const S &amp;); // #2
2200    S(S &amp;&amp;); // #3
2201  };
2202cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
2203</pre></td></tr>
2204
2205
2206<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaultConstructor0')"><a name="isDefaultConstructor0Anchor">isDefaultConstructor</a></td><td></td></tr>
2207<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
2208
2209Given
2210  struct S {
2211    S(); // #1
2212    S(const S &amp;); // #2
2213    S(S &amp;&amp;); // #3
2214  };
2215cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
2216</pre></td></tr>
2217
2218
2219<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isDelegatingConstructor0')"><a name="isDelegatingConstructor0Anchor">isDelegatingConstructor</a></td><td></td></tr>
2220<tr><td colspan="4" class="doc" id="isDelegatingConstructor0"><pre>Matches constructors that delegate to another constructor.
2221
2222Given
2223  struct S {
2224    S(); // #1
2225    S(int) {} // #2
2226    S(S &amp;&amp;) : S() {} // #3
2227  };
2228  S::S() : S(0) {} // #4
2229cxxConstructorDecl(isDelegatingConstructor()) will match #3 and #4, but not
2230#1 or #2.
2231</pre></td></tr>
2232
2233
2234<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit0')"><a name="isExplicit0Anchor">isExplicit</a></td><td></td></tr>
2235<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor, conversion function, and deduction guide declarations
2236that have an explicit specifier if this explicit specifier is resolved to
2237true.
2238
2239Given
2240  template&lt;bool b&gt;
2241  struct S {
2242    S(int); // #1
2243    explicit S(double); // #2
2244    operator int(); // #3
2245    explicit operator bool(); // #4
2246    explicit(false) S(bool) // # 7
2247    explicit(true) S(char) // # 8
2248    explicit(b) S(S) // # 9
2249  };
2250  S(int) -&gt; S&lt;true&gt; // #5
2251  explicit S(double) -&gt; S&lt;false&gt; // #6
2252cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2253cxxConversionDecl(isExplicit()) will match #4, but not #3.
2254cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2255</pre></td></tr>
2256
2257
2258<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveConstructor0')"><a name="isMoveConstructor0Anchor">isMoveConstructor</a></td><td></td></tr>
2259<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
2260
2261Given
2262  struct S {
2263    S(); // #1
2264    S(const S &amp;); // #2
2265    S(S &amp;&amp;); // #3
2266  };
2267cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
2268</pre></td></tr>
2269
2270
2271<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit1')"><a name="isExplicit1Anchor">isExplicit</a></td><td></td></tr>
2272<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor, conversion function, and deduction guide declarations
2273that have an explicit specifier if this explicit specifier is resolved to
2274true.
2275
2276Given
2277  template&lt;bool b&gt;
2278  struct S {
2279    S(int); // #1
2280    explicit S(double); // #2
2281    operator int(); // #3
2282    explicit operator bool(); // #4
2283    explicit(false) S(bool) // # 7
2284    explicit(true) S(char) // # 8
2285    explicit(b) S(S) // # 9
2286  };
2287  S(int) -&gt; S&lt;true&gt; // #5
2288  explicit S(double) -&gt; S&lt;false&gt; // #6
2289cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2290cxxConversionDecl(isExplicit()) will match #4, but not #3.
2291cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2292</pre></td></tr>
2293
2294
2295<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isBaseInitializer0')"><a name="isBaseInitializer0Anchor">isBaseInitializer</a></td><td></td></tr>
2296<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
2297opposed to a member.
2298
2299Given
2300  struct B {};
2301  struct D : B {
2302    int I;
2303    D(int i) : I(i) {}
2304  };
2305  struct E : B {
2306    E() : B() {}
2307  };
2308cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
2309  will match E(), but not match D(int).
2310</pre></td></tr>
2311
2312
2313<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isMemberInitializer0')"><a name="isMemberInitializer0Anchor">isMemberInitializer</a></td><td></td></tr>
2314<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
2315opposed to a base.
2316
2317Given
2318  struct B {};
2319  struct D : B {
2320    int I;
2321    D(int i) : I(i) {}
2322  };
2323  struct E : B {
2324    E() : B() {}
2325  };
2326cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
2327  will match D(int), but not match E().
2328</pre></td></tr>
2329
2330
2331<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('isWritten0')"><a name="isWritten0Anchor">isWritten</a></td><td></td></tr>
2332<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
2333code (as opposed to implicitly added by the compiler).
2334
2335Given
2336  struct Foo {
2337    Foo() { }
2338    Foo(int) : foo_("A") { }
2339    string foo_;
2340  };
2341cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
2342  will match Foo(int), but not Foo()
2343</pre></td></tr>
2344
2345
2346<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDeductionGuideDecl.html">CXXDeductionGuideDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicit2')"><a name="isExplicit2Anchor">isExplicit</a></td><td></td></tr>
2347<tr><td colspan="4" class="doc" id="isExplicit2"><pre>Matches constructor, conversion function, and deduction guide declarations
2348that have an explicit specifier if this explicit specifier is resolved to
2349true.
2350
2351Given
2352  template&lt;bool b&gt;
2353  struct S {
2354    S(int); // #1
2355    explicit S(double); // #2
2356    operator int(); // #3
2357    explicit operator bool(); // #4
2358    explicit(false) S(bool) // # 7
2359    explicit(true) S(char) // # 8
2360    explicit(b) S(S) // # 9
2361  };
2362  S(int) -&gt; S&lt;true&gt; // #5
2363  explicit S(double) -&gt; S&lt;false&gt; // #6
2364cxxConstructorDecl(isExplicit()) will match #2 and #8, but not #1, #7 or #9.
2365cxxConversionDecl(isExplicit()) will match #4, but not #3.
2366cxxDeductionGuideDecl(isExplicit()) will match #6, but not #5.
2367</pre></td></tr>
2368
2369
2370<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('isArrow2')"><a name="isArrow2Anchor">isArrow</a></td><td></td></tr>
2371<tr><td colspan="4" class="doc" id="isArrow2"><pre>Matches member expressions that are called with '-&gt;' as opposed
2372to '.'.
2373
2374Member calls on the implicit this pointer match as called with '-&gt;'.
2375
2376Given
2377  class Y {
2378    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2379    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
2380    int a;
2381    static int b;
2382  };
2383  template &lt;class T&gt;
2384  class Z {
2385    void x() { this-&gt;m; }
2386  };
2387memberExpr(isArrow())
2388  matches this-&gt;x, x, y.x, a, this-&gt;b
2389cxxDependentScopeMemberExpr(isArrow())
2390  matches this-&gt;m
2391unresolvedMemberExpr(isArrow())
2392  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
2393</pre></td></tr>
2394
2395
2396<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isConst0')"><a name="isConst0Anchor">isConst</a></td><td></td></tr>
2397<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
2398
2399Given
2400struct A {
2401  void foo() const;
2402  void bar();
2403};
2404
2405cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
2406</pre></td></tr>
2407
2408
2409<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
2410<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
2411operator.
2412
2413Given
2414struct A {
2415  A &amp;operator=(const A &amp;);
2416  A &amp;operator=(A &amp;&amp;);
2417};
2418
2419cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
2420the second one.
2421</pre></td></tr>
2422
2423
2424<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal1')"><a name="isFinal1Anchor">isFinal</a></td><td></td></tr>
2425<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
2426
2427Given:
2428  class A final {};
2429
2430  struct B {
2431    virtual void f();
2432  };
2433
2434  struct C : B {
2435    void f() final;
2436  };
2437matches A and C::f, but not B, C, or B::f
2438</pre></td></tr>
2439
2440
2441<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
2442<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
2443operator.
2444
2445Given
2446struct A {
2447  A &amp;operator=(const A &amp;);
2448  A &amp;operator=(A &amp;&amp;);
2449};
2450
2451cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
2452the first one.
2453</pre></td></tr>
2454
2455
2456<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isOverride0')"><a name="isOverride0Anchor">isOverride</a></td><td></td></tr>
2457<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
2458
2459Given
2460  class A {
2461   public:
2462    virtual void x();
2463  };
2464  class B : public A {
2465   public:
2466    virtual void x();
2467  };
2468  matches B::x
2469</pre></td></tr>
2470
2471
2472<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isPure0')"><a name="isPure0Anchor">isPure</a></td><td></td></tr>
2473<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
2474
2475Given
2476  class A {
2477   public:
2478    virtual void x() = 0;
2479  };
2480  matches A::x
2481</pre></td></tr>
2482
2483
2484<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isUserProvided0')"><a name="isUserProvided0Anchor">isUserProvided</a></td><td></td></tr>
2485<tr><td colspan="4" class="doc" id="isUserProvided0"><pre>Matches method declarations that are user-provided.
2486
2487Given
2488  struct S {
2489    S(); // #1
2490    S(const S &amp;) = default; // #2
2491    S(S &amp;&amp;) = delete; // #3
2492  };
2493cxxConstructorDecl(isUserProvided()) will match #1, but not #2 or #3.
2494</pre></td></tr>
2495
2496
2497<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtual0')"><a name="isVirtual0Anchor">isVirtual</a></td><td></td></tr>
2498<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
2499
2500Given
2501  class A {
2502   public:
2503    virtual void x();
2504  };
2505  matches A::x
2506</pre></td></tr>
2507
2508
2509<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
2510<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
2511
2512Given
2513  class A {
2514   public:
2515    virtual void x();
2516  };
2517  class B : public A {
2518   public:
2519    void x();
2520  };
2521  matches A::x but not B::x
2522</pre></td></tr>
2523
2524
2525<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('isArray0')"><a name="isArray0Anchor">isArray</a></td><td></td></tr>
2526<tr><td colspan="4" class="doc" id="isArray0"><pre>Matches array new expressions.
2527
2528Given:
2529  MyClass *p1 = new MyClass[10];
2530cxxNewExpr(isArray())
2531  matches the expression 'new MyClass[10]'.
2532</pre></td></tr>
2533
2534
2535<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('hasOverloadedOperatorName1')"><a name="hasOverloadedOperatorName1Anchor">hasOverloadedOperatorName</a></td><td>StringRef Name</td></tr>
2536<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
2537
2538Matches overloaded operator names specified in strings without the
2539"operator" prefix: e.g. "&lt;&lt;".
2540
2541Given:
2542  class A { int operator*(); };
2543  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2544  A a;
2545  a &lt;&lt; a;   // &lt;-- This matches
2546
2547cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2548specified line and
2549cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2550matches the declaration of A.
2551
2552Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2553</pre></td></tr>
2554
2555
2556<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;</td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td><td></td></tr>
2557<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators.
2558
2559Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator()))
2560  if (a == b)
2561    a += b;
2562
2563Example 2: matches s1 = s2
2564           (matcher = cxxOperatorCallExpr(isAssignmentOperator()))
2565  struct S { S&amp; operator=(const S&amp;); };
2566  void x() { S s1, s2; s1 = s2; })
2567</pre></td></tr>
2568
2569
2570<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr>
2571<tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined.
2572
2573Example matches x (matcher = cxxRecordDecl(hasDefinition()))
2574class x {};
2575class y;
2576</pre></td></tr>
2577
2578
2579<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom2')"><a name="isDerivedFrom2Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
2580<tr><td colspan="4" class="doc" id="isDerivedFrom2"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
2581</pre></td></tr>
2582
2583
2584<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDirectlyDerivedFrom2')"><a name="isDirectlyDerivedFrom2Anchor">isDirectlyDerivedFrom</a></td><td>std::string BaseName</td></tr>
2585<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom2"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
2586</pre></td></tr>
2587
2588
2589<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isExplicitTemplateSpecialization2')"><a name="isExplicitTemplateSpecialization2Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
2590<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
2591static member variable template instantiations.
2592
2593Given
2594  template&lt;typename T&gt; void A(T t) { }
2595  template&lt;&gt; void A(int N) { }
2596functionDecl(isExplicitTemplateSpecialization())
2597  matches the specialization A&lt;int&gt;().
2598
2599Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2600</pre></td></tr>
2601
2602
2603<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isFinal0')"><a name="isFinal0Anchor">isFinal</a></td><td></td></tr>
2604<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
2605
2606Given:
2607  class A final {};
2608
2609  struct B {
2610    virtual void f();
2611  };
2612
2613  struct C : B {
2614    void f() final;
2615  };
2616matches A and C::f, but not B, C, or B::f
2617</pre></td></tr>
2618
2619
2620<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isLambda0')"><a name="isLambda0Anchor">isLambda</a></td><td></td></tr>
2621<tr><td colspan="4" class="doc" id="isLambda0"><pre>Matches the generated class of lambda expressions.
2622
2623Given:
2624  auto x = []{};
2625
2626cxxRecordDecl(isLambda()) matches the implicit class declaration of
2627decltype(x)
2628</pre></td></tr>
2629
2630
2631<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom2')"><a name="isSameOrDerivedFrom2Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
2632<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom2"><pre>Overloaded method as shortcut for
2633isSameOrDerivedFrom(hasName(...)).
2634</pre></td></tr>
2635
2636
2637<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation2')"><a name="isTemplateInstantiation2Anchor">isTemplateInstantiation</a></td><td></td></tr>
2638<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
2639member variable template instantiations.
2640
2641Given
2642  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2643or
2644  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2645or
2646  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
2647cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2648  matches the template instantiation of X&lt;A&gt;.
2649
2650But given
2651  template &lt;typename T&gt;  class X {}; class A {};
2652  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2653cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2654  does not match, as X&lt;A&gt; is an explicit template specialization.
2655
2656Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2657</pre></td></tr>
2658
2659
2660<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs0')"><a name="argumentCountIs0Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
2661<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
2662a specific number of arguments (including absent default arguments).
2663
2664Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2665  void f(int x, int y);
2666  f(0, 0);
2667</pre></td></tr>
2668
2669
2670<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('usesADL0')"><a name="usesADL0Anchor">usesADL</a></td><td></td></tr>
2671<tr><td colspan="4" class="doc" id="usesADL0"><pre>Matches call expressions which were resolved using ADL.
2672
2673Example matches y(x) but not y(42) or NS::y(x).
2674  namespace NS {
2675    struct X {};
2676    void y(X);
2677  }
2678
2679  void y(...);
2680
2681  void test() {
2682    NS::X x;
2683    y(x); // Matches
2684    NS::y(x); // Doesn't match
2685    y(42); // Doesn't match
2686    using NS::y;
2687    y(x); // Found by both unqualified lookup and ADL, doesn't match
2688   }
2689</pre></td></tr>
2690
2691
2692<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;</td><td class="name" onclick="toggle('hasCastKind0')"><a name="hasCastKind0Anchor">hasCastKind</a></td><td>CastKind Kind</td></tr>
2693<tr><td colspan="4" class="doc" id="hasCastKind0"><pre>Matches casts that has a given cast kind.
2694
2695Example: matches the implicit cast around 0
2696(matcher = castExpr(hasCastKind(CK_NullToPointer)))
2697  int *p = 0;
2698
2699If the matcher is use from clang-query, CastKind parameter
2700should be passed as a quoted string. e.g., ofKind("CK_NullToPointer").
2701</pre></td></tr>
2702
2703
2704<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals4')"><a name="equals4Anchor">equals</a></td><td>bool Value</td></tr>
2705<tr><td colspan="4" class="doc" id="equals4"><pre></pre></td></tr>
2706
2707
2708<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals3')"><a name="equals3Anchor">equals</a></td><td>const ValueT  Value</td></tr>
2709<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value of type ValueT.
2710
2711Given
2712  f('false, 3.14, 42);
2713characterLiteral(equals(0))
2714  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
2715  match false
2716floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
2717  match 3.14
2718integerLiteral(equals(42))
2719  matches 42
2720
2721Note that you cannot directly match a negative numeric literal because the
2722minus sign is not part of the literal: It is a unary operator whose operand
2723is the positive numeric literal. Instead, you must use a unaryOperator()
2724matcher to match the minus sign:
2725
2726unaryOperator(hasOperatorName("-"),
2727              hasUnaryOperand(integerLiteral(equals(13))))
2728
2729Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;,
2730           Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2731</pre></td></tr>
2732
2733
2734<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals10')"><a name="equals10Anchor">equals</a></td><td>double Value</td></tr>
2735<tr><td colspan="4" class="doc" id="equals10"><pre></pre></td></tr>
2736
2737
2738<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;</td><td class="name" onclick="toggle('equals7')"><a name="equals7Anchor">equals</a></td><td>unsigned Value</td></tr>
2739<tr><td colspan="4" class="doc" id="equals7"><pre></pre></td></tr>
2740
2741
2742<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;</td><td class="name" onclick="toggle('templateArgumentCountIs0')"><a name="templateArgumentCountIs0Anchor">templateArgumentCountIs</a></td><td>unsigned N</td></tr>
2743<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2744
2745Given
2746  template&lt;typename T&gt; struct C {};
2747  C&lt;int&gt; c;
2748classTemplateSpecializationDecl(templateArgumentCountIs(1))
2749  matches C&lt;int&gt;.
2750</pre></td></tr>
2751
2752
2753<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;</td><td class="name" onclick="toggle('statementCountIs0')"><a name="statementCountIs0Anchor">statementCountIs</a></td><td>unsigned N</td></tr>
2754<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2755child statements.
2756
2757Example: Given
2758  { for (;;) {} }
2759compoundStmt(statementCountIs(0)))
2760  matches '{}'
2761  but does not match the outer compound statement.
2762</pre></td></tr>
2763
2764
2765<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;</td><td class="name" onclick="toggle('hasSize0')"><a name="hasSize0Anchor">hasSize</a></td><td>unsigned N</td></tr>
2766<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches nodes that have the specified size.
2767
2768Given
2769  int a[42];
2770  int b[2 * 21];
2771  int c[41], d[43];
2772  char *s = "abcd";
2773  wchar_t *ws = L"abcd";
2774  char *w = "a";
2775constantArrayType(hasSize(42))
2776  matches "int a[42]" and "int b[2 * 21]"
2777stringLiteral(hasSize(4))
2778  matches "abcd", L"abcd"
2779</pre></td></tr>
2780
2781
2782<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;</td><td class="name" onclick="toggle('declCountIs0')"><a name="declCountIs0Anchor">declCountIs</a></td><td>unsigned N</td></tr>
2783<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2784declarations.
2785
2786Example: Given
2787  int a, b;
2788  int c;
2789  int d = 2, e;
2790declCountIs(2)
2791  matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2792</pre></td></tr>
2793
2794
2795<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode1')"><a name="equalsBoundNode1Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
2796<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2797
2798Matches a node if it equals the node previously bound to ID.
2799
2800Given
2801  class X { int a; int b; };
2802cxxRecordDecl(
2803    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2804    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2805  matches the class X, as a and b have the same type.
2806
2807Note that when multiple matches are involved via forEach* matchers,
2808equalsBoundNodes acts as a filter.
2809For example:
2810compoundStmt(
2811    forEachDescendant(varDecl().bind("d")),
2812    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2813will trigger a match for each combination of variable declaration
2814and reference to that variable declaration within a compound statement.
2815</pre></td></tr>
2816
2817
2818<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('equalsNode0')"><a name="equalsNode0Anchor">equalsNode</a></td><td>const Decl* Other</td></tr>
2819<tr><td colspan="4" class="doc" id="equalsNode0"><pre>Matches if a node equals another node.
2820
2821Decl has pointer identity in the AST.
2822</pre></td></tr>
2823
2824
2825<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('hasAttr0')"><a name="hasAttr0Anchor">hasAttr</a></td><td>attr::Kind AttrKind</td></tr>
2826<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2827
2828Given
2829  __attribute__((device)) void f() { ... }
2830decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2831f. If the matcher is used from clang-query, attr::Kind parameter should be
2832passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2833</pre></td></tr>
2834
2835
2836<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching0')"><a name="isExpansionInFileMatching0Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
2837<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2838partially matching a given regex.
2839
2840Example matches Y but not X
2841    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2842  #include "ASTMatcher.h"
2843  class X {};
2844ASTMatcher.h:
2845  class Y {};
2846
2847Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2848</pre></td></tr>
2849
2850
2851<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInMainFile0')"><a name="isExpansionInMainFile0Anchor">isExpansionInMainFile</a></td><td></td></tr>
2852<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2853
2854Example matches X but not Y
2855  (matcher = cxxRecordDecl(isExpansionInMainFile())
2856  #include &lt;Y.h&gt;
2857  class X {};
2858Y.h:
2859  class Y {};
2860
2861Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2862</pre></td></tr>
2863
2864
2865<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isExpansionInSystemHeader0')"><a name="isExpansionInSystemHeader0Anchor">isExpansionInSystemHeader</a></td><td></td></tr>
2866<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2867
2868Example matches Y but not X
2869    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2870  #include &lt;SystemHeader.h&gt;
2871  class X {};
2872SystemHeader.h:
2873  class Y {};
2874
2875Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2876</pre></td></tr>
2877
2878
2879<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isImplicit0')"><a name="isImplicit0Anchor">isImplicit</a></td><td></td></tr>
2880<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2881by the compiler (eg. implicit default/copy constructors).
2882</pre></td></tr>
2883
2884
2885<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInStdNamespace0')"><a name="isInStdNamespace0Anchor">isInStdNamespace</a></td><td></td></tr>
2886<tr><td colspan="4" class="doc" id="isInStdNamespace0"><pre>Matches declarations in the namespace `std`, but not in nested namespaces.
2887
2888Given
2889  class vector {};
2890  namespace foo {
2891    class vector {};
2892    namespace std {
2893      class vector {};
2894    }
2895  }
2896  namespace std {
2897    inline namespace __1 {
2898      class vector {}; // #1
2899      namespace experimental {
2900        class vector {};
2901      }
2902    }
2903  }
2904cxxRecordDecl(hasName("vector"), isInStdNamespace()) will match only #1.
2905</pre></td></tr>
2906
2907
2908<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
2909<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2910
2911Given
2912  class C {
2913  public:    int a;
2914  protected: int b;
2915  private:   int c;
2916  };
2917fieldDecl(isPrivate())
2918  matches 'int c;'
2919</pre></td></tr>
2920
2921
2922<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isProtected0')"><a name="isProtected0Anchor">isProtected</a></td><td></td></tr>
2923<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2924
2925Given
2926  class C {
2927  public:    int a;
2928  protected: int b;
2929  private:   int c;
2930  };
2931fieldDecl(isProtected())
2932  matches 'int b;'
2933</pre></td></tr>
2934
2935
2936<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPublic0')"><a name="isPublic0Anchor">isPublic</a></td><td></td></tr>
2937<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2938
2939Given
2940  class C {
2941  public:    int a;
2942  protected: int b;
2943  private:   int c;
2944  };
2945fieldDecl(isPublic())
2946  matches 'int a;'
2947</pre></td></tr>
2948
2949
2950<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DesignatedInitExpr.html">DesignatedInitExpr</a>&gt;</td><td class="name" onclick="toggle('designatorCountIs0')"><a name="designatorCountIs0Anchor">designatorCountIs</a></td><td>unsigned N</td></tr>
2951<tr><td colspan="4" class="doc" id="designatorCountIs0"><pre>Matches designated initializer expressions that contain
2952a specific number of designators.
2953
2954Example: Given
2955  point ptarray[10] = { [2].y = 1.0, [0].x = 1.0 };
2956  point ptarray2[10] = { [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 };
2957designatorCountIs(2)
2958  matches '{ [2].y = 1.0, [0].x = 1.0 }',
2959  but not '{ [2].y = 1.0, [2].x = 0.0, [0].x = 1.0 }'.
2960</pre></td></tr>
2961
2962
2963<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;</td><td class="name" onclick="toggle('isScoped0')"><a name="isScoped0Anchor">isScoped</a></td><td></td></tr>
2964<tr><td colspan="4" class="doc" id="isScoped0"><pre>Matches C++11 scoped enum declaration.
2965
2966Example matches Y (matcher = enumDecl(isScoped()))
2967enum X {};
2968enum class Y {};
2969</pre></td></tr>
2970
2971
2972<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isInstantiationDependent0')"><a name="isInstantiationDependent0Anchor">isInstantiationDependent</a></td><td></td></tr>
2973<tr><td colspan="4" class="doc" id="isInstantiationDependent0"><pre>Matches expressions that are instantiation-dependent even if it is
2974neither type- nor value-dependent.
2975
2976In the following example, the expression sizeof(sizeof(T() + T()))
2977is instantiation-dependent (since it involves a template parameter T),
2978but is neither type- nor value-dependent, since the type of the inner
2979sizeof is known (std::size_t) and therefore the size of the outer
2980sizeof is known.
2981  template&lt;typename T&gt;
2982  void f(T x, T y) { sizeof(sizeof(T() + T()); }
2983expr(isInstantiationDependent()) matches sizeof(sizeof(T() + T())
2984</pre></td></tr>
2985
2986
2987<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isTypeDependent0')"><a name="isTypeDependent0Anchor">isTypeDependent</a></td><td></td></tr>
2988<tr><td colspan="4" class="doc" id="isTypeDependent0"><pre>Matches expressions that are type-dependent because the template type
2989is not yet instantiated.
2990
2991For example, the expressions "x" and "x + y" are type-dependent in
2992the following code, but "y" is not type-dependent:
2993  template&lt;typename T&gt;
2994  void add(T x, int y) {
2995    x + y;
2996  }
2997expr(isTypeDependent()) matches x + y
2998</pre></td></tr>
2999
3000
3001<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('isValueDependent0')"><a name="isValueDependent0Anchor">isValueDependent</a></td><td></td></tr>
3002<tr><td colspan="4" class="doc" id="isValueDependent0"><pre>Matches expression that are value-dependent because they contain a
3003non-type template parameter.
3004
3005For example, the array bound of "Chars" in the following example is
3006value-dependent.
3007  template&lt;int Size&gt; int f() { return Size; }
3008expr(isValueDependent()) matches return Size
3009</pre></td></tr>
3010
3011
3012<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3013<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3014GNU's __null, C++11's nullptr, or C's NULL macro.
3015
3016Given:
3017  void *v1 = NULL;
3018  void *v2 = nullptr;
3019  void *v3 = __null; // GNU extension
3020  char *cp = (char *)0;
3021  int *ip = 0;
3022  int i = 0;
3023expr(nullPointerConstant())
3024  matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3025  initializer for i.
3026</pre></td></tr>
3027
3028
3029<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>
3030<tr><td colspan="4" class="doc" id="hasBitWidth0"><pre>Matches non-static data members that are bit-fields of the specified
3031bit width.
3032
3033Given
3034  class C {
3035    int a : 2;
3036    int b : 4;
3037    int c : 2;
3038  };
3039fieldDecl(hasBitWidth(2))
3040  matches 'int a;' and 'int c;' but not 'int b;'.
3041</pre></td></tr>
3042
3043
3044<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>
3045<tr><td colspan="4" class="doc" id="isBitField0"><pre>Matches non-static data members that are bit-fields.
3046
3047Given
3048  class C {
3049    int a : 2;
3050    int b;
3051  };
3052fieldDecl(isBitField())
3053  matches 'int a;' but not 'int b;'.
3054</pre></td></tr>
3055
3056
3057<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>
3058<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value of type ValueT.
3059
3060Given
3061  f('false, 3.14, 42);
3062characterLiteral(equals(0))
3063  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3064  match false
3065floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3066  match 3.14
3067integerLiteral(equals(42))
3068  matches 42
3069
3070Note that you cannot directly match a negative numeric literal because the
3071minus sign is not part of the literal: It is a unary operator whose operand
3072is the positive numeric literal. Instead, you must use a unaryOperator()
3073matcher to match the minus sign:
3074
3075unaryOperator(hasOperatorName("-"),
3076              hasUnaryOperand(integerLiteral(equals(13))))
3077
3078Usable 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;,
3079           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;
3080</pre></td></tr>
3081
3082
3083<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>
3084<tr><td colspan="4" class="doc" id="equals12"><pre></pre></td></tr>
3085
3086
3087<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec0')"><a name="hasDynamicExceptionSpec0Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
3088<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec0"><pre>Matches functions that have a dynamic exception specification.
3089
3090Given:
3091  void f();
3092  void g() noexcept;
3093  void h() noexcept(true);
3094  void i() noexcept(false);
3095  void j() throw();
3096  void k() throw(int);
3097  void l() throw(...);
3098functionDecl(hasDynamicExceptionSpec()) and
3099  functionProtoType(hasDynamicExceptionSpec())
3100  match the declarations of j, k, and l, but not f, g, h, or i.
3101</pre></td></tr>
3102
3103
3104<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>
3105<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
3106
3107Matches overloaded operator names specified in strings without the
3108"operator" prefix: e.g. "&lt;&lt;".
3109
3110Given:
3111  class A { int operator*(); };
3112  const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
3113  A a;
3114  a &lt;&lt; a;   // &lt;-- This matches
3115
3116cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
3117specified line and
3118cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
3119matches the declaration of A.
3120
3121Usable 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;
3122</pre></td></tr>
3123
3124
3125<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>
3126<tr><td colspan="4" class="doc" id="hasTrailingReturn0"><pre>Matches a function declared with a trailing return type.
3127
3128Example matches Y (matcher = functionDecl(hasTrailingReturn()))
3129int X() {}
3130auto Y() -&gt; int {}
3131</pre></td></tr>
3132
3133
3134<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isConstexpr1')"><a name="isConstexpr1Anchor">isConstexpr</a></td><td></td></tr>
3135<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations,
3136       and if constexpr.
3137
3138Given:
3139  constexpr int foo = 42;
3140  constexpr int bar();
3141  void baz() { if constexpr(1 &gt; 0) {} }
3142varDecl(isConstexpr())
3143  matches the declaration of foo.
3144functionDecl(isConstexpr())
3145  matches the declaration of bar.
3146ifStmt(isConstexpr())
3147  matches the if statement in baz.
3148</pre></td></tr>
3149
3150
3151<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>
3152<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
3153
3154Given:
3155  class A { ~A(); };
3156  class B { ~B() = default; };
3157functionDecl(isDefaulted())
3158  matches the declaration of ~B, but not ~A.
3159</pre></td></tr>
3160
3161
3162<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition3')"><a name="isDefinition3Anchor">isDefinition</a></td><td></td></tr>
3163<tr><td colspan="4" class="doc" id="isDefinition3"><pre>Matches if a declaration has a body attached.
3164
3165Example matches A, va, fa
3166  class A {};
3167  class B;  // Doesn't match, as it has no body.
3168  int va;
3169  extern int vb;  // Doesn't match, as it doesn't define the variable.
3170  void fa() {}
3171  void fb();  // Doesn't match, as it has no body.
3172  @interface X
3173  - (void)ma; // Doesn't match, interface is declaration.
3174  @end
3175  @implementation X
3176  - (void)ma {}
3177  @end
3178
3179Usable 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;,
3180  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3181</pre></td></tr>
3182
3183
3184<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>
3185<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
3186
3187Given:
3188  void Func();
3189  void DeletedFunc() = delete;
3190functionDecl(isDeleted())
3191  matches the declaration of DeletedFunc, but not Func.
3192</pre></td></tr>
3193
3194
3195<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>
3196<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
3197static member variable template instantiations.
3198
3199Given
3200  template&lt;typename T&gt; void A(T t) { }
3201  template&lt;&gt; void A(int N) { }
3202functionDecl(isExplicitTemplateSpecialization())
3203  matches the specialization A&lt;int&gt;().
3204
3205Usable 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;
3206</pre></td></tr>
3207
3208
3209<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC0')"><a name="isExternC0Anchor">isExternC</a></td><td></td></tr>
3210<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function or variable declarations.
3211
3212Given:
3213  extern "C" void f() {}
3214  extern "C" { void g() {} }
3215  void h() {}
3216  extern "C" int x = 1;
3217  extern "C" int y = 2;
3218  int z = 3;
3219functionDecl(isExternC())
3220  matches the declaration of f and g, but not the declaration of h.
3221varDecl(isExternC())
3222  matches the declaration of x and y, but not the declaration of z.
3223</pre></td></tr>
3224
3225
3226<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>
3227<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
3228the inline keyword.
3229
3230Given
3231  inline void f();
3232  void g();
3233  namespace n {
3234  inline namespace m {}
3235  }
3236functionDecl(isInline()) will match ::f().
3237namespaceDecl(isInline()) will match n::m.
3238</pre></td></tr>
3239
3240
3241<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>
3242<tr><td colspan="4" class="doc" id="isMain0"><pre>Determines whether the function is "main", which is the entry point
3243into an executable program.
3244</pre></td></tr>
3245
3246
3247<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>
3248<tr><td colspan="4" class="doc" id="isNoReturn0"><pre>Matches FunctionDecls that have a noreturn attribute.
3249
3250Given
3251  void nope();
3252  [[noreturn]] void a();
3253  __attribute__((noreturn)) void b();
3254  struct c { [[noreturn]] c(); };
3255functionDecl(isNoReturn())
3256  matches all of those except
3257  void nope();
3258</pre></td></tr>
3259
3260
3261<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>
3262<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
3263
3264Given:
3265  void f();
3266  void g() noexcept;
3267  void h() throw();
3268  void i() throw(int);
3269  void j() noexcept(false);
3270functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3271  match the declarations of g, and h, but not f, i or j.
3272</pre></td></tr>
3273
3274
3275<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>
3276<tr><td colspan="4" class="doc" id="isStaticStorageClass0"><pre>Matches variable/function declarations that have "static" storage
3277class specifier ("static" keyword) written in the source.
3278
3279Given:
3280  static void f() {}
3281  static int i = 0;
3282  extern int j;
3283  int k;
3284functionDecl(isStaticStorageClass())
3285  matches the function declaration f.
3286varDecl(isStaticStorageClass())
3287  matches the variable declaration i.
3288</pre></td></tr>
3289
3290
3291<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>
3292<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
3293member variable template instantiations.
3294
3295Given
3296  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3297or
3298  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3299or
3300  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
3301cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3302  matches the template instantiation of X&lt;A&gt;.
3303
3304But given
3305  template &lt;typename T&gt;  class X {}; class A {};
3306  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3307cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3308  does not match, as X&lt;A&gt; is an explicit template specialization.
3309
3310Usable 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;
3311</pre></td></tr>
3312
3313
3314<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>
3315<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
3316
3317Example matches f, but not g or h. The function i will not match, even when
3318compiled in C mode.
3319  void f(...);
3320  void g(int);
3321  template &lt;typename... Ts&gt; void h(Ts...);
3322  void i();
3323</pre></td></tr>
3324
3325
3326<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>
3327<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3328specific parameter count.
3329
3330Given
3331  void f(int i) {}
3332  void g(int i, int j) {}
3333  void h(int i, int j);
3334  void j(int i);
3335  void k(int x, int y, int z, ...);
3336functionDecl(parameterCountIs(2))
3337  matches g and h
3338functionProtoType(parameterCountIs(2))
3339  matches g and h
3340functionProtoType(parameterCountIs(3))
3341  matches k
3342</pre></td></tr>
3343
3344
3345<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('hasDynamicExceptionSpec1')"><a name="hasDynamicExceptionSpec1Anchor">hasDynamicExceptionSpec</a></td><td></td></tr>
3346<tr><td colspan="4" class="doc" id="hasDynamicExceptionSpec1"><pre>Matches functions that have a dynamic exception specification.
3347
3348Given:
3349  void f();
3350  void g() noexcept;
3351  void h() noexcept(true);
3352  void i() noexcept(false);
3353  void j() throw();
3354  void k() throw(int);
3355  void l() throw(...);
3356functionDecl(hasDynamicExceptionSpec()) and
3357  functionProtoType(hasDynamicExceptionSpec())
3358  match the declarations of j, k, and l, but not f, g, h, or i.
3359</pre></td></tr>
3360
3361
3362<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>
3363<tr><td colspan="4" class="doc" id="isNoThrow1"><pre>Matches functions that have a non-throwing exception specification.
3364
3365Given:
3366  void f();
3367  void g() noexcept;
3368  void h() throw();
3369  void i() throw(int);
3370  void j() noexcept(false);
3371functionDecl(isNoThrow()) and functionProtoType(isNoThrow())
3372  match the declarations of g, and h, but not f, i or j.
3373</pre></td></tr>
3374
3375
3376<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>
3377<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
3378specific parameter count.
3379
3380Given
3381  void f(int i) {}
3382  void g(int i, int j) {}
3383  void h(int i, int j);
3384  void j(int i);
3385  void k(int x, int y, int z, ...);
3386functionDecl(parameterCountIs(2))
3387  matches g and h
3388functionProtoType(parameterCountIs(2))
3389  matches g and h
3390functionProtoType(parameterCountIs(3))
3391  matches k
3392</pre></td></tr>
3393
3394
3395<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>
3396<tr><td colspan="4" class="doc" id="isConstexpr2"><pre>Matches constexpr variable and function declarations,
3397       and if constexpr.
3398
3399Given:
3400  constexpr int foo = 42;
3401  constexpr int bar();
3402  void baz() { if constexpr(1 &gt; 0) {} }
3403varDecl(isConstexpr())
3404  matches the declaration of foo.
3405functionDecl(isConstexpr())
3406  matches the declaration of bar.
3407ifStmt(isConstexpr())
3408  matches the if statement in baz.
3409</pre></td></tr>
3410
3411
3412<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>
3413<tr><td colspan="4" class="doc" id="equals6"><pre></pre></td></tr>
3414
3415
3416<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>
3417<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value of type ValueT.
3418
3419Given
3420  f('false, 3.14, 42);
3421characterLiteral(equals(0))
3422  matches 'cxxBoolLiteral(equals(false)) and cxxBoolLiteral(equals(0))
3423  match false
3424floatLiteral(equals(3.14)) and floatLiteral(equals(314e-2))
3425  match 3.14
3426integerLiteral(equals(42))
3427  matches 42
3428
3429Note that you cannot directly match a negative numeric literal because the
3430minus sign is not part of the literal: It is a unary operator whose operand
3431is the positive numeric literal. Instead, you must use a unaryOperator()
3432matcher to match the minus sign:
3433
3434unaryOperator(hasOperatorName("-"),
3435              hasUnaryOperand(integerLiteral(equals(13))))
3436
3437Usable 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;,
3438           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;
3439</pre></td></tr>
3440
3441
3442<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>
3443<tr><td colspan="4" class="doc" id="equals13"><pre></pre></td></tr>
3444
3445
3446<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>
3447<tr><td colspan="4" class="doc" id="equals9"><pre></pre></td></tr>
3448
3449
3450<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>
3451<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
3452to '.'.
3453
3454Member calls on the implicit this pointer match as called with '-&gt;'.
3455
3456Given
3457  class Y {
3458    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
3459    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
3460    int a;
3461    static int b;
3462  };
3463  template &lt;class T&gt;
3464  class Z {
3465    void x() { this-&gt;m; }
3466  };
3467memberExpr(isArrow())
3468  matches this-&gt;x, x, y.x, a, this-&gt;b
3469cxxDependentScopeMemberExpr(isArrow())
3470  matches this-&gt;m
3471unresolvedMemberExpr(isArrow())
3472  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
3473</pre></td></tr>
3474
3475
3476<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>
3477<tr><td colspan="4" class="doc" id="hasExternalFormalLinkage0"><pre>Matches a declaration that has external formal linkage.
3478
3479Example matches only z (matcher = varDecl(hasExternalFormalLinkage()))
3480void f() {
3481  int x;
3482  static int y;
3483}
3484int z;
3485
3486Example matches f() because it has external formal linkage despite being
3487unique to the translation unit as though it has internal likage
3488(matcher = functionDecl(hasExternalFormalLinkage()))
3489
3490namespace {
3491void f() {}
3492}
3493</pre></td></tr>
3494
3495
3496<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>const std::string  Name</td></tr>
3497<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
3498
3499Supports specifying enclosing namespaces or classes by prefixing the name
3500with '&lt;enclosing&gt;::'.
3501Does not match typedefs of an underlying type with the given name.
3502
3503Example matches X (Name == "X")
3504  class X;
3505
3506Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
3507  namespace a { namespace b { class X; } }
3508</pre></td></tr>
3509
3510
3511<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;</td><td class="name" onclick="toggle('matchesName0')"><a name="matchesName0Anchor">matchesName</a></td><td>std::string RegExp</td></tr>
3512<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
3513a substring matched by the given RegExp.
3514
3515Supports specifying enclosing namespaces or classes by
3516prefixing the name with '&lt;enclosing&gt;::'.  Does not match typedefs
3517of an underlying type with the given name.
3518
3519Example matches X (regexp == "::X")
3520  class X;
3521
3522Example matches X (regexp is one of "::X", "^foo::.*X", among others)
3523  namespace foo { namespace bar { class X; } }
3524</pre></td></tr>
3525
3526
3527<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>
3528<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
3529
3530Given
3531  namespace n {
3532  namespace {} // #1
3533  }
3534namespaceDecl(isAnonymous()) will match #1 but not ::n.
3535</pre></td></tr>
3536
3537
3538<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>
3539<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
3540the inline keyword.
3541
3542Given
3543  inline void f();
3544  void g();
3545  namespace n {
3546  inline namespace m {}
3547  }
3548functionDecl(isInline()) will match ::f().
3549namespaceDecl(isInline()) will match n::m.
3550</pre></td></tr>
3551
3552
3553<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>
3554<tr><td colspan="4" class="doc" id="isNoneKind0"><pre>Matches if the OpenMP ``default`` clause has ``none`` kind specified.
3555
3556Given
3557
3558  #pragma omp parallel
3559  #pragma omp parallel default(none)
3560  #pragma omp parallel default(shared)
3561
3562``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.
3563</pre></td></tr>
3564
3565
3566<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>
3567<tr><td colspan="4" class="doc" id="isSharedKind0"><pre>Matches if the OpenMP ``default`` clause has ``shared`` kind specified.
3568
3569Given
3570
3571  #pragma omp parallel
3572  #pragma omp parallel default(none)
3573  #pragma omp parallel default(shared)
3574
3575``ompDefaultClause(isSharedKind())`` matches only ``default(shared)``.
3576</pre></td></tr>
3577
3578
3579<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>
3580<tr><td colspan="4" class="doc" id="isAllowedToContainClauseKind0"><pre>Matches if the OpenMP directive is allowed to contain the specified OpenMP
3581clause kind.
3582
3583Given
3584
3585  #pragma omp parallel
3586  #pragma omp parallel for
3587  #pragma omp          for
3588
3589`ompExecutableDirective(isAllowedToContainClause(OMPC_default))`` matches
3590``omp parallel`` and ``omp parallel for``.
3591
3592If the matcher is use from clang-query, ``OpenMPClauseKind`` parameter
3593should be passed as a quoted string. e.g.,
3594``isAllowedToContainClauseKind("OMPC_default").``
3595</pre></td></tr>
3596
3597
3598<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>
3599<tr><td colspan="4" class="doc" id="isStandaloneDirective0"><pre>Matches standalone OpenMP directives,
3600i.e., directives that can't have a structured block.
3601
3602Given
3603
3604  #pragma omp parallel
3605  {}
3606  #pragma omp taskyield
3607
3608``ompExecutableDirective(isStandaloneDirective()))`` matches
3609``omp taskyield``.
3610</pre></td></tr>
3611
3612
3613<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>
3614<tr><td colspan="4" class="doc" id="isDerivedFrom3"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
3615</pre></td></tr>
3616
3617
3618<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>
3619<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom3"><pre>Overloaded method as shortcut for isDirectlyDerivedFrom(hasName(...)).
3620</pre></td></tr>
3621
3622
3623<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>
3624<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom3"><pre>Overloaded method as shortcut for
3625isSameOrDerivedFrom(hasName(...)).
3626</pre></td></tr>
3627
3628
3629<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('argumentCountIs2')"><a name="argumentCountIs2Anchor">argumentCountIs</a></td><td>unsigned N</td></tr>
3630<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
3631a specific number of arguments (including absent default arguments).
3632
3633Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
3634  void f(int x, int y);
3635  f(0, 0);
3636</pre></td></tr>
3637
3638
3639<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>
3640<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
3641
3642objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
3643message expression in
3644
3645  UIWebView *webView = ...;
3646  CGRect bodyFrame = webView.frame;
3647  bodyFrame.size.height = self.bodyContentHeight;
3648  webView.frame = bodyFrame;
3649  //     ^---- matches here
3650</pre></td></tr>
3651
3652
3653<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>
3654<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
3655
3656Matches only when the selector of the objCMessageExpr is NULL. This may
3657represent an error condition in the tree!
3658</pre></td></tr>
3659
3660
3661<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasSelector0')"><a name="hasSelector0Anchor">hasSelector</a></td><td>std::string BaseName</td></tr>
3662<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
3663
3664 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
3665 matches the outer message expr in the code below, but NOT the message
3666 invocation for self.bodyView.
3667    [self.bodyView loadHTMLString:html baseURL:NULL];
3668</pre></td></tr>
3669
3670
3671<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>
3672<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
3673
3674 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
3675 matches self.bodyView in the code below, but NOT the outer message
3676 invocation of "loadHTMLString:baseURL:".
3677    [self.bodyView loadHTMLString:html baseURL:NULL];
3678</pre></td></tr>
3679
3680
3681<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>
3682<tr><td colspan="4" class="doc" id="isClassMessage0"><pre>Returns true when the Objective-C message is sent to a class.
3683
3684Example
3685matcher = objcMessageExpr(isClassMessage())
3686matches
3687  [NSString stringWithFormat:@"format"];
3688but not
3689  NSString *x = @"hello";
3690  [x containsString:@"h"];
3691</pre></td></tr>
3692
3693
3694<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>
3695<tr><td colspan="4" class="doc" id="isInstanceMessage0"><pre>Returns true when the Objective-C message is sent to an instance.
3696
3697Example
3698matcher = objcMessageExpr(isInstanceMessage())
3699matches
3700  NSString *x = @"hello";
3701  [x containsString:@"h"];
3702but not
3703  [NSString stringWithFormat:@"format"];
3704</pre></td></tr>
3705
3706
3707<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('matchesSelector0')"><a name="matchesSelector0Anchor">matchesSelector</a></td><td>std::string RegExp</td></tr>
3708<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
3709a substring matched by the given RegExp.
3710 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
3711 invocation for self.bodyView.
3712    [self.bodyView loadHTMLString:html baseURL:NULL];
3713</pre></td></tr>
3714
3715
3716<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>
3717<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
3718
3719 matcher = objCMessageExpr(numSelectorArgs(0));
3720 matches self.bodyView in the code below
3721
3722 matcher = objCMessageExpr(numSelectorArgs(2));
3723 matches the invocation of "loadHTMLString:baseURL:" but not that
3724 of self.bodyView
3725    [self.bodyView loadHTMLString:html baseURL:NULL];
3726</pre></td></tr>
3727
3728
3729<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>
3730<tr><td colspan="4" class="doc" id="isClassMethod0"><pre>Returns true when the Objective-C method declaration is a class method.
3731
3732Example
3733matcher = objcMethodDecl(isClassMethod())
3734matches
3735@interface I + (void)foo; @end
3736but not
3737@interface I - (void)bar; @end
3738</pre></td></tr>
3739
3740
3741<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>
3742<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
3743
3744Example matches A, va, fa
3745  class A {};
3746  class B;  // Doesn't match, as it has no body.
3747  int va;
3748  extern int vb;  // Doesn't match, as it doesn't define the variable.
3749  void fa() {}
3750  void fb();  // Doesn't match, as it has no body.
3751  @interface X
3752  - (void)ma; // Doesn't match, interface is declaration.
3753  @end
3754  @implementation X
3755  - (void)ma {}
3756  @end
3757
3758Usable 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;,
3759  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
3760</pre></td></tr>
3761
3762
3763<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>
3764<tr><td colspan="4" class="doc" id="isInstanceMethod0"><pre>Returns true when the Objective-C method declaration is an instance method.
3765
3766Example
3767matcher = objcMethodDecl(isInstanceMethod())
3768matches
3769@interface I - (void)bar; @end
3770but not
3771@interface I + (void)foo; @end
3772</pre></td></tr>
3773
3774
3775<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>
3776<tr><td colspan="4" class="doc" id="hasDefaultArgument0"><pre>Matches a declaration that has default arguments.
3777
3778Example matches y (matcher = parmVarDecl(hasDefaultArgument()))
3779void x(int val) {}
3780void y(int val = 0) {}
3781
3782Deprecated. Use hasInitializer() instead to be able to
3783match on the contents of the default argument.  For example:
3784
3785void x(int val = 7) {}
3786void y(int val = 42) {}
3787parmVarDecl(hasInitializer(integerLiteral(equals(42))))
3788  matches the parameter of y
3789
3790A matcher such as
3791  parmVarDecl(hasInitializer(anything()))
3792is equivalent to parmVarDecl(hasDefaultArgument()).
3793</pre></td></tr>
3794
3795
3796<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>
3797<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
3798
3799Given
3800  class Y { public: void x(); };
3801  void z() { Y* y; y-&gt;x(); }
3802cxxMemberCallExpr(on(hasType(asString("class Y *"))))
3803  matches y-&gt;x()
3804</pre></td></tr>
3805
3806
3807<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode3')"><a name="equalsBoundNode3Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3808<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
3809
3810Matches a node if it equals the node previously bound to ID.
3811
3812Given
3813  class X { int a; int b; };
3814cxxRecordDecl(
3815    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3816    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3817  matches the class X, as a and b have the same type.
3818
3819Note that when multiple matches are involved via forEach* matchers,
3820equalsBoundNodes acts as a filter.
3821For example:
3822compoundStmt(
3823    forEachDescendant(varDecl().bind("d")),
3824    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3825will trigger a match for each combination of variable declaration
3826and reference to that variable declaration within a compound statement.
3827</pre></td></tr>
3828
3829
3830<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasLocalQualifiers0')"><a name="hasLocalQualifiers0Anchor">hasLocalQualifiers</a></td><td></td></tr>
3831<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
3832the node, not hidden within a typedef.
3833
3834Given
3835  typedef const int const_int;
3836  const_int i;
3837  int *const j;
3838  int *volatile k;
3839  int m;
3840varDecl(hasType(hasLocalQualifiers())) matches only j and k.
3841i is const-qualified but the qualifier is not local.
3842</pre></td></tr>
3843
3844
3845<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>
3846<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
3847
3848Given
3849  void a(char);
3850  void b(wchar_t);
3851  void c(double);
3852functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
3853matches "a(char)", "b(wchar_t)", but not "c(double)".
3854</pre></td></tr>
3855
3856
3857<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>
3858<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type; this includes
3859the Objective-C object pointer type, which is different despite being
3860syntactically similar.
3861
3862Given
3863  int *i = nullptr;
3864
3865  @interface Foo
3866  @end
3867  Foo *f;
3868
3869  int j;
3870varDecl(hasType(isAnyPointer()))
3871  matches "int *i" and "Foo *f", but not "int j".
3872</pre></td></tr>
3873
3874
3875<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>
3876<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
3877include "top-level" const.
3878
3879Given
3880  void a(int);
3881  void b(int const);
3882  void c(const int);
3883  void d(const int*);
3884  void e(int const) {};
3885functionDecl(hasAnyParameter(hasType(isConstQualified())))
3886  matches "void b(int const)", "void c(const int)" and
3887  "void e(int const) {}". It does not match d as there
3888  is no top-level const on the parameter type "const int *".
3889</pre></td></tr>
3890
3891
3892<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>
3893<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
3894
3895Given
3896  void a(int);
3897  void b(long);
3898  void c(double);
3899functionDecl(hasAnyParameter(hasType(isInteger())))
3900matches "a(int)", "b(long)", but not "c(double)".
3901</pre></td></tr>
3902
3903
3904<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>
3905<tr><td colspan="4" class="doc" id="isSignedInteger0"><pre>Matches QualType nodes that are of signed integer type.
3906
3907Given
3908  void a(int);
3909  void b(unsigned long);
3910  void c(double);
3911functionDecl(hasAnyParameter(hasType(isSignedInteger())))
3912matches "a(int)", but not "b(unsigned long)" and "c(double)".
3913</pre></td></tr>
3914
3915
3916<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>
3917<tr><td colspan="4" class="doc" id="isUnsignedInteger0"><pre>Matches QualType nodes that are of unsigned integer type.
3918
3919Given
3920  void a(int);
3921  void b(unsigned long);
3922  void c(double);
3923functionDecl(hasAnyParameter(hasType(isUnsignedInteger())))
3924matches "b(unsigned long)", but not "a(int)" and "c(double)".
3925</pre></td></tr>
3926
3927
3928<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>
3929<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
3930include "top-level" volatile.
3931
3932Given
3933  void a(int);
3934  void b(int volatile);
3935  void c(volatile int);
3936  void d(volatile int*);
3937  void e(int volatile) {};
3938functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
3939  matches "void b(int volatile)", "void c(volatile int)" and
3940  "void e(int volatile) {}". It does not match d as there
3941  is no top-level volatile on the parameter type "volatile int *".
3942</pre></td></tr>
3943
3944
3945<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isClass0')"><a name="isClass0Anchor">isClass</a></td><td></td></tr>
3946<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
3947
3948Example matches C, but not S or U.
3949  struct S {};
3950  class C {};
3951  union U {};
3952</pre></td></tr>
3953
3954
3955<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isStruct0')"><a name="isStruct0Anchor">isStruct</a></td><td></td></tr>
3956<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
3957
3958Example matches S, but not C or U.
3959  struct S {};
3960  class C {};
3961  union U {};
3962</pre></td></tr>
3963
3964
3965<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html">RecordDecl</a>&gt;</td><td class="name" onclick="toggle('isUnion0')"><a name="isUnion0Anchor">isUnion</a></td><td></td></tr>
3966<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
3967
3968Example matches U, but not C or S.
3969  struct S {};
3970  class C {};
3971  union U {};
3972</pre></td></tr>
3973
3974
3975<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsBoundNode0')"><a name="equalsBoundNode0Anchor">equalsBoundNode</a></td><td>std::string ID</td></tr>
3976<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
3977
3978Matches a node if it equals the node previously bound to ID.
3979
3980Given
3981  class X { int a; int b; };
3982cxxRecordDecl(
3983    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
3984    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
3985  matches the class X, as a and b have the same type.
3986
3987Note that when multiple matches are involved via forEach* matchers,
3988equalsBoundNodes acts as a filter.
3989For example:
3990compoundStmt(
3991    forEachDescendant(varDecl().bind("d")),
3992    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
3993will trigger a match for each combination of variable declaration
3994and reference to that variable declaration within a compound statement.
3995</pre></td></tr>
3996
3997
3998<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('equalsNode1')"><a name="equalsNode1Anchor">equalsNode</a></td><td>const Stmt* Other</td></tr>
3999<tr><td colspan="4" class="doc" id="equalsNode1"><pre>Matches if a node equals another node.
4000
4001Stmt has pointer identity in the AST.
4002</pre></td></tr>
4003
4004
4005<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching1')"><a name="isExpansionInFileMatching1Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
4006<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
4007partially matching a given regex.
4008
4009Example matches Y but not X
4010    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4011  #include "ASTMatcher.h"
4012  class X {};
4013ASTMatcher.h:
4014  class Y {};
4015
4016Usable 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;
4017</pre></td></tr>
4018
4019
4020<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>
4021<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
4022
4023Example matches X but not Y
4024  (matcher = cxxRecordDecl(isExpansionInMainFile())
4025  #include &lt;Y.h&gt;
4026  class X {};
4027Y.h:
4028  class Y {};
4029
4030Usable 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;
4031</pre></td></tr>
4032
4033
4034<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>
4035<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
4036
4037Example matches Y but not X
4038    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4039  #include &lt;SystemHeader.h&gt;
4040  class X {};
4041SystemHeader.h:
4042  class Y {};
4043
4044Usable 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;
4045</pre></td></tr>
4046
4047
4048<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isOMPStructuredBlock0')"><a name="isOMPStructuredBlock0Anchor">isOMPStructuredBlock</a></td><td></td></tr>
4049<tr><td colspan="4" class="doc" id="isOMPStructuredBlock0"><pre>Matches the Stmt AST node that is marked as being the structured-block
4050of an OpenMP executable directive.
4051
4052Given
4053
4054   #pragma omp parallel
4055   {}
4056
4057``stmt(isOMPStructuredBlock()))`` matches ``{}``.
4058</pre></td></tr>
4059
4060
4061<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>
4062<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4063
4064Given
4065  int a[42];
4066  int b[2 * 21];
4067  int c[41], d[43];
4068  char *s = "abcd";
4069  wchar_t *ws = L"abcd";
4070  char *w = "a";
4071constantArrayType(hasSize(42))
4072  matches "int a[42]" and "int b[2 * 21]"
4073stringLiteral(hasSize(4))
4074  matches "abcd", L"abcd"
4075</pre></td></tr>
4076
4077
4078<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>
4079<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4080
4081Example matches A, va, fa
4082  class A {};
4083  class B;  // Doesn't match, as it has no body.
4084  int va;
4085  extern int vb;  // Doesn't match, as it doesn't define the variable.
4086  void fa() {}
4087  void fb();  // Doesn't match, as it has no body.
4088  @interface X
4089  - (void)ma; // Doesn't match, interface is declaration.
4090  @end
4091  @implementation X
4092  - (void)ma {}
4093  @end
4094
4095Usable 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;,
4096  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4097</pre></td></tr>
4098
4099
4100<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>
4101<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4102
4103Note that 'Value' is a string as the template argument's value is
4104an arbitrary precision integer. 'Value' must be euqal to the canonical
4105representation of that integral value in base 10.
4106
4107Given
4108  template&lt;int T&gt; struct C {};
4109  C&lt;42&gt; c;
4110classTemplateSpecializationDecl(
4111  hasAnyTemplateArgument(equalsIntegralValue("42")))
4112  matches the implicit instantiation of C in C&lt;42&gt;.
4113</pre></td></tr>
4114
4115
4116<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>
4117<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4118
4119Given
4120  template&lt;int T&gt; struct C {};
4121  C&lt;42&gt; c;
4122classTemplateSpecializationDecl(
4123  hasAnyTemplateArgument(isIntegral()))
4124  matches the implicit instantiation of C in C&lt;42&gt;
4125  with isIntegral() matching 42.
4126</pre></td></tr>
4127
4128
4129<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>
4130<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4131
4132Given
4133  template&lt;typename T&gt; struct C {};
4134  C&lt;int&gt; c;
4135classTemplateSpecializationDecl(templateArgumentCountIs(1))
4136  matches C&lt;int&gt;.
4137</pre></td></tr>
4138
4139
4140<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td><td class="name" onclick="toggle('isExpansionInFileMatching2')"><a name="isExpansionInFileMatching2Anchor">isExpansionInFileMatching</a></td><td>std::string RegExp</td></tr>
4141<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4142partially matching a given regex.
4143
4144Example matches Y but not X
4145    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4146  #include "ASTMatcher.h"
4147  class X {};
4148ASTMatcher.h:
4149  class Y {};
4150
4151Usable 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;
4152</pre></td></tr>
4153
4154
4155<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>
4156<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4157
4158Example matches X but not Y
4159  (matcher = cxxRecordDecl(isExpansionInMainFile())
4160  #include &lt;Y.h&gt;
4161  class X {};
4162Y.h:
4163  class Y {};
4164
4165Usable 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;
4166</pre></td></tr>
4167
4168
4169<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>
4170<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4171
4172Example matches Y but not X
4173    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4174  #include &lt;SystemHeader.h&gt;
4175  class X {};
4176SystemHeader.h:
4177  class Y {};
4178
4179Usable 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;
4180</pre></td></tr>
4181
4182
4183<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>
4184<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4185
4186Given
4187 struct S { bool func(); };
4188functionDecl(returns(booleanType()))
4189  matches "bool func();"
4190</pre></td></tr>
4191
4192
4193<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>
4194<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4195
4196Matches a node if it equals the node previously bound to ID.
4197
4198Given
4199  class X { int a; int b; };
4200cxxRecordDecl(
4201    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4202    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4203  matches the class X, as a and b have the same type.
4204
4205Note that when multiple matches are involved via forEach* matchers,
4206equalsBoundNodes acts as a filter.
4207For example:
4208compoundStmt(
4209    forEachDescendant(varDecl().bind("d")),
4210    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4211will trigger a match for each combination of variable declaration
4212and reference to that variable declaration within a compound statement.
4213</pre></td></tr>
4214
4215
4216<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>
4217<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4218
4219Type has pointer identity in the AST.
4220</pre></td></tr>
4221
4222
4223<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>
4224<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4225
4226Given
4227  int i;
4228  float f;
4229realFloatingPointType()
4230  matches "float f" but not "int i"
4231</pre></td></tr>
4232
4233
4234<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>
4235<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4236
4237Given
4238 struct S { void func(); };
4239functionDecl(returns(voidType()))
4240  matches "void func();"
4241</pre></td></tr>
4242
4243
4244<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>
4245<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4246
4247Given
4248  int x;
4249  int s = sizeof(x) + alignof(x)
4250unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4251  matches sizeof(x)
4252
4253If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4254should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4255</pre></td></tr>
4256
4257
4258<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>
4259<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4260unary).
4261
4262Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4263  !(a || b)
4264</pre></td></tr>
4265
4266
4267<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>
4268<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4269to '.'.
4270
4271Member calls on the implicit this pointer match as called with '-&gt;'.
4272
4273Given
4274  class Y {
4275    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4276    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4277    int a;
4278    static int b;
4279  };
4280  template &lt;class T&gt;
4281  class Z {
4282    void x() { this-&gt;m; }
4283  };
4284memberExpr(isArrow())
4285  matches this-&gt;x, x, y.x, a, this-&gt;b
4286cxxDependentScopeMemberExpr(isArrow())
4287  matches this-&gt;m
4288unresolvedMemberExpr(isArrow())
4289  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4290</pre></td></tr>
4291
4292
4293<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>
4294<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4295
4296Example matches x, but not y, z, or a.
4297(matcher = varDecl(hasAutomaticStorageDuration())
4298void f() {
4299  int x;
4300  static int y;
4301  thread_local int z;
4302}
4303int a;
4304</pre></td></tr>
4305
4306
4307<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>
4308<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4309
4310Example matches y and z (matcher = varDecl(hasGlobalStorage())
4311void f() {
4312  int x;
4313  static int y;
4314}
4315int z;
4316</pre></td></tr>
4317
4318
4319<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
4320<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4321non-static local variable.
4322
4323Example matches x (matcher = varDecl(hasLocalStorage())
4324void f() {
4325  int x;
4326  static int y;
4327}
4328int z;
4329</pre></td></tr>
4330
4331
4332<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>
4333<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4334It includes the variable declared at namespace scope and those declared
4335with "static" and "extern" storage class specifiers.
4336
4337void f() {
4338  int x;
4339  static int y;
4340  thread_local int z;
4341}
4342int a;
4343static int b;
4344extern int c;
4345varDecl(hasStaticStorageDuration())
4346  matches the function declaration y, a, b and c.
4347</pre></td></tr>
4348
4349
4350<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>
4351<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4352
4353Example matches z, but not x, z, or a.
4354(matcher = varDecl(hasThreadStorageDuration())
4355void f() {
4356  int x;
4357  static int y;
4358  thread_local int z;
4359}
4360int a;
4361</pre></td></tr>
4362
4363
4364<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>
4365<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4366       and if constexpr.
4367
4368Given:
4369  constexpr int foo = 42;
4370  constexpr int bar();
4371  void baz() { if constexpr(1 &gt; 0) {} }
4372varDecl(isConstexpr())
4373  matches the declaration of foo.
4374functionDecl(isConstexpr())
4375  matches the declaration of bar.
4376ifStmt(isConstexpr())
4377  matches the if statement in baz.
4378</pre></td></tr>
4379
4380
4381<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>
4382<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4383
4384Example matches A, va, fa
4385  class A {};
4386  class B;  // Doesn't match, as it has no body.
4387  int va;
4388  extern int vb;  // Doesn't match, as it doesn't define the variable.
4389  void fa() {}
4390  void fb();  // Doesn't match, as it has no body.
4391  @interface X
4392  - (void)ma; // Doesn't match, interface is declaration.
4393  @end
4394  @implementation X
4395  - (void)ma {}
4396  @end
4397
4398Usable 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;,
4399  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4400</pre></td></tr>
4401
4402
4403<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>
4404<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4405a C++ catch block, or an Objective-C statement.
4406
4407Example matches x (matcher = varDecl(isExceptionVariable())
4408void f(int y) {
4409  try {
4410  } catch (int x) {
4411  }
4412}
4413</pre></td></tr>
4414
4415
4416<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>
4417<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4418static member variable template instantiations.
4419
4420Given
4421  template&lt;typename T&gt; void A(T t) { }
4422  template&lt;&gt; void A(int N) { }
4423functionDecl(isExplicitTemplateSpecialization())
4424  matches the specialization A&lt;int&gt;().
4425
4426Usable 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;
4427</pre></td></tr>
4428
4429
4430<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isExternC1')"><a name="isExternC1Anchor">isExternC</a></td><td></td></tr>
4431<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4432
4433Given:
4434  extern "C" void f() {}
4435  extern "C" { void g() {} }
4436  void h() {}
4437  extern "C" int x = 1;
4438  extern "C" int y = 2;
4439  int z = 3;
4440functionDecl(isExternC())
4441  matches the declaration of f and g, but not the declaration of h.
4442varDecl(isExternC())
4443  matches the declaration of x and y, but not the declaration of z.
4444</pre></td></tr>
4445
4446
4447<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>
4448<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4449
4450Example matches y (matcher = varDecl(isStaticLocal()))
4451void f() {
4452  int x;
4453  static int y;
4454}
4455static int z;
4456</pre></td></tr>
4457
4458
4459<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>
4460<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4461class specifier ("static" keyword) written in the source.
4462
4463Given:
4464  static void f() {}
4465  static int i = 0;
4466  extern int j;
4467  int k;
4468functionDecl(isStaticStorageClass())
4469  matches the function declaration f.
4470varDecl(isStaticStorageClass())
4471  matches the variable declaration i.
4472</pre></td></tr>
4473
4474
4475<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>
4476<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4477member variable template instantiations.
4478
4479Given
4480  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4481or
4482  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4483or
4484  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4485cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4486  matches the template instantiation of X&lt;A&gt;.
4487
4488But given
4489  template &lt;typename T&gt;  class X {}; class A {};
4490  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4491cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4492  does not match, as X&lt;A&gt; is an explicit template specialization.
4493
4494Usable 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;
4495</pre></td></tr>
4496
4497
4498<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
4499<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
4500template instantiations.
4501
4502Given
4503  template&lt;typename T&gt; void A(T t) { T i; }
4504  A(0);
4505  A(0U);
4506functionDecl(isInstantiated())
4507  matches 'A(int) {...};' and 'A(unsigned) {...}'.
4508</pre></td></tr>
4509
4510
4511<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnyName0')"><a name="hasAnyName0Anchor">hasAnyName</a></td><td>StringRef, ..., StringRef</td></tr>
4512<tr><td colspan="4" class="doc" id="hasAnyName0"><pre>Matches NamedDecl nodes that have any of the specified names.
4513
4514This matcher is only provided as a performance optimization of hasName.
4515    hasAnyName(a, b, c)
4516 is equivalent to, but faster than
4517    anyOf(hasName(a), hasName(b), hasName(c))
4518</pre></td></tr>
4519
4520
4521<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;&gt;</td><td class="name" onclick="toggle('hasAnySelector0')"><a name="hasAnySelector0Anchor">hasAnySelector</a></td><td>StringRef, ..., StringRef</td></tr>
4522<tr><td colspan="4" class="doc" id="hasAnySelector0"><pre>Matches when at least one of the supplied string equals to the
4523Selector.getAsString()
4524
4525 matcher = objCMessageExpr(hasSelector("methodA:", "methodB:"));
4526 matches both of the expressions below:
4527    [myObj methodA:argA];
4528    [myObj methodB:argB];
4529</pre></td></tr>
4530
4531
4532<tr><td>Matcher&lt;internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
4533<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
4534
4535Given
4536  int j;
4537  template&lt;typename T&gt; void A(T t) { T i; j += 42;}
4538  A(0);
4539  A(0U);
4540declStmt(isInTemplateInstantiation())
4541  matches 'int i;' and 'unsigned i'.
4542unless(stmt(isInTemplateInstantiation()))
4543  will NOT match j += 42; as it's shared between the template definition and
4544  instantiation.
4545</pre></td></tr>
4546
4547<!--END_NARROWING_MATCHERS -->
4548</table>
4549
4550<!-- ======================================================================= -->
4551<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4552<!-- ======================================================================= -->
4553
4554<p>Traversal matchers specify the relationship to other nodes that are
4555reachable from the current node.</p>
4556
4557<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4558forEachDescendant) which work on all nodes and allow users to write more generic
4559match expressions.</p>
4560
4561<table>
4562<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4563<!-- START_TRAVERSAL_MATCHERS -->
4564
4565<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>
4566<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4567
4568Unlike anyOf, eachOf will generate a match result for each
4569matching submatcher.
4570
4571For example, in:
4572  class A { int a; int b; };
4573The matcher:
4574  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4575                       has(fieldDecl(hasName("b")).bind("v"))))
4576will generate two results binding "v", the first of which binds
4577the field declaration of a, the second the field declaration of
4578b.
4579
4580Usable as: Any Matcher
4581</pre></td></tr>
4582
4583
4584<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4585<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4586provided matcher.
4587
4588Example matches X, A, A::X, B, B::C, B::C::X
4589  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4590  class X {};
4591  class A { class X {}; };  // Matches A, because A::X is a class of name
4592                            // X inside A.
4593  class B { class C { class X {}; }; };
4594
4595DescendantT must be an AST base type.
4596
4597As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4598each result that matches instead of only on the first one.
4599
4600Note: Recursively combined ForEachDescendant can cause many matches:
4601  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4602    forEachDescendant(cxxRecordDecl())
4603  )))
4604will match 10 times (plus injected class name matches) on:
4605  class A { class B { class C { class D { class E {}; }; }; }; };
4606
4607Usable as: Any Matcher
4608</pre></td></tr>
4609
4610
4611<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4612<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4613provided matcher.
4614
4615Example matches X, Y, Y::X, Z::Y, Z::Y::X
4616  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4617  class X {};
4618  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
4619                            // inside Y.
4620  class Z { class Y { class X {}; }; };  // Does not match Z.
4621
4622ChildT must be an AST base type.
4623
4624As opposed to 'has', 'forEach' will cause a match for each result that
4625matches instead of only on the first one.
4626
4627Usable as: Any Matcher
4628</pre></td></tr>
4629
4630
4631<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4632<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4633matcher.
4634
4635Given
4636void f() { if (true) { int x = 42; } }
4637void g() { for (;;) { int x = 43; } }
4638expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4639
4640Usable as: Any Matcher
4641</pre></td></tr>
4642
4643
4644<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4645<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4646provided matcher.
4647
4648Example matches X, Y, Z
4649    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4650  class X {};  // Matches X, because X::X is a class of name X inside X.
4651  class Y { class X {}; };
4652  class Z { class Y { class X {}; }; };
4653
4654DescendantT must be an AST base type.
4655
4656Usable as: Any Matcher
4657</pre></td></tr>
4658
4659
4660<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4661<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4662provided matcher.
4663
4664Example matches X, Y
4665  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4666  class X {};  // Matches X, because X::X is a class of name X inside X.
4667  class Y { class X {}; };
4668  class Z { class Y { class X {}; }; };  // Does not match Z.
4669
4670ChildT must be an AST base type.
4671
4672Usable as: Any Matcher
4673Note that has is direct matcher, so it also matches things like implicit
4674casts and paren casts. If you are matching with expr then you should
4675probably consider using ignoringParenImpCasts like:
4676has(ignoringParenImpCasts(expr())).
4677</pre></td></tr>
4678
4679
4680<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4681<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4682matcher.
4683
4684Given
4685void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4686compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4687
4688Usable as: Any Matcher
4689</pre></td></tr>
4690
4691
4692<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>
4693<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4694switch statement or conditional operator.
4695
4696Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4697  if (true) {}
4698</pre></td></tr>
4699
4700
4701<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>
4702<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4703(binary or ternary).
4704
4705Example matches b
4706  condition ? a : b
4707  condition ?: b
4708</pre></td></tr>
4709
4710
4711<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>
4712<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4713
4714Example 1 (conditional ternary operator): matches a
4715  condition ? a : b
4716
4717Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4718  condition ?: b
4719</pre></td></tr>
4720
4721
4722<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AddrLabelExpr.html">AddrLabelExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration15')"><a name="hasDeclaration15Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4723<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
4724matches the given matcher.
4725
4726The associated declaration is:
4727- for type nodes, the declaration of the underlying type
4728- for CallExpr, the declaration of the callee
4729- for MemberExpr, the declaration of the referenced member
4730- for CXXConstructExpr, the declaration of the constructor
4731- for CXXNewExpr, the declaration of the operator new
4732- for ObjCIvarExpr, the declaration of the ivar
4733
4734For type nodes, hasDeclaration will generally match the declaration of the
4735sugared type. Given
4736  class X {};
4737  typedef X Y;
4738  Y y;
4739in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4740typedefDecl. A common use case is to match the underlying, desugared type.
4741This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4742  varDecl(hasType(hasUnqualifiedDesugaredType(
4743      recordType(hasDeclaration(decl())))))
4744In this matcher, the decl will match the CXXRecordDecl of class X.
4745
4746Usable 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;,
4747  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;,
4748  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;,
4749  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;,
4750  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;,
4751  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;,
4752  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4753</pre></td></tr>
4754
4755
4756<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>
4757<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4758
4759Given
4760  int i[5];
4761  void f() { i[1] = 42; }
4762arraySubscriptExpression(hasBase(implicitCastExpr(
4763    hasSourceExpression(declRefExpr()))))
4764  matches i[1] with the declRefExpr() matching i
4765</pre></td></tr>
4766
4767
4768<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>
4769<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4770
4771Given
4772  int i[5];
4773  void f() { i[1] = 42; }
4774arraySubscriptExpression(hasIndex(integerLiteral()))
4775  matches i[1] with the integerLiteral() matching 1
4776</pre></td></tr>
4777
4778
4779<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>
4780<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4781
4782Example matches a (matcher = binaryOperator(hasLHS()))
4783  a || b
4784</pre></td></tr>
4785
4786
4787<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>
4788<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4789
4790Example matches b (matcher = binaryOperator(hasRHS()))
4791  a || b
4792</pre></td></tr>
4793
4794
4795<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>
4796<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4797type.
4798
4799Given
4800  struct A {};
4801  A a[7];
4802  int b[7];
4803arrayType(hasElementType(builtinType()))
4804  matches "int b[7]"
4805
4806Usable 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;
4807</pre></td></tr>
4808
4809
4810<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>
4811<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4812
4813Given
4814  _Atomic(int) i;
4815  _Atomic(float) f;
4816atomicType(hasValueType(isInteger()))
4817 matches "_Atomic(int) i"
4818
4819Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
4820</pre></td></tr>
4821
4822
4823<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>
4824<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
4825
4826Note: There is no TypeLoc for the deduced type and thus no
4827getDeducedLoc() matcher.
4828
4829Given
4830  auto a = 1;
4831  auto b = 2.0;
4832autoType(hasDeducedType(isInteger()))
4833  matches "auto a"
4834
4835Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
4836</pre></td></tr>
4837
4838
4839<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;</td><td class="name" onclick="toggle('hasEitherOperand0')"><a name="hasEitherOperand0Anchor">hasEitherOperand</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;  InnerMatcher</td></tr>
4840<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
4841binary operator matches.
4842</pre></td></tr>
4843
4844
4845<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>
4846<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
4847
4848Example matches a (matcher = binaryOperator(hasLHS()))
4849  a || b
4850</pre></td></tr>
4851
4852
4853<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>
4854<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
4855
4856Example matches b (matcher = binaryOperator(hasRHS()))
4857  a || b
4858</pre></td></tr>
4859
4860
4861<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>
4862<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
4863block.
4864
4865Does not match the 'this' parameter of a method.
4866
4867Given
4868  class X { void f(int x, int y, int z) {} };
4869cxxMethodDecl(hasAnyParameter(hasName("y")))
4870  matches f(int x, int y, int z) {}
4871with hasAnyParameter(...)
4872  matching int y
4873
4874For ObjectiveC, given
4875  @interface I - (void) f:(int) y; @end
4876
4877the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
4878matches the declaration of method f with hasParameter
4879matching y.
4880
4881For blocks, given
4882  b = ^(int y) { printf("%d", y) };
4883
4884the matcher blockDecl(hasAnyParameter(hasName("y")))
4885matches the declaration of the block b with hasParameter
4886matching y.
4887</pre></td></tr>
4888
4889
4890<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>
4891<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
4892declaration or a block.
4893
4894Given
4895  class X { void f(int x) {} };
4896cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4897  matches f(int x) {}
4898with hasParameter(...)
4899  matching int x
4900
4901For ObjectiveC, given
4902  @interface I - (void) f:(int) y; @end
4903
4904the matcher objcMethodDecl(hasParameter(0, hasName("y")))
4905matches the declaration of method f with hasParameter
4906matching y.
4907</pre></td></tr>
4908
4909
4910<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>
4911<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
4912pointee matches a given matcher.
4913
4914Given
4915  int *a;
4916  int const *b;
4917  float const *f;
4918pointerType(pointee(isConstQualified(), isInteger()))
4919  matches "int const *b"
4920
4921Usable 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;,
4922  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;
4923</pre></td></tr>
4924
4925
4926<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>
4927<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
4928
4929Given
4930  void f(int i);
4931  int y;
4932  f(y);
4933callExpr(
4934  forEachArgumentWithParam(
4935    declRefExpr(to(varDecl(hasName("y")))),
4936    parmVarDecl(hasType(isInteger()))
4937))
4938  matches f(y);
4939with declRefExpr(...)
4940  matching int y
4941and parmVarDecl(...)
4942  matching int i
4943</pre></td></tr>
4944
4945
4946<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>
4947<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
4948expression, or an ObjC-message-send expression.
4949
4950Given
4951  void x(int, int, int) { int y; x(1, y, 42); }
4952callExpr(hasAnyArgument(declRefExpr()))
4953  matches x(1, y, 42)
4954with hasAnyArgument(...)
4955  matching y
4956
4957For ObjectiveC, given
4958  @interface I - (void) f:(int) y; @end
4959  void foo(I *i) { [i f:12]; }
4960objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
4961  matches [i f:12]
4962</pre></td></tr>
4963
4964
4965<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>
4966<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
4967call expression.
4968
4969Example matches y in x(y)
4970    (matcher = callExpr(hasArgument(0, declRefExpr())))
4971  void x(int) { int y; x(y); }
4972</pre></td></tr>
4973
4974
4975<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
4976<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
4977matches the given matcher.
4978
4979The associated declaration is:
4980- for type nodes, the declaration of the underlying type
4981- for CallExpr, the declaration of the callee
4982- for MemberExpr, the declaration of the referenced member
4983- for CXXConstructExpr, the declaration of the constructor
4984- for CXXNewExpr, the declaration of the operator new
4985- for ObjCIvarExpr, the declaration of the ivar
4986
4987For type nodes, hasDeclaration will generally match the declaration of the
4988sugared type. Given
4989  class X {};
4990  typedef X Y;
4991  Y y;
4992in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4993typedefDecl. A common use case is to match the underlying, desugared type.
4994This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4995  varDecl(hasType(hasUnqualifiedDesugaredType(
4996      recordType(hasDeclaration(decl())))))
4997In this matcher, the decl will match the CXXRecordDecl of class X.
4998
4999Usable 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;,
5000  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;,
5001  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;,
5002  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;,
5003  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;,
5004  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;,
5005  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5006</pre></td></tr>
5007
5008
5009<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>
5010<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
5011
5012Given
5013  class A { A() : i(42), j(42) {} int i; int j; };
5014cxxConstructorDecl(forEachConstructorInitializer(
5015  forField(decl().bind("x"))
5016))
5017  will trigger two matches, binding for 'i' and 'j' respectively.
5018</pre></td></tr>
5019
5020
5021<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>
5022<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
5023
5024Given
5025  struct Foo {
5026    Foo() : foo_(1) { }
5027    int foo_;
5028  };
5029cxxRecordDecl(has(cxxConstructorDecl(
5030  hasAnyConstructorInitializer(anything())
5031)))
5032  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5033</pre></td></tr>
5034
5035
5036<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>
5037<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5038
5039Given
5040  struct Foo {
5041    Foo() : foo_(1) { }
5042    int foo_;
5043  };
5044cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5045    forField(hasName("foo_"))))))
5046  matches Foo
5047with forField matching foo_
5048</pre></td></tr>
5049
5050
5051<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>
5052<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5053
5054Given
5055  struct Foo {
5056    Foo() : foo_(1) { }
5057    int foo_;
5058  };
5059cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5060    withInitializer(integerLiteral(equals(1)))))))
5061  matches Foo
5062with withInitializer matching (1)
5063</pre></td></tr>
5064
5065
5066<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>
5067<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5068given matcher. Implicit object expressions are included; that is, it matches
5069use of implicit `this`.
5070
5071Given
5072  struct X {
5073    int m;
5074    int f(X x) { x.m; return m; }
5075  };
5076memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5077  matches `x.m`, but not `m`; however,
5078memberExpr(hasObjectExpression(hasType(pointsTo(
5079     cxxRecordDecl(hasName("X"))))))
5080  matches `m` (aka. `this-&gt;m`), but not `x.m`.
5081</pre></td></tr>
5082
5083
5084<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>
5085<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
5086definition that has a given body.
5087
5088Given
5089  for (;;) {}
5090hasBody(compoundStmt())
5091  matches 'for (;;) {}'
5092with compoundStmt()
5093  matching '{}'
5094</pre></td></tr>
5095
5096
5097<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>
5098<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
5099
5100Given:
5101 void foo() {
5102   if (int i = foobar(); i &gt; 0) {}
5103   switch (int i = foobar(); i) {}
5104   for (auto&amp; a = get_range(); auto&amp; x : a) {}
5105 }
5106 void bar() {
5107   if (foobar() &gt; 0) {}
5108   switch (foobar()) {}
5109   for (auto&amp; x : get_range()) {}
5110 }
5111ifStmt(hasInitStatement(anything()))
5112  matches the if statement in foo but not in bar.
5113switchStmt(hasInitStatement(anything()))
5114  matches the switch statement in foo but not in bar.
5115cxxForRangeStmt(hasInitStatement(anything()))
5116  matches the range for statement in foo but not in bar.
5117</pre></td></tr>
5118
5119
5120<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>
5121<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5122
5123Example:
5124    forStmt(hasLoopVariable(anything()))
5125matches 'int x' in
5126    for (int x : a) { }
5127</pre></td></tr>
5128
5129
5130<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>
5131<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5132
5133Example:
5134    forStmt(hasRangeInit(anything()))
5135matches 'a' in
5136    for (int x : a) { }
5137</pre></td></tr>
5138
5139
5140<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>
5141<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5142`on`, matches the argument directly without stripping away anything.
5143
5144Given
5145  class Y { public: void m(); };
5146  Y g();
5147  class X : public Y { void g(); };
5148  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5149cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5150    cxxRecordDecl(hasName("Y")))))
5151  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5152cxxMemberCallExpr(on(callExpr()))
5153  does not match `(g()).m()`, because the parens are not ignored.
5154
5155FIXME: Overload to allow directly matching types?
5156</pre></td></tr>
5157
5158
5159<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>
5160<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5161stripping off any parentheses or implicit casts.
5162
5163Given
5164  class Y { public: void m(); };
5165  Y g();
5166  class X : public Y {};
5167  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5168cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5169  matches `y.m()` and `(g()).m()`.
5170cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5171  matches `x.m()`.
5172cxxMemberCallExpr(on(callExpr()))
5173  matches `(g()).m()`.
5174
5175FIXME: Overload to allow directly matching types?
5176</pre></td></tr>
5177
5178
5179<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>
5180<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5181</pre></td></tr>
5182
5183
5184<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>
5185<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5186matches the InnerMatcher, or is a pointer to a type that matches the
5187InnerMatcher.
5188
5189Given
5190  class Y { public: void m(); };
5191  class X : public Y { void g(); };
5192  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5193cxxMemberCallExpr(thisPointerType(hasDeclaration(
5194    cxxRecordDecl(hasName("Y")))))
5195  matches `y.m()`, `p-&gt;m()` and `x.m()`.
5196cxxMemberCallExpr(thisPointerType(hasDeclaration(
5197    cxxRecordDecl(hasName("X")))))
5198  matches `x.g()`.
5199</pre></td></tr>
5200
5201
5202<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>
5203<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5204produce multiple matches.
5205
5206Given
5207  class A { virtual void f(); };
5208  class B : public A { void f(); };
5209  class C : public B { void f(); };
5210cxxMethodDecl(ofClass(hasName("C")),
5211              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5212  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5213  that B::f is not overridden by C::f).
5214
5215The check can produce multiple matches in case of multiple inheritance, e.g.
5216  class A1 { virtual void f(); };
5217  class A2 { virtual void f(); };
5218  class C : public A1, public A2 { void f(); };
5219cxxMethodDecl(ofClass(hasName("C")),
5220              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5221  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5222  once with "b" binding "A2::f" and "d" binding "C::f".
5223</pre></td></tr>
5224
5225
5226<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>
5227<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5228belongs to.
5229
5230FIXME: Generalize this for other kinds of declarations.
5231FIXME: What other kind of declarations would we need to generalize
5232this to?
5233
5234Example matches A() in the last line
5235    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5236        ofClass(hasName("A"))))))
5237  class A {
5238   public:
5239    A();
5240  };
5241  A a = A();
5242</pre></td></tr>
5243
5244
5245<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>
5246<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5247
5248Given:
5249  MyClass *p1 = new MyClass[10];
5250cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
5251  matches the expression 'new MyClass[10]'.
5252</pre></td></tr>
5253
5254
5255<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5256<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5257matches the given matcher.
5258
5259The associated declaration is:
5260- for type nodes, the declaration of the underlying type
5261- for CallExpr, the declaration of the callee
5262- for MemberExpr, the declaration of the referenced member
5263- for CXXConstructExpr, the declaration of the constructor
5264- for CXXNewExpr, the declaration of the operator new
5265- for ObjCIvarExpr, the declaration of the ivar
5266
5267For type nodes, hasDeclaration will generally match the declaration of the
5268sugared type. Given
5269  class X {};
5270  typedef X Y;
5271  Y y;
5272in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5273typedefDecl. A common use case is to match the underlying, desugared type.
5274This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5275  varDecl(hasType(hasUnqualifiedDesugaredType(
5276      recordType(hasDeclaration(decl())))))
5277In this matcher, the decl will match the CXXRecordDecl of class X.
5278
5279Usable 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;,
5280  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;,
5281  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;,
5282  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;,
5283  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;,
5284  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;,
5285  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5286</pre></td></tr>
5287
5288
5289<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>
5290<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5291
5292Given:
5293  class A { void func(); };
5294  class B { void member(); };
5295
5296cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5297A but not B.
5298</pre></td></tr>
5299
5300
5301<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>
5302<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
5303matching Base, or Objective-C classes that directly or indirectly
5304subclass a class matching Base.
5305
5306Note that a class is not considered to be derived from itself.
5307
5308Example matches Y, Z, C (Base == hasName("X"))
5309  class X;
5310  class Y : public X {};  // directly derived
5311  class Z : public Y {};  // indirectly derived
5312  typedef X A;
5313  typedef A B;
5314  class C : public B {};  // derived from a typedef of X
5315
5316In the following example, Bar matches isDerivedFrom(hasName("X")):
5317  class Foo;
5318  typedef Foo X;
5319  class Bar : public Foo {};  // derived from a type that X is a typedef of
5320
5321In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
5322  @interface NSObject @end
5323  @interface Bar : NSObject @end
5324
5325Usable 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;
5326</pre></td></tr>
5327
5328
5329<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>
5330<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
5331matching Base.
5332
5333Note that a class is not considered to be derived from itself.
5334
5335Example matches Y, C (Base == hasName("X"))
5336  class X;
5337  class Y : public X {};  // directly derived
5338  class Z : public Y {};  // indirectly derived
5339  typedef X A;
5340  typedef A B;
5341  class C : public B {};  // derived from a typedef of X
5342
5343In the following example, Bar matches isDerivedFrom(hasName("X")):
5344  class Foo;
5345  typedef Foo X;
5346  class Bar : public Foo {};  // derived from a type that X is a typedef of
5347</pre></td></tr>
5348
5349
5350<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>
5351<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5352match Base.
5353</pre></td></tr>
5354
5355
5356<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>
5357<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5358expression, or an ObjC-message-send expression.
5359
5360Given
5361  void x(int, int, int) { int y; x(1, y, 42); }
5362callExpr(hasAnyArgument(declRefExpr()))
5363  matches x(1, y, 42)
5364with hasAnyArgument(...)
5365  matching y
5366
5367For ObjectiveC, given
5368  @interface I - (void) f:(int) y; @end
5369  void foo(I *i) { [i f:12]; }
5370objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5371  matches [i f:12]
5372</pre></td></tr>
5373
5374
5375<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>
5376<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5377given matcher.
5378
5379Example matches y.x() (matcher = callExpr(callee(
5380                                   cxxMethodDecl(hasName("x")))))
5381  class Y { public: void x(); };
5382  void z() { Y y; y.x(); }
5383</pre></td></tr>
5384
5385
5386<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>
5387<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5388
5389Given
5390  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5391  void f() { f(); }
5392callExpr(callee(expr()))
5393  matches this-&gt;x(), x(), y.x(), f()
5394with callee(...)
5395  matching this-&gt;x, x, y.x, f respectively
5396
5397Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
5398because this introduces ambiguous overloads with calls to Callee taking a
5399internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
5400implemented in terms of implicit casts.
5401</pre></td></tr>
5402
5403
5404<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>
5405<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5406
5407Given
5408  void f(int i);
5409  int y;
5410  f(y);
5411callExpr(
5412  forEachArgumentWithParam(
5413    declRefExpr(to(varDecl(hasName("y")))),
5414    parmVarDecl(hasType(isInteger()))
5415))
5416  matches f(y);
5417with declRefExpr(...)
5418  matching int y
5419and parmVarDecl(...)
5420  matching int i
5421</pre></td></tr>
5422
5423
5424<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>
5425<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5426expression, or an ObjC-message-send expression.
5427
5428Given
5429  void x(int, int, int) { int y; x(1, y, 42); }
5430callExpr(hasAnyArgument(declRefExpr()))
5431  matches x(1, y, 42)
5432with hasAnyArgument(...)
5433  matching y
5434
5435For ObjectiveC, given
5436  @interface I - (void) f:(int) y; @end
5437  void foo(I *i) { [i f:12]; }
5438objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5439  matches [i f:12]
5440</pre></td></tr>
5441
5442
5443<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>
5444<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5445call expression.
5446
5447Example matches y in x(y)
5448    (matcher = callExpr(hasArgument(0, declRefExpr())))
5449  void x(int) { int y; x(y); }
5450</pre></td></tr>
5451
5452
5453<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration14')"><a name="hasDeclaration14Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5454<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5455matches the given matcher.
5456
5457The associated declaration is:
5458- for type nodes, the declaration of the underlying type
5459- for CallExpr, the declaration of the callee
5460- for MemberExpr, the declaration of the referenced member
5461- for CXXConstructExpr, the declaration of the constructor
5462- for CXXNewExpr, the declaration of the operator new
5463- for ObjCIvarExpr, the declaration of the ivar
5464
5465For type nodes, hasDeclaration will generally match the declaration of the
5466sugared type. Given
5467  class X {};
5468  typedef X Y;
5469  Y y;
5470in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5471typedefDecl. A common use case is to match the underlying, desugared type.
5472This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5473  varDecl(hasType(hasUnqualifiedDesugaredType(
5474      recordType(hasDeclaration(decl())))))
5475In this matcher, the decl will match the CXXRecordDecl of class X.
5476
5477Usable 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;,
5478  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;,
5479  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;,
5480  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;,
5481  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;,
5482  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;,
5483  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5484</pre></td></tr>
5485
5486
5487<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>
5488<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5489extension, matches the constant given in the statement.
5490
5491Given
5492  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5493caseStmt(hasCaseConstant(integerLiteral()))
5494  matches "case 1:"
5495</pre></td></tr>
5496
5497
5498<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>
5499<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5500or opaque value's source expression matches the given matcher.
5501
5502Example 1: matches "a string"
5503(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5504class URL { URL(string); };
5505URL url = "a string";
5506
5507Example 2: matches 'b' (matcher =
5508opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5509int a = b ?: 1;
5510</pre></td></tr>
5511
5512
5513<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>
5514<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5515functionDecl that have at least one TemplateArgument matching the given
5516InnerMatcher.
5517
5518Given
5519  template&lt;typename T&gt; class A {};
5520  template&lt;&gt; class A&lt;double&gt; {};
5521  A&lt;int&gt; a;
5522
5523  template&lt;typename T&gt; f() {};
5524  void func() { f&lt;int&gt;(); };
5525
5526classTemplateSpecializationDecl(hasAnyTemplateArgument(
5527    refersToType(asString("int"))))
5528  matches the specialization A&lt;int&gt;
5529
5530functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5531  matches the specialization f&lt;int&gt;
5532</pre></td></tr>
5533
5534
5535<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>
5536<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5537
5538Given
5539  template&lt;typename T&gt; class A {}; #1
5540  template&lt;&gt; class A&lt;int&gt; {}; #2
5541classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
5542  matches '#2' with classTemplateDecl() matching the class template
5543  declaration of 'A' at #1.
5544</pre></td></tr>
5545
5546
5547<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>
5548<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5549functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5550
5551Given
5552  template&lt;typename T, typename U&gt; class A {};
5553  A&lt;bool, int&gt; b;
5554  A&lt;int, bool&gt; c;
5555
5556  template&lt;typename T&gt; void f() {}
5557  void func() { f&lt;int&gt;(); };
5558classTemplateSpecializationDecl(hasTemplateArgument(
5559    1, refersToType(asString("int"))))
5560  matches the specialization A&lt;bool, int&gt;
5561
5562functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5563  matches the specialization f&lt;int&gt;
5564</pre></td></tr>
5565
5566
5567<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>
5568<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5569type.
5570
5571Given
5572  struct A {};
5573  A a[7];
5574  int b[7];
5575arrayType(hasElementType(builtinType()))
5576  matches "int b[7]"
5577
5578Usable 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;
5579</pre></td></tr>
5580
5581
5582<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>
5583<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
5584a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5585
5586Given
5587  { {}; 1+2; }
5588hasAnySubstatement(compoundStmt())
5589  matches '{ {}; 1+2; }'
5590with compoundStmt()
5591  matching '{}'
5592</pre></td></tr>
5593
5594
5595<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>
5596<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5597</pre></td></tr>
5598
5599
5600<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration11')"><a name="hasDeclaration11Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5601<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
5602matches the given matcher.
5603
5604The associated declaration is:
5605- for type nodes, the declaration of the underlying type
5606- for CallExpr, the declaration of the callee
5607- for MemberExpr, the declaration of the referenced member
5608- for CXXConstructExpr, the declaration of the constructor
5609- for CXXNewExpr, the declaration of the operator new
5610- for ObjCIvarExpr, the declaration of the ivar
5611
5612For type nodes, hasDeclaration will generally match the declaration of the
5613sugared type. Given
5614  class X {};
5615  typedef X Y;
5616  Y y;
5617in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5618typedefDecl. A common use case is to match the underlying, desugared type.
5619This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5620  varDecl(hasType(hasUnqualifiedDesugaredType(
5621      recordType(hasDeclaration(decl())))))
5622In this matcher, the decl will match the CXXRecordDecl of class X.
5623
5624Usable 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;,
5625  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;,
5626  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;,
5627  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;,
5628  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;,
5629  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;,
5630  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5631</pre></td></tr>
5632
5633
5634<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>
5635<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5636specific using shadow declaration.
5637
5638Given
5639  namespace a { void f() {} }
5640  using a::f;
5641  void g() {
5642    f();     // Matches this ..
5643    a::f();  // .. but not this.
5644  }
5645declRefExpr(throughUsingDecl(anything()))
5646  matches f()
5647</pre></td></tr>
5648
5649
5650<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>
5651<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5652specified matcher.
5653
5654Example matches x in if(x)
5655    (matcher = declRefExpr(to(varDecl(hasName("x")))))
5656  bool x;
5657  if (x) {}
5658</pre></td></tr>
5659
5660
5661<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>
5662<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5663
5664Note that this does not work for global declarations because the AST
5665breaks up multiple-declaration DeclStmt's into multiple single-declaration
5666DeclStmt's.
5667Example: Given non-global declarations
5668  int a, b = 0;
5669  int c;
5670  int d = 2, e;
5671declStmt(containsDeclaration(
5672      0, varDecl(hasInitializer(anything()))))
5673  matches only 'int d = 2, e;', and
5674declStmt(containsDeclaration(1, varDecl()))
5675  matches 'int a, b = 0' as well as 'int d = 2, e;'
5676  but 'int c;' is not matched.
5677</pre></td></tr>
5678
5679
5680<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>
5681<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5682
5683Given
5684  int a, b;
5685  int c;
5686declStmt(hasSingleDecl(anything()))
5687  matches 'int c;' but not 'int a, b;'.
5688</pre></td></tr>
5689
5690
5691<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>
5692<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5693the inner matcher.
5694
5695Given
5696  int x;
5697declaratorDecl(hasTypeLoc(loc(asString("int"))))
5698  matches int x
5699</pre></td></tr>
5700
5701
5702<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>
5703<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5704Decl, matches InnerMatcher.
5705
5706Given
5707  namespace N {
5708    namespace M {
5709      class D {};
5710    }
5711  }
5712
5713cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5714declaration of class D.
5715</pre></td></tr>
5716
5717
5718<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>
5719<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5720
5721Given
5722  decltype(1) a = 1;
5723  decltype(2.0) b = 2.0;
5724decltypeType(hasUnderlyingType(isInteger()))
5725  matches the type of "a"
5726
5727Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
5728</pre></td></tr>
5729
5730
5731<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>
5732<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5733definition that has a given body.
5734
5735Given
5736  for (;;) {}
5737hasBody(compoundStmt())
5738  matches 'for (;;) {}'
5739with compoundStmt()
5740  matching '{}'
5741</pre></td></tr>
5742
5743
5744<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>
5745<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
5746switch statement or conditional operator.
5747
5748Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5749  if (true) {}
5750</pre></td></tr>
5751
5752
5753<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>
5754<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5755matches InnerMatcher if the qualifier exists.
5756
5757Given
5758  namespace N {
5759    namespace M {
5760      class D {};
5761    }
5762  }
5763  N::M::D d;
5764
5765elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5766matches the type of the variable declaration of d.
5767</pre></td></tr>
5768
5769
5770<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>
5771<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5772
5773Given
5774  namespace N {
5775    namespace M {
5776      class D {};
5777    }
5778  }
5779  N::M::D d;
5780
5781elaboratedType(namesType(recordType(
5782hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5783declaration of d.
5784</pre></td></tr>
5785
5786
5787<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration10')"><a name="hasDeclaration10Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
5788<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
5789matches the given matcher.
5790
5791The associated declaration is:
5792- for type nodes, the declaration of the underlying type
5793- for CallExpr, the declaration of the callee
5794- for MemberExpr, the declaration of the referenced member
5795- for CXXConstructExpr, the declaration of the constructor
5796- for CXXNewExpr, the declaration of the operator new
5797- for ObjCIvarExpr, the declaration of the ivar
5798
5799For type nodes, hasDeclaration will generally match the declaration of the
5800sugared type. Given
5801  class X {};
5802  typedef X Y;
5803  Y y;
5804in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5805typedefDecl. A common use case is to match the underlying, desugared type.
5806This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5807  varDecl(hasType(hasUnqualifiedDesugaredType(
5808      recordType(hasDeclaration(decl())))))
5809In this matcher, the decl will match the CXXRecordDecl of class X.
5810
5811Usable 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;,
5812  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;,
5813  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;,
5814  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;,
5815  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;,
5816  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;,
5817  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5818</pre></td></tr>
5819
5820
5821<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>
5822<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
5823
5824(Note: Clang's AST refers to other conversions as "casts" too, and calls
5825actual casts "explicit" casts.)
5826</pre></td></tr>
5827
5828
5829<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>
5830<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
5831declaration's type.
5832
5833In case of a value declaration (for example a variable declaration),
5834this resolves one layer of indirection. For example, in the value
5835declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
5836X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
5837declaration of x.
5838
5839Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5840            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5841            and friend class X (matcher = friendDecl(hasType("X"))
5842 class X {};
5843 void y(X &amp;x) { x; X z; }
5844 class Y { friend class X; };
5845
5846Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
5847</pre></td></tr>
5848
5849
5850<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>
5851<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
5852matcher.
5853
5854Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5855            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
5856            and U (matcher = typedefDecl(hasType(asString("int")))
5857            and friend class X (matcher = friendDecl(hasType("X"))
5858 class X {};
5859 void y(X &amp;x) { x; X z; }
5860 typedef int U;
5861 class Y { friend class X; };
5862</pre></td></tr>
5863
5864
5865<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>
5866<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
5867elidable constructor and other corresponding bookkeeping nodes.
5868
5869In C++17, elidable copy constructors are no longer being generated in the
5870AST as it is not permitted by the standard. They are, however, part of the
5871AST in C++14 and earlier. So, a matcher must abstract over these differences
5872to work in all language modes. This matcher skips elidable constructor-call
5873AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
5874various implicit nodes inside the constructor calls, all of which will not
5875appear in the C++17 AST.
5876
5877Given
5878
5879struct H {};
5880H G();
5881void f() {
5882  H D = G();
5883}
5884
5885``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
5886matches ``H D = G()`` in C++11 through C++17 (and beyond).
5887</pre></td></tr>
5888
5889
5890<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>
5891<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
5892are stripped off.
5893
5894Parentheses and explicit casts are not discarded.
5895Given
5896  int arr[5];
5897  int a = 0;
5898  char b = 0;
5899  const int c = a;
5900  int *d = arr;
5901  long e = (long) 0l;
5902The matchers
5903   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
5904   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
5905would match the declarations for a, b, c, and d, but not e.
5906While
5907   varDecl(hasInitializer(integerLiteral()))
5908   varDecl(hasInitializer(declRefExpr()))
5909only match the declarations for b, c, and d.
5910</pre></td></tr>
5911
5912
5913<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>
5914<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
5915nodes are stripped off.
5916
5917Parentheses and explicit casts are not discarded.
5918Given
5919  class C {};
5920  C a = C();
5921  C b;
5922  C c = b;
5923The matchers
5924   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
5925would match the declarations for a, b, and c.
5926While
5927   varDecl(hasInitializer(cxxConstructExpr()))
5928only match the declarations for b and c.
5929</pre></td></tr>
5930
5931
5932<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>
5933<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
5934casts are stripped off.
5935
5936Implicit and non-C Style casts are also discarded.
5937Given
5938  int a = 0;
5939  char b = (0);
5940  void* c = reinterpret_cast&lt;char*&gt;(0);
5941  char d = char(0);
5942The matcher
5943   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
5944would match the declarations for a, b, c, and d.
5945while
5946   varDecl(hasInitializer(integerLiteral()))
5947only match the declaration for a.
5948</pre></td></tr>
5949
5950
5951<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>
5952<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
5953parentheses are stripped off.
5954
5955Explicit casts are not discarded.
5956Given
5957  int arr[5];
5958  int a = 0;
5959  char b = (0);
5960  const int c = a;
5961  int *d = (arr);
5962  long e = ((long) 0l);
5963The matchers
5964   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
5965   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
5966would match the declarations for a, b, c, and d, but not e.
5967while
5968   varDecl(hasInitializer(integerLiteral()))
5969   varDecl(hasInitializer(declRefExpr()))
5970would only match the declaration for a.
5971</pre></td></tr>
5972
5973
5974<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>
5975<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
5976
5977Given
5978  const char* str = ("my-string");
5979The matcher
5980  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
5981would match the implicit cast resulting from the assignment.
5982</pre></td></tr>
5983
5984
5985<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>
5986<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
5987
5988Given
5989  class C {
5990    int a = 2;
5991    int b = 3;
5992    int c;
5993  };
5994fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
5995  matches 'int a;' but not 'int b;'.
5996fieldDecl(hasInClassInitializer(anything()))
5997  matches 'int a;' and 'int b;' but not 'int c;'.
5998</pre></td></tr>
5999
6000
6001<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>
6002<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
6003definition that has a given body.
6004
6005Given
6006  for (;;) {}
6007hasBody(compoundStmt())
6008  matches 'for (;;) {}'
6009with compoundStmt()
6010  matching '{}'
6011</pre></td></tr>
6012
6013
6014<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>
6015<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
6016switch statement or conditional operator.
6017
6018Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6019  if (true) {}
6020</pre></td></tr>
6021
6022
6023<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>
6024<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
6025
6026Example:
6027    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
6028matches '++x' in
6029    for (x; x &lt; N; ++x) { }
6030</pre></td></tr>
6031
6032
6033<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>
6034<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
6035
6036Example:
6037    forStmt(hasLoopInit(declStmt()))
6038matches 'int x = 0' in
6039    for (int x = 0; x &lt; N; ++x) { }
6040</pre></td></tr>
6041
6042
6043<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>
6044<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
6045declaration's type.
6046
6047In case of a value declaration (for example a variable declaration),
6048this resolves one layer of indirection. For example, in the value
6049declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6050X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6051declaration of x.
6052
6053Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6054            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6055            and friend class X (matcher = friendDecl(hasType("X"))
6056 class X {};
6057 void y(X &amp;x) { x; X z; }
6058 class Y { friend class X; };
6059
6060Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
6061</pre></td></tr>
6062
6063
6064<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>
6065<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6066matcher.
6067
6068Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6069            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6070            and U (matcher = typedefDecl(hasType(asString("int")))
6071            and friend class X (matcher = friendDecl(hasType("X"))
6072 class X {};
6073 void y(X &amp;x) { x; X z; }
6074 typedef int U;
6075 class Y { friend class X; };
6076</pre></td></tr>
6077
6078
6079<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>
6080<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6081block.
6082
6083Does not match the 'this' parameter of a method.
6084
6085Given
6086  class X { void f(int x, int y, int z) {} };
6087cxxMethodDecl(hasAnyParameter(hasName("y")))
6088  matches f(int x, int y, int z) {}
6089with hasAnyParameter(...)
6090  matching int y
6091
6092For ObjectiveC, given
6093  @interface I - (void) f:(int) y; @end
6094
6095the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6096matches the declaration of method f with hasParameter
6097matching y.
6098
6099For blocks, given
6100  b = ^(int y) { printf("%d", y) };
6101
6102the matcher blockDecl(hasAnyParameter(hasName("y")))
6103matches the declaration of the block b with hasParameter
6104matching y.
6105</pre></td></tr>
6106
6107
6108<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('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>
6109<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6110functionDecl that have at least one TemplateArgument matching the given
6111InnerMatcher.
6112
6113Given
6114  template&lt;typename T&gt; class A {};
6115  template&lt;&gt; class A&lt;double&gt; {};
6116  A&lt;int&gt; a;
6117
6118  template&lt;typename T&gt; f() {};
6119  void func() { f&lt;int&gt;(); };
6120
6121classTemplateSpecializationDecl(hasAnyTemplateArgument(
6122    refersToType(asString("int"))))
6123  matches the specialization A&lt;int&gt;
6124
6125functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6126  matches the specialization f&lt;int&gt;
6127</pre></td></tr>
6128
6129
6130<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>
6131<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
6132definition that has a given body.
6133
6134Given
6135  for (;;) {}
6136hasBody(compoundStmt())
6137  matches 'for (;;) {}'
6138with compoundStmt()
6139  matching '{}'
6140</pre></td></tr>
6141
6142
6143<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>
6144<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6145declaration.
6146
6147Given
6148  template&lt;bool b&gt;
6149  struct S {
6150    S(int); // #1
6151    explicit S(double); // #2
6152    operator int(); // #3
6153    explicit operator bool(); // #4
6154    explicit(false) S(bool) // # 7
6155    explicit(true) S(char) // # 8
6156    explicit(b) S(S) // # 9
6157  };
6158  S(int) -&gt; S&lt;true&gt; // #5
6159  explicit S(double) -&gt; S&lt;false&gt; // #6
6160cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6161cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6162cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6163</pre></td></tr>
6164
6165
6166<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>
6167<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6168declaration or a block.
6169
6170Given
6171  class X { void f(int x) {} };
6172cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6173  matches f(int x) {}
6174with hasParameter(...)
6175  matching int x
6176
6177For ObjectiveC, given
6178  @interface I - (void) f:(int) y; @end
6179
6180the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6181matches the declaration of method f with hasParameter
6182matching y.
6183</pre></td></tr>
6184
6185
6186<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>
6187<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6188functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6189
6190Given
6191  template&lt;typename T, typename U&gt; class A {};
6192  A&lt;bool, int&gt; b;
6193  A&lt;int, bool&gt; c;
6194
6195  template&lt;typename T&gt; void f() {}
6196  void func() { f&lt;int&gt;(); };
6197classTemplateSpecializationDecl(hasTemplateArgument(
6198    1, refersToType(asString("int"))))
6199  matches the specialization A&lt;bool, int&gt;
6200
6201functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6202  matches the specialization f&lt;int&gt;
6203</pre></td></tr>
6204
6205
6206<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>
6207<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6208
6209Given:
6210  class X { int f() { return 1; } };
6211cxxMethodDecl(returns(asString("int")))
6212  matches int f() { return 1; }
6213</pre></td></tr>
6214
6215
6216<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>
6217<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6218switch statement or conditional operator.
6219
6220Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6221  if (true) {}
6222</pre></td></tr>
6223
6224
6225<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>
6226<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6227
6228Given
6229  if (A* a = GetAPointer()) {}
6230hasConditionVariableStatement(...)
6231  matches 'A* a = GetAPointer()'.
6232</pre></td></tr>
6233
6234
6235<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>
6236<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6237
6238Examples matches the if statement
6239  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6240  if (false) false; else true;
6241</pre></td></tr>
6242
6243
6244<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>
6245<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
6246
6247Given:
6248 void foo() {
6249   if (int i = foobar(); i &gt; 0) {}
6250   switch (int i = foobar(); i) {}
6251   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6252 }
6253 void bar() {
6254   if (foobar() &gt; 0) {}
6255   switch (foobar()) {}
6256   for (auto&amp; x : get_range()) {}
6257 }
6258ifStmt(hasInitStatement(anything()))
6259  matches the if statement in foo but not in bar.
6260switchStmt(hasInitStatement(anything()))
6261  matches the switch statement in foo but not in bar.
6262cxxForRangeStmt(hasInitStatement(anything()))
6263  matches the range for statement in foo but not in bar.
6264</pre></td></tr>
6265
6266
6267<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>
6268<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6269
6270Examples matches the if statement
6271  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6272  if (false) true; else false;
6273</pre></td></tr>
6274
6275
6276<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>
6277<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6278matcher.
6279
6280FIXME: Unit test this matcher
6281</pre></td></tr>
6282
6283
6284<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>
6285<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6286
6287Example matches y.
6288    (matcher = initListExpr(hasInit(0, expr())))
6289  int x{y}.
6290</pre></td></tr>
6291
6292
6293<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>
6294<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6295(if expression have it).
6296</pre></td></tr>
6297
6298
6299<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration9')"><a name="hasDeclaration9Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6300<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6301matches the given matcher.
6302
6303The associated declaration is:
6304- for type nodes, the declaration of the underlying type
6305- for CallExpr, the declaration of the callee
6306- for MemberExpr, the declaration of the referenced member
6307- for CXXConstructExpr, the declaration of the constructor
6308- for CXXNewExpr, the declaration of the operator new
6309- for ObjCIvarExpr, the declaration of the ivar
6310
6311For type nodes, hasDeclaration will generally match the declaration of the
6312sugared type. Given
6313  class X {};
6314  typedef X Y;
6315  Y y;
6316in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6317typedefDecl. A common use case is to match the underlying, desugared type.
6318This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6319  varDecl(hasType(hasUnqualifiedDesugaredType(
6320      recordType(hasDeclaration(decl())))))
6321In this matcher, the decl will match the CXXRecordDecl of class X.
6322
6323Usable 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;,
6324  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;,
6325  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;,
6326  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;,
6327  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;,
6328  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;,
6329  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6330</pre></td></tr>
6331
6332
6333<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration8')"><a name="hasDeclaration8Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6334<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6335matches the given matcher.
6336
6337The associated declaration is:
6338- for type nodes, the declaration of the underlying type
6339- for CallExpr, the declaration of the callee
6340- for MemberExpr, the declaration of the referenced member
6341- for CXXConstructExpr, the declaration of the constructor
6342- for CXXNewExpr, the declaration of the operator new
6343- for ObjCIvarExpr, the declaration of the ivar
6344
6345For type nodes, hasDeclaration will generally match the declaration of the
6346sugared type. Given
6347  class X {};
6348  typedef X Y;
6349  Y y;
6350in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6351typedefDecl. A common use case is to match the underlying, desugared type.
6352This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6353  varDecl(hasType(hasUnqualifiedDesugaredType(
6354      recordType(hasDeclaration(decl())))))
6355In this matcher, the decl will match the CXXRecordDecl of class X.
6356
6357Usable 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;,
6358  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;,
6359  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;,
6360  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;,
6361  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;,
6362  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;,
6363  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6364</pre></td></tr>
6365
6366
6367<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration7')"><a name="hasDeclaration7Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6368<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6369matches the given matcher.
6370
6371The associated declaration is:
6372- for type nodes, the declaration of the underlying type
6373- for CallExpr, the declaration of the callee
6374- for MemberExpr, the declaration of the referenced member
6375- for CXXConstructExpr, the declaration of the constructor
6376- for CXXNewExpr, the declaration of the operator new
6377- for ObjCIvarExpr, the declaration of the ivar
6378
6379For type nodes, hasDeclaration will generally match the declaration of the
6380sugared type. Given
6381  class X {};
6382  typedef X Y;
6383  Y y;
6384in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6385typedefDecl. A common use case is to match the underlying, desugared type.
6386This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6387  varDecl(hasType(hasUnqualifiedDesugaredType(
6388      recordType(hasDeclaration(decl())))))
6389In this matcher, the decl will match the CXXRecordDecl of class X.
6390
6391Usable 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;,
6392  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;,
6393  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;,
6394  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;,
6395  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;,
6396  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;,
6397  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6398</pre></td></tr>
6399
6400
6401<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>
6402<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6403given matcher. Implicit object expressions are included; that is, it matches
6404use of implicit `this`.
6405
6406Given
6407  struct X {
6408    int m;
6409    int f(X x) { x.m; return m; }
6410  };
6411memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6412  matches `x.m`, but not `m`; however,
6413memberExpr(hasObjectExpression(hasType(pointsTo(
6414     cxxRecordDecl(hasName("X"))))))
6415  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6416</pre></td></tr>
6417
6418
6419<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>
6420<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6421given matcher.
6422
6423Given
6424  struct { int first, second; } first, second;
6425  int i(second.first);
6426  int j(first.second);
6427memberExpr(member(hasName("first")))
6428  matches second.first
6429  but not first.second (because the member name there is "second").
6430</pre></td></tr>
6431
6432
6433<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>
6434<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6435pointee matches a given matcher.
6436
6437Given
6438  int *a;
6439  int const *b;
6440  float const *f;
6441pointerType(pointee(isConstQualified(), isInteger()))
6442  matches "int const *b"
6443
6444Usable 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;,
6445  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;
6446</pre></td></tr>
6447
6448
6449<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>
6450<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6451matcher.
6452
6453Given
6454  namespace N { template&lt;class T&gt; void f(T t); }
6455  template &lt;class T&gt; void g() { using N::f; f(T()); }
6456unresolvedLookupExpr(hasAnyDeclaration(
6457    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6458  matches the use of f in g() .
6459</pre></td></tr>
6460
6461
6462<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>
6463<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6464
6465Given
6466  struct A { struct B { struct C {}; }; };
6467  A::B::C c;
6468nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6469  matches "A::"
6470</pre></td></tr>
6471
6472
6473<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>
6474<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6475given TypeLoc.
6476
6477Given
6478  struct A { struct B { struct C {}; }; };
6479  A::B::C c;
6480nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6481  hasDeclaration(cxxRecordDecl(hasName("A")))))))
6482  matches "A::"
6483</pre></td></tr>
6484
6485
6486<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>
6487<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6488
6489Given
6490  struct A { struct B { struct C {}; }; };
6491  A::B::C c;
6492nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6493  matches "A::"
6494</pre></td></tr>
6495
6496
6497<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>
6498<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6499given namespace matcher.
6500
6501Given
6502  namespace ns { struct A {}; }
6503  ns::A a;
6504nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6505  matches "ns::"
6506</pre></td></tr>
6507
6508
6509<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>
6510<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6511given QualType matcher without qualifiers.
6512
6513Given
6514  struct A { struct B { struct C {}; }; };
6515  A::B::C c;
6516nestedNameSpecifier(specifiesType(
6517  hasDeclaration(cxxRecordDecl(hasName("A")))
6518))
6519  matches "A::"
6520</pre></td></tr>
6521
6522
6523<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>
6524<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6525
6526Given
6527
6528  #pragma omp parallel
6529  #pragma omp parallel default(none)
6530
6531``ompExecutableDirective(hasAnyClause(anything()))`` matches
6532``omp parallel default(none)``.
6533</pre></td></tr>
6534
6535
6536<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>
6537<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6538
6539Prerequisite: the executable directive must not be standalone directive.
6540If it is, it will never match.
6541
6542Given
6543
6544   #pragma omp parallel
6545   ;
6546   #pragma omp parallel
6547   {}
6548
6549``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6550</pre></td></tr>
6551
6552
6553<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>
6554<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
6555matching Base, or Objective-C classes that directly or indirectly
6556subclass a class matching Base.
6557
6558Note that a class is not considered to be derived from itself.
6559
6560Example matches Y, Z, C (Base == hasName("X"))
6561  class X;
6562  class Y : public X {};  // directly derived
6563  class Z : public Y {};  // indirectly derived
6564  typedef X A;
6565  typedef A B;
6566  class C : public B {};  // derived from a typedef of X
6567
6568In the following example, Bar matches isDerivedFrom(hasName("X")):
6569  class Foo;
6570  typedef Foo X;
6571  class Bar : public Foo {};  // derived from a type that X is a typedef of
6572
6573In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6574  @interface NSObject @end
6575  @interface Bar : NSObject @end
6576
6577Usable 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;
6578</pre></td></tr>
6579
6580
6581<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>
6582<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6583matching Base.
6584
6585Note that a class is not considered to be derived from itself.
6586
6587Example matches Y, C (Base == hasName("X"))
6588  class X;
6589  class Y : public X {};  // directly derived
6590  class Z : public Y {};  // indirectly derived
6591  typedef X A;
6592  typedef A B;
6593  class C : public B {};  // derived from a typedef of X
6594
6595In the following example, Bar matches isDerivedFrom(hasName("X")):
6596  class Foo;
6597  typedef Foo X;
6598  class Bar : public Foo {};  // derived from a type that X is a typedef of
6599</pre></td></tr>
6600
6601
6602<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>
6603<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6604match Base.
6605</pre></td></tr>
6606
6607
6608<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>
6609<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
6610expression, or an ObjC-message-send expression.
6611
6612Given
6613  void x(int, int, int) { int y; x(1, y, 42); }
6614callExpr(hasAnyArgument(declRefExpr()))
6615  matches x(1, y, 42)
6616with hasAnyArgument(...)
6617  matching y
6618
6619For ObjectiveC, given
6620  @interface I - (void) f:(int) y; @end
6621  void foo(I *i) { [i f:12]; }
6622objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6623  matches [i f:12]
6624</pre></td></tr>
6625
6626
6627<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;</td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
6628<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6629call expression.
6630
6631Example matches y in x(y)
6632    (matcher = callExpr(hasArgument(0, declRefExpr())))
6633  void x(int) { int y; x(y); }
6634</pre></td></tr>
6635
6636
6637<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>
6638<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
6639and the inner matcher matches on that instance.
6640
6641For example the method call in
6642  NSString *x = @"hello";
6643  [x containsString:@"h"];
6644is matched by
6645objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
6646</pre></td></tr>
6647
6648
6649<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>
6650<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
6651
6652Example
6653matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
6654matches the [webView ...] message invocation.
6655  NSString *webViewJavaScript = ...
6656  UIWebView *webView = ...
6657  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
6658</pre></td></tr>
6659
6660
6661<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>
6662<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
6663block.
6664
6665Does not match the 'this' parameter of a method.
6666
6667Given
6668  class X { void f(int x, int y, int z) {} };
6669cxxMethodDecl(hasAnyParameter(hasName("y")))
6670  matches f(int x, int y, int z) {}
6671with hasAnyParameter(...)
6672  matching int y
6673
6674For ObjectiveC, given
6675  @interface I - (void) f:(int) y; @end
6676
6677the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6678matches the declaration of method f with hasParameter
6679matching y.
6680
6681For blocks, given
6682  b = ^(int y) { printf("%d", y) };
6683
6684the matcher blockDecl(hasAnyParameter(hasName("y")))
6685matches the declaration of the block b with hasParameter
6686matching y.
6687</pre></td></tr>
6688
6689
6690<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>
6691<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
6692declaration or a block.
6693
6694Given
6695  class X { void f(int x) {} };
6696cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6697  matches f(int x) {}
6698with hasParameter(...)
6699  matching int x
6700
6701For ObjectiveC, given
6702  @interface I - (void) f:(int) y; @end
6703
6704the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6705matches the declaration of method f with hasParameter
6706matching y.
6707</pre></td></tr>
6708
6709
6710<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>
6711<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
6712or opaque value's source expression matches the given matcher.
6713
6714Example 1: matches "a string"
6715(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6716class URL { URL(string); };
6717URL url = "a string";
6718
6719Example 2: matches 'b' (matcher =
6720opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6721int a = b ?: 1;
6722</pre></td></tr>
6723
6724
6725<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>
6726<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6727overloads matches the given matcher.
6728
6729Given
6730  template &lt;typename T&gt; void foo(T);
6731  template &lt;typename T&gt; void bar(T);
6732  template &lt;typename T&gt; void baz(T t) {
6733    foo(t);
6734    bar(t);
6735  }
6736unresolvedLookupExpr(hasAnyDeclaration(
6737    functionTemplateDecl(hasName("foo"))))
6738  matches foo in foo(t); but not bar in bar(t);
6739</pre></td></tr>
6740
6741
6742<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>
6743<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6744
6745Given
6746  int (*ptr_to_array)[4];
6747  int (*ptr_to_func)(int);
6748
6749varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6750ptr_to_func but not ptr_to_array.
6751
6752Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
6753</pre></td></tr>
6754
6755
6756<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>
6757<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6758pointee matches a given matcher.
6759
6760Given
6761  int *a;
6762  int const *b;
6763  float const *f;
6764pointerType(pointee(isConstQualified(), isInteger()))
6765  matches "int const *b"
6766
6767Usable 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;,
6768  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;
6769</pre></td></tr>
6770
6771
6772<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>
6773<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
6774
6775Given:
6776  typedef int &amp;int_ref;
6777  int a;
6778  int_ref b = a;
6779
6780varDecl(hasType(qualType(referenceType()))))) will not match the
6781declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
6782</pre></td></tr>
6783
6784
6785<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration6')"><a name="hasDeclaration6Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6786<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
6787matches the given matcher.
6788
6789The associated declaration is:
6790- for type nodes, the declaration of the underlying type
6791- for CallExpr, the declaration of the callee
6792- for MemberExpr, the declaration of the referenced member
6793- for CXXConstructExpr, the declaration of the constructor
6794- for CXXNewExpr, the declaration of the operator new
6795- for ObjCIvarExpr, the declaration of the ivar
6796
6797For type nodes, hasDeclaration will generally match the declaration of the
6798sugared type. Given
6799  class X {};
6800  typedef X Y;
6801  Y y;
6802in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6803typedefDecl. A common use case is to match the underlying, desugared type.
6804This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6805  varDecl(hasType(hasUnqualifiedDesugaredType(
6806      recordType(hasDeclaration(decl())))))
6807In this matcher, the decl will match the CXXRecordDecl of class X.
6808
6809Usable 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;,
6810  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;,
6811  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;,
6812  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;,
6813  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;,
6814  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;,
6815  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6816</pre></td></tr>
6817
6818
6819<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>
6820<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
6821
6822Given
6823  void (*fp)(void);
6824The matcher
6825  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
6826would match the declaration for fp.
6827</pre></td></tr>
6828
6829
6830<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>
6831<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
6832</pre></td></tr>
6833
6834
6835<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>
6836<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
6837matches the specified matcher.
6838
6839Example matches y-&gt;x()
6840  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
6841     cxxRecordDecl(hasName("Y")))))))
6842  class Y { public: void x(); };
6843  void z() { Y *y; y-&gt;x(); }
6844</pre></td></tr>
6845
6846
6847<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>
6848<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
6849</pre></td></tr>
6850
6851
6852<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>
6853<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
6854type matches the specified matcher.
6855
6856Example matches X &amp;x and const X &amp;y
6857    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
6858  class X {
6859    void a(X b) {
6860      X &amp;x = b;
6861      const X &amp;y = b;
6862    }
6863  };
6864</pre></td></tr>
6865
6866
6867<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration5')"><a name="hasDeclaration5Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
6868<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
6869matches the given matcher.
6870
6871The associated declaration is:
6872- for type nodes, the declaration of the underlying type
6873- for CallExpr, the declaration of the callee
6874- for MemberExpr, the declaration of the referenced member
6875- for CXXConstructExpr, the declaration of the constructor
6876- for CXXNewExpr, the declaration of the operator new
6877- for ObjCIvarExpr, the declaration of the ivar
6878
6879For type nodes, hasDeclaration will generally match the declaration of the
6880sugared type. Given
6881  class X {};
6882  typedef X Y;
6883  Y y;
6884in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6885typedefDecl. A common use case is to match the underlying, desugared type.
6886This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6887  varDecl(hasType(hasUnqualifiedDesugaredType(
6888      recordType(hasDeclaration(decl())))))
6889In this matcher, the decl will match the CXXRecordDecl of class X.
6890
6891Usable 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;,
6892  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;,
6893  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;,
6894  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;,
6895  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;,
6896  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;,
6897  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6898</pre></td></tr>
6899
6900
6901<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>
6902<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
6903pointee matches a given matcher.
6904
6905Given
6906  int *a;
6907  int const *b;
6908  float const *f;
6909pointerType(pointee(isConstQualified(), isInteger()))
6910  matches "int const *b"
6911
6912Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
6913  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
6914</pre></td></tr>
6915
6916
6917<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_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>
6918<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
6919
6920Given
6921  return a + b;
6922hasReturnValue(binaryOperator())
6923  matches 'return a + b'
6924with binaryOperator()
6925  matching 'a + b'
6926</pre></td></tr>
6927
6928
6929<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>
6930<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
6931a given matcher. Also matches StmtExprs that have CompoundStmt as children.
6932
6933Given
6934  { {}; 1+2; }
6935hasAnySubstatement(compoundStmt())
6936  matches '{ {}; 1+2; }'
6937with compoundStmt()
6938  matching '{}'
6939</pre></td></tr>
6940
6941
6942<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('alignOfExpr0')"><a name="alignOfExpr0Anchor">alignOfExpr</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
6943<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6944alignof.
6945</pre></td></tr>
6946
6947
6948<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>
6949<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
6950
6951Given:
6952F&amp; operator=(const F&amp; o) {
6953  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
6954  return *this;
6955}
6956returnStmt(forFunction(hasName("operator=")))
6957  matches 'return *this'
6958  but does not match 'return v &gt; 0'
6959</pre></td></tr>
6960
6961
6962<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('sizeOfExpr0')"><a name="sizeOfExpr0Anchor">sizeOfExpr</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;  InnerMatcher</td></tr>
6963<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
6964sizeof.
6965</pre></td></tr>
6966
6967
6968<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>
6969<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
6970type that matches the provided matcher.
6971
6972Given
6973  template &lt;typename T&gt;
6974  double F(T t);
6975  int i;
6976  double j = F(i);
6977
6978substTemplateTypeParmType(hasReplacementType(type())) matches int
6979</pre></td></tr>
6980
6981
6982<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>
6983<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
6984statement. This matcher may produce multiple matches.
6985
6986Given
6987  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
6988switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
6989  matches four times, with "c" binding each of "case 1:", "case 2:",
6990"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
6991"switch (1)", "switch (2)" and "switch (2)".
6992</pre></td></tr>
6993
6994
6995<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>
6996<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
6997switch statement or conditional operator.
6998
6999Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7000  if (true) {}
7001</pre></td></tr>
7002
7003
7004<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>
7005<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
7006
7007Given:
7008 void foo() {
7009   if (int i = foobar(); i &gt; 0) {}
7010   switch (int i = foobar(); i) {}
7011   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7012 }
7013 void bar() {
7014   if (foobar() &gt; 0) {}
7015   switch (foobar()) {}
7016   for (auto&amp; x : get_range()) {}
7017 }
7018ifStmt(hasInitStatement(anything()))
7019  matches the if statement in foo but not in bar.
7020switchStmt(hasInitStatement(anything()))
7021  matches the switch statement in foo but not in bar.
7022cxxForRangeStmt(hasInitStatement(anything()))
7023  matches the range for statement in foo but not in bar.
7024</pre></td></tr>
7025
7026
7027<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration4')"><a name="hasDeclaration4Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7028<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
7029matches the given matcher.
7030
7031The associated declaration is:
7032- for type nodes, the declaration of the underlying type
7033- for CallExpr, the declaration of the callee
7034- for MemberExpr, the declaration of the referenced member
7035- for CXXConstructExpr, the declaration of the constructor
7036- for CXXNewExpr, the declaration of the operator new
7037- for ObjCIvarExpr, the declaration of the ivar
7038
7039For type nodes, hasDeclaration will generally match the declaration of the
7040sugared type. Given
7041  class X {};
7042  typedef X Y;
7043  Y y;
7044in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7045typedefDecl. A common use case is to match the underlying, desugared type.
7046This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7047  varDecl(hasType(hasUnqualifiedDesugaredType(
7048      recordType(hasDeclaration(decl())))))
7049In this matcher, the decl will match the CXXRecordDecl of class X.
7050
7051Usable 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;,
7052  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;,
7053  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;,
7054  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;,
7055  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;,
7056  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;,
7057  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7058</pre></td></tr>
7059
7060
7061<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>
7062<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
7063
7064Given
7065  struct B { int next; };
7066  template&lt;int(B::*next_ptr)&gt; struct A {};
7067  A&lt;&amp;B::next&gt; a;
7068templateSpecializationType(hasAnyTemplateArgument(
7069  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
7070  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7071    B::next
7072</pre></td></tr>
7073
7074
7075<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>
7076<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
7077declaration.
7078
7079Given
7080  struct B { int next; };
7081  template&lt;int(B::*next_ptr)&gt; struct A {};
7082  A&lt;&amp;B::next&gt; a;
7083classTemplateSpecializationDecl(hasAnyTemplateArgument(
7084    refersToDeclaration(fieldDecl(hasName("next")))))
7085  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7086    B::next
7087</pre></td></tr>
7088
7089
7090<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>
7091<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
7092
7093Given
7094  template&lt;int T&gt; struct C {};
7095  C&lt;42&gt; c;
7096classTemplateSpecializationDecl(
7097  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
7098  matches the implicit instantiation of C in C&lt;42&gt;.
7099</pre></td></tr>
7100
7101
7102<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>
7103<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
7104
7105Given
7106  template&lt;template &lt;typename&gt; class S&gt; class X {};
7107  template&lt;typename T&gt; class Y {};
7108  X&lt;Y&gt; xi;
7109classTemplateSpecializationDecl(hasAnyTemplateArgument(
7110    refersToTemplate(templateName())))
7111  matches the specialization X&lt;Y&gt;
7112</pre></td></tr>
7113
7114
7115<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>
7116<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
7117
7118Given
7119  struct X {};
7120  template&lt;typename T&gt; struct A {};
7121  A&lt;X&gt; a;
7122classTemplateSpecializationDecl(hasAnyTemplateArgument(
7123    refersToType(class(hasName("X")))))
7124  matches the specialization A&lt;X&gt;
7125</pre></td></tr>
7126
7127
7128<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>
7129<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7130functionDecl that have at least one TemplateArgument matching the given
7131InnerMatcher.
7132
7133Given
7134  template&lt;typename T&gt; class A {};
7135  template&lt;&gt; class A&lt;double&gt; {};
7136  A&lt;int&gt; a;
7137
7138  template&lt;typename T&gt; f() {};
7139  void func() { f&lt;int&gt;(); };
7140
7141classTemplateSpecializationDecl(hasAnyTemplateArgument(
7142    refersToType(asString("int"))))
7143  matches the specialization A&lt;int&gt;
7144
7145functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7146  matches the specialization f&lt;int&gt;
7147</pre></td></tr>
7148
7149
7150<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration3')"><a name="hasDeclaration3Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7151<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
7152matches the given matcher.
7153
7154The associated declaration is:
7155- for type nodes, the declaration of the underlying type
7156- for CallExpr, the declaration of the callee
7157- for MemberExpr, the declaration of the referenced member
7158- for CXXConstructExpr, the declaration of the constructor
7159- for CXXNewExpr, the declaration of the operator new
7160- for ObjCIvarExpr, the declaration of the ivar
7161
7162For type nodes, hasDeclaration will generally match the declaration of the
7163sugared type. Given
7164  class X {};
7165  typedef X Y;
7166  Y y;
7167in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7168typedefDecl. A common use case is to match the underlying, desugared type.
7169This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7170  varDecl(hasType(hasUnqualifiedDesugaredType(
7171      recordType(hasDeclaration(decl())))))
7172In this matcher, the decl will match the CXXRecordDecl of class X.
7173
7174Usable 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;,
7175  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;,
7176  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;,
7177  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;,
7178  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;,
7179  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;,
7180  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7181</pre></td></tr>
7182
7183
7184<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>
7185<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7186functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7187
7188Given
7189  template&lt;typename T, typename U&gt; class A {};
7190  A&lt;bool, int&gt; b;
7191  A&lt;int, bool&gt; c;
7192
7193  template&lt;typename T&gt; void f() {}
7194  void func() { f&lt;int&gt;(); };
7195classTemplateSpecializationDecl(hasTemplateArgument(
7196    1, refersToType(asString("int"))))
7197  matches the specialization A&lt;bool, int&gt;
7198
7199functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7200  matches the specialization f&lt;int&gt;
7201</pre></td></tr>
7202
7203
7204<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration2')"><a name="hasDeclaration2Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7205<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7206matches the given matcher.
7207
7208The associated declaration is:
7209- for type nodes, the declaration of the underlying type
7210- for CallExpr, the declaration of the callee
7211- for MemberExpr, the declaration of the referenced member
7212- for CXXConstructExpr, the declaration of the constructor
7213- for CXXNewExpr, the declaration of the operator new
7214- for ObjCIvarExpr, the declaration of the ivar
7215
7216For type nodes, hasDeclaration will generally match the declaration of the
7217sugared type. Given
7218  class X {};
7219  typedef X Y;
7220  Y y;
7221in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7222typedefDecl. A common use case is to match the underlying, desugared type.
7223This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7224  varDecl(hasType(hasUnqualifiedDesugaredType(
7225      recordType(hasDeclaration(decl())))))
7226In this matcher, the decl will match the CXXRecordDecl of class X.
7227
7228Usable 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;,
7229  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;,
7230  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;,
7231  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;,
7232  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;,
7233  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;,
7234  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7235</pre></td></tr>
7236
7237
7238<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>const Matcher&lt;T&gt;  Matcher</td></tr>
7239<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
7240
7241Generates results for each match.
7242
7243For example, in:
7244  class A { class B {}; class C {}; };
7245The matcher:
7246  cxxRecordDecl(hasName("::A"),
7247                findAll(cxxRecordDecl(isDefinition()).bind("m")))
7248will generate results for A, B and C.
7249
7250Usable as: Any Matcher
7251</pre></td></tr>
7252
7253
7254<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('traverse0')"><a name="traverse0Anchor">traverse</a></td><td>ast_type_traits::TraversalKind TK, const Matcher&lt;T&gt;  InnerMatcher</td></tr>
7255<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
7256
7257Given
7258  void foo()
7259  {
7260      int i = 3.0;
7261  }
7262The matcher
7263  traverse(ast_type_traits::TK_IgnoreImplicitCastsAndParentheses,
7264    varDecl(hasInitializer(floatLiteral().bind("init")))
7265  )
7266matches the variable declaration with "init" bound to the "3.0".
7267</pre></td></tr>
7268
7269
7270<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>
7271<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7272matcher.
7273
7274Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7275            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7276            and U (matcher = typedefDecl(hasType(asString("int")))
7277            and friend class X (matcher = friendDecl(hasType("X"))
7278 class X {};
7279 void y(X &amp;x) { x; X z; }
7280 typedef int U;
7281 class Y { friend class X; };
7282</pre></td></tr>
7283
7284
7285<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration1')"><a name="hasDeclaration1Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7286<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7287matches the given matcher.
7288
7289The associated declaration is:
7290- for type nodes, the declaration of the underlying type
7291- for CallExpr, the declaration of the callee
7292- for MemberExpr, the declaration of the referenced member
7293- for CXXConstructExpr, the declaration of the constructor
7294- for CXXNewExpr, the declaration of the operator new
7295- for ObjCIvarExpr, the declaration of the ivar
7296
7297For type nodes, hasDeclaration will generally match the declaration of the
7298sugared type. Given
7299  class X {};
7300  typedef X Y;
7301  Y y;
7302in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7303typedefDecl. A common use case is to match the underlying, desugared type.
7304This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7305  varDecl(hasType(hasUnqualifiedDesugaredType(
7306      recordType(hasDeclaration(decl())))))
7307In this matcher, the decl will match the CXXRecordDecl of class X.
7308
7309Usable 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;,
7310  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;,
7311  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;,
7312  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;,
7313  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;,
7314  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;,
7315  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7316</pre></td></tr>
7317
7318
7319<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>
7320<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7321type of the matched node.
7322
7323For example, in:
7324  class A {};
7325  using B = A;
7326The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7327both B and A.
7328</pre></td></tr>
7329
7330
7331<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>
7332<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7333
7334Given
7335  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7336unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7337  matches sizeof(a) and alignof(c)
7338</pre></td></tr>
7339
7340
7341<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>
7342<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7343
7344Example matches true (matcher = hasUnaryOperand(
7345                                  cxxBoolLiteral(equals(true))))
7346  !true
7347</pre></td></tr>
7348
7349
7350<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>
7351<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7352given matcher. Implicit object expressions are included; that is, it matches
7353use of implicit `this`.
7354
7355Given
7356  struct X {
7357    int m;
7358    int f(X x) { x.m; return m; }
7359  };
7360memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7361  matches `x.m`, but not `m`; however,
7362memberExpr(hasObjectExpression(hasType(pointsTo(
7363     cxxRecordDecl(hasName("X"))))))
7364  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7365</pre></td></tr>
7366
7367
7368<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration0')"><a name="hasDeclaration0Anchor">hasDeclaration</a></td><td>const Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;  InnerMatcher</td></tr>
7369<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7370matches the given matcher.
7371
7372The associated declaration is:
7373- for type nodes, the declaration of the underlying type
7374- for CallExpr, the declaration of the callee
7375- for MemberExpr, the declaration of the referenced member
7376- for CXXConstructExpr, the declaration of the constructor
7377- for CXXNewExpr, the declaration of the operator new
7378- for ObjCIvarExpr, the declaration of the ivar
7379
7380For type nodes, hasDeclaration will generally match the declaration of the
7381sugared type. Given
7382  class X {};
7383  typedef X Y;
7384  Y y;
7385in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7386typedefDecl. A common use case is to match the underlying, desugared type.
7387This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7388  varDecl(hasType(hasUnqualifiedDesugaredType(
7389      recordType(hasDeclaration(decl())))))
7390In this matcher, the decl will match the CXXRecordDecl of class X.
7391
7392Usable 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;,
7393  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;,
7394  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;,
7395  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;,
7396  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;,
7397  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;,
7398  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7399</pre></td></tr>
7400
7401
7402<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>
7403<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7404
7405Given
7406  namespace X { void b(); }
7407  using X::b;
7408usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7409  matches using X::b </pre></td></tr>
7410
7411
7412<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>
7413<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7414matched by the given matcher.
7415
7416Given
7417  namespace X { int a; void b(); }
7418  using X::a;
7419  using X::b;
7420usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7421  matches using X::b but not using X::a </pre></td></tr>
7422
7423
7424<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>
7425<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7426declaration's type.
7427
7428In case of a value declaration (for example a variable declaration),
7429this resolves one layer of indirection. For example, in the value
7430declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7431X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7432declaration of x.
7433
7434Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7435            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7436            and friend class X (matcher = friendDecl(hasType("X"))
7437 class X {};
7438 void y(X &amp;x) { x; X z; }
7439 class Y { friend class X; };
7440
7441Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
7442</pre></td></tr>
7443
7444
7445<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>
7446<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7447matcher.
7448
7449Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7450            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7451            and U (matcher = typedefDecl(hasType(asString("int")))
7452            and friend class X (matcher = friendDecl(hasType("X"))
7453 class X {};
7454 void y(X &amp;x) { x; X z; }
7455 typedef int U;
7456 class Y { friend class X; };
7457</pre></td></tr>
7458
7459
7460<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>
7461<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7462that matches the given matcher.
7463
7464Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7465  bool y() { return true; }
7466  bool x = y();
7467</pre></td></tr>
7468
7469
7470<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>
7471<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7472expression.
7473
7474Given
7475  void f(int b) {
7476    int a[b];
7477  }
7478variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7479  varDecl(hasName("b")))))))
7480  matches "int a[b]"
7481</pre></td></tr>
7482
7483
7484<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>
7485<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7486definition that has a given body.
7487
7488Given
7489  for (;;) {}
7490hasBody(compoundStmt())
7491  matches 'for (;;) {}'
7492with compoundStmt()
7493  matching '{}'
7494</pre></td></tr>
7495
7496
7497<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>
7498<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
7499switch statement or conditional operator.
7500
7501Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7502  if (true) {}
7503</pre></td></tr>
7504
7505
7506<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
7507<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
7508NestedNameSpecifier-matcher matches.
7509</pre></td></tr>
7510
7511
7512<tr><td>Matcher&lt;internal::BindableMatcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
7513<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7514QualType-matcher matches.
7515</pre></td></tr>
7516
7517<!--END_TRAVERSAL_MATCHERS -->
7518</table>
7519
7520</div>
7521</body>
7522</html>
7523
7524
7525