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