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