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