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