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., hasCastKind("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_1StringLiteral.html">StringLiteral</a>&gt;</td><td class="name" onclick="toggle('hasSize1')"><a name="hasSize1Anchor">hasSize</a></td><td>unsigned N</td></tr>
4185<tr><td colspan="4" class="doc" id="hasSize1"><pre>Matches nodes that have the specified size.
4186
4187Given
4188  int a[42];
4189  int b[2 * 21];
4190  int c[41], d[43];
4191  char *s = "abcd";
4192  wchar_t *ws = L"abcd";
4193  char *w = "a";
4194constantArrayType(hasSize(42))
4195  matches "int a[42]" and "int b[2 * 21]"
4196stringLiteral(hasSize(4))
4197  matches "abcd", L"abcd"
4198</pre></td></tr>
4199
4200
4201<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>
4202<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches TagDecl object that are spelled with "class."
4203
4204Example matches C, but not S, U or E.
4205  struct S {};
4206  class C {};
4207  union U {};
4208  enum E {};
4209</pre></td></tr>
4210
4211
4212<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>
4213<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
4214
4215Example matches A, va, fa
4216  class A {};
4217  class B;  // Doesn't match, as it has no body.
4218  int va;
4219  extern int vb;  // Doesn't match, as it doesn't define the variable.
4220  void fa() {}
4221  void fb();  // Doesn't match, as it has no body.
4222  @interface X
4223  - (void)ma; // Doesn't match, interface is declaration.
4224  @end
4225  @implementation X
4226  - (void)ma {}
4227  @end
4228
4229Usable 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;,
4230  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4231</pre></td></tr>
4232
4233
4234<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>
4235<tr><td colspan="4" class="doc" id="isEnum0"><pre>Matches TagDecl object that are spelled with "enum."
4236
4237Example matches E, but not C, S or U.
4238  struct S {};
4239  class C {};
4240  union U {};
4241  enum E {};
4242</pre></td></tr>
4243
4244
4245<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>
4246<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches TagDecl object that are spelled with "struct."
4247
4248Example matches S, but not C, U or E.
4249  struct S {};
4250  class C {};
4251  union U {};
4252  enum E {};
4253</pre></td></tr>
4254
4255
4256<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>
4257<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches TagDecl object that are spelled with "union."
4258
4259Example matches U, but not C, S or E.
4260  struct S {};
4261  class C {};
4262  union U {};
4263  enum E {};
4264</pre></td></tr>
4265
4266
4267<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>
4268<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
4269
4270Note that 'Value' is a string as the template argument's value is
4271an arbitrary precision integer. 'Value' must be euqal to the canonical
4272representation of that integral value in base 10.
4273
4274Given
4275  template&lt;int T&gt; struct C {};
4276  C&lt;42&gt; c;
4277classTemplateSpecializationDecl(
4278  hasAnyTemplateArgument(equalsIntegralValue("42")))
4279  matches the implicit instantiation of C in C&lt;42&gt;.
4280</pre></td></tr>
4281
4282
4283<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>
4284<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
4285
4286Given
4287  template&lt;int T&gt; struct C {};
4288  C&lt;42&gt; c;
4289classTemplateSpecializationDecl(
4290  hasAnyTemplateArgument(isIntegral()))
4291  matches the implicit instantiation of C in C&lt;42&gt;
4292  with isIntegral() matching 42.
4293</pre></td></tr>
4294
4295
4296<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>
4297<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
4298
4299Given
4300  template&lt;typename T&gt; struct C {};
4301  C&lt;int&gt; c;
4302classTemplateSpecializationDecl(templateArgumentCountIs(1))
4303  matches C&lt;int&gt;.
4304</pre></td></tr>
4305
4306
4307<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>
4308<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
4309partially matching a given regex.
4310
4311Example matches Y but not X
4312    (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
4313  #include "ASTMatcher.h"
4314  class X {};
4315ASTMatcher.h:
4316  class Y {};
4317
4318Usable 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;
4319</pre></td></tr>
4320
4321
4322<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>
4323<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
4324
4325Example matches X but not Y
4326  (matcher = cxxRecordDecl(isExpansionInMainFile())
4327  #include &lt;Y.h&gt;
4328  class X {};
4329Y.h:
4330  class Y {};
4331
4332Usable 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;
4333</pre></td></tr>
4334
4335
4336<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>
4337<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
4338
4339Example matches Y but not X
4340    (matcher = cxxRecordDecl(isExpansionInSystemHeader())
4341  #include &lt;SystemHeader.h&gt;
4342  class X {};
4343SystemHeader.h:
4344  class Y {};
4345
4346Usable 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;
4347</pre></td></tr>
4348
4349
4350<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>
4351<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
4352
4353Given
4354 struct S { bool func(); };
4355functionDecl(returns(booleanType()))
4356  matches "bool func();"
4357</pre></td></tr>
4358
4359
4360<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>
4361<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
4362
4363Matches a node if it equals the node previously bound to ID.
4364
4365Given
4366  class X { int a; int b; };
4367cxxRecordDecl(
4368    has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
4369    has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
4370  matches the class X, as a and b have the same type.
4371
4372Note that when multiple matches are involved via forEach* matchers,
4373equalsBoundNodes acts as a filter.
4374For example:
4375compoundStmt(
4376    forEachDescendant(varDecl().bind("d")),
4377    forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
4378will trigger a match for each combination of variable declaration
4379and reference to that variable declaration within a compound statement.
4380</pre></td></tr>
4381
4382
4383<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>
4384<tr><td colspan="4" class="doc" id="equalsNode2"><pre>Matches if a node equals another node.
4385
4386Type has pointer identity in the AST.
4387</pre></td></tr>
4388
4389
4390<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>
4391<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
4392
4393Given
4394  int i;
4395  float f;
4396realFloatingPointType()
4397  matches "float f" but not "int i"
4398</pre></td></tr>
4399
4400
4401<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>
4402<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
4403
4404Given
4405 struct S { void func(); };
4406functionDecl(returns(voidType()))
4407  matches "void func();"
4408</pre></td></tr>
4409
4410
4411<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>
4412<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
4413
4414Given
4415  int x;
4416  int s = sizeof(x) + alignof(x)
4417unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
4418  matches sizeof(x)
4419
4420If the matcher is use from clang-query, UnaryExprOrTypeTrait parameter
4421should be passed as a quoted string. e.g., ofKind("UETT_SizeOf").
4422</pre></td></tr>
4423
4424
4425<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>
4426<tr><td colspan="4" class="doc" id="hasAnyOperatorName1"><pre>Matches operator expressions (binary or unary) that have any of the
4427specified names.
4428
4429   hasAnyOperatorName("+", "-")
4430 Is equivalent to
4431   anyOf(hasOperatorName("+"), hasOperatorName("-"))
4432</pre></td></tr>
4433
4434
4435<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>
4436<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
4437unary).
4438
4439Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
4440  !(a || b)
4441</pre></td></tr>
4442
4443
4444<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>
4445<tr><td colspan="4" class="doc" id="isArrow1"><pre>Matches member expressions that are called with '-&gt;' as opposed
4446to '.'.
4447
4448Member calls on the implicit this pointer match as called with '-&gt;'.
4449
4450Given
4451  class Y {
4452    void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
4453    template &lt;class T&gt; void f() { this-&gt;f&lt;T&gt;(); f&lt;T&gt;(); }
4454    int a;
4455    static int b;
4456  };
4457  template &lt;class T&gt;
4458  class Z {
4459    void x() { this-&gt;m; }
4460  };
4461memberExpr(isArrow())
4462  matches this-&gt;x, x, y.x, a, this-&gt;b
4463cxxDependentScopeMemberExpr(isArrow())
4464  matches this-&gt;m
4465unresolvedMemberExpr(isArrow())
4466  matches this-&gt;f&lt;T&gt;, f&lt;T&gt;
4467</pre></td></tr>
4468
4469
4470<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>
4471<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
4472
4473Example matches x, but not y, z, or a.
4474(matcher = varDecl(hasAutomaticStorageDuration())
4475void f() {
4476  int x;
4477  static int y;
4478  thread_local int z;
4479}
4480int a;
4481</pre></td></tr>
4482
4483
4484<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>
4485<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
4486
4487Example matches y and z (matcher = varDecl(hasGlobalStorage())
4488void f() {
4489  int x;
4490  static int y;
4491}
4492int z;
4493</pre></td></tr>
4494
4495
4496<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>
4497<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
4498non-static local variable.
4499
4500Example matches x (matcher = varDecl(hasLocalStorage())
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('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
4510<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
4511It includes the variable declared at namespace scope and those declared
4512with "static" and "extern" storage class specifiers.
4513
4514void f() {
4515  int x;
4516  static int y;
4517  thread_local int z;
4518}
4519int a;
4520static int b;
4521extern int c;
4522varDecl(hasStaticStorageDuration())
4523  matches the function declaration y, a, b and c.
4524</pre></td></tr>
4525
4526
4527<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>
4528<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
4529
4530Example matches z, but not x, z, or a.
4531(matcher = varDecl(hasThreadStorageDuration())
4532void f() {
4533  int x;
4534  static int y;
4535  thread_local int z;
4536}
4537int a;
4538</pre></td></tr>
4539
4540
4541<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>
4542<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations,
4543       and if constexpr.
4544
4545Given:
4546  constexpr int foo = 42;
4547  constexpr int bar();
4548  void baz() { if constexpr(1 &gt; 0) {} }
4549varDecl(isConstexpr())
4550  matches the declaration of foo.
4551functionDecl(isConstexpr())
4552  matches the declaration of bar.
4553ifStmt(isConstexpr())
4554  matches the if statement in baz.
4555</pre></td></tr>
4556
4557
4558<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>
4559<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
4560
4561Example matches A, va, fa
4562  class A {};
4563  class B;  // Doesn't match, as it has no body.
4564  int va;
4565  extern int vb;  // Doesn't match, as it doesn't define the variable.
4566  void fa() {}
4567  void fb();  // Doesn't match, as it has no body.
4568  @interface X
4569  - (void)ma; // Doesn't match, interface is declaration.
4570  @end
4571  @implementation X
4572  - (void)ma {}
4573  @end
4574
4575Usable 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;,
4576  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ObjCMethodDecl.html">ObjCMethodDecl</a>&gt;
4577</pre></td></tr>
4578
4579
4580<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>
4581<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
4582a C++ catch block, or an Objective-C statement.
4583
4584Example matches x (matcher = varDecl(isExceptionVariable())
4585void f(int y) {
4586  try {
4587  } catch (int x) {
4588  }
4589}
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('isExplicitTemplateSpecialization1')"><a name="isExplicitTemplateSpecialization1Anchor">isExplicitTemplateSpecialization</a></td><td></td></tr>
4594<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
4595static member variable template instantiations.
4596
4597Given
4598  template&lt;typename T&gt; void A(T t) { }
4599  template&lt;&gt; void A(int N) { }
4600functionDecl(isExplicitTemplateSpecialization())
4601  matches the specialization A&lt;int&gt;().
4602
4603Usable 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;
4604</pre></td></tr>
4605
4606
4607<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>
4608<tr><td colspan="4" class="doc" id="isExternC1"><pre>Matches extern "C" function or variable declarations.
4609
4610Given:
4611  extern "C" void f() {}
4612  extern "C" { void g() {} }
4613  void h() {}
4614  extern "C" int x = 1;
4615  extern "C" int y = 2;
4616  int z = 3;
4617functionDecl(isExternC())
4618  matches the declaration of f and g, but not the declaration of h.
4619varDecl(isExternC())
4620  matches the declaration of x and y, but not the declaration of z.
4621</pre></td></tr>
4622
4623
4624<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>
4625<tr><td colspan="4" class="doc" id="isStaticLocal0"><pre>Matches a static variable with local scope.
4626
4627Example matches y (matcher = varDecl(isStaticLocal()))
4628void f() {
4629  int x;
4630  static int y;
4631}
4632static int z;
4633</pre></td></tr>
4634
4635
4636<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>
4637<tr><td colspan="4" class="doc" id="isStaticStorageClass1"><pre>Matches variable/function declarations that have "static" storage
4638class specifier ("static" keyword) written in the source.
4639
4640Given:
4641  static void f() {}
4642  static int i = 0;
4643  extern int j;
4644  int k;
4645functionDecl(isStaticStorageClass())
4646  matches the function declaration f.
4647varDecl(isStaticStorageClass())
4648  matches the variable declaration i.
4649</pre></td></tr>
4650
4651
4652<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('isTemplateInstantiation1')"><a name="isTemplateInstantiation1Anchor">isTemplateInstantiation</a></td><td></td></tr>
4653<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
4654member variable template instantiations.
4655
4656Given
4657  template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
4658or
4659  template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
4660or
4661  template &lt;typename T&gt; class X {}; class A {}; extern template class X&lt;A&gt;;
4662cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4663  matches the template instantiation of X&lt;A&gt;.
4664
4665But given
4666  template &lt;typename T&gt;  class X {}; class A {};
4667  template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
4668cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
4669  does not match, as X&lt;A&gt; is an explicit template specialization.
4670
4671Usable 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;
4672</pre></td></tr>
4673
4674<!--END_NARROWING_MATCHERS -->
4675</table>
4676
4677<!-- ======================================================================= -->
4678<h2 id="traversal-matchers">AST Traversal Matchers</h2>
4679<!-- ======================================================================= -->
4680
4681<p>Traversal matchers specify the relationship to other nodes that are
4682reachable from the current node.</p>
4683
4684<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
4685forEachDescendant) which work on all nodes and allow users to write more generic
4686match expressions.</p>
4687
4688<table>
4689<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
4690<!-- START_TRAVERSAL_MATCHERS -->
4691
4692<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>
4693<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
4694
4695Unlike anyOf, eachOf will generate a match result for each
4696matching submatcher.
4697
4698For example, in:
4699  class A { int a; int b; };
4700The matcher:
4701  cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
4702                       has(fieldDecl(hasName("b")).bind("v"))))
4703will generate two results binding "v", the first of which binds
4704the field declaration of a, the second the field declaration of
4705b.
4706
4707Usable as: Any Matcher
4708</pre></td></tr>
4709
4710
4711<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>
4712<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
4713
4714Generates results for each match.
4715
4716For example, in:
4717  class A { class B {}; class C {}; };
4718The matcher:
4719  cxxRecordDecl(hasName("::A"),
4720                findAll(cxxRecordDecl(isDefinition()).bind("m")))
4721will generate results for A, B and C.
4722
4723Usable as: Any Matcher
4724</pre></td></tr>
4725
4726
4727<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4728<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4729provided matcher.
4730
4731Example matches X, A, A::X, B, B::C, B::C::X
4732  (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
4733  class X {};
4734  class A { class X {}; };  // Matches A, because A::X is a class of name
4735                            // X inside A.
4736  class B { class C { class X {}; }; };
4737
4738DescendantT must be an AST base type.
4739
4740As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
4741each result that matches instead of only on the first one.
4742
4743Note: Recursively combined ForEachDescendant can cause many matches:
4744  cxxRecordDecl(forEachDescendant(cxxRecordDecl(
4745    forEachDescendant(cxxRecordDecl())
4746  )))
4747will match 10 times (plus injected class name matches) on:
4748  class A { class B { class C { class D { class E {}; }; }; }; };
4749
4750Usable as: Any Matcher
4751</pre></td></tr>
4752
4753
4754<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
4755<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
4756provided matcher.
4757
4758Example matches X, Y, Y::X, Z::Y, Z::Y::X
4759  (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
4760  class X {};
4761  class Y { class X {}; };  // Matches Y, because Y::X is a class of name X
4762                            // inside Y.
4763  class Z { class Y { class X {}; }; };  // Does not match Z.
4764
4765ChildT must be an AST base type.
4766
4767As opposed to 'has', 'forEach' will cause a match for each result that
4768matches instead of only on the first one.
4769
4770Usable as: Any Matcher
4771</pre></td></tr>
4772
4773
4774<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
4775<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
4776matcher.
4777
4778Given
4779void f() { if (true) { int x = 42; } }
4780void g() { for (;;) { int x = 43; } }
4781expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
4782
4783Usable as: Any Matcher
4784</pre></td></tr>
4785
4786
4787<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
4788<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
4789provided matcher.
4790
4791Example matches X, Y, Z
4792    (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
4793  class X {};  // Matches X, because X::X is a class of name X inside X.
4794  class Y { class X {}; };
4795  class Z { class Y { class X {}; }; };
4796
4797DescendantT must be an AST base type.
4798
4799Usable as: Any Matcher
4800</pre></td></tr>
4801
4802
4803<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
4804<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
4805provided matcher.
4806
4807Example matches X, Y
4808  (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
4809  class X {};  // Matches X, because X::X is a class of name X inside X.
4810  class Y { class X {}; };
4811  class Z { class Y { class X {}; }; };  // Does not match Z.
4812
4813ChildT must be an AST base type.
4814
4815Usable as: Any Matcher
4816Note that has is direct matcher, so it also matches things like implicit
4817casts and paren casts. If you are matching with expr then you should
4818probably consider using ignoringParenImpCasts like:
4819has(ignoringParenImpCasts(expr())).
4820</pre></td></tr>
4821
4822
4823<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
4824<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
4825matcher.
4826
4827Given
4828void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
4829compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
4830
4831Usable as: Any Matcher
4832</pre></td></tr>
4833
4834
4835<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('optionally0')"><a name="optionally0Anchor">optionally</a></td><td>Matcher&lt;*&gt;</td></tr>
4836<tr><td colspan="4" class="doc" id="optionally0"><pre>Matches any node regardless of the submatcher.
4837
4838However, optionally will retain any bindings generated by the submatcher.
4839Useful when additional information which may or may not present about a main
4840matching node is desired.
4841
4842For example, in:
4843  class Foo {
4844    int bar;
4845  }
4846The matcher:
4847  cxxRecordDecl(
4848    optionally(has(
4849      fieldDecl(hasName("bar")).bind("var")
4850  ))).bind("record")
4851will produce a result binding for both "record" and "var".
4852The matcher will produce a "record" binding for even if there is no data
4853member named "bar" in that class.
4854
4855Usable as: Any Matcher
4856</pre></td></tr>
4857
4858
4859<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>
4860<tr><td colspan="4" class="doc" id="traverse0"><pre>Causes all nested matchers to be matched with the specified traversal kind.
4861
4862Given
4863  void foo()
4864  {
4865      int i = 3.0;
4866  }
4867The matcher
4868  traverse(TK_IgnoreImplicitCastsAndParentheses,
4869    varDecl(hasInitializer(floatLiteral().bind("init")))
4870  )
4871matches the variable declaration with "init" bound to the "3.0".
4872</pre></td></tr>
4873
4874
4875<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>
4876<tr><td colspan="4" class="doc" id="hasCondition5"><pre>Matches the condition expression of an if statement, for loop,
4877switch statement or conditional operator.
4878
4879Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4880  if (true) {}
4881</pre></td></tr>
4882
4883
4884<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>
4885<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator
4886(binary or ternary).
4887
4888Example matches b
4889  condition ? a : b
4890  condition ?: b
4891</pre></td></tr>
4892
4893
4894<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>
4895<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
4896
4897Example 1 (conditional ternary operator): matches a
4898  condition ? a : b
4899
4900Example 2 (conditional binary operator): matches opaqueValueExpr(condition)
4901  condition ?: b
4902</pre></td></tr>
4903
4904
4905<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>
4906<tr><td colspan="4" class="doc" id="hasDeclaration15"><pre>Matches a node if the declaration associated with that node
4907matches the given matcher.
4908
4909The associated declaration is:
4910- for type nodes, the declaration of the underlying type
4911- for CallExpr, the declaration of the callee
4912- for MemberExpr, the declaration of the referenced member
4913- for CXXConstructExpr, the declaration of the constructor
4914- for CXXNewExpr, the declaration of the operator new
4915- for ObjCIvarExpr, the declaration of the ivar
4916
4917For type nodes, hasDeclaration will generally match the declaration of the
4918sugared type. Given
4919  class X {};
4920  typedef X Y;
4921  Y y;
4922in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
4923typedefDecl. A common use case is to match the underlying, desugared type.
4924This can be achieved by using the hasUnqualifiedDesugaredType matcher:
4925  varDecl(hasType(hasUnqualifiedDesugaredType(
4926      recordType(hasDeclaration(decl())))))
4927In this matcher, the decl will match the CXXRecordDecl of class X.
4928
4929Usable 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;,
4930  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;,
4931  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;,
4932  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;,
4933  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;,
4934  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;,
4935  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4936</pre></td></tr>
4937
4938
4939<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>
4940<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
4941
4942Given
4943  int i[5];
4944  void f() { i[1] = 42; }
4945arraySubscriptExpression(hasBase(implicitCastExpr(
4946    hasSourceExpression(declRefExpr()))))
4947  matches i[1] with the declRefExpr() matching i
4948</pre></td></tr>
4949
4950
4951<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>
4952<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
4953
4954Given
4955  int i[5];
4956  void f() { i[1] = 42; }
4957arraySubscriptExpression(hasIndex(integerLiteral()))
4958  matches i[1] with the integerLiteral() matching 1
4959</pre></td></tr>
4960
4961
4962<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>
4963<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
4964
4965Example matches a (matcher = binaryOperator(hasLHS()))
4966  a || b
4967</pre></td></tr>
4968
4969
4970<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>
4971<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
4972
4973Example matches b (matcher = binaryOperator(hasRHS()))
4974  a || b
4975</pre></td></tr>
4976
4977
4978<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>
4979<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
4980type.
4981
4982Given
4983  struct A {};
4984  A a[7];
4985  int b[7];
4986arrayType(hasElementType(builtinType()))
4987  matches "int b[7]"
4988
4989Usable 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;
4990</pre></td></tr>
4991
4992
4993<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>
4994<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
4995
4996Given
4997  _Atomic(int) i;
4998  _Atomic(float) f;
4999atomicType(hasValueType(isInteger()))
5000 matches "_Atomic(int) i"
5001
5002Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
5003</pre></td></tr>
5004
5005
5006<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>
5007<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
5008
5009Note: There is no TypeLoc for the deduced type and thus no
5010getDeducedLoc() matcher.
5011
5012Given
5013  auto a = 1;
5014  auto b = 2.0;
5015autoType(hasDeducedType(isInteger()))
5016  matches "auto a"
5017
5018Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
5019</pre></td></tr>
5020
5021
5022<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>
5023<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
5024binary operator matches.
5025</pre></td></tr>
5026
5027
5028<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>
5029<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
5030
5031Example matches a (matcher = binaryOperator(hasLHS()))
5032  a || b
5033</pre></td></tr>
5034
5035
5036<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>
5037<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
5038
5039Example matches b (matcher = binaryOperator(hasRHS()))
5040  a || b
5041</pre></td></tr>
5042
5043
5044<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>
5045<tr><td colspan="4" class="doc" id="hasAnyParameter2"><pre>Matches any parameter of a function or an ObjC method declaration or a
5046block.
5047
5048Does not match the 'this' parameter of a method.
5049
5050Given
5051  class X { void f(int x, int y, int z) {} };
5052cxxMethodDecl(hasAnyParameter(hasName("y")))
5053  matches f(int x, int y, int z) {}
5054with hasAnyParameter(...)
5055  matching int y
5056
5057For ObjectiveC, given
5058  @interface I - (void) f:(int) y; @end
5059
5060the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
5061matches the declaration of method f with hasParameter
5062matching y.
5063
5064For blocks, given
5065  b = ^(int y) { printf("%d", y) };
5066
5067the matcher blockDecl(hasAnyParameter(hasName("y")))
5068matches the declaration of the block b with hasParameter
5069matching y.
5070</pre></td></tr>
5071
5072
5073<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>
5074<tr><td colspan="4" class="doc" id="hasParameter2"><pre>Matches the n'th parameter of a function or an ObjC method
5075declaration or a block.
5076
5077Given
5078  class X { void f(int x) {} };
5079cxxMethodDecl(hasParameter(0, hasType(varDecl())))
5080  matches f(int x) {}
5081with hasParameter(...)
5082  matching int x
5083
5084For ObjectiveC, given
5085  @interface I - (void) f:(int) y; @end
5086
5087the matcher objcMethodDecl(hasParameter(0, hasName("y")))
5088matches the declaration of method f with hasParameter
5089matching y.
5090</pre></td></tr>
5091
5092
5093<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>
5094<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
5095pointee matches a given matcher.
5096
5097Given
5098  int *a;
5099  int const *b;
5100  float const *f;
5101pointerType(pointee(isConstQualified(), isInteger()))
5102  matches "int const *b"
5103
5104Usable 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;,
5105  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;
5106</pre></td></tr>
5107
5108
5109<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>
5110<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
5111
5112Given
5113  void f(int i);
5114  int y;
5115  f(y);
5116callExpr(
5117  forEachArgumentWithParam(
5118    declRefExpr(to(varDecl(hasName("y")))),
5119    parmVarDecl(hasType(isInteger()))
5120))
5121  matches f(y);
5122with declRefExpr(...)
5123  matching int y
5124and parmVarDecl(...)
5125  matching int i
5126</pre></td></tr>
5127
5128
5129<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>
5130<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
5131expression, or an ObjC-message-send expression.
5132
5133Given
5134  void x(int, int, int) { int y; x(1, y, 42); }
5135callExpr(hasAnyArgument(declRefExpr()))
5136  matches x(1, y, 42)
5137with hasAnyArgument(...)
5138  matching y
5139
5140For ObjectiveC, given
5141  @interface I - (void) f:(int) y; @end
5142  void foo(I *i) { [i f:12]; }
5143objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5144  matches [i f:12]
5145</pre></td></tr>
5146
5147
5148<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>
5149<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
5150call expression.
5151
5152Example matches y in x(y)
5153    (matcher = callExpr(hasArgument(0, declRefExpr())))
5154  void x(int) { int y; x(y); }
5155</pre></td></tr>
5156
5157
5158<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>
5159<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
5160matches the given matcher.
5161
5162The associated declaration is:
5163- for type nodes, the declaration of the underlying type
5164- for CallExpr, the declaration of the callee
5165- for MemberExpr, the declaration of the referenced member
5166- for CXXConstructExpr, the declaration of the constructor
5167- for CXXNewExpr, the declaration of the operator new
5168- for ObjCIvarExpr, the declaration of the ivar
5169
5170For type nodes, hasDeclaration will generally match the declaration of the
5171sugared type. Given
5172  class X {};
5173  typedef X Y;
5174  Y y;
5175in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5176typedefDecl. A common use case is to match the underlying, desugared type.
5177This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5178  varDecl(hasType(hasUnqualifiedDesugaredType(
5179      recordType(hasDeclaration(decl())))))
5180In this matcher, the decl will match the CXXRecordDecl of class X.
5181
5182Usable 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;,
5183  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;,
5184  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;,
5185  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;,
5186  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;,
5187  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;,
5188  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5189</pre></td></tr>
5190
5191
5192<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>
5193<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
5194
5195Given
5196  class A { A() : i(42), j(42) {} int i; int j; };
5197cxxConstructorDecl(forEachConstructorInitializer(
5198  forField(decl().bind("x"))
5199))
5200  will trigger two matches, binding for 'i' and 'j' respectively.
5201</pre></td></tr>
5202
5203
5204<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>
5205<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
5206
5207Given
5208  struct Foo {
5209    Foo() : foo_(1) { }
5210    int foo_;
5211  };
5212cxxRecordDecl(has(cxxConstructorDecl(
5213  hasAnyConstructorInitializer(anything())
5214)))
5215  record matches Foo, hasAnyConstructorInitializer matches foo_(1)
5216</pre></td></tr>
5217
5218
5219<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>
5220<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
5221
5222Given
5223  struct Foo {
5224    Foo() : foo_(1) { }
5225    int foo_;
5226  };
5227cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5228    forField(hasName("foo_"))))))
5229  matches Foo
5230with forField matching foo_
5231</pre></td></tr>
5232
5233
5234<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>
5235<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
5236
5237Given
5238  struct Foo {
5239    Foo() : foo_(1) { }
5240    int foo_;
5241  };
5242cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
5243    withInitializer(integerLiteral(equals(1)))))))
5244  matches Foo
5245with withInitializer matching (1)
5246</pre></td></tr>
5247
5248
5249<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>
5250<tr><td colspan="4" class="doc" id="hasObjectExpression2"><pre>Matches a member expression where the object expression is matched by a
5251given matcher. Implicit object expressions are included; that is, it matches
5252use of implicit `this`.
5253
5254Given
5255  struct X {
5256    int m;
5257    int f(X x) { x.m; return m; }
5258  };
5259memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
5260  matches `x.m`, but not `m`; however,
5261memberExpr(hasObjectExpression(hasType(pointsTo(
5262     cxxRecordDecl(hasName("X"))))))
5263  matches `m` (aka. `this-&gt;m`), but not `x.m`.
5264</pre></td></tr>
5265
5266
5267<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>
5268<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
5269definition that has a given body.
5270
5271Given
5272  for (;;) {}
5273hasBody(compoundStmt())
5274  matches 'for (;;) {}'
5275with compoundStmt()
5276  matching '{}'
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('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>
5281<tr><td colspan="4" class="doc" id="hasInitStatement2"><pre>Matches selection statements with initializer.
5282
5283Given:
5284 void foo() {
5285   if (int i = foobar(); i &gt; 0) {}
5286   switch (int i = foobar(); i) {}
5287   for (auto&amp; a = get_range(); auto&amp; x : a) {}
5288 }
5289 void bar() {
5290   if (foobar() &gt; 0) {}
5291   switch (foobar()) {}
5292   for (auto&amp; x : get_range()) {}
5293 }
5294ifStmt(hasInitStatement(anything()))
5295  matches the if statement in foo but not in bar.
5296switchStmt(hasInitStatement(anything()))
5297  matches the switch statement in foo but not in bar.
5298cxxForRangeStmt(hasInitStatement(anything()))
5299  matches the range for statement in foo but not in bar.
5300</pre></td></tr>
5301
5302
5303<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>
5304<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
5305
5306Example:
5307    forStmt(hasLoopVariable(anything()))
5308matches 'int x' in
5309    for (int x : a) { }
5310</pre></td></tr>
5311
5312
5313<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>
5314<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
5315
5316Example:
5317    forStmt(hasRangeInit(anything()))
5318matches 'a' in
5319    for (int x : a) { }
5320</pre></td></tr>
5321
5322
5323<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>
5324<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre>Matches on the implicit object argument of a member call expression. Unlike
5325`on`, matches the argument directly without stripping away anything.
5326
5327Given
5328  class Y { public: void m(); };
5329  Y g();
5330  class X : public Y { void g(); };
5331  void z(Y y, X x) { y.m(); x.m(); x.g(); (g()).m(); }
5332cxxMemberCallExpr(onImplicitObjectArgument(hasType(
5333    cxxRecordDecl(hasName("Y")))))
5334  matches `y.m()`, `x.m()` and (g()).m(), but not `x.g()`.
5335cxxMemberCallExpr(on(callExpr()))
5336  does not match `(g()).m()`, because the parens are not ignored.
5337
5338FIXME: Overload to allow directly matching types?
5339</pre></td></tr>
5340
5341
5342<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>
5343<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression, after
5344stripping off any parentheses or implicit casts.
5345
5346Given
5347  class Y { public: void m(); };
5348  Y g();
5349  class X : public Y {};
5350  void z(Y y, X x) { y.m(); (g()).m(); x.m(); }
5351cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y")))))
5352  matches `y.m()` and `(g()).m()`.
5353cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("X")))))
5354  matches `x.m()`.
5355cxxMemberCallExpr(on(callExpr()))
5356  matches `(g()).m()`.
5357
5358FIXME: Overload to allow directly matching types?
5359</pre></td></tr>
5360
5361
5362<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>
5363<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
5364</pre></td></tr>
5365
5366
5367<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>
5368<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the type of the expression's implicit object argument either
5369matches the InnerMatcher, or is a pointer to a type that matches the
5370InnerMatcher.
5371
5372Given
5373  class Y { public: void m(); };
5374  class X : public Y { void g(); };
5375  void z() { Y y; y.m(); Y *p; p-&gt;m(); X x; x.m(); x.g(); }
5376cxxMemberCallExpr(thisPointerType(hasDeclaration(
5377    cxxRecordDecl(hasName("Y")))))
5378  matches `y.m()`, `p-&gt;m()` and `x.m()`.
5379cxxMemberCallExpr(thisPointerType(hasDeclaration(
5380    cxxRecordDecl(hasName("X")))))
5381  matches `x.g()`.
5382</pre></td></tr>
5383
5384
5385<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>
5386<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overridden by the given method. This matcher may
5387produce multiple matches.
5388
5389Given
5390  class A { virtual void f(); };
5391  class B : public A { void f(); };
5392  class C : public B { void f(); };
5393cxxMethodDecl(ofClass(hasName("C")),
5394              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5395  matches once, with "b" binding "A::f" and "d" binding "C::f" (Note
5396  that B::f is not overridden by C::f).
5397
5398The check can produce multiple matches in case of multiple inheritance, e.g.
5399  class A1 { virtual void f(); };
5400  class A2 { virtual void f(); };
5401  class C : public A1, public A2 { void f(); };
5402cxxMethodDecl(ofClass(hasName("C")),
5403              forEachOverridden(cxxMethodDecl().bind("b"))).bind("d")
5404  matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and
5405  once with "b" binding "A2::f" and "d" binding "C::f".
5406</pre></td></tr>
5407
5408
5409<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>
5410<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
5411belongs to.
5412
5413FIXME: Generalize this for other kinds of declarations.
5414FIXME: What other kind of declarations would we need to generalize
5415this to?
5416
5417Example matches A() in the last line
5418    (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
5419        ofClass(hasName("A"))))))
5420  class A {
5421   public:
5422    A();
5423  };
5424  A a = A();
5425</pre></td></tr>
5426
5427
5428<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>
5429<tr><td colspan="4" class="doc" id="hasAnyPlacementArg0"><pre>Matches any placement new expression arguments.
5430
5431Given:
5432  MyClass *p1 = new (Storage) MyClass();
5433cxxNewExpr(hasAnyPlacementArg(anything()))
5434  matches the expression 'new (Storage, 16) MyClass()'.
5435</pre></td></tr>
5436
5437
5438<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>
5439<tr><td colspan="4" class="doc" id="hasArraySize0"><pre>Matches array new expressions with a given array size.
5440
5441Given:
5442  MyClass *p1 = new MyClass[10];
5443cxxNewExpr(hasArraySize(integerLiteral(equals(10))))
5444  matches the expression 'new MyClass[10]'.
5445</pre></td></tr>
5446
5447
5448<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>
5449<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
5450matches the given matcher.
5451
5452The associated declaration is:
5453- for type nodes, the declaration of the underlying type
5454- for CallExpr, the declaration of the callee
5455- for MemberExpr, the declaration of the referenced member
5456- for CXXConstructExpr, the declaration of the constructor
5457- for CXXNewExpr, the declaration of the operator new
5458- for ObjCIvarExpr, the declaration of the ivar
5459
5460For type nodes, hasDeclaration will generally match the declaration of the
5461sugared type. Given
5462  class X {};
5463  typedef X Y;
5464  Y y;
5465in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5466typedefDecl. A common use case is to match the underlying, desugared type.
5467This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5468  varDecl(hasType(hasUnqualifiedDesugaredType(
5469      recordType(hasDeclaration(decl())))))
5470In this matcher, the decl will match the CXXRecordDecl of class X.
5471
5472Usable 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;,
5473  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;,
5474  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;,
5475  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;,
5476  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;,
5477  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;,
5478  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5479</pre></td></tr>
5480
5481
5482<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>
5483<tr><td colspan="4" class="doc" id="hasPlacementArg0"><pre>Matches placement new expression arguments.
5484
5485Given:
5486  MyClass *p1 = new (Storage, 16) MyClass();
5487cxxNewExpr(hasPlacementArg(1, integerLiteral(equals(16))))
5488  matches the expression 'new (Storage, 16) MyClass()'.
5489</pre></td></tr>
5490
5491
5492<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>
5493<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
5494
5495Given:
5496  class A { void func(); };
5497  class B { void member(); };
5498
5499cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
5500A but not B.
5501</pre></td></tr>
5502
5503
5504<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>
5505<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from a class
5506matching Base, or Objective-C classes that directly or indirectly
5507subclass a class matching Base.
5508
5509Note that a class is not considered to be derived from itself.
5510
5511Example matches Y, Z, C (Base == hasName("X"))
5512  class X;
5513  class Y : public X {};  // directly derived
5514  class Z : public Y {};  // indirectly derived
5515  typedef X A;
5516  typedef A B;
5517  class C : public B {};  // derived from a typedef of X
5518
5519In the following example, Bar matches isDerivedFrom(hasName("X")):
5520  class Foo;
5521  typedef Foo X;
5522  class Bar : public Foo {};  // derived from a type that X is a typedef of
5523
5524In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
5525  @interface NSObject @end
5526  @interface Bar : NSObject @end
5527
5528Usable 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;
5529</pre></td></tr>
5530
5531
5532<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>
5533<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom0"><pre>Matches C++ or Objective-C classes that are directly derived from a class
5534matching Base.
5535
5536Note that a class is not considered to be derived from itself.
5537
5538Example matches Y, C (Base == hasName("X"))
5539  class X;
5540  class Y : public X {};  // directly derived
5541  class Z : public Y {};  // indirectly derived
5542  typedef X A;
5543  typedef A B;
5544  class C : public B {};  // derived from a typedef of X
5545
5546In the following example, Bar matches isDerivedFrom(hasName("X")):
5547  class Foo;
5548  typedef Foo X;
5549  class Bar : public Foo {};  // derived from a type that X is a typedef of
5550</pre></td></tr>
5551
5552
5553<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>
5554<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
5555match Base.
5556</pre></td></tr>
5557
5558
5559<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>
5560<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call
5561expression, or an ObjC-message-send expression.
5562
5563Given
5564  void x(int, int, int) { int y; x(1, y, 42); }
5565callExpr(hasAnyArgument(declRefExpr()))
5566  matches x(1, y, 42)
5567with hasAnyArgument(...)
5568  matching y
5569
5570For ObjectiveC, given
5571  @interface I - (void) f:(int) y; @end
5572  void foo(I *i) { [i f:12]; }
5573objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5574  matches [i f:12]
5575</pre></td></tr>
5576
5577
5578<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>
5579<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
5580given matcher.
5581
5582Example matches y.x() (matcher = callExpr(callee(
5583                                   cxxMethodDecl(hasName("x")))))
5584  class Y { public: void x(); };
5585  void z() { Y y; y.x(); }
5586</pre></td></tr>
5587
5588
5589<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>
5590<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
5591
5592Given
5593  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
5594  void f() { f(); }
5595callExpr(callee(expr()))
5596  matches this-&gt;x(), x(), y.x(), f()
5597with callee(...)
5598  matching this-&gt;x, x, y.x, f respectively
5599
5600Note: Callee cannot take the more general internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
5601because this introduces ambiguous overloads with calls to Callee taking a
5602internal::Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
5603implemented in terms of implicit casts.
5604</pre></td></tr>
5605
5606
5607<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>
5608<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
5609
5610Given
5611  void f(int i);
5612  int y;
5613  f(y);
5614callExpr(
5615  forEachArgumentWithParam(
5616    declRefExpr(to(varDecl(hasName("y")))),
5617    parmVarDecl(hasType(isInteger()))
5618))
5619  matches f(y);
5620with declRefExpr(...)
5621  matching int y
5622and parmVarDecl(...)
5623  matching int i
5624</pre></td></tr>
5625
5626
5627<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>
5628<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
5629expression, or an ObjC-message-send expression.
5630
5631Given
5632  void x(int, int, int) { int y; x(1, y, 42); }
5633callExpr(hasAnyArgument(declRefExpr()))
5634  matches x(1, y, 42)
5635with hasAnyArgument(...)
5636  matching y
5637
5638For ObjectiveC, given
5639  @interface I - (void) f:(int) y; @end
5640  void foo(I *i) { [i f:12]; }
5641objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
5642  matches [i f:12]
5643</pre></td></tr>
5644
5645
5646<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>
5647<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
5648call expression.
5649
5650Example matches y in x(y)
5651    (matcher = callExpr(hasArgument(0, declRefExpr())))
5652  void x(int) { int y; x(y); }
5653</pre></td></tr>
5654
5655
5656<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>
5657<tr><td colspan="4" class="doc" id="hasDeclaration14"><pre>Matches a node if the declaration associated with that node
5658matches the given matcher.
5659
5660The associated declaration is:
5661- for type nodes, the declaration of the underlying type
5662- for CallExpr, the declaration of the callee
5663- for MemberExpr, the declaration of the referenced member
5664- for CXXConstructExpr, the declaration of the constructor
5665- for CXXNewExpr, the declaration of the operator new
5666- for ObjCIvarExpr, the declaration of the ivar
5667
5668For type nodes, hasDeclaration will generally match the declaration of the
5669sugared type. Given
5670  class X {};
5671  typedef X Y;
5672  Y y;
5673in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5674typedefDecl. A common use case is to match the underlying, desugared type.
5675This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5676  varDecl(hasType(hasUnqualifiedDesugaredType(
5677      recordType(hasDeclaration(decl())))))
5678In this matcher, the decl will match the CXXRecordDecl of class X.
5679
5680Usable 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;,
5681  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;,
5682  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;,
5683  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;,
5684  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;,
5685  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;,
5686  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5687</pre></td></tr>
5688
5689
5690<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>
5691<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
5692extension, matches the constant given in the statement.
5693
5694Given
5695  switch (1) { case 1: case 1+1: case 3 ... 4: ; }
5696caseStmt(hasCaseConstant(integerLiteral()))
5697  matches "case 1:"
5698</pre></td></tr>
5699
5700
5701<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>
5702<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression
5703or opaque value's source expression matches the given matcher.
5704
5705Example 1: matches "a string"
5706(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
5707class URL { URL(string); };
5708URL url = "a string";
5709
5710Example 2: matches 'b' (matcher =
5711opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
5712int a = b ?: 1;
5713</pre></td></tr>
5714
5715
5716<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>
5717<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5718functionDecl that have at least one TemplateArgument matching the given
5719InnerMatcher.
5720
5721Given
5722  template&lt;typename T&gt; class A {};
5723  template&lt;&gt; class A&lt;double&gt; {};
5724  A&lt;int&gt; a;
5725
5726  template&lt;typename T&gt; f() {};
5727  void func() { f&lt;int&gt;(); };
5728
5729classTemplateSpecializationDecl(hasAnyTemplateArgument(
5730    refersToType(asString("int"))))
5731  matches the specialization A&lt;int&gt;
5732
5733functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
5734  matches the specialization f&lt;int&gt;
5735</pre></td></tr>
5736
5737
5738<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>
5739<tr><td colspan="4" class="doc" id="hasSpecializedTemplate0"><pre>Matches the specialized template of a specialization declaration.
5740
5741Given
5742  template&lt;typename T&gt; class A {}; #1
5743  template&lt;&gt; class A&lt;int&gt; {}; #2
5744classTemplateSpecializationDecl(hasSpecializedTemplate(classTemplateDecl()))
5745  matches '#2' with classTemplateDecl() matching the class template
5746  declaration of 'A' at #1.
5747</pre></td></tr>
5748
5749
5750<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>
5751<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations, templateSpecializationType and
5752functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
5753
5754Given
5755  template&lt;typename T, typename U&gt; class A {};
5756  A&lt;bool, int&gt; b;
5757  A&lt;int, bool&gt; c;
5758
5759  template&lt;typename T&gt; void f() {}
5760  void func() { f&lt;int&gt;(); };
5761classTemplateSpecializationDecl(hasTemplateArgument(
5762    1, refersToType(asString("int"))))
5763  matches the specialization A&lt;bool, int&gt;
5764
5765functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
5766  matches the specialization f&lt;int&gt;
5767</pre></td></tr>
5768
5769
5770<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>
5771<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
5772type.
5773
5774Given
5775  struct A {};
5776  A a[7];
5777  int b[7];
5778arrayType(hasElementType(builtinType()))
5779  matches "int b[7]"
5780
5781Usable 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;
5782</pre></td></tr>
5783
5784
5785<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>
5786<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
5787a given matcher. Also matches StmtExprs that have CompoundStmt as children.
5788
5789Given
5790  { {}; 1+2; }
5791hasAnySubstatement(compoundStmt())
5792  matches '{ {}; 1+2; }'
5793with compoundStmt()
5794  matching '{}'
5795</pre></td></tr>
5796
5797
5798<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>
5799<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
5800</pre></td></tr>
5801
5802
5803<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>
5804<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
5805matches the given matcher.
5806
5807The associated declaration is:
5808- for type nodes, the declaration of the underlying type
5809- for CallExpr, the declaration of the callee
5810- for MemberExpr, the declaration of the referenced member
5811- for CXXConstructExpr, the declaration of the constructor
5812- for CXXNewExpr, the declaration of the operator new
5813- for ObjCIvarExpr, the declaration of the ivar
5814
5815For type nodes, hasDeclaration will generally match the declaration of the
5816sugared type. Given
5817  class X {};
5818  typedef X Y;
5819  Y y;
5820in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
5821typedefDecl. A common use case is to match the underlying, desugared type.
5822This can be achieved by using the hasUnqualifiedDesugaredType matcher:
5823  varDecl(hasType(hasUnqualifiedDesugaredType(
5824      recordType(hasDeclaration(decl())))))
5825In this matcher, the decl will match the CXXRecordDecl of class X.
5826
5827Usable 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;,
5828  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;,
5829  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;,
5830  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;,
5831  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;,
5832  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;,
5833  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
5834</pre></td></tr>
5835
5836
5837<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>
5838<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
5839specific using shadow declaration.
5840
5841Given
5842  namespace a { void f() {} }
5843  using a::f;
5844  void g() {
5845    f();     // Matches this ..
5846    a::f();  // .. but not this.
5847  }
5848declRefExpr(throughUsingDecl(anything()))
5849  matches f()
5850</pre></td></tr>
5851
5852
5853<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>
5854<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
5855specified matcher.
5856
5857Example matches x in if(x)
5858    (matcher = declRefExpr(to(varDecl(hasName("x")))))
5859  bool x;
5860  if (x) {}
5861</pre></td></tr>
5862
5863
5864<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>
5865<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
5866
5867Note that this does not work for global declarations because the AST
5868breaks up multiple-declaration DeclStmt's into multiple single-declaration
5869DeclStmt's.
5870Example: Given non-global declarations
5871  int a, b = 0;
5872  int c;
5873  int d = 2, e;
5874declStmt(containsDeclaration(
5875      0, varDecl(hasInitializer(anything()))))
5876  matches only 'int d = 2, e;', and
5877declStmt(containsDeclaration(1, varDecl()))
5878  matches 'int a, b = 0' as well as 'int d = 2, e;'
5879  but 'int c;' is not matched.
5880</pre></td></tr>
5881
5882
5883<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>
5884<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
5885
5886Given
5887  int a, b;
5888  int c;
5889declStmt(hasSingleDecl(anything()))
5890  matches 'int c;' but not 'int a, b;'.
5891</pre></td></tr>
5892
5893
5894<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>
5895<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
5896the inner matcher.
5897
5898Given
5899  int x;
5900declaratorDecl(hasTypeLoc(loc(asString("int"))))
5901  matches int x
5902</pre></td></tr>
5903
5904
5905<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>
5906<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
5907Decl, matches InnerMatcher.
5908
5909Given
5910  namespace N {
5911    namespace M {
5912      class D {};
5913    }
5914  }
5915
5916cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
5917declaration of class D.
5918</pre></td></tr>
5919
5920
5921<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>
5922<tr><td colspan="4" class="doc" id="hasUnderlyingType0"><pre>Matches DecltypeType nodes to find out the underlying type.
5923
5924Given
5925  decltype(1) a = 1;
5926  decltype(2.0) b = 2.0;
5927decltypeType(hasUnderlyingType(isInteger()))
5928  matches the type of "a"
5929
5930Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DecltypeType.html">DecltypeType</a>&gt;
5931</pre></td></tr>
5932
5933
5934<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>
5935<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
5936definition that has a given body.
5937
5938Given
5939  for (;;) {}
5940hasBody(compoundStmt())
5941  matches 'for (;;) {}'
5942with compoundStmt()
5943  matching '{}'
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('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>
5948<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
5949switch statement or conditional operator.
5950
5951Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5952  if (true) {}
5953</pre></td></tr>
5954
5955
5956<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>
5957<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
5958matches InnerMatcher if the qualifier exists.
5959
5960Given
5961  namespace N {
5962    namespace M {
5963      class D {};
5964    }
5965  }
5966  N::M::D d;
5967
5968elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
5969matches the type of the variable declaration of d.
5970</pre></td></tr>
5971
5972
5973<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>
5974<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
5975
5976Given
5977  namespace N {
5978    namespace M {
5979      class D {};
5980    }
5981  }
5982  N::M::D d;
5983
5984elaboratedType(namesType(recordType(
5985hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
5986declaration of d.
5987</pre></td></tr>
5988
5989
5990<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>
5991<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
5992matches the given matcher.
5993
5994The associated declaration is:
5995- for type nodes, the declaration of the underlying type
5996- for CallExpr, the declaration of the callee
5997- for MemberExpr, the declaration of the referenced member
5998- for CXXConstructExpr, the declaration of the constructor
5999- for CXXNewExpr, the declaration of the operator new
6000- for ObjCIvarExpr, the declaration of the ivar
6001
6002For type nodes, hasDeclaration will generally match the declaration of the
6003sugared type. Given
6004  class X {};
6005  typedef X Y;
6006  Y y;
6007in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6008typedefDecl. A common use case is to match the underlying, desugared type.
6009This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6010  varDecl(hasType(hasUnqualifiedDesugaredType(
6011      recordType(hasDeclaration(decl())))))
6012In this matcher, the decl will match the CXXRecordDecl of class X.
6013
6014Usable 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;,
6015  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;,
6016  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;,
6017  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;,
6018  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;,
6019  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;,
6020  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6021</pre></td></tr>
6022
6023
6024<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>
6025<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
6026
6027(Note: Clang's AST refers to other conversions as "casts" too, and calls
6028actual casts "explicit" casts.)
6029</pre></td></tr>
6030
6031
6032<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>
6033<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
6034declaration's type.
6035
6036In case of a value declaration (for example a variable declaration),
6037this resolves one layer of indirection. For example, in the value
6038declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6039X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6040declaration of x.
6041
6042Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6043            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6044            and friend class X (matcher = friendDecl(hasType("X"))
6045 class X {};
6046 void y(X &amp;x) { x; X z; }
6047 class Y { friend class X; };
6048
6049Usable 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;
6050</pre></td></tr>
6051
6052
6053<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>
6054<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
6055matcher.
6056
6057Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6058            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6059            and U (matcher = typedefDecl(hasType(asString("int")))
6060            and friend class X (matcher = friendDecl(hasType("X"))
6061 class X {};
6062 void y(X &amp;x) { x; X z; }
6063 typedef int U;
6064 class Y { friend class X; };
6065</pre></td></tr>
6066
6067
6068<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>
6069<tr><td colspan="4" class="doc" id="ignoringElidableConstructorCall0"><pre>Matches expressions that match InnerMatcher that are possibly wrapped in an
6070elidable constructor and other corresponding bookkeeping nodes.
6071
6072In C++17, elidable copy constructors are no longer being generated in the
6073AST as it is not permitted by the standard. They are, however, part of the
6074AST in C++14 and earlier. So, a matcher must abstract over these differences
6075to work in all language modes. This matcher skips elidable constructor-call
6076AST nodes, `ExprWithCleanups` nodes wrapping elidable constructor-calls and
6077various implicit nodes inside the constructor calls, all of which will not
6078appear in the C++17 AST.
6079
6080Given
6081
6082struct H {};
6083H G();
6084void f() {
6085  H D = G();
6086}
6087
6088``varDecl(hasInitializer(ignoringElidableConstructorCall(callExpr())))``
6089matches ``H D = G()`` in C++11 through C++17 (and beyond).
6090</pre></td></tr>
6091
6092
6093<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>
6094<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
6095are stripped off.
6096
6097Parentheses and explicit casts are not discarded.
6098Given
6099  int arr[5];
6100  int a = 0;
6101  char b = 0;
6102  const int c = a;
6103  int *d = arr;
6104  long e = (long) 0l;
6105The matchers
6106   varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
6107   varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
6108would match the declarations for a, b, c, and d, but not e.
6109While
6110   varDecl(hasInitializer(integerLiteral()))
6111   varDecl(hasInitializer(declRefExpr()))
6112only match the declarations for b, c, and d.
6113</pre></td></tr>
6114
6115
6116<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>
6117<tr><td colspan="4" class="doc" id="ignoringImplicit0"><pre>Matches expressions that match InnerMatcher after any implicit AST
6118nodes are stripped off.
6119
6120Parentheses and explicit casts are not discarded.
6121Given
6122  class C {};
6123  C a = C();
6124  C b;
6125  C c = b;
6126The matchers
6127   varDecl(hasInitializer(ignoringImplicit(cxxConstructExpr())))
6128would match the declarations for a, b, and c.
6129While
6130   varDecl(hasInitializer(cxxConstructExpr()))
6131only match the declarations for b and c.
6132</pre></td></tr>
6133
6134
6135<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>
6136<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
6137casts are stripped off.
6138
6139Implicit and non-C Style casts are also discarded.
6140Given
6141  int a = 0;
6142  char b = (0);
6143  void* c = reinterpret_cast&lt;char*&gt;(0);
6144  char d = char(0);
6145The matcher
6146   varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
6147would match the declarations for a, b, c, and d.
6148while
6149   varDecl(hasInitializer(integerLiteral()))
6150only match the declaration for a.
6151</pre></td></tr>
6152
6153
6154<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>
6155<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
6156parentheses are stripped off.
6157
6158Explicit casts are not discarded.
6159Given
6160  int arr[5];
6161  int a = 0;
6162  char b = (0);
6163  const int c = a;
6164  int *d = (arr);
6165  long e = ((long) 0l);
6166The matchers
6167   varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
6168   varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
6169would match the declarations for a, b, c, and d, but not e.
6170while
6171   varDecl(hasInitializer(integerLiteral()))
6172   varDecl(hasInitializer(declRefExpr()))
6173would only match the declaration for a.
6174</pre></td></tr>
6175
6176
6177<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>
6178<tr><td colspan="4" class="doc" id="ignoringParens1"><pre>Overload ignoringParens for Expr.
6179
6180Given
6181  const char* str = ("my-string");
6182The matcher
6183  implicitCastExpr(hasSourceExpression(ignoringParens(stringLiteral())))
6184would match the implicit cast resulting from the assignment.
6185</pre></td></tr>
6186
6187
6188<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>
6189<tr><td colspan="4" class="doc" id="hasInClassInitializer0"><pre>Matches non-static data members that have an in-class initializer.
6190
6191Given
6192  class C {
6193    int a = 2;
6194    int b = 3;
6195    int c;
6196  };
6197fieldDecl(hasInClassInitializer(integerLiteral(equals(2))))
6198  matches 'int a;' but not 'int b;'.
6199fieldDecl(hasInClassInitializer(anything()))
6200  matches 'int a;' and 'int b;' but not 'int c;'.
6201</pre></td></tr>
6202
6203
6204<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>
6205<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
6206definition that has a given body.
6207
6208Given
6209  for (;;) {}
6210hasBody(compoundStmt())
6211  matches 'for (;;) {}'
6212with compoundStmt()
6213  matching '{}'
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('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>
6218<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
6219switch statement or conditional operator.
6220
6221Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6222  if (true) {}
6223</pre></td></tr>
6224
6225
6226<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>
6227<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
6228
6229Example:
6230    forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
6231matches '++x' in
6232    for (x; x &lt; N; ++x) { }
6233</pre></td></tr>
6234
6235
6236<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>
6237<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
6238
6239Example:
6240    forStmt(hasLoopInit(declStmt()))
6241matches 'int x = 0' in
6242    for (int x = 0; x &lt; N; ++x) { }
6243</pre></td></tr>
6244
6245
6246<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>
6247<tr><td colspan="4" class="doc" id="hasType5"><pre>Overloaded to match the declaration of the expression's or value
6248declaration's type.
6249
6250In case of a value declaration (for example a variable declaration),
6251this resolves one layer of indirection. For example, in the value
6252declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
6253X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
6254declaration of x.
6255
6256Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6257            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6258            and friend class X (matcher = friendDecl(hasType("X"))
6259 class X {};
6260 void y(X &amp;x) { x; X z; }
6261 class Y { friend class X; };
6262
6263Usable 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;
6264</pre></td></tr>
6265
6266
6267<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>
6268<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
6269matcher.
6270
6271Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
6272            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
6273            and U (matcher = typedefDecl(hasType(asString("int")))
6274            and friend class X (matcher = friendDecl(hasType("X"))
6275 class X {};
6276 void y(X &amp;x) { x; X z; }
6277 typedef int U;
6278 class Y { friend class X; };
6279</pre></td></tr>
6280
6281
6282<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>
6283<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function or an ObjC method declaration or a
6284block.
6285
6286Does not match the 'this' parameter of a method.
6287
6288Given
6289  class X { void f(int x, int y, int z) {} };
6290cxxMethodDecl(hasAnyParameter(hasName("y")))
6291  matches f(int x, int y, int z) {}
6292with hasAnyParameter(...)
6293  matching int y
6294
6295For ObjectiveC, given
6296  @interface I - (void) f:(int) y; @end
6297
6298the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6299matches the declaration of method f with hasParameter
6300matching y.
6301
6302For blocks, given
6303  b = ^(int y) { printf("%d", y) };
6304
6305the matcher blockDecl(hasAnyParameter(hasName("y")))
6306matches the declaration of the block b with hasParameter
6307matching y.
6308</pre></td></tr>
6309
6310
6311<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>
6312<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6313functionDecl that have at least one TemplateArgument matching the given
6314InnerMatcher.
6315
6316Given
6317  template&lt;typename T&gt; class A {};
6318  template&lt;&gt; class A&lt;double&gt; {};
6319  A&lt;int&gt; a;
6320
6321  template&lt;typename T&gt; f() {};
6322  void func() { f&lt;int&gt;(); };
6323
6324classTemplateSpecializationDecl(hasAnyTemplateArgument(
6325    refersToType(asString("int"))))
6326  matches the specialization A&lt;int&gt;
6327
6328functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
6329  matches the specialization f&lt;int&gt;
6330</pre></td></tr>
6331
6332
6333<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>
6334<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
6335definition that has a given body.
6336
6337Given
6338  for (;;) {}
6339hasBody(compoundStmt())
6340  matches 'for (;;) {}'
6341with compoundStmt()
6342  matching '{}'
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('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>
6347<tr><td colspan="4" class="doc" id="hasExplicitSpecifier0"><pre>Matches the expression in an explicit specifier if present in the given
6348declaration.
6349
6350Given
6351  template&lt;bool b&gt;
6352  struct S {
6353    S(int); // #1
6354    explicit S(double); // #2
6355    operator int(); // #3
6356    explicit operator bool(); // #4
6357    explicit(false) S(bool) // # 7
6358    explicit(true) S(char) // # 8
6359    explicit(b) S(S) // # 9
6360  };
6361  S(int) -&gt; S&lt;true&gt; // #5
6362  explicit S(double) -&gt; S&lt;false&gt; // #6
6363cxxConstructorDecl(hasExplicitSpecifier(constantExpr())) will match #7, #8 and #9, but not #1 or #2.
6364cxxConversionDecl(hasExplicitSpecifier(constantExpr())) will not match #3 or #4.
6365cxxDeductionGuideDecl(hasExplicitSpecifier(constantExpr())) will not match #5 or #6.
6366</pre></td></tr>
6367
6368
6369<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>
6370<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function or an ObjC method
6371declaration or a block.
6372
6373Given
6374  class X { void f(int x) {} };
6375cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6376  matches f(int x) {}
6377with hasParameter(...)
6378  matching int x
6379
6380For ObjectiveC, given
6381  @interface I - (void) f:(int) y; @end
6382
6383the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6384matches the declaration of method f with hasParameter
6385matching y.
6386</pre></td></tr>
6387
6388
6389<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>
6390<tr><td colspan="4" class="doc" id="hasTemplateArgument2"><pre>Matches classTemplateSpecializations, templateSpecializationType and
6391functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
6392
6393Given
6394  template&lt;typename T, typename U&gt; class A {};
6395  A&lt;bool, int&gt; b;
6396  A&lt;int, bool&gt; c;
6397
6398  template&lt;typename T&gt; void f() {}
6399  void func() { f&lt;int&gt;(); };
6400classTemplateSpecializationDecl(hasTemplateArgument(
6401    1, refersToType(asString("int"))))
6402  matches the specialization A&lt;bool, int&gt;
6403
6404functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
6405  matches the specialization f&lt;int&gt;
6406</pre></td></tr>
6407
6408
6409<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>
6410<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
6411
6412Given:
6413  class X { int f() { return 1; } };
6414cxxMethodDecl(returns(asString("int")))
6415  matches int f() { return 1; }
6416</pre></td></tr>
6417
6418
6419<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>
6420<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
6421switch statement or conditional operator.
6422
6423Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
6424  if (true) {}
6425</pre></td></tr>
6426
6427
6428<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>
6429<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
6430
6431Given
6432  if (A* a = GetAPointer()) {}
6433hasConditionVariableStatement(...)
6434  matches 'A* a = GetAPointer()'.
6435</pre></td></tr>
6436
6437
6438<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>
6439<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
6440
6441Examples matches the if statement
6442  (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
6443  if (false) false; else true;
6444</pre></td></tr>
6445
6446
6447<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>
6448<tr><td colspan="4" class="doc" id="hasInitStatement0"><pre>Matches selection statements with initializer.
6449
6450Given:
6451 void foo() {
6452   if (int i = foobar(); i &gt; 0) {}
6453   switch (int i = foobar(); i) {}
6454   for (auto&amp; a = get_range(); auto&amp; x : a) {}
6455 }
6456 void bar() {
6457   if (foobar() &gt; 0) {}
6458   switch (foobar()) {}
6459   for (auto&amp; x : get_range()) {}
6460 }
6461ifStmt(hasInitStatement(anything()))
6462  matches the if statement in foo but not in bar.
6463switchStmt(hasInitStatement(anything()))
6464  matches the switch statement in foo but not in bar.
6465cxxForRangeStmt(hasInitStatement(anything()))
6466  matches the range for statement in foo but not in bar.
6467</pre></td></tr>
6468
6469
6470<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>
6471<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
6472
6473Examples matches the if statement
6474  (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
6475  if (false) true; else false;
6476</pre></td></tr>
6477
6478
6479<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>
6480<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
6481matcher.
6482
6483FIXME: Unit test this matcher
6484</pre></td></tr>
6485
6486
6487<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>
6488<tr><td colspan="4" class="doc" id="hasInit0"><pre>Matches the n'th item of an initializer list expression.
6489
6490Example matches y.
6491    (matcher = initListExpr(hasInit(0, expr())))
6492  int x{y}.
6493</pre></td></tr>
6494
6495
6496<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>
6497<tr><td colspan="4" class="doc" id="hasSyntacticForm0"><pre>Matches the syntactic form of init list expressions
6498(if expression have it).
6499</pre></td></tr>
6500
6501
6502<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>
6503<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
6504matches the given matcher.
6505
6506The associated declaration is:
6507- for type nodes, the declaration of the underlying type
6508- for CallExpr, the declaration of the callee
6509- for MemberExpr, the declaration of the referenced member
6510- for CXXConstructExpr, the declaration of the constructor
6511- for CXXNewExpr, the declaration of the operator new
6512- for ObjCIvarExpr, the declaration of the ivar
6513
6514For type nodes, hasDeclaration will generally match the declaration of the
6515sugared type. Given
6516  class X {};
6517  typedef X Y;
6518  Y y;
6519in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6520typedefDecl. A common use case is to match the underlying, desugared type.
6521This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6522  varDecl(hasType(hasUnqualifiedDesugaredType(
6523      recordType(hasDeclaration(decl())))))
6524In this matcher, the decl will match the CXXRecordDecl of class X.
6525
6526Usable 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;,
6527  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;,
6528  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;,
6529  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;,
6530  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;,
6531  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;,
6532  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6533</pre></td></tr>
6534
6535
6536<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>
6537<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
6538matches the given matcher.
6539
6540The associated declaration is:
6541- for type nodes, the declaration of the underlying type
6542- for CallExpr, the declaration of the callee
6543- for MemberExpr, the declaration of the referenced member
6544- for CXXConstructExpr, the declaration of the constructor
6545- for CXXNewExpr, the declaration of the operator new
6546- for ObjCIvarExpr, the declaration of the ivar
6547
6548For type nodes, hasDeclaration will generally match the declaration of the
6549sugared type. Given
6550  class X {};
6551  typedef X Y;
6552  Y y;
6553in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6554typedefDecl. A common use case is to match the underlying, desugared type.
6555This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6556  varDecl(hasType(hasUnqualifiedDesugaredType(
6557      recordType(hasDeclaration(decl())))))
6558In this matcher, the decl will match the CXXRecordDecl of class X.
6559
6560Usable 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;,
6561  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;,
6562  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;,
6563  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;,
6564  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;,
6565  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;,
6566  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6567</pre></td></tr>
6568
6569
6570<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>
6571<tr><td colspan="4" class="doc" id="hasAnyCapture1"><pre>Matches any capture of 'this' in a lambda expression.
6572
6573Given
6574  struct foo {
6575    void bar() {
6576      auto f = [this](){};
6577    }
6578  }
6579lambdaExpr(hasAnyCapture(cxxThisExpr()))
6580  matches [this](){};
6581</pre></td></tr>
6582
6583
6584<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>
6585<tr><td colspan="4" class="doc" id="hasAnyCapture0"><pre>Matches any capture of a lambda expression.
6586
6587Given
6588  void foo() {
6589    int x;
6590    auto f = [x](){};
6591  }
6592lambdaExpr(hasAnyCapture(anything()))
6593  matches [x](){};
6594</pre></td></tr>
6595
6596
6597<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>
6598<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
6599matches the given matcher.
6600
6601The associated declaration is:
6602- for type nodes, the declaration of the underlying type
6603- for CallExpr, the declaration of the callee
6604- for MemberExpr, the declaration of the referenced member
6605- for CXXConstructExpr, the declaration of the constructor
6606- for CXXNewExpr, the declaration of the operator new
6607- for ObjCIvarExpr, the declaration of the ivar
6608
6609For type nodes, hasDeclaration will generally match the declaration of the
6610sugared type. Given
6611  class X {};
6612  typedef X Y;
6613  Y y;
6614in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
6615typedefDecl. A common use case is to match the underlying, desugared type.
6616This can be achieved by using the hasUnqualifiedDesugaredType matcher:
6617  varDecl(hasType(hasUnqualifiedDesugaredType(
6618      recordType(hasDeclaration(decl())))))
6619In this matcher, the decl will match the CXXRecordDecl of class X.
6620
6621Usable 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;,
6622  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;,
6623  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;,
6624  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;,
6625  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;,
6626  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;,
6627  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
6628</pre></td></tr>
6629
6630
6631<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>
6632<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is matched by a
6633given matcher. Implicit object expressions are included; that is, it matches
6634use of implicit `this`.
6635
6636Given
6637  struct X {
6638    int m;
6639    int f(X x) { x.m; return m; }
6640  };
6641memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
6642  matches `x.m`, but not `m`; however,
6643memberExpr(hasObjectExpression(hasType(pointsTo(
6644     cxxRecordDecl(hasName("X"))))))
6645  matches `m` (aka. `this-&gt;m`), but not `x.m`.
6646</pre></td></tr>
6647
6648
6649<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>
6650<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
6651given matcher.
6652
6653Given
6654  struct { int first, second; } first, second;
6655  int i(second.first);
6656  int j(first.second);
6657memberExpr(member(hasName("first")))
6658  matches second.first
6659  but not first.second (because the member name there is "second").
6660</pre></td></tr>
6661
6662
6663<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>
6664<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
6665pointee matches a given matcher.
6666
6667Given
6668  int *a;
6669  int const *b;
6670  float const *f;
6671pointerType(pointee(isConstQualified(), isInteger()))
6672  matches "int const *b"
6673
6674Usable 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;,
6675  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;
6676</pre></td></tr>
6677
6678
6679<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>
6680<tr><td colspan="4" class="doc" id="hasUnderlyingDecl0"><pre>Matches a NamedDecl whose underlying declaration matches the given
6681matcher.
6682
6683Given
6684  namespace N { template&lt;class T&gt; void f(T t); }
6685  template &lt;class T&gt; void g() { using N::f; f(T()); }
6686unresolvedLookupExpr(hasAnyDeclaration(
6687    namedDecl(hasUnderlyingDecl(hasName("::N::f")))))
6688  matches the use of f in g() .
6689</pre></td></tr>
6690
6691
6692<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>
6693<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
6694
6695Given
6696  struct A { struct B { struct C {}; }; };
6697  A::B::C c;
6698nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
6699  matches "A::"
6700</pre></td></tr>
6701
6702
6703<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>
6704<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
6705NestedNameSpecifier-matcher matches.
6706</pre></td></tr>
6707
6708
6709<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>
6710<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
6711given TypeLoc.
6712
6713Given
6714  struct A { struct B { struct C {}; }; };
6715  A::B::C c;
6716nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
6717  hasDeclaration(cxxRecordDecl(hasName("A")))))))
6718  matches "A::"
6719</pre></td></tr>
6720
6721
6722<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>
6723<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
6724
6725Given
6726  struct A { struct B { struct C {}; }; };
6727  A::B::C c;
6728nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
6729  matches "A::"
6730</pre></td></tr>
6731
6732
6733<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>
6734<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
6735given namespace matcher.
6736
6737Given
6738  namespace ns { struct A {}; }
6739  ns::A a;
6740nestedNameSpecifier(specifiesNamespace(hasName("ns")))
6741  matches "ns::"
6742</pre></td></tr>
6743
6744
6745<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>
6746<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
6747given QualType matcher without qualifiers.
6748
6749Given
6750  struct A { struct B { struct C {}; }; };
6751  A::B::C c;
6752nestedNameSpecifier(specifiesType(
6753  hasDeclaration(cxxRecordDecl(hasName("A")))
6754))
6755  matches "A::"
6756</pre></td></tr>
6757
6758
6759<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>
6760<tr><td colspan="4" class="doc" id="hasAnyClause0"><pre>Matches any clause in an OpenMP directive.
6761
6762Given
6763
6764  #pragma omp parallel
6765  #pragma omp parallel default(none)
6766
6767``ompExecutableDirective(hasAnyClause(anything()))`` matches
6768``omp parallel default(none)``.
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('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>
6773<tr><td colspan="4" class="doc" id="hasStructuredBlock0"><pre>Matches the structured-block of the OpenMP executable directive
6774
6775Prerequisite: the executable directive must not be standalone directive.
6776If it is, it will never match.
6777
6778Given
6779
6780   #pragma omp parallel
6781   ;
6782   #pragma omp parallel
6783   {}
6784
6785``ompExecutableDirective(hasStructuredBlock(nullStmt()))`` will match ``;``
6786</pre></td></tr>
6787
6788
6789<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>
6790<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Matches C++ classes that are directly or indirectly derived from a class
6791matching Base, or Objective-C classes that directly or indirectly
6792subclass a class matching Base.
6793
6794Note that a class is not considered to be derived from itself.
6795
6796Example matches Y, Z, C (Base == hasName("X"))
6797  class X;
6798  class Y : public X {};  // directly derived
6799  class Z : public Y {};  // indirectly derived
6800  typedef X A;
6801  typedef A B;
6802  class C : public B {};  // derived from a typedef of X
6803
6804In the following example, Bar matches isDerivedFrom(hasName("X")):
6805  class Foo;
6806  typedef Foo X;
6807  class Bar : public Foo {};  // derived from a type that X is a typedef of
6808
6809In the following example, Bar matches isDerivedFrom(hasName("NSObject"))
6810  @interface NSObject @end
6811  @interface Bar : NSObject @end
6812
6813Usable 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;
6814</pre></td></tr>
6815
6816
6817<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>
6818<tr><td colspan="4" class="doc" id="isDirectlyDerivedFrom1"><pre>Matches C++ or Objective-C classes that are directly derived from a class
6819matching Base.
6820
6821Note that a class is not considered to be derived from itself.
6822
6823Example matches Y, C (Base == hasName("X"))
6824  class X;
6825  class Y : public X {};  // directly derived
6826  class Z : public Y {};  // indirectly derived
6827  typedef X A;
6828  typedef A B;
6829  class C : public B {};  // derived from a typedef of X
6830
6831In the following example, Bar matches isDerivedFrom(hasName("X")):
6832  class Foo;
6833  typedef Foo X;
6834  class Bar : public Foo {};  // derived from a type that X is a typedef of
6835</pre></td></tr>
6836
6837
6838<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>
6839<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Similar to isDerivedFrom(), but also matches classes that directly
6840match Base.
6841</pre></td></tr>
6842
6843
6844<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>
6845<tr><td colspan="4" class="doc" id="hasAnyArgument3"><pre>Matches any argument of a call expression or a constructor call
6846expression, or an ObjC-message-send expression.
6847
6848Given
6849  void x(int, int, int) { int y; x(1, y, 42); }
6850callExpr(hasAnyArgument(declRefExpr()))
6851  matches x(1, y, 42)
6852with hasAnyArgument(...)
6853  matching y
6854
6855For ObjectiveC, given
6856  @interface I - (void) f:(int) y; @end
6857  void foo(I *i) { [i f:12]; }
6858objcMessageExpr(hasAnyArgument(integerLiteral(equals(12))))
6859  matches [i f:12]
6860</pre></td></tr>
6861
6862
6863<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>
6864<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
6865call expression.
6866
6867Example matches y in x(y)
6868    (matcher = callExpr(hasArgument(0, declRefExpr())))
6869  void x(int) { int y; x(y); }
6870</pre></td></tr>
6871
6872
6873<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>
6874<tr><td colspan="4" class="doc" id="hasReceiver0"><pre>Matches if the Objective-C message is sent to an instance,
6875and the inner matcher matches on that instance.
6876
6877For example the method call in
6878  NSString *x = @"hello";
6879  [x containsString:@"h"];
6880is matched by
6881objcMessageExpr(hasReceiver(declRefExpr(to(varDecl(hasName("x"))))))
6882</pre></td></tr>
6883
6884
6885<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>
6886<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
6887
6888Example
6889matcher = objCMessageExpr(hasReceiverType(asString("UIWebView *")));
6890matches the [webView ...] message invocation.
6891  NSString *webViewJavaScript = ...
6892  UIWebView *webView = ...
6893  [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
6894</pre></td></tr>
6895
6896
6897<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>
6898<tr><td colspan="4" class="doc" id="hasAnyParameter1"><pre>Matches any parameter of a function or an ObjC method declaration or a
6899block.
6900
6901Does not match the 'this' parameter of a method.
6902
6903Given
6904  class X { void f(int x, int y, int z) {} };
6905cxxMethodDecl(hasAnyParameter(hasName("y")))
6906  matches f(int x, int y, int z) {}
6907with hasAnyParameter(...)
6908  matching int y
6909
6910For ObjectiveC, given
6911  @interface I - (void) f:(int) y; @end
6912
6913the matcher objcMethodDecl(hasAnyParameter(hasName("y")))
6914matches the declaration of method f with hasParameter
6915matching y.
6916
6917For blocks, given
6918  b = ^(int y) { printf("%d", y) };
6919
6920the matcher blockDecl(hasAnyParameter(hasName("y")))
6921matches the declaration of the block b with hasParameter
6922matching y.
6923</pre></td></tr>
6924
6925
6926<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>
6927<tr><td colspan="4" class="doc" id="hasParameter1"><pre>Matches the n'th parameter of a function or an ObjC method
6928declaration or a block.
6929
6930Given
6931  class X { void f(int x) {} };
6932cxxMethodDecl(hasParameter(0, hasType(varDecl())))
6933  matches f(int x) {}
6934with hasParameter(...)
6935  matching int x
6936
6937For ObjectiveC, given
6938  @interface I - (void) f:(int) y; @end
6939
6940the matcher objcMethodDecl(hasParameter(0, hasName("y")))
6941matches the declaration of method f with hasParameter
6942matching y.
6943</pre></td></tr>
6944
6945
6946<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>
6947<tr><td colspan="4" class="doc" id="hasSourceExpression1"><pre>Matches if the cast's source expression
6948or opaque value's source expression matches the given matcher.
6949
6950Example 1: matches "a string"
6951(matcher = castExpr(hasSourceExpression(cxxConstructExpr())))
6952class URL { URL(string); };
6953URL url = "a string";
6954
6955Example 2: matches 'b' (matcher =
6956opaqueValueExpr(hasSourceExpression(implicitCastExpr(declRefExpr())))
6957int a = b ?: 1;
6958</pre></td></tr>
6959
6960
6961<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>
6962<tr><td colspan="4" class="doc" id="hasAnyDeclaration0"><pre>Matches an OverloadExpr if any of the declarations in the set of
6963overloads matches the given matcher.
6964
6965Given
6966  template &lt;typename T&gt; void foo(T);
6967  template &lt;typename T&gt; void bar(T);
6968  template &lt;typename T&gt; void baz(T t) {
6969    foo(t);
6970    bar(t);
6971  }
6972unresolvedLookupExpr(hasAnyDeclaration(
6973    functionTemplateDecl(hasName("foo"))))
6974  matches foo in foo(t); but not bar in bar(t);
6975</pre></td></tr>
6976
6977
6978<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>
6979<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
6980
6981Given
6982  int (*ptr_to_array)[4];
6983  int (*ptr_to_func)(int);
6984
6985varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
6986ptr_to_func but not ptr_to_array.
6987
6988Usable as: Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
6989</pre></td></tr>
6990
6991
6992<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>
6993<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
6994pointee matches a given matcher.
6995
6996Given
6997  int *a;
6998  int const *b;
6999  float const *f;
7000pointerType(pointee(isConstQualified(), isInteger()))
7001  matches "int const *b"
7002
7003Usable 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;,
7004  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;
7005</pre></td></tr>
7006
7007
7008<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>
7009<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
7010
7011Given:
7012  typedef int &amp;int_ref;
7013  int a;
7014  int_ref b = a;
7015
7016varDecl(hasType(qualType(referenceType()))))) will not match the
7017declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
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('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>
7022<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
7023matches the given matcher.
7024
7025The associated declaration is:
7026- for type nodes, the declaration of the underlying type
7027- for CallExpr, the declaration of the callee
7028- for MemberExpr, the declaration of the referenced member
7029- for CXXConstructExpr, the declaration of the constructor
7030- for CXXNewExpr, the declaration of the operator new
7031- for ObjCIvarExpr, the declaration of the ivar
7032
7033For type nodes, hasDeclaration will generally match the declaration of the
7034sugared type. Given
7035  class X {};
7036  typedef X Y;
7037  Y y;
7038in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7039typedefDecl. A common use case is to match the underlying, desugared type.
7040This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7041  varDecl(hasType(hasUnqualifiedDesugaredType(
7042      recordType(hasDeclaration(decl())))))
7043In this matcher, the decl will match the CXXRecordDecl of class X.
7044
7045Usable 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;,
7046  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;,
7047  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;,
7048  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;,
7049  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;,
7050  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;,
7051  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7052</pre></td></tr>
7053
7054
7055<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>
7056<tr><td colspan="4" class="doc" id="ignoringParens0"><pre>Matches types that match InnerMatcher after any parens are stripped.
7057
7058Given
7059  void (*fp)(void);
7060The matcher
7061  varDecl(hasType(pointerType(pointee(ignoringParens(functionType())))))
7062would match the declaration for fp.
7063</pre></td></tr>
7064
7065
7066<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>
7067<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
7068</pre></td></tr>
7069
7070
7071<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>
7072<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
7073matches the specified matcher.
7074
7075Example matches y-&gt;x()
7076  (matcher = cxxMemberCallExpr(on(hasType(pointsTo
7077     cxxRecordDecl(hasName("Y")))))))
7078  class Y { public: void x(); };
7079  void z() { Y *y; y-&gt;x(); }
7080</pre></td></tr>
7081
7082
7083<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>
7084<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
7085</pre></td></tr>
7086
7087
7088<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>
7089<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
7090type matches the specified matcher.
7091
7092Example matches X &amp;x and const X &amp;y
7093    (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
7094  class X {
7095    void a(X b) {
7096      X &amp;x = b;
7097      const X &amp;y = b;
7098    }
7099  };
7100</pre></td></tr>
7101
7102
7103<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>
7104<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
7105matches the given matcher.
7106
7107The associated declaration is:
7108- for type nodes, the declaration of the underlying type
7109- for CallExpr, the declaration of the callee
7110- for MemberExpr, the declaration of the referenced member
7111- for CXXConstructExpr, the declaration of the constructor
7112- for CXXNewExpr, the declaration of the operator new
7113- for ObjCIvarExpr, the declaration of the ivar
7114
7115For type nodes, hasDeclaration will generally match the declaration of the
7116sugared type. Given
7117  class X {};
7118  typedef X Y;
7119  Y y;
7120in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7121typedefDecl. A common use case is to match the underlying, desugared type.
7122This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7123  varDecl(hasType(hasUnqualifiedDesugaredType(
7124      recordType(hasDeclaration(decl())))))
7125In this matcher, the decl will match the CXXRecordDecl of class X.
7126
7127Usable 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;,
7128  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;,
7129  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;,
7130  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;,
7131  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;,
7132  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;,
7133  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7134</pre></td></tr>
7135
7136
7137<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>
7138<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
7139pointee matches a given matcher.
7140
7141Given
7142  int *a;
7143  int const *b;
7144  float const *f;
7145pointerType(pointee(isConstQualified(), isInteger()))
7146  matches "int const *b"
7147
7148Usable 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;,
7149  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;
7150</pre></td></tr>
7151
7152
7153<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>
7154<tr><td colspan="4" class="doc" id="hasReturnValue0"><pre>Matches the return value expression of a return statement
7155
7156Given
7157  return a + b;
7158hasReturnValue(binaryOperator())
7159  matches 'return a + b'
7160with binaryOperator()
7161  matching 'a + b'
7162</pre></td></tr>
7163
7164
7165<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>
7166<tr><td colspan="4" class="doc" id="hasAnySubstatement1"><pre>Matches compound statements where at least one substatement matches
7167a given matcher. Also matches StmtExprs that have CompoundStmt as children.
7168
7169Given
7170  { {}; 1+2; }
7171hasAnySubstatement(compoundStmt())
7172  matches '{ {}; 1+2; }'
7173with compoundStmt()
7174  matching '{}'
7175</pre></td></tr>
7176
7177
7178<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>
7179<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7180alignof.
7181</pre></td></tr>
7182
7183
7184<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>
7185<tr><td colspan="4" class="doc" id="forFunction0"><pre>Matches declaration of the function the statement belongs to
7186
7187Given:
7188F&amp; operator=(const F&amp; o) {
7189  std::copy_if(o.begin(), o.end(), begin(), [](V v) { return v &gt; 0; });
7190  return *this;
7191}
7192returnStmt(forFunction(hasName("operator=")))
7193  matches 'return *this'
7194  but does not match 'return v &gt; 0'
7195</pre></td></tr>
7196
7197
7198<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>
7199<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
7200sizeof.
7201</pre></td></tr>
7202
7203
7204<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>
7205<tr><td colspan="4" class="doc" id="hasReplacementType0"><pre>Matches template type parameter substitutions that have a replacement
7206type that matches the provided matcher.
7207
7208Given
7209  template &lt;typename T&gt;
7210  double F(T t);
7211  int i;
7212  double j = F(i);
7213
7214substTemplateTypeParmType(hasReplacementType(type())) matches int
7215</pre></td></tr>
7216
7217
7218<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>
7219<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
7220statement. This matcher may produce multiple matches.
7221
7222Given
7223  switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
7224switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
7225  matches four times, with "c" binding each of "case 1:", "case 2:",
7226"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
7227"switch (1)", "switch (2)" and "switch (2)".
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('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>
7232<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
7233switch statement or conditional operator.
7234
7235Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7236  if (true) {}
7237</pre></td></tr>
7238
7239
7240<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>
7241<tr><td colspan="4" class="doc" id="hasInitStatement1"><pre>Matches selection statements with initializer.
7242
7243Given:
7244 void foo() {
7245   if (int i = foobar(); i &gt; 0) {}
7246   switch (int i = foobar(); i) {}
7247   for (auto&amp; a = get_range(); auto&amp; x : a) {}
7248 }
7249 void bar() {
7250   if (foobar() &gt; 0) {}
7251   switch (foobar()) {}
7252   for (auto&amp; x : get_range()) {}
7253 }
7254ifStmt(hasInitStatement(anything()))
7255  matches the if statement in foo but not in bar.
7256switchStmt(hasInitStatement(anything()))
7257  matches the switch statement in foo but not in bar.
7258cxxForRangeStmt(hasInitStatement(anything()))
7259  matches the range for statement in foo but not in bar.
7260</pre></td></tr>
7261
7262
7263<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>
7264<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
7265matches the given matcher.
7266
7267The associated declaration is:
7268- for type nodes, the declaration of the underlying type
7269- for CallExpr, the declaration of the callee
7270- for MemberExpr, the declaration of the referenced member
7271- for CXXConstructExpr, the declaration of the constructor
7272- for CXXNewExpr, the declaration of the operator new
7273- for ObjCIvarExpr, the declaration of the ivar
7274
7275For type nodes, hasDeclaration will generally match the declaration of the
7276sugared type. Given
7277  class X {};
7278  typedef X Y;
7279  Y y;
7280in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7281typedefDecl. A common use case is to match the underlying, desugared type.
7282This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7283  varDecl(hasType(hasUnqualifiedDesugaredType(
7284      recordType(hasDeclaration(decl())))))
7285In this matcher, the decl will match the CXXRecordDecl of class X.
7286
7287Usable 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;,
7288  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;,
7289  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;,
7290  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;,
7291  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;,
7292  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;,
7293  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7294</pre></td></tr>
7295
7296
7297<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>
7298<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
7299
7300Given
7301  struct B { int next; };
7302  template&lt;int(B::*next_ptr)&gt; struct A {};
7303  A&lt;&amp;B::next&gt; a;
7304templateSpecializationType(hasAnyTemplateArgument(
7305  isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
7306  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7307    B::next
7308</pre></td></tr>
7309
7310
7311<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>
7312<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
7313declaration.
7314
7315Given
7316  struct B { int next; };
7317  template&lt;int(B::*next_ptr)&gt; struct A {};
7318  A&lt;&amp;B::next&gt; a;
7319classTemplateSpecializationDecl(hasAnyTemplateArgument(
7320    refersToDeclaration(fieldDecl(hasName("next")))))
7321  matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
7322    B::next
7323</pre></td></tr>
7324
7325
7326<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>
7327<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
7328
7329Given
7330  template&lt;int T&gt; struct C {};
7331  C&lt;42&gt; c;
7332classTemplateSpecializationDecl(
7333  hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
7334  matches the implicit instantiation of C in C&lt;42&gt;.
7335</pre></td></tr>
7336
7337
7338<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>
7339<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>Matches a TemplateArgument that refers to a certain template.
7340
7341Given
7342  template&lt;template &lt;typename&gt; class S&gt; class X {};
7343  template&lt;typename T&gt; class Y {};
7344  X&lt;Y&gt; xi;
7345classTemplateSpecializationDecl(hasAnyTemplateArgument(
7346    refersToTemplate(templateName())))
7347  matches the specialization X&lt;Y&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('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>
7352<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
7353
7354Given
7355  struct X {};
7356  template&lt;typename T&gt; struct A {};
7357  A&lt;X&gt; a;
7358classTemplateSpecializationDecl(hasAnyTemplateArgument(
7359    refersToType(class(hasName("X")))))
7360  matches the specialization A&lt;X&gt;
7361</pre></td></tr>
7362
7363
7364<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>
7365<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7366functionDecl that have at least one TemplateArgument matching the given
7367InnerMatcher.
7368
7369Given
7370  template&lt;typename T&gt; class A {};
7371  template&lt;&gt; class A&lt;double&gt; {};
7372  A&lt;int&gt; a;
7373
7374  template&lt;typename T&gt; f() {};
7375  void func() { f&lt;int&gt;(); };
7376
7377classTemplateSpecializationDecl(hasAnyTemplateArgument(
7378    refersToType(asString("int"))))
7379  matches the specialization A&lt;int&gt;
7380
7381functionDecl(hasAnyTemplateArgument(refersToType(asString("int"))))
7382  matches the specialization f&lt;int&gt;
7383</pre></td></tr>
7384
7385
7386<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>
7387<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
7388matches the given matcher.
7389
7390The associated declaration is:
7391- for type nodes, the declaration of the underlying type
7392- for CallExpr, the declaration of the callee
7393- for MemberExpr, the declaration of the referenced member
7394- for CXXConstructExpr, the declaration of the constructor
7395- for CXXNewExpr, the declaration of the operator new
7396- for ObjCIvarExpr, the declaration of the ivar
7397
7398For type nodes, hasDeclaration will generally match the declaration of the
7399sugared type. Given
7400  class X {};
7401  typedef X Y;
7402  Y y;
7403in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7404typedefDecl. A common use case is to match the underlying, desugared type.
7405This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7406  varDecl(hasType(hasUnqualifiedDesugaredType(
7407      recordType(hasDeclaration(decl())))))
7408In this matcher, the decl will match the CXXRecordDecl of class X.
7409
7410Usable 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;,
7411  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;,
7412  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;,
7413  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;,
7414  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;,
7415  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;,
7416  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7417</pre></td></tr>
7418
7419
7420<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>
7421<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations, templateSpecializationType and
7422functionDecl where the n'th TemplateArgument matches the given InnerMatcher.
7423
7424Given
7425  template&lt;typename T, typename U&gt; class A {};
7426  A&lt;bool, int&gt; b;
7427  A&lt;int, bool&gt; c;
7428
7429  template&lt;typename T&gt; void f() {}
7430  void func() { f&lt;int&gt;(); };
7431classTemplateSpecializationDecl(hasTemplateArgument(
7432    1, refersToType(asString("int"))))
7433  matches the specialization A&lt;bool, int&gt;
7434
7435functionDecl(hasTemplateArgument(0, refersToType(asString("int"))))
7436  matches the specialization f&lt;int&gt;
7437</pre></td></tr>
7438
7439
7440<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>
7441<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
7442matches the given matcher.
7443
7444The associated declaration is:
7445- for type nodes, the declaration of the underlying type
7446- for CallExpr, the declaration of the callee
7447- for MemberExpr, the declaration of the referenced member
7448- for CXXConstructExpr, the declaration of the constructor
7449- for CXXNewExpr, the declaration of the operator new
7450- for ObjCIvarExpr, the declaration of the ivar
7451
7452For type nodes, hasDeclaration will generally match the declaration of the
7453sugared type. Given
7454  class X {};
7455  typedef X Y;
7456  Y y;
7457in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7458typedefDecl. A common use case is to match the underlying, desugared type.
7459This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7460  varDecl(hasType(hasUnqualifiedDesugaredType(
7461      recordType(hasDeclaration(decl())))))
7462In this matcher, the decl will match the CXXRecordDecl of class X.
7463
7464Usable 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;,
7465  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;,
7466  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;,
7467  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;,
7468  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;,
7469  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;,
7470  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7471</pre></td></tr>
7472
7473
7474<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>
7475<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
7476QualType-matcher matches.
7477</pre></td></tr>
7478
7479
7480<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>
7481<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
7482matcher.
7483
7484Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7485            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7486            and U (matcher = typedefDecl(hasType(asString("int")))
7487            and friend class X (matcher = friendDecl(hasType("X"))
7488 class X {};
7489 void y(X &amp;x) { x; X z; }
7490 typedef int U;
7491 class Y { friend class X; };
7492</pre></td></tr>
7493
7494
7495<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>
7496<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
7497matches the given matcher.
7498
7499The associated declaration is:
7500- for type nodes, the declaration of the underlying type
7501- for CallExpr, the declaration of the callee
7502- for MemberExpr, the declaration of the referenced member
7503- for CXXConstructExpr, the declaration of the constructor
7504- for CXXNewExpr, the declaration of the operator new
7505- for ObjCIvarExpr, the declaration of the ivar
7506
7507For type nodes, hasDeclaration will generally match the declaration of the
7508sugared type. Given
7509  class X {};
7510  typedef X Y;
7511  Y y;
7512in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7513typedefDecl. A common use case is to match the underlying, desugared type.
7514This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7515  varDecl(hasType(hasUnqualifiedDesugaredType(
7516      recordType(hasDeclaration(decl())))))
7517In this matcher, the decl will match the CXXRecordDecl of class X.
7518
7519Usable 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;,
7520  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;,
7521  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;,
7522  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;,
7523  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;,
7524  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;,
7525  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7526</pre></td></tr>
7527
7528
7529<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>
7530<tr><td colspan="4" class="doc" id="hasUnqualifiedDesugaredType0"><pre>Matches if the matched type matches the unqualified desugared
7531type of the matched node.
7532
7533For example, in:
7534  class A {};
7535  using B = A;
7536The matcher type(hasUnqualifiedDesugaredType(recordType())) matches
7537both B and A.
7538</pre></td></tr>
7539
7540
7541<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>
7542<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
7543
7544Given
7545  int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
7546unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
7547  matches sizeof(a) and alignof(c)
7548</pre></td></tr>
7549
7550
7551<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>
7552<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
7553
7554Example matches true (matcher = hasUnaryOperand(
7555                                  cxxBoolLiteral(equals(true))))
7556  !true
7557</pre></td></tr>
7558
7559
7560<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>
7561<tr><td colspan="4" class="doc" id="hasObjectExpression1"><pre>Matches a member expression where the object expression is matched by a
7562given matcher. Implicit object expressions are included; that is, it matches
7563use of implicit `this`.
7564
7565Given
7566  struct X {
7567    int m;
7568    int f(X x) { x.m; return m; }
7569  };
7570memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))
7571  matches `x.m`, but not `m`; however,
7572memberExpr(hasObjectExpression(hasType(pointsTo(
7573     cxxRecordDecl(hasName("X"))))))
7574  matches `m` (aka. `this-&gt;m`), but not `x.m`.
7575</pre></td></tr>
7576
7577
7578<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>
7579<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
7580matches the given matcher.
7581
7582The associated declaration is:
7583- for type nodes, the declaration of the underlying type
7584- for CallExpr, the declaration of the callee
7585- for MemberExpr, the declaration of the referenced member
7586- for CXXConstructExpr, the declaration of the constructor
7587- for CXXNewExpr, the declaration of the operator new
7588- for ObjCIvarExpr, the declaration of the ivar
7589
7590For type nodes, hasDeclaration will generally match the declaration of the
7591sugared type. Given
7592  class X {};
7593  typedef X Y;
7594  Y y;
7595in varDecl(hasType(hasDeclaration(decl()))) the decl will match the
7596typedefDecl. A common use case is to match the underlying, desugared type.
7597This can be achieved by using the hasUnqualifiedDesugaredType matcher:
7598  varDecl(hasType(hasUnqualifiedDesugaredType(
7599      recordType(hasDeclaration(decl())))))
7600In this matcher, the decl will match the CXXRecordDecl of class X.
7601
7602Usable 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;,
7603  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;,
7604  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;,
7605  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;,
7606  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;,
7607  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;,
7608  Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
7609</pre></td></tr>
7610
7611
7612<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>
7613<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
7614
7615Given
7616  namespace X { void b(); }
7617  using X::b;
7618usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
7619  matches using X::b </pre></td></tr>
7620
7621
7622<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>
7623<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
7624matched by the given matcher.
7625
7626Given
7627  namespace X { int a; void b(); }
7628  using X::a;
7629  using X::b;
7630usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
7631  matches using X::b but not using X::a </pre></td></tr>
7632
7633
7634<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>
7635<tr><td colspan="4" class="doc" id="hasType6"><pre>Overloaded to match the declaration of the expression's or value
7636declaration's type.
7637
7638In case of a value declaration (for example a variable declaration),
7639this resolves one layer of indirection. For example, in the value
7640declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
7641X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
7642declaration of x.
7643
7644Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7645            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7646            and friend class X (matcher = friendDecl(hasType("X"))
7647 class X {};
7648 void y(X &amp;x) { x; X z; }
7649 class Y { friend class X; };
7650
7651Usable 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;
7652</pre></td></tr>
7653
7654
7655<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>
7656<tr><td colspan="4" class="doc" id="hasType3"><pre>Matches if the expression's or declaration's type matches a type
7657matcher.
7658
7659Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
7660            and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
7661            and U (matcher = typedefDecl(hasType(asString("int")))
7662            and friend class X (matcher = friendDecl(hasType("X"))
7663 class X {};
7664 void y(X &amp;x) { x; X z; }
7665 typedef int U;
7666 class Y { friend class X; };
7667</pre></td></tr>
7668
7669
7670<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>
7671<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
7672that matches the given matcher.
7673
7674Example matches x (matcher = varDecl(hasInitializer(callExpr())))
7675  bool y() { return true; }
7676  bool x = y();
7677</pre></td></tr>
7678
7679
7680<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>
7681<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
7682expression.
7683
7684Given
7685  void f(int b) {
7686    int a[b];
7687  }
7688variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
7689  varDecl(hasName("b")))))))
7690  matches "int a[b]"
7691</pre></td></tr>
7692
7693
7694<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>
7695<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
7696definition that has a given body.
7697
7698Given
7699  for (;;) {}
7700hasBody(compoundStmt())
7701  matches 'for (;;) {}'
7702with compoundStmt()
7703  matching '{}'
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('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>
7708<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
7709switch statement or conditional operator.
7710
7711Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
7712  if (true) {}
7713</pre></td></tr>
7714
7715<!--END_TRAVERSAL_MATCHERS -->
7716</table>
7717
7718</div>
7719</body>
7720</html>
7721
7722
7723