blob: 8be0aa9eb8218d5cc4de47e0a75b2dbf8d3015d1 [file] [log] [blame]
Aaron Ballman11825f22015-08-18 19:55:20 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10 padding: .33em;
11}
12td.doc {
13 display: none;
14 border-bottom: 1px solid black;
15}
16td.name:hover {
17 color: blue;
18 cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23 if (!id) return;
24 row = document.getElementById(id);
25 if (row.style.display != 'table-cell')
26 row.style.display = 'table-cell';
27 else
28 row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66 ifStmt(hasTrueExpression(
67 expr(hasDescendant(
68 ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
101<!-- START_DECL_MATCHERS -->
102
103<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;</td><td class="name" onclick="toggle('ctorInitializer0')"><a name="ctorInitializer0Anchor">ctorInitializer</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt;...</td></tr>
104<tr><td colspan="4" class="doc" id="ctorInitializer0"><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="http://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="http://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="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateDecl.html">ClassTemplateDecl</a>&gt;...</td></tr>
128<tr><td colspan="4" class="doc" id="classTemplateDecl0"><pre>Matches C++ class template declarations.
129
130Example matches Z
131 template&lt;class T&gt; class Z {};
132</pre></td></tr>
133
134
135<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ClassTemplateSpecializationDecl.html">ClassTemplateSpecializationDecl</a>&gt;...</td></tr>
136<tr><td colspan="4" class="doc" id="classTemplateSpecializationDecl0"><pre>Matches C++ class template specializations.
137
138Given
139 template&lt;typename T&gt; class A {};
140 template&lt;&gt; class A&lt;double&gt; {};
141 A&lt;int&gt; a;
142classTemplateSpecializationDecl()
143 matches the specializations A&lt;int&gt; and A&lt;double&gt;
144</pre></td></tr>
145
146
147<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('constructorDecl0')"><a name="constructorDecl0Anchor">constructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">CXXConstructorDecl</a>&gt;...</td></tr>
148<tr><td colspan="4" class="doc" id="constructorDecl0"><pre>Matches C++ constructor declarations.
149
150Example matches Foo::Foo() and Foo::Foo(int)
151 class Foo {
152 public:
153 Foo();
154 Foo(int);
155 int DoSomething();
156 };
157</pre></td></tr>
158
159
160<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('conversionDecl0')"><a name="conversionDecl0Anchor">conversionDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConversionDecl.html">CXXConversionDecl</a>&gt;...</td></tr>
161<tr><td colspan="4" class="doc" id="conversionDecl0"><pre>Matches conversion operator declarations.
162
163Example matches the operator.
164 class X { operator int() const; };
165</pre></td></tr>
166
167
168<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;...</td></tr>
169<tr><td colspan="4" class="doc" id="decl0"><pre>Matches declarations.
170
171Examples matches X, C, and the friend declaration inside C;
172 void X();
173 class C {
174 friend X;
175 };
176</pre></td></tr>
177
178
179<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclaratorDecl.html">DeclaratorDecl</a>&gt;...</td></tr>
180<tr><td colspan="4" class="doc" id="declaratorDecl0"><pre>Matches declarator declarations (field, variable, function
181and non-type template parameter declarations).
182
183Given
184 class X { int y; };
185declaratorDecl()
186 matches int y.
187</pre></td></tr>
188
189
190<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('destructorDecl0')"><a name="destructorDecl0Anchor">destructorDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDestructorDecl.html">CXXDestructorDecl</a>&gt;...</td></tr>
191<tr><td colspan="4" class="doc" id="destructorDecl0"><pre>Matches explicit C++ destructor declarations.
192
193Example matches Foo::~Foo()
194 class Foo {
195 public:
196 virtual ~Foo();
197 };
198</pre></td></tr>
199
200
201<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumConstantDecl.html">EnumConstantDecl</a>&gt;...</td></tr>
202<tr><td colspan="4" class="doc" id="enumConstantDecl0"><pre>Matches enum constants.
203
204Example matches A, B, C
205 enum X {
206 A, B, C
207 };
208</pre></td></tr>
209
210
211<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1EnumDecl.html">EnumDecl</a>&gt;...</td></tr>
212<tr><td colspan="4" class="doc" id="enumDecl0"><pre>Matches enum declarations.
213
214Example matches X
215 enum X {
216 A, B, C
217 };
218</pre></td></tr>
219
220
221<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt;...</td></tr>
222<tr><td colspan="4" class="doc" id="fieldDecl0"><pre>Matches field declarations.
223
224Given
225 class X { int m; };
226fieldDecl()
227 matches 'm'.
228</pre></td></tr>
229
230
231<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FriendDecl.html">FriendDecl</a>&gt;...</td></tr>
232<tr><td colspan="4" class="doc" id="friendDecl0"><pre>Matches friend declarations.
233
234Given
235 class X { friend void foo(); };
236friendDecl()
237 matches 'friend void foo()'.
238</pre></td></tr>
239
240
241<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;...</td></tr>
242<tr><td colspan="4" class="doc" id="functionDecl0"><pre>Matches function declarations.
243
244Example matches f
245 void f();
246</pre></td></tr>
247
248
249<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionTemplateDecl.html">FunctionTemplateDecl</a>&gt;...</td></tr>
250<tr><td colspan="4" class="doc" id="functionTemplateDecl0"><pre>Matches C++ function template declarations.
251
252Example matches f
253 template&lt;class T&gt; void f(T t) {}
254</pre></td></tr>
255
256
257<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LinkageSpecDecl.html">LinkageSpecDecl</a>&gt;...</td></tr>
258<tr><td colspan="4" class="doc" id="linkageSpecDecl0"><pre>Matches a declaration of a linkage specification.
259
260Given
261 extern "C" {}
262linkageSpecDecl()
263 matches "extern "C" {}"
264</pre></td></tr>
265
266
267<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('methodDecl0')"><a name="methodDecl0Anchor">methodDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;...</td></tr>
268<tr><td colspan="4" class="doc" id="methodDecl0"><pre>Matches method declarations.
269
270Example matches y
271 class X { void y(); };
272</pre></td></tr>
273
274
275<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt;...</td></tr>
276<tr><td colspan="4" class="doc" id="namedDecl0"><pre>Matches a declaration of anything that could have a name.
277
278Example matches X, S, the anonymous union type, i, and U;
279 typedef int X;
280 struct S {
281 union {
282 int i;
283 } U;
284 };
285</pre></td></tr>
286
287
Aaron Ballman6c79f352015-08-28 19:39:21 +0000288<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceAliasDecl.html">NamespaceAliasDecl</a>&gt;...</td></tr>
289<tr><td colspan="4" class="doc" id="namespaceAliasDecl0"><pre>Matches a declaration of a namespace alias.
290
291Given
292 namespace test {}
293 namespace alias = ::test;
294namespaceAliasDecl()
295 matches "namespace alias" but not "namespace test"
296</pre></td></tr>
297
298
Aaron Ballman11825f22015-08-18 19:55:20 +0000299<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt;...</td></tr>
300<tr><td colspan="4" class="doc" id="namespaceDecl0"><pre>Matches a declaration of a namespace.
301
302Given
303 namespace {}
304 namespace test {}
305namespaceDecl()
306 matches "namespace {}" and "namespace test {}"
307</pre></td></tr>
308
309
310<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt;...</td></tr>
311<tr><td colspan="4" class="doc" id="parmVarDecl0"><pre>Matches parameter variable declarations.
312
313Given
314 void f(int x);
315parmVarDecl()
316 matches int x.
317</pre></td></tr>
318
319
320<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;...</td></tr>
321<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches C++ class declarations.
322
323Example matches X, Z
324 class X;
325 template&lt;class T&gt; class Z {};
326</pre></td></tr>
327
328
329<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1StaticAssertDecl.html">StaticAssertDecl</a>&gt;...</td></tr>
330<tr><td colspan="4" class="doc" id="staticAssertDecl0"><pre>Matches a C++ static_assert declaration.
331
332Example:
333 staticAssertExpr()
334matches
335 static_assert(sizeof(S) == sizeof(int))
336in
337 struct S {
338 int x;
339 };
340 static_assert(sizeof(S) == sizeof(int));
341</pre></td></tr>
342
343
344<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
345<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
346
347Given
348 int X;
349 namespace NS {
350 int Y;
351 } namespace NS
352decl(hasDeclContext(translationUnitDecl()))
353 matches "int X", but not "int Y".
354</pre></td></tr>
355
356
357<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
358<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
359
360Given
361 typedef int X;
362typedefDecl()
363 matches "typedef int X"
364</pre></td></tr>
365
366
367<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingValueDecl.html">UnresolvedUsingValueDecl</a>&gt;...</td></tr>
368<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
369
370Given
371 template&lt;typename X&gt;
372 class C : private X {
373 using X::x;
374 };
375unresolvedUsingValueDecl()
376 matches using X::x </pre></td></tr>
377
378
379<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingDecl.html">UsingDecl</a>&gt;...</td></tr>
380<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
381
382Given
383 namespace X { int x; }
384 using X::x;
385usingDecl()
386 matches using X::x </pre></td></tr>
387
388
389<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingDirectiveDecl.html">UsingDirectiveDecl</a>&gt;...</td></tr>
390<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
391
392Given
393 namespace X { int x; }
394 using namespace X;
395usingDirectiveDecl()
396 matches using namespace X </pre></td></tr>
397
398
399<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;...</td></tr>
400<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
401
402Example matches A, B, C and F
403 enum X { A, B, C };
404 void F();
405</pre></td></tr>
406
407
408<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;...</td></tr>
409<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
410
411Note: this does not match declarations of member variables, which are
412"field" declarations in Clang parlance.
413
414Example matches a
415 int a;
416</pre></td></tr>
417
418
419<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;...</td></tr>
420<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
421</pre></td></tr>
422
423
424<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt;...</td></tr>
425<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
426
427Given
428 namespace ns {
429 struct A { static void f(); };
430 void A::f() {}
431 void g() { A::f(); }
432 }
433 ns::A a;
434nestedNameSpecifier()
435 matches "ns::" and both "A::"
436</pre></td></tr>
437
438
439<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;...</td></tr>
440<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
441</pre></td></tr>
442
443
444<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CUDAKernelCallExpr.html">CUDAKernelCallExpr</a>&gt;...</td></tr>
445<tr><td colspan="4" class="doc" id="CUDAKernelCallExpr0"><pre>Matches CUDA kernel call expression.
446
447Example matches,
448 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
449</pre></td></tr>
450
451
452<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;...</td></tr>
453<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
454
455Given
456 int i = a[1];
457arraySubscriptExpr()
458 matches "a[1]"
459</pre></td></tr>
460
461
462<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AsmStmt.html">AsmStmt</a>&gt;...</td></tr>
463<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
464
465 int i = 100;
466 __asm("mov al, 2");
467asmStmt()
468 matches '__asm("mov al, 2")'
469</pre></td></tr>
470
471
472<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>&gt;...</td></tr>
473<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
474
475Example matches a || b
476 !(a || b)
477</pre></td></tr>
478
479
480<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('bindTemporaryExpr0')"><a name="bindTemporaryExpr0Anchor">bindTemporaryExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBindTemporaryExpr.html">CXXBindTemporaryExpr</a>&gt;...</td></tr>
481<tr><td colspan="4" class="doc" id="bindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
482
483Example matches FunctionTakesString(GetStringByValue())
484 (matcher = bindTemporaryExpr())
485 FunctionTakesString(GetStringByValue());
486 FunctionTakesStringByPointer(GetStringPointer());
487</pre></td></tr>
488
489
490<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('boolLiteral0')"><a name="boolLiteral0Anchor">boolLiteral</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>&gt;...</td></tr>
491<tr><td colspan="4" class="doc" id="boolLiteral0"><pre>Matches bool literals.
492
493Example matches true
494 true
495</pre></td></tr>
496
497
498<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BreakStmt.html">BreakStmt</a>&gt;...</td></tr>
499<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
500
501Given
502 while (true) { break; }
503breakStmt()
504 matches 'break'
505</pre></td></tr>
506
507
508<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CStyleCastExpr.html">CStyleCastExpr</a>&gt;...</td></tr>
509<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
510
511Example: Matches (int*) 2.2f in
512 int i = (int) 2.2f;
513</pre></td></tr>
514
515
516<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;...</td></tr>
517<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
518
519Example matches x.y() and y()
520 X x;
521 x.y();
522 y();
523</pre></td></tr>
524
525
526<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CaseStmt.html">CaseStmt</a>&gt;...</td></tr>
527<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
528
529Given
530 switch(a) { case 42: break; default: break; }
531caseStmt()
532 matches 'case 42: break;'.
533</pre></td></tr>
534
535
536<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CastExpr.html">CastExpr</a>&gt;...</td></tr>
537<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
538
539Example: castExpr() matches each of the following:
540 (int) 3;
541 const_cast&lt;Expr *&gt;(SubExpr);
542 char c = 0;
543but does not match
544 int i = (0);
545 int k = 0;
546</pre></td></tr>
547
548
549<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('catchStmt0')"><a name="catchStmt0Anchor">catchStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXCatchStmt.html">CXXCatchStmt</a>&gt;...</td></tr>
550<tr><td colspan="4" class="doc" id="catchStmt0"><pre>Matches catch statements.
551
552 try {} catch(int i) {}
553catchStmt()
554 matches 'catch(int i)'
555</pre></td></tr>
556
557
558<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;...</td></tr>
559<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
560
561Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
562though.
563
564Example matches 'a', L'a'
565 char ch = 'a'; wchar_t chw = L'a';
566</pre></td></tr>
567
568
569<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CompoundLiteralExpr.html">CompoundLiteralExpr</a>&gt;...</td></tr>
570<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
571
572Example match: {1}, (1, 2)
573 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
574</pre></td></tr>
575
576
577<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CompoundStmt.html">CompoundStmt</a>&gt;...</td></tr>
578<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
579
580Example matches '{}' and '{{}}'in 'for (;;) {{}}'
581 for (;;) {{}}
582</pre></td></tr>
583
584
585<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;...</td></tr>
586<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
587
588Example matches a ? b : c
589 (a ? b : c) + 42
590</pre></td></tr>
591
592
593<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constCastExpr0')"><a name="constCastExpr0Anchor">constCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstCastExpr.html">CXXConstCastExpr</a>&gt;...</td></tr>
594<tr><td colspan="4" class="doc" id="constCastExpr0"><pre>Matches a const_cast expression.
595
596Example: Matches const_cast&lt;int*&gt;(&amp;r) in
597 int n = 42;
598 const int &amp;r(n);
599 int* p = const_cast&lt;int*&gt;(&amp;r);
600</pre></td></tr>
601
602
603<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('constructExpr0')"><a name="constructExpr0Anchor">constructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;...</td></tr>
604<tr><td colspan="4" class="doc" id="constructExpr0"><pre>Matches constructor call expressions (including implicit ones).
605
606Example matches string(ptr, n) and ptr within arguments of f
607 (matcher = constructExpr())
608 void f(const string &amp;a, const string &amp;b);
609 char *ptr;
610 int n;
611 f(string(ptr, n), ptr);
612</pre></td></tr>
613
614
615<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ContinueStmt.html">ContinueStmt</a>&gt;...</td></tr>
616<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
617
618Given
619 while (true) { continue; }
620continueStmt()
621 matches 'continue'
622</pre></td></tr>
623
624
625<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;...</td></tr>
626<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
627
628Example matches x in if (x)
629 bool x;
630 if (x) {}
631</pre></td></tr>
632
633
634<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt;...</td></tr>
635<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
636
637Given
638 int a;
639declStmt()
640 matches 'int a'.
641</pre></td></tr>
642
643
644<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('defaultArgExpr0')"><a name="defaultArgExpr0Anchor">defaultArgExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDefaultArgExpr.html">CXXDefaultArgExpr</a>&gt;...</td></tr>
645<tr><td colspan="4" class="doc" id="defaultArgExpr0"><pre>Matches the value of a default argument at the call site.
646
647Example matches the CXXDefaultArgExpr placeholder inserted for the
648 default value of the second parameter in the call expression f(42)
649 (matcher = defaultArgExpr())
650 void f(int x, int y = 0);
651 f(42);
652</pre></td></tr>
653
654
655<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DefaultStmt.html">DefaultStmt</a>&gt;...</td></tr>
656<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
657
658Given
659 switch(a) { case 42: break; default: break; }
660defaultStmt()
661 matches 'default: break;'.
662</pre></td></tr>
663
664
665<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('deleteExpr0')"><a name="deleteExpr0Anchor">deleteExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDeleteExpr.html">CXXDeleteExpr</a>&gt;...</td></tr>
666<tr><td colspan="4" class="doc" id="deleteExpr0"><pre>Matches delete expressions.
667
668Given
669 delete X;
670deleteExpr()
671 matches 'delete X'.
672</pre></td></tr>
673
674
675<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DoStmt.html">DoStmt</a>&gt;...</td></tr>
676<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
677
678Given
679 do {} while (true);
680doStmt()
681 matches 'do {} while(true)'
682</pre></td></tr>
683
684
685<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('dynamicCastExpr0')"><a name="dynamicCastExpr0Anchor">dynamicCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXDynamicCastExpr.html">CXXDynamicCastExpr</a>&gt;...</td></tr>
686<tr><td colspan="4" class="doc" id="dynamicCastExpr0"><pre>Matches a dynamic_cast expression.
687
688Example:
689 dynamicCastExpr()
690matches
691 dynamic_cast&lt;D*&gt;(&amp;b);
692in
693 struct B { virtual ~B() {} }; struct D : B {};
694 B b;
695 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
696</pre></td></tr>
697
698
699<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ExplicitCastExpr.html">ExplicitCastExpr</a>&gt;...</td></tr>
700<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
701
702Matches any cast expression written in user code, whether it be a
703C-style cast, a functional-style cast, or a keyword cast.
704
705Does not match implicit conversions.
706
707Note: the name "explicitCast" is chosen to match Clang's terminology, as
708Clang uses the term "cast" to apply to implicit conversions as well as to
709actual cast expressions.
710
711hasDestinationType.
712
713Example: matches all five of the casts in
714 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
715but does not match the implicit conversion in
716 long ell = 42;
717</pre></td></tr>
718
719
720<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;...</td></tr>
721<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
722
723Example matches x()
724 void f() { x(); }
725</pre></td></tr>
726
727
728<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ExprWithCleanups.html">ExprWithCleanups</a>&gt;...</td></tr>
729<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
730of the sub-expression's evaluation.
731
732Example matches std::string()
733 const std::string str = std::string();
734</pre></td></tr>
735
736
737<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;...</td></tr>
738<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
7391.0, 1.0f, 1.0L and 1e10.
740
741Does not match implicit conversions such as
742 float a = 10;
743</pre></td></tr>
744
745
746<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('forRangeStmt0')"><a name="forRangeStmt0Anchor">forRangeStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXForRangeStmt.html">CXXForRangeStmt</a>&gt;...</td></tr>
747<tr><td colspan="4" class="doc" id="forRangeStmt0"><pre>Matches range-based for statements.
748
749forRangeStmt() matches 'for (auto a : i)'
750 int i[] = {1, 2, 3}; for (auto a : i);
751 for(int j = 0; j &lt; 5; ++j);
752</pre></td></tr>
753
754
755<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>&gt;...</td></tr>
756<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
757
758Example matches 'for (;;) {}'
759 for (;;) {}
760 int i[] = {1, 2, 3}; for (auto a : i);
761</pre></td></tr>
762
763
764<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('functionalCastExpr0')"><a name="functionalCastExpr0Anchor">functionalCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXFunctionalCastExpr.html">CXXFunctionalCastExpr</a>&gt;...</td></tr>
765<tr><td colspan="4" class="doc" id="functionalCastExpr0"><pre>Matches functional cast expressions
766
767Example: Matches Foo(bar);
768 Foo f = bar;
769 Foo g = (Foo) bar;
770 Foo h = Foo(bar);
771</pre></td></tr>
772
773
774<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1GNUNullExpr.html">GNUNullExpr</a>&gt;...</td></tr>
775<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
776</pre></td></tr>
777
778
779<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1GotoStmt.html">GotoStmt</a>&gt;...</td></tr>
780<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
781
782Given
783 goto FOO;
784 FOO: bar();
785gotoStmt()
786 matches 'goto FOO'
787</pre></td></tr>
788
789
790<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>&gt;...</td></tr>
791<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
792
793Example matches 'if (x) {}'
794 if (x) {}
795</pre></td></tr>
796
797
798<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>&gt;...</td></tr>
799<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
800
801This matches many different places, including function call return value
802eliding, as well as any type conversions.
803</pre></td></tr>
804
805
806<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1InitListExpr.html">InitListExpr</a>&gt;...</td></tr>
807<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
808
809Given
810 int a[] = { 1, 2 };
811 struct B { int x, y; };
812 B b = { 5, 6 };
813initListExpr()
814 matches "{ 1, 2 }" and "{ 5, 6 }"
815</pre></td></tr>
816
817
818<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;...</td></tr>
819<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
8201, 1L, 0x1 and 1U.
821
822Does not match character-encoded integers such as L'a'.
823</pre></td></tr>
824
825
826<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;...</td></tr>
827<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
828
829Given
830 goto FOO;
831 FOO: bar();
832labelStmt()
833 matches 'FOO:'
834</pre></td></tr>
835
836
837<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LambdaExpr.html">LambdaExpr</a>&gt;...</td></tr>
838<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
839
840Example matches [&amp;](){return 5;}
841 [&amp;](){return 5;}
842</pre></td></tr>
843
844
845<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MaterializeTemporaryExpr.html">MaterializeTemporaryExpr</a>&gt;...</td></tr>
846<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
847
848Example: Given
849 struct T {void func()};
850 T f();
851 void g(T);
852materializeTemporaryExpr() matches 'f()' in these statements
853 T u(f());
854 g(f());
855but does not match
856 f();
857 f().func();
858</pre></td></tr>
859
860
861<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('memberCallExpr0')"><a name="memberCallExpr0Anchor">memberCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html">CXXMemberCallExpr</a>&gt;...</td></tr>
862<tr><td colspan="4" class="doc" id="memberCallExpr0"><pre>Matches member call expressions.
863
864Example matches x.y()
865 X x;
866 x.y();
867</pre></td></tr>
868
869
870<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;...</td></tr>
871<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
872
873Given
874 class Y {
875 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
876 int a; static int b;
877 };
878memberExpr()
879 matches this-&gt;x, x, y.x, a, this-&gt;b
880</pre></td></tr>
881
882
883<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('newExpr0')"><a name="newExpr0Anchor">newExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNewExpr.html">CXXNewExpr</a>&gt;...</td></tr>
884<tr><td colspan="4" class="doc" id="newExpr0"><pre>Matches new expressions.
885
886Given
887 new X;
888newExpr()
889 matches 'new X'.
890</pre></td></tr>
891
892
893<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('nullPtrLiteralExpr0')"><a name="nullPtrLiteralExpr0Anchor">nullPtrLiteralExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXNullPtrLiteralExpr.html">CXXNullPtrLiteralExpr</a>&gt;...</td></tr>
894<tr><td colspan="4" class="doc" id="nullPtrLiteralExpr0"><pre>Matches nullptr literal.
895</pre></td></tr>
896
897
898<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NullStmt.html">NullStmt</a>&gt;...</td></tr>
899<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
900
901 foo();;
902nullStmt()
903 matches the second ';'
904</pre></td></tr>
905
906
907<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>&gt;...</td></tr>
908<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
909
910The innermost message send invokes the "alloc" class method on the
911NSString class, while the outermost message send invokes the
912"initWithString" instance method on the object returned from
913NSString's "alloc". This matcher should match both message sends.
914 [[NSString alloc] initWithString:@"Hello"]
915</pre></td></tr>
916
917
918<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('operatorCallExpr0')"><a name="operatorCallExpr0Anchor">operatorCallExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;...</td></tr>
919<tr><td colspan="4" class="doc" id="operatorCallExpr0"><pre>Matches overloaded operator calls.
920
921Note that if an operator isn't overloaded, it won't match. Instead, use
922binaryOperator matcher.
923Currently it does not match operators such as new delete.
924FIXME: figure out why these do not match?
925
926Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
927 (matcher = operatorCallExpr())
928 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
929 ostream &amp;o; int b = 1, c = 1;
930 o &lt;&lt; b &lt;&lt; c;
931</pre></td></tr>
932
933
934<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('reinterpretCastExpr0')"><a name="reinterpretCastExpr0Anchor">reinterpretCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXReinterpretCastExpr.html">CXXReinterpretCastExpr</a>&gt;...</td></tr>
935<tr><td colspan="4" class="doc" id="reinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
936
937Either the source expression or the destination type can be matched
938using has(), but hasDestinationType() is more specific and can be
939more readable.
940
941Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
942 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
943</pre></td></tr>
944
945
946<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ReturnStmt.html">ReturnStmt</a>&gt;...</td></tr>
947<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
948
949Given
950 return 1;
951returnStmt()
952 matches 'return 1'
953</pre></td></tr>
954
955
956<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('staticCastExpr0')"><a name="staticCastExpr0Anchor">staticCastExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXStaticCastExpr.html">CXXStaticCastExpr</a>&gt;...</td></tr>
957<tr><td colspan="4" class="doc" id="staticCastExpr0"><pre>Matches a C++ static_cast expression.
958
959hasDestinationType
960reinterpretCast
961
962Example:
963 staticCastExpr()
964matches
965 static_cast&lt;long&gt;(8)
966in
967 long eight(static_cast&lt;long&gt;(8));
968</pre></td></tr>
969
970
971<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;...</td></tr>
972<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
973
974Given
975 { ++a; }
976stmt()
977 matches both the compound statement '{ ++a; }' and '++a'.
978</pre></td></tr>
979
980
981<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1StringLiteral.html">StringLiteral</a>&gt;...</td></tr>
982<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
983
984Example matches "abcd", L"abcd"
985 char *s = "abcd"; wchar_t *ws = L"abcd"
986</pre></td></tr>
987
988
989<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SubstNonTypeTemplateParmExpr.html">SubstNonTypeTemplateParmExpr</a>&gt;...</td></tr>
990<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
991
992Given
993 template &lt;int N&gt;
994 struct A { static const int n = N; };
995 struct B : public A&lt;42&gt; {};
996substNonTypeTemplateParmExpr()
997 matches "N" in the right-hand side of "static const int n = N;"
998</pre></td></tr>
999
1000
1001<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt;...</td></tr>
1002<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1003
1004Given
1005 switch(a) { case 42: break; default: break; }
1006switchCase()
1007 matches 'case 42: break;' and 'default: break;'.
1008</pre></td></tr>
1009
1010
1011<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html">SwitchStmt</a>&gt;...</td></tr>
1012<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1013
1014Given
1015 switch(a) { case 42: break; default: break; }
1016switchStmt()
1017 matches 'switch(a)'.
1018</pre></td></tr>
1019
1020
1021<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('temporaryObjectExpr0')"><a name="temporaryObjectExpr0Anchor">temporaryObjectExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTemporaryObjectExpr.html">CXXTemporaryObjectExpr</a>&gt;...</td></tr>
1022<tr><td colspan="4" class="doc" id="temporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
1023
1024Example: Matches Foo(bar, bar)
1025 Foo h = Foo(bar, bar);
1026</pre></td></tr>
1027
1028
1029<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('thisExpr0')"><a name="thisExpr0Anchor">thisExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThisExpr.html">CXXThisExpr</a>&gt;...</td></tr>
1030<tr><td colspan="4" class="doc" id="thisExpr0"><pre>Matches implicit and explicit this expressions.
1031
1032Example matches the implicit this expression in "return i".
1033 (matcher = thisExpr())
1034struct foo {
1035 int i;
1036 int f() { return i; }
1037};
1038</pre></td></tr>
1039
1040
1041<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('throwExpr0')"><a name="throwExpr0Anchor">throwExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXThrowExpr.html">CXXThrowExpr</a>&gt;...</td></tr>
1042<tr><td colspan="4" class="doc" id="throwExpr0"><pre>Matches throw expressions.
1043
1044 try { throw 5; } catch(int i) {}
1045throwExpr()
1046 matches 'throw 5'
1047</pre></td></tr>
1048
1049
1050<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('tryStmt0')"><a name="tryStmt0Anchor">tryStmt</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXTryStmt.html">CXXTryStmt</a>&gt;...</td></tr>
1051<tr><td colspan="4" class="doc" id="tryStmt0"><pre>Matches try statements.
1052
1053 try {} catch(int i) {}
1054tryStmt()
1055 matches 'try {}'
1056</pre></td></tr>
1057
1058
1059<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;...</td></tr>
1060<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1061
1062Given
1063 Foo x = bar;
1064 int y = sizeof(x) + alignof(x);
1065unaryExprOrTypeTraitExpr()
1066 matches sizeof(x) and alignof(x)
1067</pre></td></tr>
1068
1069
1070<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryOperator.html">UnaryOperator</a>&gt;...</td></tr>
1071<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1072
1073Example matches !a
1074 !a || b
1075</pre></td></tr>
1076
1077
1078<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('unresolvedConstructExpr0')"><a name="unresolvedConstructExpr0Anchor">unresolvedConstructExpr</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXUnresolvedConstructExpr.html">CXXUnresolvedConstructExpr</a>&gt;...</td></tr>
1079<tr><td colspan="4" class="doc" id="unresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
1080
1081Example matches T(t) in return statement of f
1082 (matcher = unresolvedConstructExpr())
1083 template &lt;typename T&gt;
1084 void f(const T&amp; t) { return T(t); }
1085</pre></td></tr>
1086
1087
1088<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UserDefinedLiteral.html">UserDefinedLiteral</a>&gt;...</td></tr>
1089<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1090
1091Example match: "foo"_suffix
1092</pre></td></tr>
1093
1094
1095<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1WhileStmt.html">WhileStmt</a>&gt;...</td></tr>
1096<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1097
1098Given
1099 while (true) {}
1100whileStmt()
1101 matches 'while (true) {}'.
1102</pre></td></tr>
1103
1104
1105<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt;...</td></tr>
1106<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1107
1108Given
1109 template &lt;typename T&gt; struct C {};
1110 C&lt;int&gt; c;
1111templateArgument()
1112 matches 'int' in C&lt;int&gt;.
1113</pre></td></tr>
1114
1115
1116<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;...</td></tr>
1117<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1118</pre></td></tr>
1119
1120
1121<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;...</td></tr>
1122<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1123
1124Given
1125 int a[] = { 2, 3 };
1126 int b[4];
1127 void f() { int c[a[0]]; }
1128arrayType()
1129 matches "int a[]", "int b[4]" and "int c[a[0]]";
1130</pre></td></tr>
1131
1132
1133<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;...</td></tr>
1134<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1135
1136Given
1137 _Atomic(int) i;
1138atomicType()
1139 matches "_Atomic(int) i"
1140</pre></td></tr>
1141
1142
1143<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;...</td></tr>
1144<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1145
1146Given:
1147 auto n = 4;
1148 int v[] = { 2, 3 }
1149 for (auto i : v) { }
1150autoType()
1151 matches "auto n" and "auto i"
1152</pre></td></tr>
1153
1154
1155<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;...</td></tr>
1156<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1157"void (^)(int)".
1158
1159The pointee is always required to be a FunctionType.
1160</pre></td></tr>
1161
1162
1163<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1BuiltinType.html">BuiltinType</a>&gt;...</td></tr>
1164<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1165
1166Given
1167 struct A {};
1168 A a;
1169 int b;
1170 float c;
1171 bool d;
1172builtinType()
1173 matches "int b", "float c" and "bool d"
1174</pre></td></tr>
1175
1176
1177<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;...</td></tr>
1178<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1179
1180Given
1181 _Complex float f;
1182complexType()
1183 matches "_Complex float f"
1184</pre></td></tr>
1185
1186
1187<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html">ConstantArrayType</a>&gt;...</td></tr>
1188<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1189
1190Given
1191 void() {
1192 int a[2];
1193 int b[] = { 2, 3 };
1194 int c[b[0]];
1195 }
1196constantArrayType()
1197 matches "int a[2]"
1198</pre></td></tr>
1199
1200
1201<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DependentSizedArrayType.html">DependentSizedArrayType</a>&gt;...</td></tr>
1202<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1203
1204Given
1205 template&lt;typename T, int Size&gt;
1206 class array {
1207 T data[Size];
1208 };
1209dependentSizedArrayType
1210 matches "T data[Size]"
1211</pre></td></tr>
1212
1213
1214<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ElaboratedType.html">ElaboratedType</a>&gt;...</td></tr>
1215<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1216qualified name.
1217
1218Given
1219 namespace N {
1220 namespace M {
1221 class D {};
1222 }
1223 }
1224 class C {};
1225
1226 class C c;
1227 N::M::D d;
1228
1229elaboratedType() matches the type of the variable declarations of both
1230c and d.
1231</pre></td></tr>
1232
1233
1234<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html">FunctionType</a>&gt;...</td></tr>
1235<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1236
1237Given
1238 int (*f)(int);
1239 void g();
1240functionType()
1241 matches "int (*f)(int)" and the type of "g".
1242</pre></td></tr>
1243
1244
1245<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1IncompleteArrayType.html">IncompleteArrayType</a>&gt;...</td></tr>
1246<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1247
1248Given
1249 int a[] = { 2, 3 };
1250 int b[42];
1251 void f(int c[]) { int d[a[0]]; };
1252incompleteArrayType()
1253 matches "int a[]" and "int c[]"
1254</pre></td></tr>
1255
1256
1257<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1LValueReferenceType.html">LValueReferenceType</a>&gt;...</td></tr>
1258<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1259
1260Given:
1261 int *a;
1262 int &amp;b = *a;
1263 int &amp;&amp;c = 1;
1264 auto &amp;d = b;
1265 auto &amp;&amp;e = c;
1266 auto &amp;&amp;f = 2;
1267 int g = 5;
1268
1269lValueReferenceType() matches the types of b, d, and e. e is
1270matched since the type is deduced as int&amp; by reference collapsing rules.
1271</pre></td></tr>
1272
1273
1274<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;...</td></tr>
1275<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1276Given
1277 struct A { int i; }
1278 A::* ptr = A::i;
1279memberPointerType()
1280 matches "A::* ptr"
1281</pre></td></tr>
1282
1283
1284<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;...</td></tr>
1285<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1286
1287Given
1288 int (*ptr_to_array)[4];
1289 int *array_of_ptrs[4];
1290
1291varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1292array_of_ptrs.
1293</pre></td></tr>
1294
1295
1296<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;...</td></tr>
1297<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
1298
1299Given
1300 int *a;
1301 int &amp;b = *a;
1302 int c = 5;
1303pointerType()
1304 matches "int *a"
1305</pre></td></tr>
1306
1307
1308<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RValueReferenceType.html">RValueReferenceType</a>&gt;...</td></tr>
1309<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1310
1311Given:
1312 int *a;
1313 int &amp;b = *a;
1314 int &amp;&amp;c = 1;
1315 auto &amp;d = b;
1316 auto &amp;&amp;e = c;
1317 auto &amp;&amp;f = 2;
1318 int g = 5;
1319
1320rValueReferenceType() matches the types of c and f. e is not
1321matched as it is deduced to int&amp; by reference collapsing rules.
1322</pre></td></tr>
1323
1324
1325<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;...</td></tr>
1326<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1327
1328Given
1329 class C {};
1330 struct S {};
1331
1332 C c;
1333 S s;
1334
1335recordType() matches the type of the variable declarations of both c
1336and s.
1337</pre></td></tr>
1338
1339
1340<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;...</td></tr>
1341<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1342
1343Given
1344 int *a;
1345 int &amp;b = *a;
1346 int &amp;&amp;c = 1;
1347 auto &amp;d = b;
1348 auto &amp;&amp;e = c;
1349 auto &amp;&amp;f = 2;
1350 int g = 5;
1351
1352referenceType() matches the types of b, c, d, e, and f.
1353</pre></td></tr>
1354
1355
1356<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;...</td></tr>
1357<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1358
1359Given
1360 template &lt;typename T&gt;
1361 class C { };
1362
1363 template class C&lt;int&gt;; A
1364 C&lt;char&gt; var; B
1365
1366templateSpecializationType() matches the type of the explicit
1367instantiation in A and the type of the variable declaration in B.
1368</pre></td></tr>
1369
1370
1371<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;...</td></tr>
1372<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1373</pre></td></tr>
1374
1375
1376<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;...</td></tr>
1377<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1378
1379Given
1380 typedef int X;
1381typedefType()
1382 matches "typedef int X"
1383</pre></td></tr>
1384
1385
1386<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryTransformType.html">UnaryTransformType</a>&gt;...</td></tr>
1387<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1388
1389Given:
1390 typedef __underlying_type(T) type;
1391unaryTransformType()
1392 matches "__underlying_type(T)"
1393</pre></td></tr>
1394
1395
1396<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VariableArrayType.html">VariableArrayType</a>&gt;...</td></tr>
1397<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1398integer-constant-expression.
1399
1400Given
1401 void f() {
1402 int a[] = { 2, 3 }
1403 int b[42];
1404 int c[a[0]];
1405 }
1406variableArrayType()
1407 matches "int c[a[0]]"
1408</pre></td></tr>
1409
1410<!--END_DECL_MATCHERS -->
1411</table>
1412
1413<!-- ======================================================================= -->
1414<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1415<!-- ======================================================================= -->
1416
1417<p>Narrowing matchers match certain attributes on the current node, thus
1418narrowing down the set of nodes of the current type to match on.</p>
1419
1420<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1421which allow users to create more powerful match expressions.</p>
1422
1423<table>
1424<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
1425<!-- START_NARROWING_MATCHERS -->
1426
1427<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>
1428<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1429
1430Usable as: Any Matcher
1431</pre></td></tr>
1432
1433
1434<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>
1435<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1436
1437Usable as: Any Matcher
1438</pre></td></tr>
1439
1440
1441<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1442<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1443
1444Useful when another matcher requires a child matcher, but there's no
1445additional constraint. This will often be used with an explicit conversion
1446to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1447
1448Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1449"int* p" and "void f()" in
1450 int* p;
1451 void f();
1452
1453Usable as: Any Matcher
1454</pre></td></tr>
1455
1456
1457<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1458<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1459
1460Example matches Y (matcher = recordDecl(unless(hasName("X"))))
1461 class X {};
1462 class Y {};
1463
1464Usable as: Any Matcher
1465</pre></td></tr>
1466
1467
1468<tr><td>Matcher&lt<a href="http://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>
1469<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1470unary).
1471
1472Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1473 !(a || b)
1474</pre></td></tr>
1475
1476
1477<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
1478<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1479
1480Example matches true (matcher = boolLiteral(equals(true)))
1481 true
1482
1483Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1484 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1485</pre></td></tr>
1486
1487
1488<tr><td>Matcher&lt<a href="http://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>
1489<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1490
1491Given
1492 try {
1493 ...
1494 } catch (int) {
1495 ...
1496 } catch (...) {
1497 ...
1498 }
1499endcode
1500catchStmt(isCatchAll()) matches catch(...) but not catch(int).
1501</pre></td></tr>
1502
1503
1504<tr><td>Matcher&lt<a href="http://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>
1505<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1506a specific number of arguments (including absent default arguments).
1507
1508Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1509 void f(int x, int y);
1510 f(0, 0);
1511</pre></td></tr>
1512
1513
1514<tr><td>Matcher&lt<a href="http://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>
1515<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1516</pre></td></tr>
1517
1518
1519<tr><td>Matcher&lt<a href="http://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>
1520<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1521
1522Given
1523 struct S {
1524 S(); #1
1525 S(const S &amp;); #2
1526 S(S &amp;&amp;); #3
1527 };
1528constructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1529</pre></td></tr>
1530
1531
1532<tr><td>Matcher&lt<a href="http://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>
1533<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1534
1535Given
1536 struct S {
1537 S(); #1
1538 S(const S &amp;); #2
1539 S(S &amp;&amp;); #3
1540 };
1541constructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1542</pre></td></tr>
1543
1544
1545<tr><td>Matcher&lt<a href="http://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>
1546<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1547the explicit keyword.
1548
1549Given
1550 struct S {
1551 S(int); #1
1552 explicit S(double); #2
1553 operator int(); #3
1554 explicit operator bool(); #4
1555 };
1556constructorDecl(isExplicit()) will match #2, but not #1.
1557conversionDecl(isExplicit()) will match #4, but not #3.
1558</pre></td></tr>
1559
1560
1561<tr><td>Matcher&lt<a href="http://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>
1562<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
1563
1564Given
1565 struct S {
1566 S(); #1
1567 S(const S &amp;); #2
1568 S(S &amp;&amp;); #3
1569 };
1570constructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
1571</pre></td></tr>
1572
1573
1574<tr><td>Matcher&lt<a href="http://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>
1575<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
1576the explicit keyword.
1577
1578Given
1579 struct S {
1580 S(int); #1
1581 explicit S(double); #2
1582 operator int(); #3
1583 explicit operator bool(); #4
1584 };
1585constructorDecl(isExplicit()) will match #2, but not #1.
1586conversionDecl(isExplicit()) will match #4, but not #3.
1587</pre></td></tr>
1588
1589
1590<tr><td>Matcher&lt<a href="http://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>
1591<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
1592opposed to a member.
1593
1594Given
1595 struct B {};
1596 struct D : B {
1597 int I;
1598 D(int i) : I(i) {}
1599 };
1600 struct E : B {
1601 E() : B() {}
1602 };
1603constructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
1604 will match E(), but not match D(int).
1605</pre></td></tr>
1606
1607
1608<tr><td>Matcher&lt<a href="http://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>
1609<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
1610opposed to a base.
1611
1612Given
1613 struct B {};
1614 struct D : B {
1615 int I;
1616 D(int i) : I(i) {}
1617 };
1618 struct E : B {
1619 E() : B() {}
1620 };
1621constructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
1622 will match D(int), but not match E().
1623</pre></td></tr>
1624
1625
1626<tr><td>Matcher&lt<a href="http://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>
1627<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
1628code (as opposed to implicitly added by the compiler).
1629
1630Given
1631 struct Foo {
1632 Foo() { }
1633 Foo(int) : foo_("A") { }
1634 string foo_;
1635 };
1636constructorDecl(hasAnyConstructorInitializer(isWritten()))
1637 will match Foo(int), but not Foo()
1638</pre></td></tr>
1639
1640
1641<tr><td>Matcher&lt<a href="http://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>
1642<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1643
1644Given
1645struct A {
1646 void foo() const;
1647 void bar();
1648};
1649
1650methodDecl(isConst()) matches A::foo() but not A::bar()
1651</pre></td></tr>
1652
1653
1654<tr><td>Matcher&lt<a href="http://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>
1655<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
1656
1657Given:
1658 class A final {};
1659
1660 struct B {
1661 virtual void f();
1662 };
1663
1664 struct C : B {
1665 void f() final;
1666 };
1667matches A and C::f, but not B, C, or B::f
1668</pre></td></tr>
1669
1670
1671<tr><td>Matcher&lt<a href="http://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>
1672<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1673
1674Given
1675 class A {
1676 public:
1677 virtual void x();
1678 };
1679 class B : public A {
1680 public:
1681 virtual void x();
1682 };
1683 matches B::x
1684</pre></td></tr>
1685
1686
1687<tr><td>Matcher&lt<a href="http://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>
1688<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
1689
1690Given
1691 class A {
1692 public:
1693 virtual void x() = 0;
1694 };
1695 matches A::x
1696</pre></td></tr>
1697
1698
1699<tr><td>Matcher&lt<a href="http://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>
1700<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1701
1702Given
1703 class A {
1704 public:
1705 virtual void x();
1706 };
1707 matches A::x
1708</pre></td></tr>
1709
1710
1711<tr><td>Matcher&lt<a href="http://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>
1712<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1713
1714Matches overloaded operator names specified in strings without the
1715"operator" prefix: e.g. "&lt;&lt;".
1716
1717Given:
1718 class A { int operator*(); };
1719 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1720 A a;
1721 a &lt;&lt; a; &lt;-- This matches
1722
1723operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
1724line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
1725the declaration of A.
1726
1727Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
1728</pre></td></tr>
1729
1730
1731<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
1732<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1733</pre></td></tr>
1734
1735
1736<tr><td>Matcher&lt<a href="http://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>
1737<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
1738static member variable template instantiations.
1739
1740Given
1741 template&lt;typename T&gt; void A(T t) { }
1742 template&lt;&gt; void A(int N) { }
1743functionDecl(isExplicitTemplateSpecialization())
1744 matches the specialization A&lt;int&gt;().
1745
1746Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
1747</pre></td></tr>
1748
1749
1750<tr><td>Matcher&lt<a href="http://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>
1751<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
1752
1753Given:
1754 class A final {};
1755
1756 struct B {
1757 virtual void f();
1758 };
1759
1760 struct C : B {
1761 void f() final;
1762 };
1763matches A and C::f, but not B, C, or B::f
1764</pre></td></tr>
1765
1766
1767<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
1768<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1769isSameOrDerivedFrom(hasName(...)).
1770</pre></td></tr>
1771
1772
1773<tr><td>Matcher&lt<a href="http://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>
1774<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
1775member variable template instantiations.
1776
1777Given
1778 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1779or
1780 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1781recordDecl(hasName("::X"), isTemplateInstantiation())
1782 matches the template instantiation of X&lt;A&gt;.
1783
1784But given
1785 template &lt;typename T&gt; class X {}; class A {};
1786 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1787recordDecl(hasName("::X"), isTemplateInstantiation())
1788 does not match, as X&lt;A&gt; is an explicit template specialization.
1789
1790Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
1791</pre></td></tr>
1792
1793
1794<tr><td>Matcher&lt<a href="http://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>
1795<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1796a specific number of arguments (including absent default arguments).
1797
1798Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1799 void f(int x, int y);
1800 f(0, 0);
1801</pre></td></tr>
1802
1803
1804<tr><td>Matcher&lt<a href="http://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>ValueT Value</td></tr>
1805<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1806
1807Example matches true (matcher = boolLiteral(equals(true)))
1808 true
1809
1810Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1811 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1812</pre></td></tr>
1813
1814
1815<tr><td>Matcher&lt<a href="http://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>
1816<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
1817
1818Given
1819 template&lt;typename T&gt; struct C {};
1820 C&lt;int&gt; c;
1821classTemplateSpecializationDecl(templateArgumentCountIs(1))
1822 matches C&lt;int&gt;.
1823</pre></td></tr>
1824
1825
1826<tr><td>Matcher&lt<a href="http://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>
1827<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
1828child statements.
1829
1830Example: Given
1831 { for (;;) {} }
1832compoundStmt(statementCountIs(0)))
1833 matches '{}'
1834 but does not match the outer compound statement.
1835</pre></td></tr>
1836
1837
1838<tr><td>Matcher&lt<a href="http://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>
1839<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
1840
1841Given
1842 int a[42];
1843 int b[2 * 21];
1844 int c[41], d[43];
1845constantArrayType(hasSize(42))
1846 matches "int a[42]" and "int b[2 * 21]"
1847</pre></td></tr>
1848
1849
1850<tr><td>Matcher&lt<a href="http://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>
1851<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
1852declarations.
1853
1854Example: Given
1855 int a, b;
1856 int c;
1857 int d = 2, e;
1858declCountIs(2)
1859 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
1860</pre></td></tr>
1861
1862
1863<tr><td>Matcher&lt<a href="http://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>
1864<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
1865
1866Matches a node if it equals the node previously bound to ID.
1867
1868Given
1869 class X { int a; int b; };
1870recordDecl(
1871 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
1872 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
1873 matches the class X, as a and b have the same type.
1874
1875Note that when multiple matches are involved via forEach* matchers,
1876equalsBoundNodes acts as a filter.
1877For example:
1878compoundStmt(
1879 forEachDescendant(varDecl().bind("d")),
1880 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
1881will trigger a match for each combination of variable declaration
1882and reference to that variable declaration within a compound statement.
1883</pre></td></tr>
1884
1885
1886<tr><td>Matcher&lt<a href="http://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>
1887<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
1888
1889Given
1890 __attribute__((device)) void f() { ... }
1891decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
1892f. If the matcher is use from clang-query, attr::Kind parameter should be
1893passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
1894</pre></td></tr>
1895
1896
1897<tr><td>Matcher&lt<a href="http://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>
1898<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
1899partially matching a given regex.
1900
1901Example matches Y but not X
1902 (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
1903 #include "ASTMatcher.h"
1904 class X {};
1905ASTMatcher.h:
1906 class Y {};
1907
1908Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1909</pre></td></tr>
1910
1911
1912<tr><td>Matcher&lt<a href="http://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>
1913<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
1914
1915Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
1916 #include &lt;Y.h&gt;
1917 class X {};
1918Y.h:
1919 class Y {};
1920
1921Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1922</pre></td></tr>
1923
1924
1925<tr><td>Matcher&lt<a href="http://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>
1926<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
1927
1928Example matches Y but not X
1929 (matcher = recordDecl(isExpansionInSystemHeader())
1930 #include &lt;SystemHeader.h&gt;
1931 class X {};
1932SystemHeader.h:
1933 class Y {};
1934
1935Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
1936</pre></td></tr>
1937
1938
1939<tr><td>Matcher&lt<a href="http://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>
1940<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
1941by the compiler (eg. implicit defaultcopy constructors).
1942</pre></td></tr>
1943
1944
1945<tr><td>Matcher&lt<a href="http://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>
1946<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
1947
1948Given
1949 class C {
1950 public: int a;
1951 protected: int b;
1952 private: int c;
1953 };
1954fieldDecl(isPrivate())
1955 matches 'int c;'
1956</pre></td></tr>
1957
1958
1959<tr><td>Matcher&lt<a href="http://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>
1960<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
1961
1962Given
1963 class C {
1964 public: int a;
1965 protected: int b;
1966 private: int c;
1967 };
1968fieldDecl(isProtected())
1969 matches 'int b;'
1970</pre></td></tr>
1971
1972
1973<tr><td>Matcher&lt<a href="http://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>
1974<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
1975
1976Given
1977 class C {
1978 public: int a;
1979 protected: int b;
1980 private: int c;
1981 };
1982fieldDecl(isPublic())
1983 matches 'int a;'
1984</pre></td></tr>
1985
1986
1987<tr><td>Matcher&lt<a href="http://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>ValueT Value</td></tr>
1988<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
1989
1990Example matches true (matcher = boolLiteral(equals(true)))
1991 true
1992
1993Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1994 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
1995</pre></td></tr>
1996
1997
1998<tr><td>Matcher&lt<a href="http://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>
1999<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2000
2001Matches overloaded operator names specified in strings without the
2002"operator" prefix: e.g. "&lt;&lt;".
2003
2004Given:
2005 class A { int operator*(); };
2006 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2007 A a;
2008 a &lt;&lt; a; &lt;-- This matches
2009
2010operatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the specified
2011line and recordDecl(hasMethod(hasOverloadedOperatorName("*"))) matches
2012the declaration of A.
2013
2014Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2015</pre></td></tr>
2016
2017
2018<tr><td>Matcher&lt<a href="http://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>
2019<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2020
2021Given:
2022 constexpr int foo = 42;
2023 constexpr int bar();
2024varDecl(isConstexpr())
2025 matches the declaration of foo.
2026functionDecl(isConstexpr())
2027 matches the declaration of bar.
2028</pre></td></tr>
2029
2030
2031<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
2032<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2033
2034Example matches A, va, fa
2035 class A {};
2036 class B; Doesn't match, as it has no body.
2037 int va;
2038 extern int vb; Doesn't match, as it doesn't define the variable.
2039 void fa() {}
2040 void fb(); Doesn't match, as it has no body.
2041
2042Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2043</pre></td></tr>
2044
2045
2046<tr><td>Matcher&lt<a href="http://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>
2047<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2048
2049Given:
2050 void Func();
2051 void DeletedFunc() = delete;
2052functionDecl(isDeleted())
2053 matches the declaration of DeletedFunc, but not Func.
2054</pre></td></tr>
2055
2056
2057<tr><td>Matcher&lt<a href="http://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>
2058<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2059static member variable template instantiations.
2060
2061Given
2062 template&lt;typename T&gt; void A(T t) { }
2063 template&lt;&gt; void A(int N) { }
2064functionDecl(isExplicitTemplateSpecialization())
2065 matches the specialization A&lt;int&gt;().
2066
2067Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2068</pre></td></tr>
2069
2070
2071<tr><td>Matcher&lt<a href="http://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>
2072<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2073
2074Given:
2075 extern "C" void f() {}
2076 extern "C" { void g() {} }
2077 void h() {}
2078functionDecl(isExternC())
2079 matches the declaration of f and g, but not the declaration h
2080</pre></td></tr>
2081
2082
2083<tr><td>Matcher&lt<a href="http://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>
2084<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2085the inline keyword.
2086
2087Given
2088 inline void f();
2089 void g();
2090 namespace n {
2091 inline namespace m {}
2092 }
2093functionDecl(isInline()) will match ::f().
2094namespaceDecl(isInline()) will match n::m.
2095</pre></td></tr>
2096
2097
2098<tr><td>Matcher&lt<a href="http://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>
2099<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2100member variable template instantiations.
2101
2102Given
2103 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2104or
2105 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2106recordDecl(hasName("::X"), isTemplateInstantiation())
2107 matches the template instantiation of X&lt;A&gt;.
2108
2109But given
2110 template &lt;typename T&gt; class X {}; class A {};
2111 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2112recordDecl(hasName("::X"), isTemplateInstantiation())
2113 does not match, as X&lt;A&gt; is an explicit template specialization.
2114
2115Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2116</pre></td></tr>
2117
2118
2119<tr><td>Matcher&lt<a href="http://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>
2120<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls that have a specific parameter count.
2121
2122Given
2123 void f(int i) {}
2124 void g(int i, int j) {}
2125functionDecl(parameterCountIs(2))
2126 matches g(int i, int j) {}
2127</pre></td></tr>
2128
2129
2130<tr><td>Matcher&lt<a href="http://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>ValueT Value</td></tr>
2131<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
2132
2133Example matches true (matcher = boolLiteral(equals(true)))
2134 true
2135
2136Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2137 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FloatingLiteral.html">FloatingLiteral</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1IntegerLiteral.html">IntegerLiteral</a>&gt;
2138</pre></td></tr>
2139
2140
2141<tr><td>Matcher&lt<a href="http://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>
2142<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2143to '.'.
2144
2145Member calls on the implicit this pointer match as called with '-&gt;'.
2146
2147Given
2148 class Y {
2149 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2150 int a;
2151 static int b;
2152 };
2153memberExpr(isArrow())
2154 matches this-&gt;x, x, y.x, a, this-&gt;b
2155</pre></td></tr>
2156
2157
2158<tr><td>Matcher&lt<a href="http://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>std::string Name</td></tr>
2159<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2160
2161Supports specifying enclosing namespaces or classes by prefixing the name
2162with '&lt;enclosing&gt;::'.
2163Does not match typedefs of an underlying type with the given name.
2164
2165Example matches X (Name == "X")
2166 class X;
2167
2168Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2169 namespace a { namespace b { class X; } }
2170</pre></td></tr>
2171
2172
2173<tr><td>Matcher&lt<a href="http://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>
2174<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2175a substring matched by the given RegExp.
2176
2177Supports specifying enclosing namespaces or classes by
2178prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2179of an underlying type with the given name.
2180
2181Example matches X (regexp == "::X")
2182 class X;
2183
2184Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2185 namespace foo { namespace bar { class X; } }
2186</pre></td></tr>
2187
2188
2189<tr><td>Matcher&lt<a href="http://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>
2190<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2191
2192Given
2193 namespace n {
2194 namespace {} #1
2195 }
2196namespaceDecl(isAnonymous()) will match #1 but not ::n.
2197</pre></td></tr>
2198
2199
2200<tr><td>Matcher&lt<a href="http://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>
2201<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2202the inline keyword.
2203
2204Given
2205 inline void f();
2206 void g();
2207 namespace n {
2208 inline namespace m {}
2209 }
2210functionDecl(isInline()) will match ::f().
2211namespaceDecl(isInline()) will match n::m.
2212</pre></td></tr>
2213
2214
2215<tr><td>Matcher&lt<a href="http://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>
2216<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
2217a specific number of arguments (including absent default arguments).
2218
2219Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2220 void f(int x, int y);
2221 f(0, 0);
2222</pre></td></tr>
2223
2224
2225<tr><td>Matcher&lt<a href="http://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>
2226<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre></pre></td></tr>
2227
2228
2229<tr><td>Matcher&lt<a href="http://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>
2230<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
2231
2232Matches only when the selector of the objCMessageExpr is NULL. This may
2233represent an error condition in the tree!
2234</pre></td></tr>
2235
2236
2237<tr><td>Matcher&lt<a href="http://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>
2238<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
2239
2240 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
2241 matches the outer message expr in the code below, but NOT the message
2242 invocation for self.bodyView.
2243 [self.bodyView loadHTMLString:html baseURL:NULL];
2244</pre></td></tr>
2245
2246
2247<tr><td>Matcher&lt<a href="http://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>
2248<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
2249
2250 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
2251 matches self.bodyView in the code below, but NOT the outer message
2252 invocation of "loadHTMLString:baseURL:".
2253 [self.bodyView loadHTMLString:html baseURL:NULL];
2254</pre></td></tr>
2255
2256
2257<tr><td>Matcher&lt<a href="http://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>
2258<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
2259a substring matched by the given RegExp.
2260 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
2261 invocation for self.bodyView.
2262 [self.bodyView loadHTMLString:html baseURL:NULL];
2263</pre></td></tr>
2264
2265
2266<tr><td>Matcher&lt<a href="http://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>
2267<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
2268
2269 matcher = objCMessageExpr(numSelectorArgs(1));
2270 matches self.bodyView in the code below
2271
2272 matcher = objCMessageExpr(numSelectorArgs(2));
2273 matches the invocation of "loadHTMLString:baseURL:" but not that
2274 of self.bodyView
2275 [self.bodyView loadHTMLString:html baseURL:NULL];
2276</pre></td></tr>
2277
2278
2279<tr><td>Matcher&lt<a href="http://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>
2280<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
2281
2282Given
2283 class Y { public: void x(); };
2284 void z() { Y* y; y-&gt;x(); }
2285memberCallExpr(on(hasType(asString("class Y *"))))
2286 matches y-&gt;x()
2287</pre></td></tr>
2288
2289
2290<tr><td>Matcher&lt<a href="http://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>
2291<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
2292
2293Matches a node if it equals the node previously bound to ID.
2294
2295Given
2296 class X { int a; int b; };
2297recordDecl(
2298 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2299 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2300 matches the class X, as a and b have the same type.
2301
2302Note that when multiple matches are involved via forEach* matchers,
2303equalsBoundNodes acts as a filter.
2304For example:
2305compoundStmt(
2306 forEachDescendant(varDecl().bind("d")),
2307 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2308will trigger a match for each combination of variable declaration
2309and reference to that variable declaration within a compound statement.
2310</pre></td></tr>
2311
2312
2313<tr><td>Matcher&lt<a href="http://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>
2314<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
2315the node, not hidden within a typedef.
2316
2317Given
2318 typedef const int const_int;
2319 const_int i;
2320 int *const j;
2321 int *volatile k;
2322 int m;
2323varDecl(hasType(hasLocalQualifiers())) matches only j and k.
2324i is const-qualified but the qualifier is not local.
2325</pre></td></tr>
2326
2327
2328<tr><td>Matcher&lt<a href="http://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>
2329<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2330include "top-level" const.
2331
2332Given
2333 void a(int);
2334 void b(int const);
2335 void c(const int);
2336 void d(const int*);
2337 void e(int const) {};
2338functionDecl(hasAnyParameter(hasType(isConstQualified())))
2339 matches "void b(int const)", "void c(const int)" and
2340 "void e(int const) {}". It does not match d as there
2341 is no top-level const on the parameter type "const int *".
2342</pre></td></tr>
2343
2344
2345<tr><td>Matcher&lt<a href="http://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>
2346<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2347
2348Given
2349 void a(int);
2350 void b(long);
2351 void c(double);
2352functionDecl(hasAnyParameter(hasType(isInteger())))
2353matches "a(int)", "b(long)", but not "c(double)".
2354</pre></td></tr>
2355
2356
2357<tr><td>Matcher&lt<a href="http://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>
2358<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2359
2360Matches a node if it equals the node previously bound to ID.
2361
2362Given
2363 class X { int a; int b; };
2364recordDecl(
2365 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2366 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2367 matches the class X, as a and b have the same type.
2368
2369Note that when multiple matches are involved via forEach* matchers,
2370equalsBoundNodes acts as a filter.
2371For example:
2372compoundStmt(
2373 forEachDescendant(varDecl().bind("d")),
2374 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2375will trigger a match for each combination of variable declaration
2376and reference to that variable declaration within a compound statement.
2377</pre></td></tr>
2378
2379
2380<tr><td>Matcher&lt<a href="http://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>
2381<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
2382partially matching a given regex.
2383
2384Example matches Y but not X
2385 (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2386 #include "ASTMatcher.h"
2387 class X {};
2388ASTMatcher.h:
2389 class Y {};
2390
2391Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2392</pre></td></tr>
2393
2394
2395<tr><td>Matcher&lt<a href="http://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>
2396<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
2397
2398Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2399 #include &lt;Y.h&gt;
2400 class X {};
2401Y.h:
2402 class Y {};
2403
2404Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2405</pre></td></tr>
2406
2407
2408<tr><td>Matcher&lt<a href="http://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>
2409<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
2410
2411Example matches Y but not X
2412 (matcher = recordDecl(isExpansionInSystemHeader())
2413 #include &lt;SystemHeader.h&gt;
2414 class X {};
2415SystemHeader.h:
2416 class Y {};
2417
2418Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2419</pre></td></tr>
2420
2421
2422<tr><td>Matcher&lt<a href="http://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>
2423<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
2424
2425Example matches A, va, fa
2426 class A {};
2427 class B; Doesn't match, as it has no body.
2428 int va;
2429 extern int vb; Doesn't match, as it doesn't define the variable.
2430 void fa() {}
2431 void fb(); Doesn't match, as it has no body.
2432
2433Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2434</pre></td></tr>
2435
2436
2437<tr><td>Matcher&lt<a href="http://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>
2438<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
2439
2440Note that 'Value' is a string as the template argument's value is
2441an arbitrary precision integer. 'Value' must be euqal to the canonical
2442representation of that integral value in base 10.
2443
2444Given
2445 template&lt;int T&gt; struct A {};
2446 C&lt;42&gt; c;
2447classTemplateSpecializationDecl(
2448 hasAnyTemplateArgument(equalsIntegralValue("42")))
2449 matches the implicit instantiation of C in C&lt;42&gt;.
2450</pre></td></tr>
2451
2452
2453<tr><td>Matcher&lt<a href="http://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>
2454<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
2455
2456Given
2457 template&lt;int T&gt; struct A {};
2458 C&lt;42&gt; c;
2459classTemplateSpecializationDecl(
2460 hasAnyTemplateArgument(isIntegral()))
2461 matches the implicit instantiation of C in C&lt;42&gt;
2462 with isIntegral() matching 42.
2463</pre></td></tr>
2464
2465
2466<tr><td>Matcher&lt<a href="http://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>
2467<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
2468
2469Given
2470 template&lt;typename T&gt; struct C {};
2471 C&lt;int&gt; c;
2472classTemplateSpecializationDecl(templateArgumentCountIs(1))
2473 matches C&lt;int&gt;.
2474</pre></td></tr>
2475
2476
2477<tr><td>Matcher&lt<a href="http://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>
2478<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
2479partially matching a given regex.
2480
2481Example matches Y but not X
2482 (matcher = recordDecl(isExpansionInFileMatching("AST.*"))
2483 #include "ASTMatcher.h"
2484 class X {};
2485ASTMatcher.h:
2486 class Y {};
2487
2488Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2489</pre></td></tr>
2490
2491
2492<tr><td>Matcher&lt<a href="http://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>
2493<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
2494
2495Example matches X but not Y (matcher = recordDecl(isExpansionInMainFile())
2496 #include &lt;Y.h&gt;
2497 class X {};
2498Y.h:
2499 class Y {};
2500
2501Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2502</pre></td></tr>
2503
2504
2505<tr><td>Matcher&lt<a href="http://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>
2506<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
2507
2508Example matches Y but not X
2509 (matcher = recordDecl(isExpansionInSystemHeader())
2510 #include &lt;SystemHeader.h&gt;
2511 class X {};
2512SystemHeader.h:
2513 class Y {};
2514
2515Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;
2516</pre></td></tr>
2517
2518
2519<tr><td>Matcher&lt<a href="http://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>
2520<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2521
2522Matches a node if it equals the node previously bound to ID.
2523
2524Given
2525 class X { int a; int b; };
2526recordDecl(
2527 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2528 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2529 matches the class X, as a and b have the same type.
2530
2531Note that when multiple matches are involved via forEach* matchers,
2532equalsBoundNodes acts as a filter.
2533For example:
2534compoundStmt(
2535 forEachDescendant(varDecl().bind("d")),
2536 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2537will trigger a match for each combination of variable declaration
2538and reference to that variable declaration within a compound statement.
2539</pre></td></tr>
2540
2541
2542<tr><td>Matcher&lt<a href="http://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>
2543<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
2544
2545Given
2546 struct S { void func(); };
2547functionDecl(returns(voidType()))
2548 matches "void func();"
2549</pre></td></tr>
2550
2551
2552<tr><td>Matcher&lt<a href="http://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>
2553<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2554
2555Given
2556 int x;
2557 int s = sizeof(x) + alignof(x)
2558unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2559 matches sizeof(x)
2560</pre></td></tr>
2561
2562
2563<tr><td>Matcher&lt<a href="http://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>
2564<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2565unary).
2566
2567Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2568 !(a || b)
2569</pre></td></tr>
2570
2571
2572<tr><td>Matcher&lt<a href="http://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>
2573<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
2574
2575Example matches y and z (matcher = varDecl(hasGlobalStorage())
2576void f() {
2577 int x;
2578 static int y;
2579}
2580int z;
2581</pre></td></tr>
2582
2583
2584<tr><td>Matcher&lt<a href="http://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>
2585<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
2586non-static local variable.
2587
2588Example matches x (matcher = varDecl(hasLocalStorage())
2589void f() {
2590 int x;
2591 static int y;
2592}
2593int z;
2594</pre></td></tr>
2595
2596
2597<tr><td>Matcher&lt<a href="http://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>
2598<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
2599
2600Given:
2601 constexpr int foo = 42;
2602 constexpr int bar();
2603varDecl(isConstexpr())
2604 matches the declaration of foo.
2605functionDecl(isConstexpr())
2606 matches the declaration of bar.
2607</pre></td></tr>
2608
2609
2610<tr><td>Matcher&lt<a href="http://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>
2611<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
2612
2613Example matches A, va, fa
2614 class A {};
2615 class B; Doesn't match, as it has no body.
2616 int va;
2617 extern int vb; Doesn't match, as it doesn't define the variable.
2618 void fa() {}
2619 void fb(); Doesn't match, as it has no body.
2620
2621Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;
2622</pre></td></tr>
2623
2624
2625<tr><td>Matcher&lt<a href="http://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>
2626<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
2627a C++ catch block, or an Objective-C statement.
2628
2629Example matches x (matcher = varDecl(isExceptionVariable())
2630void f(int y) {
2631 try {
2632 } catch (int x) {
2633 }
2634}
2635</pre></td></tr>
2636
2637
2638<tr><td>Matcher&lt<a href="http://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>
2639<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
2640static member variable template instantiations.
2641
2642Given
2643 template&lt;typename T&gt; void A(T t) { }
2644 template&lt;&gt; void A(int N) { }
2645functionDecl(isExplicitTemplateSpecialization())
2646 matches the specialization A&lt;int&gt;().
2647
2648Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2649</pre></td></tr>
2650
2651
2652<tr><td>Matcher&lt<a href="http://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>
2653<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
2654member variable template instantiations.
2655
2656Given
2657 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2658or
2659 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2660recordDecl(hasName("::X"), isTemplateInstantiation())
2661 matches the template instantiation of X&lt;A&gt;.
2662
2663But given
2664 template &lt;typename T&gt; class X {}; class A {};
2665 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2666recordDecl(hasName("::X"), isTemplateInstantiation())
2667 does not match, as X&lt;A&gt; is an explicit template specialization.
2668
2669Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
2670</pre></td></tr>
2671
2672
2673<tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
2674<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
2675template instantiations.
2676
2677Given
2678 template&lt;typename T&gt; void A(T t) { T i; }
2679 A(0);
2680 A(0U);
2681functionDecl(isInstantiated())
2682 matches 'A(int) {...};' and 'A(unsigned) {...}'.
2683</pre></td></tr>
2684
2685
2686<tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
2687<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
2688
2689Given
2690 int j;
2691 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
2692 A(0);
2693 A(0U);
2694declStmt(isInTemplateInstantiation())
2695 matches 'int i;' and 'unsigned i'.
2696unless(stmt(isInTemplateInstantiation()))
2697 will NOT match j += 42; as it's shared between the template definition and
2698 instantiation.
2699</pre></td></tr>
2700
2701<!--END_NARROWING_MATCHERS -->
2702</table>
2703
2704<!-- ======================================================================= -->
2705<h2 id="traversal-matchers">AST Traversal Matchers</h2>
2706<!-- ======================================================================= -->
2707
2708<p>Traversal matchers specify the relationship to other nodes that are
2709reachable from the current node.</p>
2710
2711<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
2712forEachDescendant) which work on all nodes and allow users to write more generic
2713match expressions.</p>
2714
2715<table>
2716<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
2717<!-- START_TRAVERSAL_MATCHERS -->
2718
2719<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>
2720<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
2721
2722Unlike anyOf, eachOf will generate a match result for each
2723matching submatcher.
2724
2725For example, in:
2726 class A { int a; int b; };
2727The matcher:
2728 recordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
2729 has(fieldDecl(hasName("b")).bind("v"))))
2730will generate two results binding "v", the first of which binds
2731the field declaration of a, the second the field declaration of
2732b.
2733
2734Usable as: Any Matcher
2735</pre></td></tr>
2736
2737
2738<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
2739<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2740provided matcher.
2741
2742Example matches X, A, B, C
2743 (matcher = recordDecl(forEachDescendant(recordDecl(hasName("X")))))
2744 class X {}; Matches X, because X::X is a class of name X inside X.
2745 class A { class X {}; };
2746 class B { class C { class X {}; }; };
2747
2748DescendantT must be an AST base type.
2749
2750As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
2751each result that matches instead of only on the first one.
2752
2753Note: Recursively combined ForEachDescendant can cause many matches:
2754 recordDecl(forEachDescendant(recordDecl(forEachDescendant(recordDecl()))))
2755will match 10 times (plus injected class name matches) on:
2756 class A { class B { class C { class D { class E {}; }; }; }; };
2757
2758Usable as: Any Matcher
2759</pre></td></tr>
2760
2761
2762<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
2763<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
2764provided matcher.
2765
2766Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
2767 class X {}; Matches X, because X::X is a class of name X inside X.
2768 class Y { class X {}; };
2769 class Z { class Y { class X {}; }; }; Does not match Z.
2770
2771ChildT must be an AST base type.
2772
2773As opposed to 'has', 'forEach' will cause a match for each result that
2774matches instead of only on the first one.
2775
2776Usable as: Any Matcher
2777</pre></td></tr>
2778
2779
2780<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
2781<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
2782matcher.
2783
2784Given
2785void f() { if (true) { int x = 42; } }
2786void g() { for (;;) { int x = 43; } }
2787expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
2788
2789Usable as: Any Matcher
2790</pre></td></tr>
2791
2792
2793<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
2794<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
2795provided matcher.
2796
2797Example matches X, Y, Z
2798 (matcher = recordDecl(hasDescendant(recordDecl(hasName("X")))))
2799 class X {}; Matches X, because X::X is a class of name X inside X.
2800 class Y { class X {}; };
2801 class Z { class Y { class X {}; }; };
2802
2803DescendantT must be an AST base type.
2804
2805Usable as: Any Matcher
2806</pre></td></tr>
2807
2808
2809<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
2810<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
2811provided matcher.
2812
2813Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
2814 class X {}; Matches X, because X::X is a class of name X inside X.
2815 class Y { class X {}; };
2816 class Z { class Y { class X {}; }; }; Does not match Z.
2817
2818ChildT must be an AST base type.
2819
2820Usable as: Any Matcher
2821</pre></td></tr>
2822
2823
2824<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
2825<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
2826matcher.
2827
2828Given
2829void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
2830compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
2831
2832Usable as: Any Matcher
2833</pre></td></tr>
2834
2835
2836<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2837<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
2838
2839Given
2840 int i[5];
2841 void f() { i[1] = 42; }
2842arraySubscriptExpression(hasBase(implicitCastExpr(
2843 hasSourceExpression(declRefExpr()))))
2844 matches i[1] with the declRefExpr() matching i
2845</pre></td></tr>
2846
2847
2848<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2849<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
2850
2851Given
2852 int i[5];
2853 void f() { i[1] = 42; }
2854arraySubscriptExpression(hasIndex(integerLiteral()))
2855 matches i[1] with the integerLiteral() matching 1
2856</pre></td></tr>
2857
2858
2859<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayTypeLoc.html">ArrayTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc0')"><a name="hasElementTypeLoc0Anchor">hasElementTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2860<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
2861type.
2862
2863Given
2864 struct A {};
2865 A a[7];
2866 int b[7];
2867arrayType(hasElementType(builtinType()))
2868 matches "int b[7]"
2869
2870Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
2871</pre></td></tr>
2872
2873
2874<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2875<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
2876type.
2877
2878Given
2879 struct A {};
2880 A a[7];
2881 int b[7];
2882arrayType(hasElementType(builtinType()))
2883 matches "int b[7]"
2884
2885Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
2886</pre></td></tr>
2887
2888
2889<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicTypeLoc.html">AtomicTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasValueTypeLoc0')"><a name="hasValueTypeLoc0Anchor">hasValueTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2890<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
2891
2892Given
2893 _Atomic(int) i;
2894 _Atomic(float) f;
2895atomicType(hasValueType(isInteger()))
2896 matches "_Atomic(int) i"
2897
2898Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2899</pre></td></tr>
2900
2901
2902<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2903<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
2904
2905Given
2906 _Atomic(int) i;
2907 _Atomic(float) f;
2908atomicType(hasValueType(isInteger()))
2909 matches "_Atomic(int) i"
2910
2911Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
2912</pre></td></tr>
2913
2914
2915<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2916<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
2917
2918Note: There is no TypeLoc for the deduced type and thus no
2919getDeducedLoc() matcher.
2920
2921Given
2922 auto a = 1;
2923 auto b = 2.0;
2924autoType(hasDeducedType(isInteger()))
2925 matches "auto a"
2926
2927Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
2928</pre></td></tr>
2929
2930
2931<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2932<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
2933binary operator matches.
2934</pre></td></tr>
2935
2936
2937<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2938<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
2939
2940Example matches a (matcher = binaryOperator(hasLHS()))
2941 a || b
2942</pre></td></tr>
2943
2944
2945<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2946<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
2947
2948Example matches b (matcher = binaryOperator(hasRHS()))
2949 a || b
2950</pre></td></tr>
2951
2952
2953<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerTypeLoc.html">BlockPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc0')"><a name="pointeeLoc0Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
2954<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
2955pointee matches a given matcher.
2956
2957Given
2958 int *a;
2959 int const *b;
2960 float const *f;
2961pointerType(pointee(isConstQualified(), isInteger()))
2962 matches "int const *b"
2963
2964Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
2965 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
2966</pre></td></tr>
2967
2968
2969<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
2970<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
2971pointee matches a given matcher.
2972
2973Given
2974 int *a;
2975 int const *b;
2976 float const *f;
2977pointerType(pointee(isConstQualified(), isInteger()))
2978 matches "int const *b"
2979
2980Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
2981 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
2982</pre></td></tr>
2983
2984
2985<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
2986<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
2987expression.
2988
2989Given
2990 void x(int, int, int) { int y; x(1, y, 42); }
2991callExpr(hasAnyArgument(declRefExpr()))
2992 matches x(1, y, 42)
2993with hasAnyArgument(...)
2994 matching y
2995
2996FIXME: Currently this will ignore parentheses and implicit casts on
2997the argument before applying the inner matcher. We'll want to remove
2998this to allow for greater control by the user once ignoreImplicit()
2999has been implemented.
3000</pre></td></tr>
3001
3002
3003<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3004<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
3005call expression.
3006
3007Example matches y in x(y)
3008 (matcher = callExpr(hasArgument(0, declRefExpr())))
3009 void x(int) { int y; x(y); }
3010</pre></td></tr>
3011
3012
3013<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration12')"><a name="hasDeclaration12Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3014<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
3015matches the given matcher.
3016
3017The associated declaration is:
3018- for type nodes, the declaration of the underlying type
3019- for CallExpr, the declaration of the callee
3020- for MemberExpr, the declaration of the referenced member
3021- for CXXConstructExpr, the declaration of the constructor
3022
3023Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3024function. e.g. various subtypes of clang::Type and various expressions.
3025
3026Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3027 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3028 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3029 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3030 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3031 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3032</pre></td></tr>
3033
3034
3035<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
3036<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
3037
3038Given
3039 class A { A() : i(42), j(42) {} int i; int j; };
3040constructorDecl(forEachConstructorInitializer(forField(decl().bind("x"))))
3041 will trigger two matches, binding for 'i' and 'j' respectively.
3042</pre></td></tr>
3043
3044
3045<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXCtorInitializer.html">CXXCtorInitializer</a>&gt; InnerMatcher</td></tr>
3046<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
3047
3048Given
3049 struct Foo {
3050 Foo() : foo_(1) { }
3051 int foo_;
3052 };
3053recordDecl(has(constructorDecl(hasAnyConstructorInitializer(anything()))))
3054 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
3055</pre></td></tr>
3056
3057
3058<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>&gt; InnerMatcher</td></tr>
3059<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
3060
3061Given
3062 struct Foo {
3063 Foo() : foo_(1) { }
3064 int foo_;
3065 };
3066recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
3067 forField(hasName("foo_"))))))
3068 matches Foo
3069with forField matching foo_
3070</pre></td></tr>
3071
3072
3073<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3074<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
3075
3076Given
3077 struct Foo {
3078 Foo() : foo_(1) { }
3079 int foo_;
3080 };
3081recordDecl(has(constructorDecl(hasAnyConstructorInitializer(
3082 withInitializer(integerLiteral(equals(1)))))))
3083 matches Foo
3084with withInitializer matching (1)
3085</pre></td></tr>
3086
3087
3088<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3089<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', or 'do while' statement that has
3090a given body.
3091
3092Given
3093 for (;;) {}
3094hasBody(compoundStmt())
3095 matches 'for (;;) {}'
3096with compoundStmt()
3097 matching '{}'
3098</pre></td></tr>
3099
3100
3101<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt; InnerMatcher</td></tr>
3102<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
3103
3104Example:
3105 forStmt(hasLoopVariable(anything()))
3106matches 'int x' in
3107 for (int x : a) { }
3108</pre></td></tr>
3109
3110
3111<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3112<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
3113
3114Example:
3115 forStmt(hasRangeInit(anything()))
3116matches 'a' in
3117 for (int x : a) { }
3118</pre></td></tr>
3119
3120
3121<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3122<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
3123
3124
3125<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3126<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
3127
3128Example matches y.x()
3129 (matcher = memberCallExpr(on(hasType(recordDecl(hasName("Y"))))))
3130 class Y { public: void x(); };
3131 void z() { Y y; y.x(); }",
3132
3133FIXME: Overload to allow directly matching types?
3134</pre></td></tr>
3135
3136
3137<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3138<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
3139</pre></td></tr>
3140
3141
3142<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3143<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
3144matcher, or is a pointer to a type that matches the InnerMatcher.
3145</pre></td></tr>
3146
3147
3148<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt; InnerMatcher</td></tr>
3149<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
3150belongs to.
3151
3152FIXME: Generalize this for other kinds of declarations.
3153FIXME: What other kind of declarations would we need to generalize
3154this to?
3155
3156Example matches A() in the last line
3157 (matcher = constructExpr(hasDeclaration(methodDecl(
3158 ofClass(hasName("A"))))))
3159 class A {
3160 public:
3161 A();
3162 };
3163 A a = A();
3164</pre></td></tr>
3165
3166
3167<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt; InnerMatcher</td></tr>
3168<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
3169
3170Given:
3171 class A { void func(); };
3172 class B { void member(); };
3173
3174recordDecl(hasMethod(hasName("func"))) matches the declaration of A
3175but not B.
3176</pre></td></tr>
3177
3178
3179<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
3180<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
3181a class matching Base.
3182
3183Note that a class is not considered to be derived from itself.
3184
3185Example matches Y, Z, C (Base == hasName("X"))
3186 class X;
3187 class Y : public X {}; directly derived
3188 class Z : public Y {}; indirectly derived
3189 typedef X A;
3190 typedef A B;
3191 class C : public B {}; derived from a typedef of X
3192
3193In the following example, Bar matches isDerivedFrom(hasName("X")):
3194 class Foo;
3195 typedef Foo X;
3196 class Bar : public Foo {}; derived from a type that X is a typedef of
3197</pre></td></tr>
3198
3199
3200<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; Base</td></tr>
3201<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
3202match Base.
3203</pre></td></tr>
3204
3205
3206<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3207<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
3208given matcher.
3209
3210Example matches y.x() (matcher = callExpr(callee(methodDecl(hasName("x")))))
3211 class Y { public: void x(); };
3212 void z() { Y y; y.x(); }
3213</pre></td></tr>
3214
3215
3216<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3217<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
3218
3219Given
3220 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
3221 void f() { f(); }
3222callExpr(callee(expr()))
3223 matches this-&gt;x(), x(), y.x(), f()
3224with callee(...)
3225 matching this-&gt;x, x, y.x, f respectively
3226
3227Note: Callee cannot take the more general internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
3228because this introduces ambiguous overloads with calls to Callee taking a
3229internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
3230implemented in terms of implicit casts.
3231</pre></td></tr>
3232
3233
3234<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3235<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
3236expression.
3237
3238Given
3239 void x(int, int, int) { int y; x(1, y, 42); }
3240callExpr(hasAnyArgument(declRefExpr()))
3241 matches x(1, y, 42)
3242with hasAnyArgument(...)
3243 matching y
3244
3245FIXME: Currently this will ignore parentheses and implicit casts on
3246the argument before applying the inner matcher. We'll want to remove
3247this to allow for greater control by the user once ignoreImplicit()
3248has been implemented.
3249</pre></td></tr>
3250
3251
3252<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3253<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
3254call expression.
3255
3256Example matches y in x(y)
3257 (matcher = callExpr(hasArgument(0, declRefExpr())))
3258 void x(int) { int y; x(y); }
3259</pre></td></tr>
3260
3261
3262<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('hasDeclaration13')"><a name="hasDeclaration13Anchor">hasDeclaration</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3263<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
3264matches the given matcher.
3265
3266The associated declaration is:
3267- for type nodes, the declaration of the underlying type
3268- for CallExpr, the declaration of the callee
3269- for MemberExpr, the declaration of the referenced member
3270- for CXXConstructExpr, the declaration of the constructor
3271
3272Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3273function. e.g. various subtypes of clang::Type and various expressions.
3274
3275Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3276 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3277 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3278 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3279 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3280 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3281</pre></td></tr>
3282
3283
3284<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3285<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
3286extension, matches the constant given in the statement.
3287
3288Given
3289 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
3290caseStmt(hasCaseConstant(integerLiteral()))
3291 matches "case 1:"
3292</pre></td></tr>
3293
3294
3295<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3296<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
3297
3298Example: matches "a string" (matcher =
3299 hasSourceExpression(constructExpr()))
3300class URL { URL(string); };
3301URL url = "a string";
3302</pre></td></tr>
3303
3304
3305<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
3306<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
3307TemplateArgument matching the given InnerMatcher.
3308
3309Given
3310 template&lt;typename T&gt; class A {};
3311 template&lt;&gt; class A&lt;double&gt; {};
3312 A&lt;int&gt; a;
3313classTemplateSpecializationDecl(hasAnyTemplateArgument(
3314 refersToType(asString("int"))))
3315 matches the specialization A&lt;int&gt;
3316</pre></td></tr>
3317
3318
3319<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
3320<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
3321matches the given InnerMatcher.
3322
3323Given
3324 template&lt;typename T, typename U&gt; class A {};
3325 A&lt;bool, int&gt; b;
3326 A&lt;int, bool&gt; c;
3327classTemplateSpecializationDecl(hasTemplateArgument(
3328 1, refersToType(asString("int"))))
3329 matches the specialization A&lt;bool, int&gt;
3330</pre></td></tr>
3331
3332
3333<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexTypeLoc.html">ComplexTypeLoc</a>&gt;</td><td class="name" onclick="toggle('hasElementTypeLoc1')"><a name="hasElementTypeLoc1Anchor">hasElementTypeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
3334<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
3335type.
3336
3337Given
3338 struct A {};
3339 A a[7];
3340 int b[7];
3341arrayType(hasElementType(builtinType()))
3342 matches "int b[7]"
3343
3344Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
3345</pre></td></tr>
3346
3347
3348<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3349<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
3350type.
3351
3352Given
3353 struct A {};
3354 A a[7];
3355 int b[7];
3356arrayType(hasElementType(builtinType()))
3357 matches "int b[7]"
3358
3359Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ArrayType.html">ArrayType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ComplexType.html">ComplexType</a>&gt;
3360</pre></td></tr>
3361
3362
3363<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3364<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
3365a given matcher.
3366
3367Given
3368 { {}; 1+2; }
3369hasAnySubstatement(compoundStmt())
3370 matches '{ {}; 1+2; }'
3371with compoundStmt()
3372 matching '{}'
3373</pre></td></tr>
3374
3375
3376<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasCondition4')"><a name="hasCondition4Anchor">hasCondition</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3377<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
3378or conditional operator.
3379
3380Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3381 if (true) {}
3382</pre></td></tr>
3383
3384
3385<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasFalseExpression0')"><a name="hasFalseExpression0Anchor">hasFalseExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3386<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
3387
3388Example matches b
3389 condition ? a : b
3390</pre></td></tr>
3391
3392
3393<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ConditionalOperator.html">ConditionalOperator</a>&gt;</td><td class="name" onclick="toggle('hasTrueExpression0')"><a name="hasTrueExpression0Anchor">hasTrueExpression</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3394<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3395
3396Example matches a
3397 condition ? a : b
3398</pre></td></tr>
3399
3400
3401<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3402<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
3403matches the given matcher.
3404
3405The associated declaration is:
3406- for type nodes, the declaration of the underlying type
3407- for CallExpr, the declaration of the callee
3408- for MemberExpr, the declaration of the referenced member
3409- for CXXConstructExpr, the declaration of the constructor
3410
3411Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3412function. e.g. various subtypes of clang::Type and various expressions.
3413
3414Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3415 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3416 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3417 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3418 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3419 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3420</pre></td></tr>
3421
3422
3423<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
3424<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
3425specific using shadow declaration.
3426
3427Given
3428 namespace a { void f() {} }
3429 using a::f;
3430 void g() {
3431 f(); Matches this ..
3432 a::f(); .. but not this.
3433 }
3434declRefExpr(throughUsingDecl(anything()))
3435 matches f()
3436</pre></td></tr>
3437
3438
3439<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3440<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
3441specified matcher.
3442
3443Example matches x in if(x)
3444 (matcher = declRefExpr(to(varDecl(hasName("x")))))
3445 bool x;
3446 if (x) {}
3447</pre></td></tr>
3448
3449
3450<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3451<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
3452
3453Note that this does not work for global declarations because the AST
3454breaks up multiple-declaration DeclStmt's into multiple single-declaration
3455DeclStmt's.
3456Example: Given non-global declarations
3457 int a, b = 0;
3458 int c;
3459 int d = 2, e;
3460declStmt(containsDeclaration(
3461 0, varDecl(hasInitializer(anything()))))
3462 matches only 'int d = 2, e;', and
3463declStmt(containsDeclaration(1, varDecl()))
3464 matches 'int a, b = 0' as well as 'int d = 2, e;'
3465 but 'int c;' is not matched.
3466</pre></td></tr>
3467
3468
3469<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3470<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
3471
3472Given
3473 int a, b;
3474 int c;
3475declStmt(hasSingleDecl(anything()))
3476 matches 'int c;' but not 'int a, b;'.
3477</pre></td></tr>
3478
3479
3480<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; Inner</td></tr>
3481<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
3482the inner matcher.
3483
3484Given
3485 int x;
3486declaratorDecl(hasTypeLoc(loc(asString("int"))))
3487 matches int x
3488</pre></td></tr>
3489
3490
3491<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3492<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
3493Decl, matches InnerMatcher.
3494
3495Given
3496 namespace N {
3497 namespace M {
3498 class D {};
3499 }
3500 }
3501
3502recordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3503declaration of class D.
3504</pre></td></tr>
3505
3506
3507<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3508<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', or 'do while' statement that has
3509a given body.
3510
3511Given
3512 for (;;) {}
3513hasBody(compoundStmt())
3514 matches 'for (;;) {}'
3515with compoundStmt()
3516 matching '{}'
3517</pre></td></tr>
3518
3519
3520<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3521<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
3522or conditional operator.
3523
3524Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3525 if (true) {}
3526</pre></td></tr>
3527
3528
3529<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
3530<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
3531matches InnerMatcher if the qualifier exists.
3532
3533Given
3534 namespace N {
3535 namespace M {
3536 class D {};
3537 }
3538 }
3539 N::M::D d;
3540
3541elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
3542matches the type of the variable declaration of d.
3543</pre></td></tr>
3544
3545
3546<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3547<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
3548
3549Given
3550 namespace N {
3551 namespace M {
3552 class D {};
3553 }
3554 }
3555 N::M::D d;
3556
3557elaboratedType(namesType(recordType(
3558hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
3559declaration of d.
3560</pre></td></tr>
3561
3562
3563<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3564<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
3565matches the given matcher.
3566
3567The associated declaration is:
3568- for type nodes, the declaration of the underlying type
3569- for CallExpr, the declaration of the callee
3570- for MemberExpr, the declaration of the referenced member
3571- for CXXConstructExpr, the declaration of the constructor
3572
3573Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3574function. e.g. various subtypes of clang::Type and various expressions.
3575
3576Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3577 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3578 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3579 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3580 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3581 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3582</pre></td></tr>
3583
3584
3585<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3586<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
3587
3588(Note: Clang's AST refers to other conversions as "casts" too, and calls
3589actual casts "explicit" casts.)
3590</pre></td></tr>
3591
3592
3593<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;</td><td class="name" onclick="toggle('hasType2')"><a name="hasType2Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3594<tr><td colspan="4" class="doc" id="hasType2"><pre>Overloaded to match the declaration of the expression's or value
3595declaration's type.
3596
3597In case of a value declaration (for example a variable declaration),
3598this resolves one layer of indirection. For example, in the value
3599declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
3600while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
3601of x."
3602
3603Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3604 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3605 class X {};
3606 void y(X &amp;x) { x; X z; }
3607
3608Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
3609</pre></td></tr>
3610
3611
3612<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3613<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
3614matcher.
3615
3616Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
3617 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
3618 class X {};
3619 void y(X &amp;x) { x; X z; }
3620</pre></td></tr>
3621
3622
3623<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3624<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
3625are stripped off.
3626
3627Parentheses and explicit casts are not discarded.
3628Given
3629 int arr[5];
3630 int a = 0;
3631 char b = 0;
3632 const int c = a;
3633 int *d = arr;
3634 long e = (long) 0l;
3635The matchers
3636 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
3637 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
3638would match the declarations for a, b, c, and d, but not e.
3639While
3640 varDecl(hasInitializer(integerLiteral()))
3641 varDecl(hasInitializer(declRefExpr()))
3642only match the declarations for b, c, and d.
3643</pre></td></tr>
3644
3645
3646<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3647<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
3648casts are stripped off.
3649
3650Implicit and non-C Style casts are also discarded.
3651Given
3652 int a = 0;
3653 char b = (0);
3654 void* c = reinterpret_cast&lt;char*&gt;(0);
3655 char d = char(0);
3656The matcher
3657 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
3658would match the declarations for a, b, c, and d.
3659while
3660 varDecl(hasInitializer(integerLiteral()))
3661only match the declaration for a.
3662</pre></td></tr>
3663
3664
3665<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3666<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
3667parentheses are stripped off.
3668
3669Explicit casts are not discarded.
3670Given
3671 int arr[5];
3672 int a = 0;
3673 char b = (0);
3674 const int c = a;
3675 int *d = (arr);
3676 long e = ((long) 0l);
3677The matchers
3678 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
3679 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
3680would match the declarations for a, b, c, and d, but not e.
3681while
3682 varDecl(hasInitializer(integerLiteral()))
3683 varDecl(hasInitializer(declRefExpr()))
3684would only match the declaration for a.
3685</pre></td></tr>
3686
3687
3688<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3689<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', or 'do while' statement that has
3690a given body.
3691
3692Given
3693 for (;;) {}
3694hasBody(compoundStmt())
3695 matches 'for (;;) {}'
3696with compoundStmt()
3697 matching '{}'
3698</pre></td></tr>
3699
3700
3701<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3702<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
3703or conditional operator.
3704
3705Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3706 if (true) {}
3707</pre></td></tr>
3708
3709
3710<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3711<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
3712
3713Example:
3714 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
3715matches '++x' in
3716 for (x; x &lt; N; ++x) { }
3717</pre></td></tr>
3718
3719
3720<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3721<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
3722
3723Example:
3724 forStmt(hasLoopInit(declStmt()))
3725matches 'int x = 0' in
3726 for (int x = 0; x &lt; N; ++x) { }
3727</pre></td></tr>
3728
3729
3730<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
3731<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
3732
3733Does not match the 'this' parameter of a method.
3734
3735Given
3736 class X { void f(int x, int y, int z) {} };
3737methodDecl(hasAnyParameter(hasName("y")))
3738 matches f(int x, int y, int z) {}
3739with hasAnyParameter(...)
3740 matching int y
3741</pre></td></tr>
3742
3743
3744<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; InnerMatcher</td></tr>
3745<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
3746
3747Given
3748 class X { void f(int x) {} };
3749methodDecl(hasParameter(0, hasType(varDecl())))
3750 matches f(int x) {}
3751with hasParameter(...)
3752 matching int x
3753</pre></td></tr>
3754
3755
3756<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3757<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
3758
3759Given:
3760 class X { int f() { return 1; } };
3761methodDecl(returns(asString("int")))
3762 matches int f() { return 1; }
3763</pre></td></tr>
3764
3765
3766<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3767<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
3768or conditional operator.
3769
3770Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
3771 if (true) {}
3772</pre></td></tr>
3773
3774
3775<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1DeclStmt.html">DeclStmt</a>&gt; InnerMatcher</td></tr>
3776<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
3777
3778Given
3779 if (A* a = GetAPointer()) {}
3780hasConditionVariableStatement(...)
3781 matches 'A* a = GetAPointer()'.
3782</pre></td></tr>
3783
3784
3785<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3786<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
3787
3788Examples matches the if statement
3789 (matcher = ifStmt(hasElse(boolLiteral(equals(true)))))
3790 if (false) false; else true;
3791</pre></td></tr>
3792
3793
3794<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
3795<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
3796
3797Examples matches the if statement
3798 (matcher = ifStmt(hasThen(boolLiteral(equals(true)))))
3799 if (false) true; else false;
3800</pre></td></tr>
3801
3802
3803<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3804<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
3805matcher.
3806
3807FIXME: Unit test this matcher
3808</pre></td></tr>
3809
3810
3811<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3812<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
3813matches the given matcher.
3814
3815The associated declaration is:
3816- for type nodes, the declaration of the underlying type
3817- for CallExpr, the declaration of the callee
3818- for MemberExpr, the declaration of the referenced member
3819- for CXXConstructExpr, the declaration of the constructor
3820
3821Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3822function. e.g. various subtypes of clang::Type and various expressions.
3823
3824Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3825 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3826 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3827 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3828 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3829 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3830</pre></td></tr>
3831
3832
3833<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3834<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
3835matches the given matcher.
3836
3837The associated declaration is:
3838- for type nodes, the declaration of the underlying type
3839- for CallExpr, the declaration of the callee
3840- for MemberExpr, the declaration of the referenced member
3841- for CXXConstructExpr, the declaration of the constructor
3842
3843Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3844function. e.g. various subtypes of clang::Type and various expressions.
3845
3846Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3847 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3848 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3849 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3850 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3851 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3852</pre></td></tr>
3853
3854
3855<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
3856<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
3857matches the given matcher.
3858
3859The associated declaration is:
3860- for type nodes, the declaration of the underlying type
3861- for CallExpr, the declaration of the callee
3862- for MemberExpr, the declaration of the referenced member
3863- for CXXConstructExpr, the declaration of the constructor
3864
3865Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3866function. e.g. various subtypes of clang::Type and various expressions.
3867
3868Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
3869 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
3870 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
3871 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
3872 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
3873 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
3874</pre></td></tr>
3875
3876
3877<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3878<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
3879matched by a given matcher.
3880
3881Given
3882 struct X { int m; };
3883 void f(X x) { x.m; m; }
3884memberExpr(hasObjectExpression(hasType(recordDecl(hasName("X")))))))
3885 matches "x.m" and "m"
3886with hasObjectExpression(...)
3887 matching "x" and the implicit object expression of "m" which has type X*.
3888</pre></td></tr>
3889
3890
3891<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt; InnerMatcher</td></tr>
3892<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
3893given matcher.
3894
3895Given
3896 struct { int first, second; } first, second;
3897 int i(second.first);
3898 int j(first.second);
3899memberExpr(member(hasName("first")))
3900 matches second.first
3901 but not first.second (because the member name there is "second").
3902</pre></td></tr>
3903
3904
3905<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerTypeLoc.html">MemberPointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
3906<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
3907pointee matches a given matcher.
3908
3909Given
3910 int *a;
3911 int const *b;
3912 float const *f;
3913pointerType(pointee(isConstQualified(), isInteger()))
3914 matches "int const *b"
3915
3916Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3917 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3918</pre></td></tr>
3919
3920
3921<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
3922<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
3923pointee matches a given matcher.
3924
3925Given
3926 int *a;
3927 int const *b;
3928 float const *f;
3929pointerType(pointee(isConstQualified(), isInteger()))
3930 matches "int const *b"
3931
3932Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
3933 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
3934</pre></td></tr>
3935
3936
3937<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt; InnerMatcher</td></tr>
3938<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
3939
3940Given
3941 struct A { struct B { struct C {}; }; };
3942 A::B::C c;
3943nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
3944 matches "A::"
3945</pre></td></tr>
3946
3947
3948<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt; InnerMatcher</td></tr>
3949<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
3950given TypeLoc.
3951
3952Given
3953 struct A { struct B { struct C {}; }; };
3954 A::B::C c;
3955nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
3956 hasDeclaration(recordDecl(hasName("A")))))))
3957 matches "A::"
3958</pre></td></tr>
3959
3960
3961<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
3962<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
3963
3964Given
3965 struct A { struct B { struct C {}; }; };
3966 A::B::C c;
3967nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
3968 matches "A::"
3969</pre></td></tr>
3970
3971
3972<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamespaceDecl.html">NamespaceDecl</a>&gt; InnerMatcher</td></tr>
3973<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
3974given namespace matcher.
3975
3976Given
3977 namespace ns { struct A {}; }
3978 ns::A a;
3979nestedNameSpecifier(specifiesNamespace(hasName("ns")))
3980 matches "ns::"
3981</pre></td></tr>
3982
3983
3984<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
3985<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
3986given QualType matcher without qualifiers.
3987
3988Given
3989 struct A { struct B { struct C {}; }; };
3990 A::B::C c;
3991nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
3992 matches "A::"
3993</pre></td></tr>
3994
3995
3996<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
3997<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
3998call expression.
3999
4000Example matches y in x(y)
4001 (matcher = callExpr(hasArgument(0, declRefExpr())))
4002 void x(int) { int y; x(y); }
4003</pre></td></tr>
4004
4005
4006<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4007<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
4008
4009Example
4010matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *")));
4011matches the [webView ...] message invocation.
4012 NSString *webViewJavaScript = ...
4013 UIWebView *webView = ...
4014 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
4015</pre></td></tr>
4016
4017
4018<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
4019<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
4020
4021Given
4022 int (*ptr_to_array)[4];
4023 int (*ptr_to_func)(int);
4024
4025varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
4026ptr_to_func but not ptr_to_array.
4027
4028Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
4029</pre></td></tr>
4030
4031
4032<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc2')"><a name="pointeeLoc2Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
4033<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
4034pointee matches a given matcher.
4035
4036Given
4037 int *a;
4038 int const *b;
4039 float const *f;
4040pointerType(pointee(isConstQualified(), isInteger()))
4041 matches "int const *b"
4042
4043Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
4044 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
4045</pre></td></tr>
4046
4047
4048<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
4049<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
4050pointee matches a given matcher.
4051
4052Given
4053 int *a;
4054 int const *b;
4055 float const *f;
4056pointerType(pointee(isConstQualified(), isInteger()))
4057 matches "int const *b"
4058
4059Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
4060 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
4061</pre></td></tr>
4062
4063
4064<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4065<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
4066
4067Given:
4068 typedef int &amp;int_ref;
4069 int a;
4070 int_ref b = a;
4071
4072varDecl(hasType(qualType(referenceType()))))) will not match the
4073declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
4074</pre></td></tr>
4075
4076
4077<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4078<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
4079matches the given matcher.
4080
4081The associated declaration is:
4082- for type nodes, the declaration of the underlying type
4083- for CallExpr, the declaration of the callee
4084- for MemberExpr, the declaration of the referenced member
4085- for CXXConstructExpr, the declaration of the constructor
4086
4087Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4088function. e.g. various subtypes of clang::Type and various expressions.
4089
4090Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4091 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4092 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4093 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4094 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4095 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4096</pre></td></tr>
4097
4098
4099<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4100<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
4101</pre></td></tr>
4102
4103
4104<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4105<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
4106matches the specified matcher.
4107
4108Example matches y-&gt;x()
4109 (matcher = memberCallExpr(on(hasType(pointsTo
4110 recordDecl(hasName("Y")))))))
4111 class Y { public: void x(); };
4112 void z() { Y *y; y-&gt;x(); }
4113</pre></td></tr>
4114
4115
4116<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4117<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
4118</pre></td></tr>
4119
4120
4121<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4122<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
4123type matches the specified matcher.
4124
4125Example matches X &amp;x and const X &amp;y
4126 (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
4127 class X {
4128 void a(X b) {
4129 X &amp;x = b;
4130 const X &amp;y = b;
4131 }
4132 };
4133</pre></td></tr>
4134
4135
4136<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4137<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
4138matches the given matcher.
4139
4140The associated declaration is:
4141- for type nodes, the declaration of the underlying type
4142- for CallExpr, the declaration of the callee
4143- for MemberExpr, the declaration of the referenced member
4144- for CXXConstructExpr, the declaration of the constructor
4145
4146Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4147function. e.g. various subtypes of clang::Type and various expressions.
4148
4149Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4150 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4151 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4152 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4153 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4154 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4155</pre></td></tr>
4156
4157
4158<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceTypeLoc.html">ReferenceTypeLoc</a>&gt;</td><td class="name" onclick="toggle('pointeeLoc3')"><a name="pointeeLoc3Anchor">pointeeLoc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;</td></tr>
4159<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
4160pointee matches a given matcher.
4161
4162Given
4163 int *a;
4164 int const *b;
4165 float const *f;
4166pointerType(pointee(isConstQualified(), isInteger()))
4167 matches "int const *b"
4168
4169Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
4170 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
4171</pre></td></tr>
4172
4173
4174<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td></tr>
4175<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
4176pointee matches a given matcher.
4177
4178Given
4179 int *a;
4180 int const *b;
4181 float const *f;
4182pointerType(pointee(isConstQualified(), isInteger()))
4183 matches "int const *b"
4184
4185Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1BlockPointerType.html">BlockPointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberPointerType.html">MemberPointerType</a>&gt;,
4186 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ReferenceType.html">ReferenceType</a>&gt;
4187</pre></td></tr>
4188
4189
4190<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
4191<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
4192alignof.
4193</pre></td></tr>
4194
4195
4196<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt; InnerMatcher</td></tr>
4197<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
4198sizeof.
4199</pre></td></tr>
4200
4201
4202<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html">SwitchCase</a>&gt; InnerMatcher</td></tr>
4203<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
4204statement. This matcher may produce multiple matches.
4205
4206Given
4207 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
4208switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
4209 matches four times, with "c" binding each of "case 1:", "case 2:",
4210"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
4211"switch (1)", "switch (2)" and "switch (2)".
4212</pre></td></tr>
4213
4214
4215<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4216<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
4217matches the given matcher.
4218
4219The associated declaration is:
4220- for type nodes, the declaration of the underlying type
4221- for CallExpr, the declaration of the callee
4222- for MemberExpr, the declaration of the referenced member
4223- for CXXConstructExpr, the declaration of the constructor
4224
4225Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4226function. e.g. various subtypes of clang::Type and various expressions.
4227
4228Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4229 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4230 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4231 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4232 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4233 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4234</pre></td></tr>
4235
4236
4237<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4238<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
4239
4240Given
4241 template&lt;typename T&gt; struct A {};
4242 struct B { B* next; };
4243 A&lt;&amp;B::next&gt; a;
4244templateSpecializationType(hasAnyTemplateArgument(
4245 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
4246 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
4247 B::next
4248</pre></td></tr>
4249
4250
4251<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4252<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
4253declaration.
4254
4255Given
4256 template&lt;typename T&gt; struct A {};
4257 struct B { B* next; };
4258 A&lt;&amp;B::next&gt; a;
4259classTemplateSpecializationDecl(hasAnyTemplateArgument(
4260 refersToDeclaration(fieldDecl(hasName("next"))))
4261 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
4262 B::next
4263</pre></td></tr>
4264
4265
4266<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4267<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
4268
4269Given
4270 template&lt;int T&gt; struct A {};
4271 C&lt;42&gt; c;
4272classTemplateSpecializationDecl(
4273 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
4274 matches the implicit instantiation of C in C&lt;42&gt;.
4275</pre></td></tr>
4276
4277
4278<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4279<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
4280
4281Given
4282 struct X {};
4283 template&lt;typename T&gt; struct A {};
4284 A&lt;X&gt; a;
4285classTemplateSpecializationDecl(hasAnyTemplateArgument(
4286 refersToType(class(hasName("X")))))
4287 matches the specialization A&lt;X&gt;
4288</pre></td></tr>
4289
4290
4291<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
4292<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
4293TemplateArgument matching the given InnerMatcher.
4294
4295Given
4296 template&lt;typename T&gt; class A {};
4297 template&lt;&gt; class A&lt;double&gt; {};
4298 A&lt;int&gt; a;
4299classTemplateSpecializationDecl(hasAnyTemplateArgument(
4300 refersToType(asString("int"))))
4301 matches the specialization A&lt;int&gt;
4302</pre></td></tr>
4303
4304
4305<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4306<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
4307matches the given matcher.
4308
4309The associated declaration is:
4310- for type nodes, the declaration of the underlying type
4311- for CallExpr, the declaration of the callee
4312- for MemberExpr, the declaration of the referenced member
4313- for CXXConstructExpr, the declaration of the constructor
4314
4315Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4316function. e.g. various subtypes of clang::Type and various expressions.
4317
4318Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4319 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4320 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4321 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4322 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4323 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4324</pre></td></tr>
4325
4326
4327<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>&gt; InnerMatcher</td></tr>
4328<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
4329matches the given InnerMatcher.
4330
4331Given
4332 template&lt;typename T, typename U&gt; class A {};
4333 A&lt;bool, int&gt; b;
4334 A&lt;int, bool&gt; c;
4335classTemplateSpecializationDecl(hasTemplateArgument(
4336 1, refersToType(asString("int"))))
4337 matches the specialization A&lt;bool, int&gt;
4338</pre></td></tr>
4339
4340
4341<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4342<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
4343matches the given matcher.
4344
4345The associated declaration is:
4346- for type nodes, the declaration of the underlying type
4347- for CallExpr, the declaration of the callee
4348- for MemberExpr, the declaration of the referenced member
4349- for CXXConstructExpr, the declaration of the constructor
4350
4351Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4352function. e.g. various subtypes of clang::Type and various expressions.
4353
4354Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4355 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4356 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4357 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4358 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4359 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4360</pre></td></tr>
4361
4362
4363<tr><td>Matcher&lt;T&gt;</td><td class="name" onclick="toggle('findAll0')"><a name="findAll0Anchor">findAll</a></td><td>Matcher&lt;T&gt; Matcher</td></tr>
4364<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
4365
4366Generates results for each match.
4367
4368For example, in:
4369 class A { class B {}; class C {}; };
4370The matcher:
4371 recordDecl(hasName("::A"), findAll(recordDecl(isDefinition()).bind("m")))
4372will generate results for A, B and C.
4373
4374Usable as: Any Matcher
4375</pre></td></tr>
4376
4377
4378<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4379<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
4380matches the given matcher.
4381
4382The associated declaration is:
4383- for type nodes, the declaration of the underlying type
4384- for CallExpr, the declaration of the callee
4385- for MemberExpr, the declaration of the referenced member
4386- for CXXConstructExpr, the declaration of the constructor
4387
4388Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4389function. e.g. various subtypes of clang::Type and various expressions.
4390
4391Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4392 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4393 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4394 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4395 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4396 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4397</pre></td></tr>
4398
4399
4400<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4401<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
4402
4403Given
4404 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
4405unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
4406 matches sizeof(a) and alignof(c)
4407</pre></td></tr>
4408
4409
4410<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4411<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
4412
4413Example matches true (matcher = hasUnaryOperand(boolLiteral(equals(true))))
4414 !true
4415</pre></td></tr>
4416
4417
4418<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4419<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
4420matches the given matcher.
4421
4422The associated declaration is:
4423- for type nodes, the declaration of the underlying type
4424- for CallExpr, the declaration of the callee
4425- for MemberExpr, the declaration of the referenced member
4426- for CXXConstructExpr, the declaration of the constructor
4427
4428Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4429function. e.g. various subtypes of clang::Type and various expressions.
4430
4431Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;,
4432 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html">DeclRefExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1EnumType.html">EnumType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1InjectedClassNameType.html">InjectedClassNameType</a>&gt;,
4433 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1LabelStmt.html">LabelStmt</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html">MemberExpr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;,
4434 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html">RecordType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagType.html">TagType</a>&gt;,
4435 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateSpecializationType.html">TemplateSpecializationType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmType.html">TemplateTypeParmType</a>&gt;,
4436 Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefType.html">TypedefType</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnresolvedUsingType.html">UnresolvedUsingType</a>&gt;
4437</pre></td></tr>
4438
4439
4440<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1UsingShadowDecl.html">UsingShadowDecl</a>&gt; InnerMatcher</td></tr>
4441<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
4442
4443Given
4444 namespace X { void b(); }
4445 using X::b;
4446usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
4447 matches using X::b </pre></td></tr>
4448
4449
4450<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>&gt; InnerMatcher</td></tr>
4451<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
4452matched by the given matcher.
4453
4454Given
4455 namespace X { int a; void b(); }
4456 using X::a;
4457 using X::b;
4458usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
4459 matches using X::b but not using X::a </pre></td></tr>
4460
4461
4462<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4463<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
4464declaration's type.
4465
4466In case of a value declaration (for example a variable declaration),
4467this resolves one layer of indirection. For example, in the value
4468declaration "X x;", recordDecl(hasName("X")) matches the declaration of X,
4469while varDecl(hasType(recordDecl(hasName("X")))) matches the declaration
4470of x."
4471
4472Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4473 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
4474 class X {};
4475 void y(X &amp;x) { x; X z; }
4476
4477Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;
4478</pre></td></tr>
4479
4480
4481<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType1')"><a name="hasType1Anchor">hasType</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4482<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
4483matcher.
4484
4485Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
4486 and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
4487 class X {};
4488 void y(X &amp;x) { x; X z; }
4489</pre></td></tr>
4490
4491
4492<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4493<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
4494that matches the given matcher.
4495
4496Example matches x (matcher = varDecl(hasInitializer(callExpr())))
4497 bool y() { return true; }
4498 bool x = y();
4499</pre></td></tr>
4500
4501
4502<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4503<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
4504expression.
4505
4506Given
4507 void f(int b) {
4508 int a[b];
4509 }
4510variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
4511 varDecl(hasName("b")))))))
4512 matches "int a[b]"
4513</pre></td></tr>
4514
4515
4516<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
4517<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', or 'do while' statement that has
4518a given body.
4519
4520Given
4521 for (;;) {}
4522hasBody(compoundStmt())
4523 matches 'for (;;) {}'
4524with compoundStmt()
4525 matching '{}'
4526</pre></td></tr>
4527
4528
4529<tr><td>Matcher&lt<a href="http://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="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
4530<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
4531or conditional operator.
4532
4533Example matches true (matcher = hasCondition(boolLiteral(equals(true))))
4534 if (true) {}
4535</pre></td></tr>
4536
4537
4538<tr><td>Matcher&lt;internal::BindableMatcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifierLoc.html">NestedNameSpecifierLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc1')"><a name="loc1Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1NestedNameSpecifier.html">NestedNameSpecifier</a>&gt; InnerMatcher</td></tr>
4539<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
4540NestedNameSpecifier-matcher matches.
4541</pre></td></tr>
4542
4543
4544<tr><td>Matcher&lt;internal::BindableMatcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>&gt;&gt;</td><td class="name" onclick="toggle('loc0')"><a name="loc0Anchor">loc</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4545<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
4546QualType-matcher matches.
4547</pre></td></tr>
4548
4549<!--END_TRAVERSAL_MATCHERS -->
4550</table>
4551
4552</div>
4553</body>
4554</html>
4555
4556