blob: 4dabc4b454976be1368fdce6ccdeb4e36d26cafe [file] [log] [blame]
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
3<html>
4<head>
5<title>AST Matcher Reference</title>
6<link type="text/css" rel="stylesheet" href="../menu.css" />
7<link type="text/css" rel="stylesheet" href="../content.css" />
8<style type="text/css">
9td {
10 padding: .33em;
11}
12td.doc {
13 display: none;
14 border-bottom: 1px solid black;
15}
16td.name:hover {
17 color: blue;
18 cursor: pointer;
19}
20</style>
21<script type="text/javascript">
22function toggle(id) {
23 if (!id) return;
24 row = document.getElementById(id);
25 if (row.style.display != 'table-cell')
26 row.style.display = 'table-cell';
27 else
28 row.style.display = 'none';
29}
30</script>
31</head>
32<body onLoad="toggle(location.hash.substring(1, location.hash.length - 6))">
33
34<!--#include virtual="../menu.html.incl"-->
35
36<div id="content">
37
38<h1>AST Matcher Reference</h1>
39
40<p>This document shows all currently implemented matchers. The matchers are grouped
41by category and node type they match. You can click on matcher names to show the
42matcher's source documentation.</p>
43
44<p>There are three different basic categories of matchers:
45<ul>
46<li><a href="#decl-matchers">Node Matchers:</a> Matchers that match a specific type of AST node.</li>
47<li><a href="#narrowing-matchers">Narrowing Matchers:</a> Matchers that match attributes on AST nodes.</li>
48<li><a href="#traversal-matchers">Traversal Matchers:</a> Matchers that allow traversal between AST nodes.</li>
49</ul>
50</p>
51
52<p>Within each category the matchers are ordered by node type they match on.
53Note that if a matcher can match multiple node types, it will it will appear
54multiple times. This means that by searching for Matcher&lt;Stmt&gt; you can
55find all matchers that can be used to match on Stmt nodes.</p>
56
57<p>The exception to that rule are matchers that can match on any node. Those
58are marked with a * and are listed in the beginning of each category.</p>
59
60<p>Note that the categorization of matchers is a great help when you combine
61them into matcher expressions. You will usually want to form matcher expressions
62that read like english sentences by alternating between node matchers and
63narrowing or traversal matchers, like this:
64<pre>
65recordDecl(hasDescendant(
66 ifStmt(hasTrueExpression(
67 expr(hasDescendant(
68 ifStmt()))))))
69</pre>
70</p>
71
72<!-- ======================================================================= -->
73<h2 id="decl-matchers">Node Matchers</h2>
74<!-- ======================================================================= -->
75
76<p>Node matchers are at the core of matcher expressions - they specify the type
77of node that is expected. Every match expression starts with a node matcher,
78which can then be further refined with a narrowing or traversal matcher. All
79traversal matchers take node matchers as their arguments.</p>
80
81<p>For convenience, all node matchers take an arbitrary number of arguments
82and implicitly act as allOf matchers.</p>
83
84<p>Node matchers are the only matchers that support the bind("id") call to
85bind the matched node to the given string, to be later retrieved from the
86match callback.</p>
87
88<p>It is important to remember that the arguments to node matchers are
89predicates on the same node, just with additional information about the type.
90This is often useful to make matcher expression more readable by inlining bind
91calls into redundant node matchers inside another node matcher:
92<pre>
93// This binds the CXXRecordDecl to "id", as the decl() matcher will stay on
94// the same node.
95recordDecl(decl().bind("id"), hasName("::MyClass"))
96</pre>
97</p>
98
99<table>
100<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000101<!-- START_DECL_MATCHERS -->
102
Aaron Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000104<tr><td colspan="4" class="doc" id="cxxCtorInitializer0"><pre>Matches constructor initializers.
105
106Examples matches i(42).
107 class C {
108 C() : i(42) {}
109 int i;
110 };
111</pre></td></tr>
112
113
Aaron Ballman672dde22016-01-22 23:15:00 +0000114<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000115<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000127<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000128<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000135<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000136<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000148<tr><td colspan="4" class="doc" id="cxxConstructorDecl0"><pre>Matches C++ constructor declarations.
149
150Example matches Foo::Foo() and Foo::Foo(int)
151 class Foo {
152 public:
153 Foo();
154 Foo(int);
155 int DoSomething();
156 };
157</pre></td></tr>
158
159
Aaron Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000161<tr><td colspan="4" class="doc" id="cxxConversionDecl0"><pre>Matches conversion operator declarations.
162
163Example matches the operator.
164 class X { operator int() const; };
165</pre></td></tr>
166
167
Aaron Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000169<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000179<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000180<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000187<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000188<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000197<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000207<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000208<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000219<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000228<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000229<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000238<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000239<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000248<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000249<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000258<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000259<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000266<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000267<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000274<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000275<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000285<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000298<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000309<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000320<tr><td colspan="4" class="doc" id="nonTypeTemplateParmDecl0"><pre>Matches non-type template parameter declarations.
321
322Given
323 template &lt;typename T, int N&gt; struct C {};
324nonTypeTemplateParmDecl()
325 matches 'N', but not 'T'.
326</pre></td></tr>
327
328
Aaron Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000330<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000339<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 Ballman672dde22016-01-22 23:15:00 +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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000349<tr><td colspan="4" class="doc" id="recordDecl0"><pre>Matches class, struct, and union declarations.
350
351Example matches X, Z, U, and S
352 class X;
353 template&lt;class T&gt; class Z {};
354 struct S {};
355 union U {};
356</pre></td></tr>
357
358
Aaron Ballman672dde22016-01-22 23:15:00 +0000359<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000360<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
Aaron Ballman672dde22016-01-22 23:15:00 +0000374<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('templateTypeParmDecl0')"><a name="templateTypeParmDecl0Anchor">templateTypeParmDecl</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateTypeParmDecl.html">TemplateTypeParmDecl</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000375<tr><td colspan="4" class="doc" id="templateTypeParmDecl0"><pre>Matches template type parameter declarations.
376
377Given
378 template &lt;typename T, int N&gt; struct C {};
379templateTypeParmDecl()
380 matches 'T', but not 'N'.
381</pre></td></tr>
382
383
Aaron Ballman672dde22016-01-22 23:15:00 +0000384<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000385<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
386
387Given
388 int X;
389 namespace NS {
390 int Y;
391 } namespace NS
392decl(hasDeclContext(translationUnitDecl()))
393 matches "int X", but not "int Y".
394</pre></td></tr>
395
396
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000398<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
399
400Given
401 typedef int X;
402typedefDecl()
403 matches "typedef int X"
404</pre></td></tr>
405
406
Aaron Ballman672dde22016-01-22 23:15:00 +0000407<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000408<tr><td colspan="4" class="doc" id="unresolvedUsingTypenameDecl0"><pre>Matches unresolved using value declarations that involve the
409typename.
410
411Given
412 template &lt;typename T&gt;
413 struct Base { typedef T Foo; };
414
415 template&lt;typename T&gt;
416 struct S : private Base&lt;T&gt; {
417 using typename Base&lt;T&gt;::Foo;
418 };
419unresolvedUsingTypenameDecl()
420 matches using Base&lt;T&gt;::Foo </pre></td></tr>
421
422
Aaron Ballman672dde22016-01-22 23:15:00 +0000423<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000424<tr><td colspan="4" class="doc" id="unresolvedUsingValueDecl0"><pre>Matches unresolved using value declarations.
425
426Given
427 template&lt;typename X&gt;
428 class C : private X {
429 using X::x;
430 };
431unresolvedUsingValueDecl()
432 matches using X::x </pre></td></tr>
433
434
Aaron Ballman672dde22016-01-22 23:15:00 +0000435<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000436<tr><td colspan="4" class="doc" id="usingDecl0"><pre>Matches using declarations.
437
438Given
439 namespace X { int x; }
440 using X::x;
441usingDecl()
442 matches using X::x </pre></td></tr>
443
444
Aaron Ballman672dde22016-01-22 23:15:00 +0000445<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000446<tr><td colspan="4" class="doc" id="usingDirectiveDecl0"><pre>Matches using namespace declarations.
447
448Given
449 namespace X { int x; }
450 using namespace X;
451usingDirectiveDecl()
452 matches using namespace X </pre></td></tr>
453
454
Aaron Ballman672dde22016-01-22 23:15:00 +0000455<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000456<tr><td colspan="4" class="doc" id="valueDecl0"><pre>Matches any value declaration.
457
458Example matches A, B, C and F
459 enum X { A, B, C };
460 void F();
461</pre></td></tr>
462
463
Aaron Ballman672dde22016-01-22 23:15:00 +0000464<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000465<tr><td colspan="4" class="doc" id="varDecl0"><pre>Matches variable declarations.
466
467Note: this does not match declarations of member variables, which are
468"field" declarations in Clang parlance.
469
470Example matches a
471 int a;
472</pre></td></tr>
473
474
Aaron Ballman672dde22016-01-22 23:15:00 +0000475<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000476<tr><td colspan="4" class="doc" id="nestedNameSpecifierLoc0"><pre>Same as nestedNameSpecifier but matches NestedNameSpecifierLoc.
477</pre></td></tr>
478
479
Aaron Ballman672dde22016-01-22 23:15:00 +0000480<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000481<tr><td colspan="4" class="doc" id="nestedNameSpecifier0"><pre>Matches nested name specifiers.
482
483Given
484 namespace ns {
485 struct A { static void f(); };
486 void A::f() {}
487 void g() { A::f(); }
488 }
489 ns::A a;
490nestedNameSpecifier()
491 matches "ns::" and both "A::"
492</pre></td></tr>
493
494
Aaron Ballman672dde22016-01-22 23:15:00 +0000495<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000496<tr><td colspan="4" class="doc" id="qualType0"><pre>Matches QualTypes in the clang AST.
497</pre></td></tr>
498
499
Aaron Ballman672dde22016-01-22 23:15:00 +0000500<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000501<tr><td colspan="4" class="doc" id="arraySubscriptExpr0"><pre>Matches array subscript expressions.
502
503Given
504 int i = a[1];
505arraySubscriptExpr()
506 matches "a[1]"
507</pre></td></tr>
508
509
Aaron Ballman672dde22016-01-22 23:15:00 +0000510<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000511<tr><td colspan="4" class="doc" id="asmStmt0"><pre>Matches asm statements.
512
513 int i = 100;
514 __asm("mov al, 2");
515asmStmt()
516 matches '__asm("mov al, 2")'
517</pre></td></tr>
518
519
Aaron Ballman672dde22016-01-22 23:15:00 +0000520<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000521<tr><td colspan="4" class="doc" id="binaryOperator0"><pre>Matches binary operator expressions.
522
523Example matches a || b
524 !(a || b)
525</pre></td></tr>
526
527
Aaron Ballman672dde22016-01-22 23:15:00 +0000528<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000529<tr><td colspan="4" class="doc" id="breakStmt0"><pre>Matches break statements.
530
531Given
532 while (true) { break; }
533breakStmt()
534 matches 'break'
535</pre></td></tr>
536
537
Aaron Ballman672dde22016-01-22 23:15:00 +0000538<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000539<tr><td colspan="4" class="doc" id="cStyleCastExpr0"><pre>Matches a C-style cast expression.
540
541Example: Matches (int*) 2.2f in
542 int i = (int) 2.2f;
543</pre></td></tr>
544
545
Aaron Ballman672dde22016-01-22 23:15:00 +0000546<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000547<tr><td colspan="4" class="doc" id="callExpr0"><pre>Matches call expressions.
548
549Example matches x.y() and y()
550 X x;
551 x.y();
552 y();
553</pre></td></tr>
554
555
Aaron Ballman672dde22016-01-22 23:15:00 +0000556<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000557<tr><td colspan="4" class="doc" id="caseStmt0"><pre>Matches case statements inside switch statements.
558
559Given
560 switch(a) { case 42: break; default: break; }
561caseStmt()
562 matches 'case 42: break;'.
563</pre></td></tr>
564
565
Aaron Ballman672dde22016-01-22 23:15:00 +0000566<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000567<tr><td colspan="4" class="doc" id="castExpr0"><pre>Matches any cast nodes of Clang's AST.
568
569Example: castExpr() matches each of the following:
570 (int) 3;
571 const_cast&lt;Expr *&gt;(SubExpr);
572 char c = 0;
573but does not match
574 int i = (0);
575 int k = 0;
576</pre></td></tr>
577
578
Aaron Ballman672dde22016-01-22 23:15:00 +0000579<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000580<tr><td colspan="4" class="doc" id="characterLiteral0"><pre>Matches character literals (also matches wchar_t).
581
582Not matching Hex-encoded chars (e.g. 0x1234, which is a IntegerLiteral),
583though.
584
585Example matches 'a', L'a'
586 char ch = 'a'; wchar_t chw = L'a';
587</pre></td></tr>
588
589
Aaron Ballman672dde22016-01-22 23:15:00 +0000590<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000591<tr><td colspan="4" class="doc" id="compoundLiteralExpr0"><pre>Matches compound (i.e. non-scalar) literals
592
593Example match: {1}, (1, 2)
594 int array[4] = {1}; vector int myvec = (vector int)(1, 2);
595</pre></td></tr>
596
597
Aaron Ballman672dde22016-01-22 23:15:00 +0000598<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000599<tr><td colspan="4" class="doc" id="compoundStmt0"><pre>Matches compound statements.
600
601Example matches '{}' and '{{}}'in 'for (;;) {{}}'
602 for (;;) {{}}
603</pre></td></tr>
604
605
Aaron Ballman672dde22016-01-22 23:15:00 +0000606<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000607<tr><td colspan="4" class="doc" id="conditionalOperator0"><pre>Matches conditional operator expressions.
608
609Example matches a ? b : c
610 (a ? b : c) + 42
611</pre></td></tr>
612
613
Aaron Ballman672dde22016-01-22 23:15:00 +0000614<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000615<tr><td colspan="4" class="doc" id="continueStmt0"><pre>Matches continue statements.
616
617Given
618 while (true) { continue; }
619continueStmt()
620 matches 'continue'
621</pre></td></tr>
622
623
Aaron Ballman672dde22016-01-22 23:15:00 +0000624<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000625<tr><td colspan="4" class="doc" id="cudaKernelCallExpr0"><pre>Matches CUDA kernel call expression.
626
627Example matches,
628 kernel&lt;&lt;&lt;i,j&gt;&gt;&gt;();
629</pre></td></tr>
630
631
Aaron Ballman672dde22016-01-22 23:15:00 +0000632<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000633<tr><td colspan="4" class="doc" id="cxxBindTemporaryExpr0"><pre>Matches nodes where temporaries are created.
634
635Example matches FunctionTakesString(GetStringByValue())
636 (matcher = cxxBindTemporaryExpr())
637 FunctionTakesString(GetStringByValue());
638 FunctionTakesStringByPointer(GetStringPointer());
639</pre></td></tr>
640
641
Aaron Ballman672dde22016-01-22 23:15:00 +0000642<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000643<tr><td colspan="4" class="doc" id="cxxBoolLiteral0"><pre>Matches bool literals.
644
645Example matches true
646 true
647</pre></td></tr>
648
649
Aaron Ballman672dde22016-01-22 23:15:00 +0000650<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000651<tr><td colspan="4" class="doc" id="cxxCatchStmt0"><pre>Matches catch statements.
652
653 try {} catch(int i) {}
654cxxCatchStmt()
655 matches 'catch(int i)'
656</pre></td></tr>
657
658
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000660<tr><td colspan="4" class="doc" id="cxxConstCastExpr0"><pre>Matches a const_cast expression.
661
662Example: Matches const_cast&lt;int*&gt;(&amp;r) in
663 int n = 42;
664 const int &amp;r(n);
665 int* p = const_cast&lt;int*&gt;(&amp;r);
666</pre></td></tr>
667
668
Aaron Ballman672dde22016-01-22 23:15:00 +0000669<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000670<tr><td colspan="4" class="doc" id="cxxConstructExpr0"><pre>Matches constructor call expressions (including implicit ones).
671
672Example matches string(ptr, n) and ptr within arguments of f
673 (matcher = cxxConstructExpr())
674 void f(const string &amp;a, const string &amp;b);
675 char *ptr;
676 int n;
677 f(string(ptr, n), ptr);
678</pre></td></tr>
679
680
Aaron Ballman672dde22016-01-22 23:15:00 +0000681<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000682<tr><td colspan="4" class="doc" id="cxxDefaultArgExpr0"><pre>Matches the value of a default argument at the call site.
683
684Example matches the CXXDefaultArgExpr placeholder inserted for the
685 default value of the second parameter in the call expression f(42)
686 (matcher = cxxDefaultArgExpr())
687 void f(int x, int y = 0);
688 f(42);
689</pre></td></tr>
690
691
Aaron Ballman672dde22016-01-22 23:15:00 +0000692<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000693<tr><td colspan="4" class="doc" id="cxxDeleteExpr0"><pre>Matches delete expressions.
694
695Given
696 delete X;
697cxxDeleteExpr()
698 matches 'delete X'.
699</pre></td></tr>
700
701
Aaron Ballman672dde22016-01-22 23:15:00 +0000702<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000703<tr><td colspan="4" class="doc" id="cxxDynamicCastExpr0"><pre>Matches a dynamic_cast expression.
704
705Example:
706 cxxDynamicCastExpr()
707matches
708 dynamic_cast&lt;D*&gt;(&amp;b);
709in
710 struct B { virtual ~B() {} }; struct D : B {};
711 B b;
712 D* p = dynamic_cast&lt;D*&gt;(&amp;b);
713</pre></td></tr>
714
715
Aaron Ballman672dde22016-01-22 23:15:00 +0000716<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000717<tr><td colspan="4" class="doc" id="cxxForRangeStmt0"><pre>Matches range-based for statements.
718
719cxxForRangeStmt() matches 'for (auto a : i)'
720 int i[] = {1, 2, 3}; for (auto a : i);
721 for(int j = 0; j &lt; 5; ++j);
722</pre></td></tr>
723
724
Aaron Ballman672dde22016-01-22 23:15:00 +0000725<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000726<tr><td colspan="4" class="doc" id="cxxFunctionalCastExpr0"><pre>Matches functional cast expressions
727
728Example: Matches Foo(bar);
729 Foo f = bar;
730 Foo g = (Foo) bar;
731 Foo h = Foo(bar);
732</pre></td></tr>
733
734
Aaron Ballman672dde22016-01-22 23:15:00 +0000735<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000736<tr><td colspan="4" class="doc" id="cxxMemberCallExpr0"><pre>Matches member call expressions.
737
738Example matches x.y()
739 X x;
740 x.y();
741</pre></td></tr>
742
743
Aaron Ballman672dde22016-01-22 23:15:00 +0000744<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000745<tr><td colspan="4" class="doc" id="cxxNewExpr0"><pre>Matches new expressions.
746
747Given
748 new X;
749cxxNewExpr()
750 matches 'new X'.
751</pre></td></tr>
752
753
Aaron Ballman672dde22016-01-22 23:15:00 +0000754<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000755<tr><td colspan="4" class="doc" id="cxxNullPtrLiteralExpr0"><pre>Matches nullptr literal.
756</pre></td></tr>
757
758
Aaron Ballman672dde22016-01-22 23:15:00 +0000759<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000760<tr><td colspan="4" class="doc" id="cxxOperatorCallExpr0"><pre>Matches overloaded operator calls.
761
762Note that if an operator isn't overloaded, it won't match. Instead, use
763binaryOperator matcher.
764Currently it does not match operators such as new delete.
765FIXME: figure out why these do not match?
766
767Example matches both operator&lt;&lt;((o &lt;&lt; b), c) and operator&lt;&lt;(o, b)
768 (matcher = cxxOperatorCallExpr())
769 ostream &amp;operator&lt;&lt; (ostream &amp;out, int i) { };
770 ostream &amp;o; int b = 1, c = 1;
771 o &lt;&lt; b &lt;&lt; c;
772</pre></td></tr>
773
774
Aaron Ballman672dde22016-01-22 23:15:00 +0000775<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000776<tr><td colspan="4" class="doc" id="cxxReinterpretCastExpr0"><pre>Matches a reinterpret_cast expression.
777
778Either the source expression or the destination type can be matched
779using has(), but hasDestinationType() is more specific and can be
780more readable.
781
782Example matches reinterpret_cast&lt;char*&gt;(&amp;p) in
783 void* p = reinterpret_cast&lt;char*&gt;(&amp;p);
784</pre></td></tr>
785
786
Aaron Ballman672dde22016-01-22 23:15:00 +0000787<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000788<tr><td colspan="4" class="doc" id="cxxStaticCastExpr0"><pre>Matches a C++ static_cast expression.
789
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000790See also: hasDestinationType
791See also: reinterpretCast
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000792
793Example:
794 cxxStaticCastExpr()
795matches
796 static_cast&lt;long&gt;(8)
797in
798 long eight(static_cast&lt;long&gt;(8));
799</pre></td></tr>
800
801
Aaron Ballman672dde22016-01-22 23:15:00 +0000802<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000803<tr><td colspan="4" class="doc" id="cxxTemporaryObjectExpr0"><pre>Matches functional cast expressions having N != 1 arguments
804
805Example: Matches Foo(bar, bar)
806 Foo h = Foo(bar, bar);
807</pre></td></tr>
808
809
Aaron Ballman672dde22016-01-22 23:15:00 +0000810<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000811<tr><td colspan="4" class="doc" id="cxxThisExpr0"><pre>Matches implicit and explicit this expressions.
812
813Example matches the implicit this expression in "return i".
814 (matcher = cxxThisExpr())
815struct foo {
816 int i;
817 int f() { return i; }
818};
819</pre></td></tr>
820
821
Aaron Ballman672dde22016-01-22 23:15:00 +0000822<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000823<tr><td colspan="4" class="doc" id="cxxThrowExpr0"><pre>Matches throw expressions.
824
825 try { throw 5; } catch(int i) {}
826cxxThrowExpr()
827 matches 'throw 5'
828</pre></td></tr>
829
830
Aaron Ballman672dde22016-01-22 23:15:00 +0000831<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000832<tr><td colspan="4" class="doc" id="cxxTryStmt0"><pre>Matches try statements.
833
834 try {} catch(int i) {}
835cxxTryStmt()
836 matches 'try {}'
837</pre></td></tr>
838
839
Aaron Ballman672dde22016-01-22 23:15:00 +0000840<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000841<tr><td colspan="4" class="doc" id="cxxUnresolvedConstructExpr0"><pre>Matches unresolved constructor call expressions.
842
843Example matches T(t) in return statement of f
844 (matcher = cxxUnresolvedConstructExpr())
845 template &lt;typename T&gt;
846 void f(const T&amp; t) { return T(t); }
847</pre></td></tr>
848
849
Aaron Ballman672dde22016-01-22 23:15:00 +0000850<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000851<tr><td colspan="4" class="doc" id="declRefExpr0"><pre>Matches expressions that refer to declarations.
852
853Example matches x in if (x)
854 bool x;
855 if (x) {}
856</pre></td></tr>
857
858
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000860<tr><td colspan="4" class="doc" id="declStmt0"><pre>Matches declaration statements.
861
862Given
863 int a;
864declStmt()
865 matches 'int a'.
866</pre></td></tr>
867
868
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000870<tr><td colspan="4" class="doc" id="defaultStmt0"><pre>Matches default statements inside switch statements.
871
872Given
873 switch(a) { case 42: break; default: break; }
874defaultStmt()
875 matches 'default: break;'.
876</pre></td></tr>
877
878
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000880<tr><td colspan="4" class="doc" id="doStmt0"><pre>Matches do statements.
881
882Given
883 do {} while (true);
884doStmt()
885 matches 'do {} while(true)'
886</pre></td></tr>
887
888
Aaron Ballman672dde22016-01-22 23:15:00 +0000889<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000890<tr><td colspan="4" class="doc" id="explicitCastExpr0"><pre>Matches explicit cast expressions.
891
892Matches any cast expression written in user code, whether it be a
893C-style cast, a functional-style cast, or a keyword cast.
894
895Does not match implicit conversions.
896
897Note: the name "explicitCast" is chosen to match Clang's terminology, as
898Clang uses the term "cast" to apply to implicit conversions as well as to
899actual cast expressions.
900
Aaron Ballmanc35724c2016-01-21 15:18:25 +0000901See also: hasDestinationType.
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000902
903Example: matches all five of the casts in
904 int((int)(reinterpret_cast&lt;int&gt;(static_cast&lt;int&gt;(const_cast&lt;int&gt;(42)))))
905but does not match the implicit conversion in
906 long ell = 42;
907</pre></td></tr>
908
909
Aaron Ballman672dde22016-01-22 23:15:00 +0000910<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000911<tr><td colspan="4" class="doc" id="expr0"><pre>Matches expressions.
912
913Example matches x()
914 void f() { x(); }
915</pre></td></tr>
916
917
Aaron Ballman672dde22016-01-22 23:15:00 +0000918<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000919<tr><td colspan="4" class="doc" id="exprWithCleanups0"><pre>Matches expressions that introduce cleanups to be run at the end
920of the sub-expression's evaluation.
921
922Example matches std::string()
923 const std::string str = std::string();
924</pre></td></tr>
925
926
Aaron Ballman672dde22016-01-22 23:15:00 +0000927<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000928<tr><td colspan="4" class="doc" id="floatLiteral0"><pre>Matches float literals of all sizes encodings, e.g.
9291.0, 1.0f, 1.0L and 1e10.
930
931Does not match implicit conversions such as
932 float a = 10;
933</pre></td></tr>
934
935
Aaron Ballman672dde22016-01-22 23:15:00 +0000936<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000937<tr><td colspan="4" class="doc" id="forStmt0"><pre>Matches for statements.
938
939Example matches 'for (;;) {}'
940 for (;;) {}
941 int i[] = {1, 2, 3}; for (auto a : i);
942</pre></td></tr>
943
944
Aaron Ballman672dde22016-01-22 23:15:00 +0000945<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000946<tr><td colspan="4" class="doc" id="gnuNullExpr0"><pre>Matches GNU __null expression.
947</pre></td></tr>
948
949
Aaron Ballman672dde22016-01-22 23:15:00 +0000950<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000951<tr><td colspan="4" class="doc" id="gotoStmt0"><pre>Matches goto statements.
952
953Given
954 goto FOO;
955 FOO: bar();
956gotoStmt()
957 matches 'goto FOO'
958</pre></td></tr>
959
960
Aaron Ballman672dde22016-01-22 23:15:00 +0000961<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000962<tr><td colspan="4" class="doc" id="ifStmt0"><pre>Matches if statements.
963
964Example matches 'if (x) {}'
965 if (x) {}
966</pre></td></tr>
967
968
Aaron Ballman672dde22016-01-22 23:15:00 +0000969<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000970<tr><td colspan="4" class="doc" id="implicitCastExpr0"><pre>Matches the implicit cast nodes of Clang's AST.
971
972This matches many different places, including function call return value
973eliding, as well as any type conversions.
974</pre></td></tr>
975
976
Aaron Ballman672dde22016-01-22 23:15:00 +0000977<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000978<tr><td colspan="4" class="doc" id="initListExpr0"><pre>Matches init list expressions.
979
980Given
981 int a[] = { 1, 2 };
982 struct B { int x, y; };
983 B b = { 5, 6 };
984initListExpr()
985 matches "{ 1, 2 }" and "{ 5, 6 }"
986</pre></td></tr>
987
988
Aaron Ballman672dde22016-01-22 23:15:00 +0000989<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000990<tr><td colspan="4" class="doc" id="integerLiteral0"><pre>Matches integer literals of all sizes encodings, e.g.
9911, 1L, 0x1 and 1U.
992
993Does not match character-encoded integers such as L'a'.
994</pre></td></tr>
995
996
Aaron Ballman672dde22016-01-22 23:15:00 +0000997<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +0000998<tr><td colspan="4" class="doc" id="labelStmt0"><pre>Matches label statements.
999
1000Given
1001 goto FOO;
1002 FOO: bar();
1003labelStmt()
1004 matches 'FOO:'
1005</pre></td></tr>
1006
1007
Aaron Ballman672dde22016-01-22 23:15:00 +00001008<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001009<tr><td colspan="4" class="doc" id="lambdaExpr0"><pre>Matches lambda expressions.
1010
1011Example matches [&amp;](){return 5;}
1012 [&amp;](){return 5;}
1013</pre></td></tr>
1014
1015
Aaron Ballman672dde22016-01-22 23:15:00 +00001016<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001017<tr><td colspan="4" class="doc" id="materializeTemporaryExpr0"><pre>Matches nodes where temporaries are materialized.
1018
1019Example: Given
1020 struct T {void func()};
1021 T f();
1022 void g(T);
1023materializeTemporaryExpr() matches 'f()' in these statements
1024 T u(f());
1025 g(f());
1026but does not match
1027 f();
1028 f().func();
1029</pre></td></tr>
1030
1031
Aaron Ballman672dde22016-01-22 23:15:00 +00001032<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001033<tr><td colspan="4" class="doc" id="memberExpr0"><pre>Matches member expressions.
1034
1035Given
1036 class Y {
1037 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
1038 int a; static int b;
1039 };
1040memberExpr()
1041 matches this-&gt;x, x, y.x, a, this-&gt;b
1042</pre></td></tr>
1043
1044
Aaron Ballman672dde22016-01-22 23:15:00 +00001045<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001046<tr><td colspan="4" class="doc" id="nullStmt0"><pre>Matches null statements.
1047
1048 foo();;
1049nullStmt()
1050 matches the second ';'
1051</pre></td></tr>
1052
1053
Aaron Ballman672dde22016-01-22 23:15:00 +00001054<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001055<tr><td colspan="4" class="doc" id="objcMessageExpr0"><pre>Matches ObjectiveC Message invocation expressions.
1056
1057The innermost message send invokes the "alloc" class method on the
1058NSString class, while the outermost message send invokes the
1059"initWithString" instance method on the object returned from
1060NSString's "alloc". This matcher should match both message sends.
1061 [[NSString alloc] initWithString:@"Hello"]
1062</pre></td></tr>
1063
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001064
Aaron Ballman672dde22016-01-22 23:15:00 +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('parenExpr0')"><a name="parenExpr0Anchor">parenExpr</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenExpr.html">ParenExpr</a>&gt;...</td></tr>
Aaron Ballmane8295d72016-01-20 16:17:39 +00001066<tr><td colspan="4" class="doc" id="parenExpr0"><pre>Matches parentheses used in expressions.
1067
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001068Example matches (foo() + 1)
Aaron Ballmane8295d72016-01-20 16:17:39 +00001069 int foo() { return 1; }
1070 int a = (foo() + 1);
Aaron Ballmane8295d72016-01-20 16:17:39 +00001071</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001072
Aaron Ballmanc35724c2016-01-21 15:18:25 +00001073
Aaron Ballman672dde22016-01-22 23:15:00 +00001074<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001075<tr><td colspan="4" class="doc" id="returnStmt0"><pre>Matches return statements.
1076
1077Given
1078 return 1;
1079returnStmt()
1080 matches 'return 1'
1081</pre></td></tr>
1082
1083
Aaron Ballman672dde22016-01-22 23:15:00 +00001084<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001085<tr><td colspan="4" class="doc" id="stmt0"><pre>Matches statements.
1086
1087Given
1088 { ++a; }
1089stmt()
1090 matches both the compound statement '{ ++a; }' and '++a'.
1091</pre></td></tr>
1092
1093
Aaron Ballman672dde22016-01-22 23:15:00 +00001094<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001095<tr><td colspan="4" class="doc" id="stringLiteral0"><pre>Matches string literals (also matches wide string literals).
1096
1097Example matches "abcd", L"abcd"
1098 char *s = "abcd"; wchar_t *ws = L"abcd"
1099</pre></td></tr>
1100
1101
Aaron Ballman672dde22016-01-22 23:15:00 +00001102<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001103<tr><td colspan="4" class="doc" id="substNonTypeTemplateParmExpr0"><pre>Matches substitutions of non-type template parameters.
1104
1105Given
1106 template &lt;int N&gt;
1107 struct A { static const int n = N; };
1108 struct B : public A&lt;42&gt; {};
1109substNonTypeTemplateParmExpr()
1110 matches "N" in the right-hand side of "static const int n = N;"
1111</pre></td></tr>
1112
1113
Aaron Ballman672dde22016-01-22 23:15:00 +00001114<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001115<tr><td colspan="4" class="doc" id="switchCase0"><pre>Matches case and default statements inside switch statements.
1116
1117Given
1118 switch(a) { case 42: break; default: break; }
1119switchCase()
1120 matches 'case 42: break;' and 'default: break;'.
1121</pre></td></tr>
1122
1123
Aaron Ballman672dde22016-01-22 23:15:00 +00001124<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001125<tr><td colspan="4" class="doc" id="switchStmt0"><pre>Matches switch statements.
1126
1127Given
1128 switch(a) { case 42: break; default: break; }
1129switchStmt()
1130 matches 'switch(a)'.
1131</pre></td></tr>
1132
1133
Aaron Ballman672dde22016-01-22 23:15:00 +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('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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001135<tr><td colspan="4" class="doc" id="unaryExprOrTypeTraitExpr0"><pre>Matches sizeof (C99), alignof (C++11) and vec_step (OpenCL)
1136
1137Given
1138 Foo x = bar;
1139 int y = sizeof(x) + alignof(x);
1140unaryExprOrTypeTraitExpr()
1141 matches sizeof(x) and alignof(x)
1142</pre></td></tr>
1143
1144
Aaron Ballman672dde22016-01-22 23:15:00 +00001145<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001146<tr><td colspan="4" class="doc" id="unaryOperator0"><pre>Matches unary operator expressions.
1147
1148Example matches !a
1149 !a || b
1150</pre></td></tr>
1151
1152
Aaron Ballman672dde22016-01-22 23:15:00 +00001153<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001154<tr><td colspan="4" class="doc" id="userDefinedLiteral0"><pre>Matches user defined literal operator call.
1155
1156Example match: "foo"_suffix
1157</pre></td></tr>
1158
1159
Aaron Ballman672dde22016-01-22 23:15:00 +00001160<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001161<tr><td colspan="4" class="doc" id="whileStmt0"><pre>Matches while statements.
1162
1163Given
1164 while (true) {}
1165whileStmt()
1166 matches 'while (true) {}'.
1167</pre></td></tr>
1168
1169
Aaron Ballman672dde22016-01-22 23:15:00 +00001170<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001171<tr><td colspan="4" class="doc" id="templateArgument0"><pre>Matches template arguments.
1172
1173Given
1174 template &lt;typename T&gt; struct C {};
1175 C&lt;int&gt; c;
1176templateArgument()
1177 matches 'int' in C&lt;int&gt;.
1178</pre></td></tr>
1179
1180
Aaron Ballman672dde22016-01-22 23:15:00 +00001181<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001182<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
1183</pre></td></tr>
1184
1185
Aaron Ballman672dde22016-01-22 23:15:00 +00001186<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001187<tr><td colspan="4" class="doc" id="arrayType0"><pre>Matches all kinds of arrays.
1188
1189Given
1190 int a[] = { 2, 3 };
1191 int b[4];
1192 void f() { int c[a[0]]; }
1193arrayType()
1194 matches "int a[]", "int b[4]" and "int c[a[0]]";
1195</pre></td></tr>
1196
1197
Aaron Ballman672dde22016-01-22 23:15:00 +00001198<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001199<tr><td colspan="4" class="doc" id="atomicType0"><pre>Matches atomic types.
1200
1201Given
1202 _Atomic(int) i;
1203atomicType()
1204 matches "_Atomic(int) i"
1205</pre></td></tr>
1206
1207
Aaron Ballman672dde22016-01-22 23:15:00 +00001208<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001209<tr><td colspan="4" class="doc" id="autoType0"><pre>Matches types nodes representing C++11 auto types.
1210
1211Given:
1212 auto n = 4;
1213 int v[] = { 2, 3 }
1214 for (auto i : v) { }
1215autoType()
1216 matches "auto n" and "auto i"
1217</pre></td></tr>
1218
1219
Aaron Ballman672dde22016-01-22 23:15:00 +00001220<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001221<tr><td colspan="4" class="doc" id="blockPointerType0"><pre>Matches block pointer types, i.e. types syntactically represented as
1222"void (^)(int)".
1223
1224The pointee is always required to be a FunctionType.
1225</pre></td></tr>
1226
1227
Aaron Ballman672dde22016-01-22 23:15:00 +00001228<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001229<tr><td colspan="4" class="doc" id="builtinType0"><pre>Matches builtin Types.
1230
1231Given
1232 struct A {};
1233 A a;
1234 int b;
1235 float c;
1236 bool d;
1237builtinType()
1238 matches "int b", "float c" and "bool d"
1239</pre></td></tr>
1240
1241
Aaron Ballman672dde22016-01-22 23:15:00 +00001242<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001243<tr><td colspan="4" class="doc" id="complexType0"><pre>Matches C99 complex types.
1244
1245Given
1246 _Complex float f;
1247complexType()
1248 matches "_Complex float f"
1249</pre></td></tr>
1250
1251
Aaron Ballman672dde22016-01-22 23:15:00 +00001252<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001253<tr><td colspan="4" class="doc" id="constantArrayType0"><pre>Matches C arrays with a specified constant size.
1254
1255Given
1256 void() {
1257 int a[2];
1258 int b[] = { 2, 3 };
1259 int c[b[0]];
1260 }
1261constantArrayType()
1262 matches "int a[2]"
1263</pre></td></tr>
1264
1265
Aaron Ballman672dde22016-01-22 23:15:00 +00001266<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('decayedType0')"><a name="decayedType0Anchor">decayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;...</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001267<tr><td colspan="4" class="doc" id="decayedType0"><pre>Matches decayed type
1268Example matches i[] in declaration of f.
1269 (matcher = valueDecl(hasType(decayedType(hasDecayedType(pointerType())))))
1270Example matches i[1].
1271 (matcher = expr(hasType(decayedType(hasDecayedType(pointerType())))))
1272 void f(int i[]) {
1273 i[1] = 0;
1274 }
1275</pre></td></tr>
1276
1277
Aaron Ballman672dde22016-01-22 23:15:00 +00001278<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001279<tr><td colspan="4" class="doc" id="dependentSizedArrayType0"><pre>Matches C++ arrays whose size is a value-dependent expression.
1280
1281Given
1282 template&lt;typename T, int Size&gt;
1283 class array {
1284 T data[Size];
1285 };
1286dependentSizedArrayType
1287 matches "T data[Size]"
1288</pre></td></tr>
1289
1290
Aaron Ballman672dde22016-01-22 23:15:00 +00001291<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001292<tr><td colspan="4" class="doc" id="elaboratedType0"><pre>Matches types specified with an elaborated type keyword or with a
1293qualified name.
1294
1295Given
1296 namespace N {
1297 namespace M {
1298 class D {};
1299 }
1300 }
1301 class C {};
1302
1303 class C c;
1304 N::M::D d;
1305
1306elaboratedType() matches the type of the variable declarations of both
1307c and d.
1308</pre></td></tr>
1309
1310
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00001311<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('functionProtoType0')"><a name="functionProtoType0Anchor">functionProtoType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;...</td></tr>
1312<tr><td colspan="4" class="doc" id="functionProtoType0"><pre>Matches FunctionProtoType nodes.
1313
1314Given
1315 int (*f)(int);
1316 void g();
1317functionProtoType()
1318 matches "int (*f)(int)" and the type of "g" in C++ mode.
1319 In C mode, "g" is not matched because it does not contain a prototype.
1320</pre></td></tr>
1321
1322
Aaron Ballman672dde22016-01-22 23:15:00 +00001323<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001324<tr><td colspan="4" class="doc" id="functionType0"><pre>Matches FunctionType nodes.
1325
1326Given
1327 int (*f)(int);
1328 void g();
1329functionType()
1330 matches "int (*f)(int)" and the type of "g".
1331</pre></td></tr>
1332
1333
Aaron Ballman672dde22016-01-22 23:15:00 +00001334<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001335<tr><td colspan="4" class="doc" id="incompleteArrayType0"><pre>Matches C arrays with unspecified size.
1336
1337Given
1338 int a[] = { 2, 3 };
1339 int b[42];
1340 void f(int c[]) { int d[a[0]]; };
1341incompleteArrayType()
1342 matches "int a[]" and "int c[]"
1343</pre></td></tr>
1344
1345
Aaron Ballman672dde22016-01-22 23:15:00 +00001346<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001347<tr><td colspan="4" class="doc" id="injectedClassNameType0"><pre>Matches injected class name types.
1348
1349Example matches S s, but not S&lt;T&gt; s.
1350 (matcher = parmVarDecl(hasType(injectedClassNameType())))
1351 template &lt;typename T&gt; struct S {
1352 void f(S s);
1353 void g(S&lt;T&gt; s);
1354 };
1355</pre></td></tr>
1356
1357
Aaron Ballman672dde22016-01-22 23:15:00 +00001358<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001359<tr><td colspan="4" class="doc" id="lValueReferenceType0"><pre>Matches lvalue reference types.
1360
1361Given:
1362 int *a;
1363 int &amp;b = *a;
1364 int &amp;&amp;c = 1;
1365 auto &amp;d = b;
1366 auto &amp;&amp;e = c;
1367 auto &amp;&amp;f = 2;
1368 int g = 5;
1369
1370lValueReferenceType() matches the types of b, d, and e. e is
1371matched since the type is deduced as int&amp; by reference collapsing rules.
1372</pre></td></tr>
1373
1374
Aaron Ballman672dde22016-01-22 23:15:00 +00001375<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001376<tr><td colspan="4" class="doc" id="memberPointerType0"><pre>Matches member pointer types.
1377Given
1378 struct A { int i; }
1379 A::* ptr = A::i;
1380memberPointerType()
1381 matches "A::* ptr"
1382</pre></td></tr>
1383
1384
Aaron Ballman672dde22016-01-22 23:15:00 +00001385<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001386<tr><td colspan="4" class="doc" id="objcObjectPointerType0"><pre>Matches an Objective-C object pointer type, which is different from
1387a pointer type, despite being syntactically similar.
1388
1389Given
1390 int *a;
1391
1392 @interface Foo
1393 @end
1394 Foo *f;
1395pointerType()
1396 matches "Foo *f", but does not match "int *a".
1397</pre></td></tr>
1398
1399
Aaron Ballman672dde22016-01-22 23:15:00 +00001400<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001401<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
1402
1403Given
1404 int (*ptr_to_array)[4];
1405 int *array_of_ptrs[4];
1406
1407varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
1408array_of_ptrs.
1409</pre></td></tr>
1410
1411
Aaron Ballman672dde22016-01-22 23:15:00 +00001412<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001413<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types, but does not match Objective-C object pointer
1414types.
1415
1416Given
1417 int *a;
1418 int &amp;b = *a;
1419 int c = 5;
1420
1421 @interface Foo
1422 @end
1423 Foo *f;
1424pointerType()
1425 matches "int *a", but does not match "Foo *f".
1426</pre></td></tr>
1427
1428
Aaron Ballman672dde22016-01-22 23:15:00 +00001429<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001430<tr><td colspan="4" class="doc" id="rValueReferenceType0"><pre>Matches rvalue reference types.
1431
1432Given:
1433 int *a;
1434 int &amp;b = *a;
1435 int &amp;&amp;c = 1;
1436 auto &amp;d = b;
1437 auto &amp;&amp;e = c;
1438 auto &amp;&amp;f = 2;
1439 int g = 5;
1440
1441rValueReferenceType() matches the types of c and f. e is not
1442matched as it is deduced to int&amp; by reference collapsing rules.
1443</pre></td></tr>
1444
1445
Aaron Ballman672dde22016-01-22 23:15:00 +00001446<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001447<tr><td colspan="4" class="doc" id="recordType0"><pre>Matches record types (e.g. structs, classes).
1448
1449Given
1450 class C {};
1451 struct S {};
1452
1453 C c;
1454 S s;
1455
1456recordType() matches the type of the variable declarations of both c
1457and s.
1458</pre></td></tr>
1459
1460
Aaron Ballman672dde22016-01-22 23:15:00 +00001461<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001462<tr><td colspan="4" class="doc" id="referenceType0"><pre>Matches both lvalue and rvalue reference types.
1463
1464Given
1465 int *a;
1466 int &amp;b = *a;
1467 int &amp;&amp;c = 1;
1468 auto &amp;d = b;
1469 auto &amp;&amp;e = c;
1470 auto &amp;&amp;f = 2;
1471 int g = 5;
1472
1473referenceType() matches the types of b, c, d, e, and f.
1474</pre></td></tr>
1475
1476
Aaron Ballman672dde22016-01-22 23:15:00 +00001477<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001478<tr><td colspan="4" class="doc" id="substTemplateTypeParmType0"><pre>Matches types that represent the result of substituting a type for a
1479template type parameter.
1480
1481Given
1482 template &lt;typename T&gt;
1483 void F(T t) {
1484 int i = 1 + t;
1485 }
1486
1487substTemplateTypeParmType() matches the type of 't' but not '1'
1488</pre></td></tr>
1489
1490
Aaron Ballman672dde22016-01-22 23:15:00 +00001491<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001492<tr><td colspan="4" class="doc" id="templateSpecializationType0"><pre>Matches template specialization types.
1493
1494Given
1495 template &lt;typename T&gt;
1496 class C { };
1497
1498 template class C&lt;int&gt;; A
1499 C&lt;char&gt; var; B
1500
1501templateSpecializationType() matches the type of the explicit
1502instantiation in A and the type of the variable declaration in B.
1503</pre></td></tr>
1504
1505
Aaron Ballman672dde22016-01-22 23:15:00 +00001506<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001507<tr><td colspan="4" class="doc" id="templateTypeParmType0"><pre>Matches template type parameter types.
1508
1509Example matches T, but not int.
1510 (matcher = templateTypeParmType())
1511 template &lt;typename T&gt; void f(int i);
1512</pre></td></tr>
1513
1514
Aaron Ballman672dde22016-01-22 23:15:00 +00001515<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001516<tr><td colspan="4" class="doc" id="type0"><pre>Matches Types in the clang AST.
1517</pre></td></tr>
1518
1519
Aaron Ballman672dde22016-01-22 23:15:00 +00001520<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001521<tr><td colspan="4" class="doc" id="typedefType0"><pre>Matches typedef types.
1522
1523Given
1524 typedef int X;
1525typedefType()
1526 matches "typedef int X"
1527</pre></td></tr>
1528
1529
Aaron Ballman672dde22016-01-22 23:15:00 +00001530<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001531<tr><td colspan="4" class="doc" id="unaryTransformType0"><pre>Matches types nodes representing unary type transformations.
1532
1533Given:
1534 typedef __underlying_type(T) type;
1535unaryTransformType()
1536 matches "__underlying_type(T)"
1537</pre></td></tr>
1538
1539
Aaron Ballman672dde22016-01-22 23:15:00 +00001540<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001541<tr><td colspan="4" class="doc" id="variableArrayType0"><pre>Matches C arrays with a specified size that is not an
1542integer-constant-expression.
1543
1544Given
1545 void f() {
1546 int a[] = { 2, 3 }
1547 int b[42];
1548 int c[a[0]];
1549 }
1550variableArrayType()
1551 matches "int c[a[0]]"
1552</pre></td></tr>
1553
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00001554<!--END_DECL_MATCHERS -->
1555</table>
1556
1557<!-- ======================================================================= -->
1558<h2 id="narrowing-matchers">Narrowing Matchers</h2>
1559<!-- ======================================================================= -->
1560
1561<p>Narrowing matchers match certain attributes on the current node, thus
1562narrowing down the set of nodes of the current type to match on.</p>
1563
1564<p>There are special logical narrowing matchers (allOf, anyOf, anything and unless)
1565which allow users to create more powerful match expressions.</p>
1566
1567<table>
1568<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001569<!-- START_NARROWING_MATCHERS -->
1570
1571<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>
1572<tr><td colspan="4" class="doc" id="allOf0"><pre>Matches if all given matchers match.
1573
1574Usable as: Any Matcher
1575</pre></td></tr>
1576
1577
1578<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>
1579<tr><td colspan="4" class="doc" id="anyOf0"><pre>Matches if any of the given matchers matches.
1580
1581Usable as: Any Matcher
1582</pre></td></tr>
1583
1584
1585<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('anything0')"><a name="anything0Anchor">anything</a></td><td></td></tr>
1586<tr><td colspan="4" class="doc" id="anything0"><pre>Matches any node.
1587
1588Useful when another matcher requires a child matcher, but there's no
1589additional constraint. This will often be used with an explicit conversion
1590to an internal::Matcher&lt;&gt; type such as TypeMatcher.
1591
1592Example: DeclarationMatcher(anything()) matches all declarations, e.g.,
1593"int* p" and "void f()" in
1594 int* p;
1595 void f();
1596
1597Usable as: Any Matcher
1598</pre></td></tr>
1599
1600
1601<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('unless0')"><a name="unless0Anchor">unless</a></td><td>Matcher&lt;*&gt;</td></tr>
1602<tr><td colspan="4" class="doc" id="unless0"><pre>Matches if the provided matcher does not match.
1603
1604Example matches Y (matcher = cxxRecordDecl(unless(hasName("X"))))
1605 class X {};
1606 class Y {};
1607
1608Usable as: Any Matcher
1609</pre></td></tr>
1610
1611
Aaron Ballman672dde22016-01-22 23:15:00 +00001612<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001613<tr><td colspan="4" class="doc" id="hasOperatorName0"><pre>Matches the operator Name of operator expressions (binary or
1614unary).
1615
1616Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
1617 !(a || b)
1618</pre></td></tr>
1619
1620
1621<tr><td>Matcher&lt;CXXBoolLiteral&gt;</td><td class="name" onclick="toggle('equals2')"><a name="equals2Anchor">equals</a></td><td>ValueT Value</td></tr>
1622<tr><td colspan="4" class="doc" id="equals2"><pre>Matches literals that are equal to the given value.
1623
1624Example matches true (matcher = cxxBoolLiteral(equals(true)))
1625 true
1626
Aaron Ballman672dde22016-01-22 23:15:00 +00001627Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
1628 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001629</pre></td></tr>
1630
1631
Aaron Ballman672dde22016-01-22 23:15:00 +00001632<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001633<tr><td colspan="4" class="doc" id="isCatchAll0"><pre>Matches a C++ catch statement that has a catch-all handler.
1634
1635Given
1636 try {
1637 ...
1638 } catch (int) {
1639 ...
1640 } catch (...) {
1641 ...
1642 }
1643endcode
1644cxxCatchStmt(isCatchAll()) matches catch(...) but not catch(int).
1645</pre></td></tr>
1646
1647
Aaron Ballman672dde22016-01-22 23:15:00 +00001648<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001649<tr><td colspan="4" class="doc" id="argumentCountIs1"><pre>Checks that a call expression or a constructor call expression has
1650a specific number of arguments (including absent default arguments).
1651
1652Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1653 void f(int x, int y);
1654 f(0, 0);
1655</pre></td></tr>
1656
1657
Aaron Ballman672dde22016-01-22 23:15:00 +00001658<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001659<tr><td colspan="4" class="doc" id="isListInitialization0"><pre>Matches a constructor call expression which uses list initialization.
1660</pre></td></tr>
1661
1662
Aaron Ballman672dde22016-01-22 23:15:00 +00001663<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001664<tr><td colspan="4" class="doc" id="isCopyConstructor0"><pre>Matches constructor declarations that are copy constructors.
1665
1666Given
1667 struct S {
1668 S(); #1
1669 S(const S &amp;); #2
1670 S(S &amp;&amp;); #3
1671 };
1672cxxConstructorDecl(isCopyConstructor()) will match #2, but not #1 or #3.
1673</pre></td></tr>
1674
1675
Aaron Ballman672dde22016-01-22 23:15:00 +00001676<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001677<tr><td colspan="4" class="doc" id="isDefaultConstructor0"><pre>Matches constructor declarations that are default constructors.
1678
1679Given
1680 struct S {
1681 S(); #1
1682 S(const S &amp;); #2
1683 S(S &amp;&amp;); #3
1684 };
1685cxxConstructorDecl(isDefaultConstructor()) will match #1, but not #2 or #3.
1686</pre></td></tr>
1687
1688
Aaron Ballman672dde22016-01-22 23:15:00 +00001689<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001690<tr><td colspan="4" class="doc" id="isExplicit0"><pre>Matches constructor and conversion declarations that are marked with
1691the explicit keyword.
1692
1693Given
1694 struct S {
1695 S(int); #1
1696 explicit S(double); #2
1697 operator int(); #3
1698 explicit operator bool(); #4
1699 };
1700cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1701cxxConversionDecl(isExplicit()) will match #4, but not #3.
1702</pre></td></tr>
1703
1704
Aaron Ballman672dde22016-01-22 23:15:00 +00001705<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001706<tr><td colspan="4" class="doc" id="isMoveConstructor0"><pre>Matches constructor declarations that are move constructors.
1707
1708Given
1709 struct S {
1710 S(); #1
1711 S(const S &amp;); #2
1712 S(S &amp;&amp;); #3
1713 };
1714cxxConstructorDecl(isMoveConstructor()) will match #3, but not #1 or #2.
1715</pre></td></tr>
1716
1717
Aaron Ballman672dde22016-01-22 23:15:00 +00001718<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001719<tr><td colspan="4" class="doc" id="isExplicit1"><pre>Matches constructor and conversion declarations that are marked with
1720the explicit keyword.
1721
1722Given
1723 struct S {
1724 S(int); #1
1725 explicit S(double); #2
1726 operator int(); #3
1727 explicit operator bool(); #4
1728 };
1729cxxConstructorDecl(isExplicit()) will match #2, but not #1.
1730cxxConversionDecl(isExplicit()) will match #4, but not #3.
1731</pre></td></tr>
1732
1733
Aaron Ballman672dde22016-01-22 23:15:00 +00001734<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001735<tr><td colspan="4" class="doc" id="isBaseInitializer0"><pre>Matches a constructor initializer if it is initializing a base, as
1736opposed to a member.
1737
1738Given
1739 struct B {};
1740 struct D : B {
1741 int I;
1742 D(int i) : I(i) {}
1743 };
1744 struct E : B {
1745 E() : B() {}
1746 };
1747cxxConstructorDecl(hasAnyConstructorInitializer(isBaseInitializer()))
1748 will match E(), but not match D(int).
1749</pre></td></tr>
1750
1751
Aaron Ballman672dde22016-01-22 23:15:00 +00001752<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001753<tr><td colspan="4" class="doc" id="isMemberInitializer0"><pre>Matches a constructor initializer if it is initializing a member, as
1754opposed to a base.
1755
1756Given
1757 struct B {};
1758 struct D : B {
1759 int I;
1760 D(int i) : I(i) {}
1761 };
1762 struct E : B {
1763 E() : B() {}
1764 };
1765cxxConstructorDecl(hasAnyConstructorInitializer(isMemberInitializer()))
1766 will match D(int), but not match E().
1767</pre></td></tr>
1768
1769
Aaron Ballman672dde22016-01-22 23:15:00 +00001770<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001771<tr><td colspan="4" class="doc" id="isWritten0"><pre>Matches a constructor initializer if it is explicitly written in
1772code (as opposed to implicitly added by the compiler).
1773
1774Given
1775 struct Foo {
1776 Foo() { }
1777 Foo(int) : foo_("A") { }
1778 string foo_;
1779 };
1780cxxConstructorDecl(hasAnyConstructorInitializer(isWritten()))
1781 will match Foo(int), but not Foo()
1782</pre></td></tr>
1783
1784
Aaron Ballman672dde22016-01-22 23:15:00 +00001785<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001786<tr><td colspan="4" class="doc" id="isConst0"><pre>Matches if the given method declaration is const.
1787
1788Given
1789struct A {
1790 void foo() const;
1791 void bar();
1792};
1793
1794cxxMethodDecl(isConst()) matches A::foo() but not A::bar()
1795</pre></td></tr>
1796
1797
Aaron Ballman672dde22016-01-22 23:15:00 +00001798<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isCopyAssignmentOperator0')"><a name="isCopyAssignmentOperator0Anchor">isCopyAssignmentOperator</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001799<tr><td colspan="4" class="doc" id="isCopyAssignmentOperator0"><pre>Matches if the given method declaration declares a copy assignment
1800operator.
1801
1802Given
1803struct A {
1804 A &amp;operator=(const A &amp;);
1805 A &amp;operator=(A &amp;&amp;);
1806};
1807
1808cxxMethodDecl(isCopyAssignmentOperator()) matches the first method but not
1809the second one.
1810</pre></td></tr>
1811
1812
Aaron Ballman672dde22016-01-22 23:15:00 +00001813<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001814<tr><td colspan="4" class="doc" id="isFinal1"><pre>Matches if the given method or class declaration is final.
1815
1816Given:
1817 class A final {};
1818
1819 struct B {
1820 virtual void f();
1821 };
1822
1823 struct C : B {
1824 void f() final;
1825 };
1826matches A and C::f, but not B, C, or B::f
1827</pre></td></tr>
1828
1829
Aaron Ballman672dde22016-01-22 23:15:00 +00001830<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isMoveAssignmentOperator0')"><a name="isMoveAssignmentOperator0Anchor">isMoveAssignmentOperator</a></td><td></td></tr>
Aaron Ballman31bde872016-01-22 22:37:09 +00001831<tr><td colspan="4" class="doc" id="isMoveAssignmentOperator0"><pre>Matches if the given method declaration declares a move assignment
1832operator.
1833
1834Given
Aaron Ballmana6811512016-01-23 17:49:18 +00001835struct A {
1836 A &amp;operator=(const A &amp;);
1837 A &amp;operator=(A &amp;&amp;);
1838};
1839
1840cxxMethodDecl(isMoveAssignmentOperator()) matches the second method but not
1841the first one.
Aaron Ballman31bde872016-01-22 22:37:09 +00001842</pre></td></tr>
1843
1844
Aaron Ballman672dde22016-01-22 23:15:00 +00001845<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001846<tr><td colspan="4" class="doc" id="isOverride0"><pre>Matches if the given method declaration overrides another method.
1847
1848Given
1849 class A {
1850 public:
1851 virtual void x();
1852 };
1853 class B : public A {
1854 public:
1855 virtual void x();
1856 };
1857 matches B::x
1858</pre></td></tr>
1859
1860
Aaron Ballman672dde22016-01-22 23:15:00 +00001861<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001862<tr><td colspan="4" class="doc" id="isPure0"><pre>Matches if the given method declaration is pure.
1863
1864Given
1865 class A {
1866 public:
1867 virtual void x() = 0;
1868 };
1869 matches A::x
1870</pre></td></tr>
1871
1872
Aaron Ballman672dde22016-01-22 23:15:00 +00001873<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001874<tr><td colspan="4" class="doc" id="isVirtual0"><pre>Matches if the given method declaration is virtual.
1875
1876Given
1877 class A {
1878 public:
1879 virtual void x();
1880 };
1881 matches A::x
1882</pre></td></tr>
1883
Aaron Ballman672dde22016-01-22 23:15:00 +00001884
1885<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>&gt;</td><td class="name" onclick="toggle('isVirtualAsWritten0')"><a name="isVirtualAsWritten0Anchor">isVirtualAsWritten</a></td><td></td></tr>
Nico Webera415a1d2016-01-21 17:56:24 +00001886<tr><td colspan="4" class="doc" id="isVirtualAsWritten0"><pre>Matches if the given method declaration has an explicit "virtual".
1887
1888Given
1889 class A {
1890 public:
1891 virtual void x();
1892 };
1893 class B : public A {
1894 public:
1895 void x();
1896 };
1897 matches A::x but not B::x
1898</pre></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001899
Aaron Ballman672dde22016-01-22 23:15:00 +00001900
1901<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001902<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName1"><pre>Matches overloaded operator names.
1903
1904Matches overloaded operator names specified in strings without the
1905"operator" prefix: e.g. "&lt;&lt;".
1906
1907Given:
1908 class A { int operator*(); };
1909 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
1910 A a;
1911 a &lt;&lt; a; &lt;-- This matches
1912
1913cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
1914specified line and
1915cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
1916matches the declaration of A.
1917
Aaron Ballman672dde22016-01-22 23:15:00 +00001918Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001919</pre></td></tr>
1920
1921
Aaron Ballman672dde22016-01-22 23:15:00 +00001922<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001923<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
1924</pre></td></tr>
1925
1926
Aaron Ballman672dde22016-01-22 23:15:00 +00001927<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001928<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization2"><pre>Matches explicit template specializations of function, class, or
1929static member variable template instantiations.
1930
1931Given
1932 template&lt;typename T&gt; void A(T t) { }
1933 template&lt;&gt; void A(int N) { }
1934functionDecl(isExplicitTemplateSpecialization())
1935 matches the specialization A&lt;int&gt;().
1936
Aaron Ballman672dde22016-01-22 23:15:00 +00001937Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001938</pre></td></tr>
1939
1940
Aaron Ballman672dde22016-01-22 23:15:00 +00001941<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001942<tr><td colspan="4" class="doc" id="isFinal0"><pre>Matches if the given method or class declaration is final.
1943
1944Given:
1945 class A final {};
1946
1947 struct B {
1948 virtual void f();
1949 };
1950
1951 struct C : B {
1952 void f() final;
1953 };
1954matches A and C::f, but not B, C, or B::f
1955</pre></td></tr>
1956
1957
Aaron Ballman672dde22016-01-22 23:15:00 +00001958<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001959<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
1960isSameOrDerivedFrom(hasName(...)).
1961</pre></td></tr>
1962
1963
Aaron Ballman672dde22016-01-22 23:15:00 +00001964<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001965<tr><td colspan="4" class="doc" id="isTemplateInstantiation2"><pre>Matches template instantiations of function, class, or static
1966member variable template instantiations.
1967
1968Given
1969 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
1970or
1971 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
1972cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
1973 matches the template instantiation of X&lt;A&gt;.
1974
1975But given
1976 template &lt;typename T&gt; class X {}; class A {};
1977 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
1978cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
1979 does not match, as X&lt;A&gt; is an explicit template specialization.
1980
Aaron Ballman672dde22016-01-22 23:15:00 +00001981Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001982</pre></td></tr>
1983
1984
Aaron Ballman672dde22016-01-22 23:15:00 +00001985<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001986<tr><td colspan="4" class="doc" id="argumentCountIs0"><pre>Checks that a call expression or a constructor call expression has
1987a specific number of arguments (including absent default arguments).
1988
1989Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
1990 void f(int x, int y);
1991 f(0, 0);
1992</pre></td></tr>
1993
1994
Aaron Ballman672dde22016-01-22 23:15:00 +00001995<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00001996<tr><td colspan="4" class="doc" id="equals3"><pre>Matches literals that are equal to the given value.
1997
1998Example matches true (matcher = cxxBoolLiteral(equals(true)))
1999 true
2000
Aaron Ballman672dde22016-01-22 23:15:00 +00002001Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2002 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002003</pre></td></tr>
2004
2005
Aaron Ballman672dde22016-01-22 23:15:00 +00002006<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002007<tr><td colspan="4" class="doc" id="templateArgumentCountIs0"><pre>Matches if the number of template arguments equals N.
2008
2009Given
2010 template&lt;typename T&gt; struct C {};
2011 C&lt;int&gt; c;
2012classTemplateSpecializationDecl(templateArgumentCountIs(1))
2013 matches C&lt;int&gt;.
2014</pre></td></tr>
2015
2016
Aaron Ballman672dde22016-01-22 23:15:00 +00002017<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002018<tr><td colspan="4" class="doc" id="statementCountIs0"><pre>Checks that a compound statement contains a specific number of
2019child statements.
2020
2021Example: Given
2022 { for (;;) {} }
2023compoundStmt(statementCountIs(0)))
2024 matches '{}'
2025 but does not match the outer compound statement.
2026</pre></td></tr>
2027
2028
Aaron Ballman672dde22016-01-22 23:15:00 +00002029<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002030<tr><td colspan="4" class="doc" id="hasSize0"><pre>Matches ConstantArrayType nodes that have the specified size.
2031
2032Given
2033 int a[42];
2034 int b[2 * 21];
2035 int c[41], d[43];
2036constantArrayType(hasSize(42))
2037 matches "int a[42]" and "int b[2 * 21]"
2038</pre></td></tr>
2039
2040
Aaron Ballman672dde22016-01-22 23:15:00 +00002041<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002042<tr><td colspan="4" class="doc" id="declCountIs0"><pre>Matches declaration statements that contain a specific number of
2043declarations.
2044
2045Example: Given
2046 int a, b;
2047 int c;
2048 int d = 2, e;
2049declCountIs(2)
2050 matches 'int a, b;' and 'int d = 2, e;', but not 'int c;'.
2051</pre></td></tr>
2052
2053
Aaron Ballman672dde22016-01-22 23:15:00 +00002054<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002055<tr><td colspan="4" class="doc" id="equalsBoundNode1"><pre>Matches if a node equals a previously bound node.
2056
2057Matches a node if it equals the node previously bound to ID.
2058
2059Given
2060 class X { int a; int b; };
2061cxxRecordDecl(
2062 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2063 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2064 matches the class X, as a and b have the same type.
2065
2066Note that when multiple matches are involved via forEach* matchers,
2067equalsBoundNodes acts as a filter.
2068For example:
2069compoundStmt(
2070 forEachDescendant(varDecl().bind("d")),
2071 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2072will trigger a match for each combination of variable declaration
2073and reference to that variable declaration within a compound statement.
2074</pre></td></tr>
2075
2076
Aaron Ballman672dde22016-01-22 23:15:00 +00002077<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002078<tr><td colspan="4" class="doc" id="hasAttr0"><pre>Matches declaration that has a given attribute.
2079
2080Given
2081 __attribute__((device)) void f() { ... }
2082decl(hasAttr(clang::attr::CUDADevice)) matches the function declaration of
2083f. If the matcher is use from clang-query, attr::Kind parameter should be
2084passed as a quoted string. e.g., hasAttr("attr::CUDADevice").
2085</pre></td></tr>
2086
2087
Aaron Ballman672dde22016-01-22 23:15:00 +00002088<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002089<tr><td colspan="4" class="doc" id="isExpansionInFileMatching0"><pre>Matches AST nodes that were expanded within files whose name is
2090partially matching a given regex.
2091
2092Example matches Y but not X
2093 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2094 #include "ASTMatcher.h"
2095 class X {};
2096ASTMatcher.h:
2097 class Y {};
2098
Aaron Ballman672dde22016-01-22 23:15:00 +00002099Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002100</pre></td></tr>
2101
2102
Aaron Ballman672dde22016-01-22 23:15:00 +00002103<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002104<tr><td colspan="4" class="doc" id="isExpansionInMainFile0"><pre>Matches AST nodes that were expanded within the main-file.
2105
2106Example matches X but not Y
2107 (matcher = cxxRecordDecl(isExpansionInMainFile())
2108 #include &lt;Y.h&gt;
2109 class X {};
2110Y.h:
2111 class Y {};
2112
Aaron Ballman672dde22016-01-22 23:15:00 +00002113Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002114</pre></td></tr>
2115
2116
Aaron Ballman672dde22016-01-22 23:15:00 +00002117<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002118<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader0"><pre>Matches AST nodes that were expanded within system-header-files.
2119
2120Example matches Y but not X
2121 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2122 #include &lt;SystemHeader.h&gt;
2123 class X {};
2124SystemHeader.h:
2125 class Y {};
2126
Aaron Ballman672dde22016-01-22 23:15:00 +00002127Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002128</pre></td></tr>
2129
2130
Aaron Ballman672dde22016-01-22 23:15:00 +00002131<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002132<tr><td colspan="4" class="doc" id="isImplicit0"><pre>Matches a declaration that has been implicitly added
2133by the compiler (eg. implicit defaultcopy constructors).
2134</pre></td></tr>
2135
2136
Aaron Ballman672dde22016-01-22 23:15:00 +00002137<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002138<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
2139
2140Given
2141 class C {
2142 public: int a;
2143 protected: int b;
2144 private: int c;
2145 };
2146fieldDecl(isPrivate())
2147 matches 'int c;'
2148</pre></td></tr>
2149
2150
Aaron Ballman672dde22016-01-22 23:15:00 +00002151<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002152<tr><td colspan="4" class="doc" id="isProtected0"><pre>Matches protected C++ declarations.
2153
2154Given
2155 class C {
2156 public: int a;
2157 protected: int b;
2158 private: int c;
2159 };
2160fieldDecl(isProtected())
2161 matches 'int b;'
2162</pre></td></tr>
2163
2164
Aaron Ballman672dde22016-01-22 23:15:00 +00002165<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002166<tr><td colspan="4" class="doc" id="isPublic0"><pre>Matches public C++ declarations.
2167
2168Given
2169 class C {
2170 public: int a;
2171 protected: int b;
2172 private: int c;
2173 };
2174fieldDecl(isPublic())
2175 matches 'int a;'
2176</pre></td></tr>
2177
2178
Aaron Ballman672dde22016-01-22 23:15:00 +00002179<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002180<tr><td colspan="4" class="doc" id="equals1"><pre>Matches literals that are equal to the given value.
2181
2182Example matches true (matcher = cxxBoolLiteral(equals(true)))
2183 true
2184
Aaron Ballman672dde22016-01-22 23:15:00 +00002185Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2186 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002187</pre></td></tr>
2188
2189
Aaron Ballman672dde22016-01-22 23:15:00 +00002190<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002191<tr><td colspan="4" class="doc" id="hasOverloadedOperatorName0"><pre>Matches overloaded operator names.
2192
2193Matches overloaded operator names specified in strings without the
2194"operator" prefix: e.g. "&lt;&lt;".
2195
2196Given:
2197 class A { int operator*(); };
2198 const A &amp;operator&lt;&lt;(const A &amp;a, const A &amp;b);
2199 A a;
2200 a &lt;&lt; a; &lt;-- This matches
2201
2202cxxOperatorCallExpr(hasOverloadedOperatorName("&lt;&lt;"))) matches the
2203specified line and
2204cxxRecordDecl(hasMethod(hasOverloadedOperatorName("*")))
2205matches the declaration of A.
2206
Aaron Ballman672dde22016-01-22 23:15:00 +00002207Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002208</pre></td></tr>
2209
2210
Aaron Ballman672dde22016-01-22 23:15:00 +00002211<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002212<tr><td colspan="4" class="doc" id="isConstexpr1"><pre>Matches constexpr variable and function declarations.
2213
2214Given:
2215 constexpr int foo = 42;
2216 constexpr int bar();
2217varDecl(isConstexpr())
2218 matches the declaration of foo.
2219functionDecl(isConstexpr())
2220 matches the declaration of bar.
2221</pre></td></tr>
2222
2223
Aaron Ballman672dde22016-01-22 23:15:00 +00002224<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isDefaulted0')"><a name="isDefaulted0Anchor">isDefaulted</a></td><td></td></tr>
Aaron Ballmanc35724c2016-01-21 15:18:25 +00002225<tr><td colspan="4" class="doc" id="isDefaulted0"><pre>Matches defaulted function declarations.
2226
2227Given:
2228 class A { ~A(); };
2229 class B { ~B() = default; };
2230functionDecl(isDefaulted())
2231 matches the declaration of ~B, but not ~A.
2232</pre></td></tr>
2233
2234
Aaron Ballman672dde22016-01-22 23:15:00 +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('isDefinition2')"><a name="isDefinition2Anchor">isDefinition</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002236<tr><td colspan="4" class="doc" id="isDefinition2"><pre>Matches if a declaration has a body attached.
2237
2238Example matches A, va, fa
2239 class A {};
2240 class B; Doesn't match, as it has no body.
2241 int va;
2242 extern int vb; Doesn't match, as it doesn't define the variable.
2243 void fa() {}
2244 void fb(); Doesn't match, as it has no body.
2245
Aaron Ballman672dde22016-01-22 23:15:00 +00002246Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002247</pre></td></tr>
2248
2249
Aaron Ballman672dde22016-01-22 23:15:00 +00002250<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002251<tr><td colspan="4" class="doc" id="isDeleted0"><pre>Matches deleted function declarations.
2252
2253Given:
2254 void Func();
2255 void DeletedFunc() = delete;
2256functionDecl(isDeleted())
2257 matches the declaration of DeletedFunc, but not Func.
2258</pre></td></tr>
2259
2260
Aaron Ballman672dde22016-01-22 23:15:00 +00002261<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002262<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization0"><pre>Matches explicit template specializations of function, class, or
2263static member variable template instantiations.
2264
2265Given
2266 template&lt;typename T&gt; void A(T t) { }
2267 template&lt;&gt; void A(int N) { }
2268functionDecl(isExplicitTemplateSpecialization())
2269 matches the specialization A&lt;int&gt;().
2270
Aaron Ballman672dde22016-01-22 23:15:00 +00002271Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002272</pre></td></tr>
2273
2274
Aaron Ballman672dde22016-01-22 23:15:00 +00002275<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002276<tr><td colspan="4" class="doc" id="isExternC0"><pre>Matches extern "C" function declarations.
2277
2278Given:
2279 extern "C" void f() {}
2280 extern "C" { void g() {} }
2281 void h() {}
2282functionDecl(isExternC())
2283 matches the declaration of f and g, but not the declaration h
2284</pre></td></tr>
2285
2286
Aaron Ballman672dde22016-01-22 23:15:00 +00002287<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002288<tr><td colspan="4" class="doc" id="isInline1"><pre>Matches function and namespace declarations that are marked with
2289the inline keyword.
2290
2291Given
2292 inline void f();
2293 void g();
2294 namespace n {
2295 inline namespace m {}
2296 }
2297functionDecl(isInline()) will match ::f().
2298namespaceDecl(isInline()) will match n::m.
2299</pre></td></tr>
2300
2301
Aaron Ballman672dde22016-01-22 23:15:00 +00002302<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('isNoThrow0')"><a name="isNoThrow0Anchor">isNoThrow</a></td><td></td></tr>
Aaron Ballmana60bcda2015-12-02 15:23:59 +00002303<tr><td colspan="4" class="doc" id="isNoThrow0"><pre>Matches functions that have a non-throwing exception specification.
2304
2305Given:
2306 void f();
2307 void g() noexcept;
2308 void h() throw();
2309 void i() throw(int);
2310 void j() noexcept(false);
2311functionDecl(isNoThrow())
2312 matches the declarations of g, and h, but not f, i or j.
2313</pre></td></tr>
2314
2315
Aaron Ballman672dde22016-01-22 23:15:00 +00002316<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002317<tr><td colspan="4" class="doc" id="isTemplateInstantiation0"><pre>Matches template instantiations of function, class, or static
2318member variable template instantiations.
2319
2320Given
2321 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
2322or
2323 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
2324cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2325 matches the template instantiation of X&lt;A&gt;.
2326
2327But given
2328 template &lt;typename T&gt; class X {}; class A {};
2329 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
2330cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
2331 does not match, as X&lt;A&gt; is an explicit template specialization.
2332
Aaron Ballman672dde22016-01-22 23:15:00 +00002333Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002334</pre></td></tr>
2335
2336
Aaron Ballman672dde22016-01-22 23:15:00 +00002337<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002338<tr><td colspan="4" class="doc" id="isVariadic0"><pre>Matches if a function declaration is variadic.
2339
2340Example matches f, but not g or h. The function i will not match, even when
2341compiled in C mode.
2342 void f(...);
2343 void g(int);
2344 template &lt;typename... Ts&gt; void h(Ts...);
2345 void i();
2346</pre></td></tr>
2347
2348
Aaron Ballman672dde22016-01-22 23:15:00 +00002349<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>
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002350<tr><td colspan="4" class="doc" id="parameterCountIs0"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2351specific parameter count.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002352
2353Given
2354 void f(int i) {}
2355 void g(int i, int j) {}
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002356 void h(int i, int j);
2357 void j(int i);
2358 void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002359functionDecl(parameterCountIs(2))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00002360 matches void g(int i, int j) {}
2361functionProtoType(parameterCountIs(2))
2362 matches void h(int i, int j)
2363functionProtoType(parameterCountIs(3))
2364 matches void k(int x, int y, int z, ...);
2365</pre></td></tr>
2366
2367
2368<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionProtoType.html">FunctionProtoType</a>&gt;</td><td class="name" onclick="toggle('parameterCountIs1')"><a name="parameterCountIs1Anchor">parameterCountIs</a></td><td>unsigned N</td></tr>
2369<tr><td colspan="4" class="doc" id="parameterCountIs1"><pre>Matches FunctionDecls and FunctionProtoTypes that have a
2370specific parameter count.
2371
2372Given
2373 void f(int i) {}
2374 void g(int i, int j) {}
2375 void h(int i, int j);
2376 void j(int i);
2377 void k(int x, int y, int z, ...);
2378functionDecl(parameterCountIs(2))
2379 matches void g(int i, int j) {}
2380functionProtoType(parameterCountIs(2))
2381 matches void h(int i, int j)
2382functionProtoType(parameterCountIs(3))
2383 matches void k(int x, int y, int z, ...);
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002384</pre></td></tr>
2385
2386
Aaron Ballman672dde22016-01-22 23:15:00 +00002387<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002388<tr><td colspan="4" class="doc" id="equals0"><pre>Matches literals that are equal to the given value.
2389
2390Example matches true (matcher = cxxBoolLiteral(equals(true)))
2391 true
2392
Aaron Ballman672dde22016-01-22 23:15:00 +00002393Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CharacterLiteral.html">CharacterLiteral</a>&gt;, Matcher&lt;CXXBoolLiteral&gt;,
2394 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002395</pre></td></tr>
2396
2397
Aaron Ballman672dde22016-01-22 23:15:00 +00002398<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002399<tr><td colspan="4" class="doc" id="isArrow0"><pre>Matches member expressions that are called with '-&gt;' as opposed
2400to '.'.
2401
2402Member calls on the implicit this pointer match as called with '-&gt;'.
2403
2404Given
2405 class Y {
2406 void x() { this-&gt;x(); x(); Y y; y.x(); a; this-&gt;b; Y::b; }
2407 int a;
2408 static int b;
2409 };
2410memberExpr(isArrow())
2411 matches this-&gt;x, x, y.x, a, this-&gt;b
2412</pre></td></tr>
2413
2414
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002415<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002416<tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name.
2417
2418Supports specifying enclosing namespaces or classes by prefixing the name
2419with '&lt;enclosing&gt;::'.
2420Does not match typedefs of an underlying type with the given name.
2421
2422Example matches X (Name == "X")
2423 class X;
2424
2425Example matches X (Name is one of "::a::b::X", "a::b::X", "b::X", "X")
2426 namespace a { namespace b { class X; } }
2427</pre></td></tr>
2428
2429
Aaron Ballman672dde22016-01-22 23:15:00 +00002430<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002431<tr><td colspan="4" class="doc" id="matchesName0"><pre>Matches NamedDecl nodes whose fully qualified names contain
2432a substring matched by the given RegExp.
2433
2434Supports specifying enclosing namespaces or classes by
2435prefixing the name with '&lt;enclosing&gt;::'. Does not match typedefs
2436of an underlying type with the given name.
2437
2438Example matches X (regexp == "::X")
2439 class X;
2440
2441Example matches X (regexp is one of "::X", "^foo::.*X", among others)
2442 namespace foo { namespace bar { class X; } }
2443</pre></td></tr>
2444
2445
Aaron Ballman672dde22016-01-22 23:15:00 +00002446<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002447<tr><td colspan="4" class="doc" id="isAnonymous0"><pre>Matches anonymous namespace declarations.
2448
2449Given
2450 namespace n {
2451 namespace {} #1
2452 }
2453namespaceDecl(isAnonymous()) will match #1 but not ::n.
2454</pre></td></tr>
2455
2456
Aaron Ballman672dde22016-01-22 23:15:00 +00002457<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002458<tr><td colspan="4" class="doc" id="isInline0"><pre>Matches function and namespace declarations that are marked with
2459the inline keyword.
2460
2461Given
2462 inline void f();
2463 void g();
2464 namespace n {
2465 inline namespace m {}
2466 }
2467functionDecl(isInline()) will match ::f().
2468namespaceDecl(isInline()) will match n::m.
2469</pre></td></tr>
2470
2471
Aaron Ballman672dde22016-01-22 23:15:00 +00002472<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002473<tr><td colspan="4" class="doc" id="argumentCountIs2"><pre>Checks that a call expression or a constructor call expression has
2474a specific number of arguments (including absent default arguments).
2475
2476Example matches f(0, 0) (matcher = callExpr(argumentCountIs(2)))
2477 void f(int x, int y);
2478 f(0, 0);
2479</pre></td></tr>
2480
2481
Aaron Ballman672dde22016-01-22 23:15:00 +00002482<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002483<tr><td colspan="4" class="doc" id="hasKeywordSelector0"><pre>Matches when the selector is a keyword selector
2484
2485objCMessageExpr(hasKeywordSelector()) matches the generated setFrame
2486message expression in
2487
2488 UIWebView *webView = ...;
2489 CGRect bodyFrame = webView.frame;
2490 bodyFrame.size.height = self.bodyContentHeight;
2491 webView.frame = bodyFrame;
2492 ^---- matches here
2493</pre></td></tr>
2494
2495
Aaron Ballman672dde22016-01-22 23:15:00 +00002496<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002497<tr><td colspan="4" class="doc" id="hasNullSelector0"><pre>Matches when the selector is the empty selector
2498
2499Matches only when the selector of the objCMessageExpr is NULL. This may
2500represent an error condition in the tree!
2501</pre></td></tr>
2502
2503
Aaron Ballman672dde22016-01-22 23:15:00 +00002504<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002505<tr><td colspan="4" class="doc" id="hasSelector0"><pre>Matches when BaseName == Selector.getAsString()
2506
2507 matcher = objCMessageExpr(hasSelector("loadHTMLString:baseURL:"));
2508 matches the outer message expr in the code below, but NOT the message
2509 invocation for self.bodyView.
2510 [self.bodyView loadHTMLString:html baseURL:NULL];
2511</pre></td></tr>
2512
2513
Aaron Ballman672dde22016-01-22 23:15:00 +00002514<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002515<tr><td colspan="4" class="doc" id="hasUnarySelector0"><pre>Matches when the selector is a Unary Selector
2516
2517 matcher = objCMessageExpr(matchesSelector(hasUnarySelector());
2518 matches self.bodyView in the code below, but NOT the outer message
2519 invocation of "loadHTMLString:baseURL:".
2520 [self.bodyView loadHTMLString:html baseURL:NULL];
2521</pre></td></tr>
2522
2523
Aaron Ballman672dde22016-01-22 23:15:00 +00002524<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002525<tr><td colspan="4" class="doc" id="matchesSelector0"><pre>Matches ObjC selectors whose name contains
2526a substring matched by the given RegExp.
2527 matcher = objCMessageExpr(matchesSelector("loadHTMLStringmatches the outer message expr in the code below, but NOT the message
2528 invocation for self.bodyView.
2529 [self.bodyView loadHTMLString:html baseURL:NULL];
2530</pre></td></tr>
2531
2532
Aaron Ballman672dde22016-01-22 23:15:00 +00002533<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002534<tr><td colspan="4" class="doc" id="numSelectorArgs0"><pre>Matches when the selector has the specified number of arguments
2535
2536 matcher = objCMessageExpr(numSelectorArgs(0));
2537 matches self.bodyView in the code below
2538
2539 matcher = objCMessageExpr(numSelectorArgs(2));
2540 matches the invocation of "loadHTMLString:baseURL:" but not that
2541 of self.bodyView
2542 [self.bodyView loadHTMLString:html baseURL:NULL];
2543</pre></td></tr>
2544
2545
Aaron Ballman672dde22016-01-22 23:15:00 +00002546<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002547<tr><td colspan="4" class="doc" id="asString0"><pre>Matches if the matched type is represented by the given string.
2548
2549Given
2550 class Y { public: void x(); };
2551 void z() { Y* y; y-&gt;x(); }
2552cxxMemberCallExpr(on(hasType(asString("class Y *"))))
2553 matches y-&gt;x()
2554</pre></td></tr>
2555
2556
Aaron Ballman672dde22016-01-22 23:15:00 +00002557<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002558<tr><td colspan="4" class="doc" id="equalsBoundNode3"><pre>Matches if a node equals a previously bound node.
2559
2560Matches a node if it equals the node previously bound to ID.
2561
2562Given
2563 class X { int a; int b; };
2564cxxRecordDecl(
2565 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2566 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2567 matches the class X, as a and b have the same type.
2568
2569Note that when multiple matches are involved via forEach* matchers,
2570equalsBoundNodes acts as a filter.
2571For example:
2572compoundStmt(
2573 forEachDescendant(varDecl().bind("d")),
2574 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2575will trigger a match for each combination of variable declaration
2576and reference to that variable declaration within a compound statement.
2577</pre></td></tr>
2578
2579
Aaron Ballman672dde22016-01-22 23:15:00 +00002580<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002581<tr><td colspan="4" class="doc" id="hasLocalQualifiers0"><pre>Matches QualType nodes that have local CV-qualifiers attached to
2582the node, not hidden within a typedef.
2583
2584Given
2585 typedef const int const_int;
2586 const_int i;
2587 int *const j;
2588 int *volatile k;
2589 int m;
2590varDecl(hasType(hasLocalQualifiers())) matches only j and k.
2591i is const-qualified but the qualifier is not local.
2592</pre></td></tr>
2593
2594
Aaron Ballman672dde22016-01-22 23:15:00 +00002595<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyCharacter0')"><a name="isAnyCharacter0Anchor">isAnyCharacter</a></td><td></td></tr>
Samuel Benzaquen30747f72015-12-22 21:06:36 +00002596<tr><td colspan="4" class="doc" id="isAnyCharacter0"><pre>Matches QualType nodes that are of character type.
2597
2598Given
2599 void a(char);
2600 void b(wchar_t);
2601 void c(double);
2602functionDecl(hasAnyParameter(hasType(isAnyCharacter())))
2603matches "a(char)", "b(wchar_t)", but not "c(double)".
2604</pre></td></tr>
2605
2606
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002607<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isAnyPointer0')"><a name="isAnyPointer0Anchor">isAnyPointer</a></td><td></td></tr>
2608<tr><td colspan="4" class="doc" id="isAnyPointer0"><pre>Matches QualType nodes that are of any pointer type.
2609
2610Given
2611 int *i = nullptr;
2612 int j;
2613varDecl(hasType(isAnyPointer()))
2614 matches "int *i", but not "int j".
2615</pre></td></tr>
2616
2617
Aaron Ballman672dde22016-01-22 23:15:00 +00002618<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002619<tr><td colspan="4" class="doc" id="isConstQualified0"><pre>Matches QualType nodes that are const-qualified, i.e., that
2620include "top-level" const.
2621
2622Given
2623 void a(int);
2624 void b(int const);
2625 void c(const int);
2626 void d(const int*);
2627 void e(int const) {};
2628functionDecl(hasAnyParameter(hasType(isConstQualified())))
2629 matches "void b(int const)", "void c(const int)" and
2630 "void e(int const) {}". It does not match d as there
2631 is no top-level const on the parameter type "const int *".
2632</pre></td></tr>
2633
2634
Aaron Ballman672dde22016-01-22 23:15:00 +00002635<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002636<tr><td colspan="4" class="doc" id="isInteger0"><pre>Matches QualType nodes that are of integer type.
2637
2638Given
2639 void a(int);
2640 void b(long);
2641 void c(double);
2642functionDecl(hasAnyParameter(hasType(isInteger())))
2643matches "a(int)", "b(long)", but not "c(double)".
2644</pre></td></tr>
2645
2646
Aaron Ballman672dde22016-01-22 23:15:00 +00002647<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt;</td><td class="name" onclick="toggle('isVolatileQualified0')"><a name="isVolatileQualified0Anchor">isVolatileQualified</a></td><td></td></tr>
Aaron Ballman6290fc92015-11-23 17:09:24 +00002648<tr><td colspan="4" class="doc" id="isVolatileQualified0"><pre>Matches QualType nodes that are volatile-qualified, i.e., that
2649include "top-level" volatile.
2650
2651Given
2652 void a(int);
2653 void b(int volatile);
2654 void c(volatile int);
2655 void d(volatile int*);
2656 void e(int volatile) {};
2657functionDecl(hasAnyParameter(hasType(isVolatileQualified())))
2658 matches "void b(int volatile)", "void c(volatile int)" and
2659 "void e(int volatile) {}". It does not match d as there
2660 is no top-level volatile on the parameter type "volatile int *".
2661</pre></td></tr>
2662
2663
Aaron Ballman672dde22016-01-22 23:15:00 +00002664<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002665<tr><td colspan="4" class="doc" id="isClass0"><pre>Matches RecordDecl object that are spelled with "class."
2666
2667Example matches C, but not S or U.
2668 struct S {};
2669 class C {};
2670 union U {};
2671</pre></td></tr>
2672
2673
Aaron Ballman672dde22016-01-22 23:15:00 +00002674<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002675<tr><td colspan="4" class="doc" id="isStruct0"><pre>Matches RecordDecl object that are spelled with "struct."
2676
2677Example matches S, but not C or U.
2678 struct S {};
2679 class C {};
2680 union U {};
2681</pre></td></tr>
2682
2683
Aaron Ballman672dde22016-01-22 23:15:00 +00002684<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002685<tr><td colspan="4" class="doc" id="isUnion0"><pre>Matches RecordDecl object that are spelled with "union."
2686
2687Example matches U, but not C or S.
2688 struct S {};
2689 class C {};
2690 union U {};
2691</pre></td></tr>
2692
2693
Aaron Ballman672dde22016-01-22 23:15:00 +00002694<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002695<tr><td colspan="4" class="doc" id="equalsBoundNode0"><pre>Matches if a node equals a previously bound node.
2696
2697Matches a node if it equals the node previously bound to ID.
2698
2699Given
2700 class X { int a; int b; };
2701cxxRecordDecl(
2702 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2703 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2704 matches the class X, as a and b have the same type.
2705
2706Note that when multiple matches are involved via forEach* matchers,
2707equalsBoundNodes acts as a filter.
2708For example:
2709compoundStmt(
2710 forEachDescendant(varDecl().bind("d")),
2711 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2712will trigger a match for each combination of variable declaration
2713and reference to that variable declaration within a compound statement.
2714</pre></td></tr>
2715
2716
Aaron Ballman672dde22016-01-22 23:15:00 +00002717<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002718<tr><td colspan="4" class="doc" id="isExpansionInFileMatching1"><pre>Matches AST nodes that were expanded within files whose name is
2719partially matching a given regex.
2720
2721Example matches Y but not X
2722 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2723 #include "ASTMatcher.h"
2724 class X {};
2725ASTMatcher.h:
2726 class Y {};
2727
Aaron Ballman672dde22016-01-22 23:15:00 +00002728Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002729</pre></td></tr>
2730
2731
Aaron Ballman672dde22016-01-22 23:15:00 +00002732<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002733<tr><td colspan="4" class="doc" id="isExpansionInMainFile1"><pre>Matches AST nodes that were expanded within the main-file.
2734
2735Example matches X but not Y
2736 (matcher = cxxRecordDecl(isExpansionInMainFile())
2737 #include &lt;Y.h&gt;
2738 class X {};
2739Y.h:
2740 class Y {};
2741
Aaron Ballman672dde22016-01-22 23:15:00 +00002742Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002743</pre></td></tr>
2744
2745
Aaron Ballman672dde22016-01-22 23:15:00 +00002746<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002747<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader1"><pre>Matches AST nodes that were expanded within system-header-files.
2748
2749Example matches Y but not X
2750 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2751 #include &lt;SystemHeader.h&gt;
2752 class X {};
2753SystemHeader.h:
2754 class Y {};
2755
Aaron Ballman672dde22016-01-22 23:15:00 +00002756Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002757</pre></td></tr>
2758
2759
Aaron Ballman672dde22016-01-22 23:15:00 +00002760<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002761<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
2762
2763Example matches A, va, fa
2764 class A {};
2765 class B; Doesn't match, as it has no body.
2766 int va;
2767 extern int vb; Doesn't match, as it doesn't define the variable.
2768 void fa() {}
2769 void fb(); Doesn't match, as it has no body.
2770
Aaron Ballman672dde22016-01-22 23:15:00 +00002771Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002772</pre></td></tr>
2773
2774
Aaron Ballman672dde22016-01-22 23:15:00 +00002775<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002776<tr><td colspan="4" class="doc" id="equalsIntegralValue0"><pre>Matches a TemplateArgument of integral type with a given value.
2777
2778Note that 'Value' is a string as the template argument's value is
2779an arbitrary precision integer. 'Value' must be euqal to the canonical
2780representation of that integral value in base 10.
2781
2782Given
2783 template&lt;int T&gt; struct A {};
2784 C&lt;42&gt; c;
2785classTemplateSpecializationDecl(
2786 hasAnyTemplateArgument(equalsIntegralValue("42")))
2787 matches the implicit instantiation of C in C&lt;42&gt;.
2788</pre></td></tr>
2789
2790
Aaron Ballman672dde22016-01-22 23:15:00 +00002791<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002792<tr><td colspan="4" class="doc" id="isIntegral0"><pre>Matches a TemplateArgument that is an integral value.
2793
2794Given
2795 template&lt;int T&gt; struct A {};
2796 C&lt;42&gt; c;
2797classTemplateSpecializationDecl(
2798 hasAnyTemplateArgument(isIntegral()))
2799 matches the implicit instantiation of C in C&lt;42&gt;
2800 with isIntegral() matching 42.
2801</pre></td></tr>
2802
2803
Aaron Ballman672dde22016-01-22 23:15:00 +00002804<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002805<tr><td colspan="4" class="doc" id="templateArgumentCountIs1"><pre>Matches if the number of template arguments equals N.
2806
2807Given
2808 template&lt;typename T&gt; struct C {};
2809 C&lt;int&gt; c;
2810classTemplateSpecializationDecl(templateArgumentCountIs(1))
2811 matches C&lt;int&gt;.
2812</pre></td></tr>
2813
2814
Aaron Ballman672dde22016-01-22 23:15:00 +00002815<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002816<tr><td colspan="4" class="doc" id="isExpansionInFileMatching2"><pre>Matches AST nodes that were expanded within files whose name is
2817partially matching a given regex.
2818
2819Example matches Y but not X
2820 (matcher = cxxRecordDecl(isExpansionInFileMatching("AST.*"))
2821 #include "ASTMatcher.h"
2822 class X {};
2823ASTMatcher.h:
2824 class Y {};
2825
Aaron Ballman672dde22016-01-22 23:15:00 +00002826Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002827</pre></td></tr>
2828
2829
Aaron Ballman672dde22016-01-22 23:15:00 +00002830<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002831<tr><td colspan="4" class="doc" id="isExpansionInMainFile2"><pre>Matches AST nodes that were expanded within the main-file.
2832
2833Example matches X but not Y
2834 (matcher = cxxRecordDecl(isExpansionInMainFile())
2835 #include &lt;Y.h&gt;
2836 class X {};
2837Y.h:
2838 class Y {};
2839
Aaron Ballman672dde22016-01-22 23:15:00 +00002840Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002841</pre></td></tr>
2842
2843
Aaron Ballman672dde22016-01-22 23:15:00 +00002844<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002845<tr><td colspan="4" class="doc" id="isExpansionInSystemHeader2"><pre>Matches AST nodes that were expanded within system-header-files.
2846
2847Example matches Y but not X
2848 (matcher = cxxRecordDecl(isExpansionInSystemHeader())
2849 #include &lt;SystemHeader.h&gt;
2850 class X {};
2851SystemHeader.h:
2852 class Y {};
2853
Aaron Ballman672dde22016-01-22 23:15:00 +00002854Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002855</pre></td></tr>
2856
2857
Aaron Ballman672dde22016-01-22 23:15:00 +00002858<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('booleanType0')"><a name="booleanType0Anchor">booleanType</a></td><td></td></tr>
Samuel Benzaquen30747f72015-12-22 21:06:36 +00002859<tr><td colspan="4" class="doc" id="booleanType0"><pre>Matches type bool.
2860
2861Given
2862 struct S { bool func(); };
2863functionDecl(returns(booleanType()))
2864 matches "bool func();"
2865</pre></td></tr>
2866
2867
Aaron Ballman672dde22016-01-22 23:15:00 +00002868<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002869<tr><td colspan="4" class="doc" id="equalsBoundNode2"><pre>Matches if a node equals a previously bound node.
2870
2871Matches a node if it equals the node previously bound to ID.
2872
2873Given
2874 class X { int a; int b; };
2875cxxRecordDecl(
2876 has(fieldDecl(hasName("a"), hasType(type().bind("t")))),
2877 has(fieldDecl(hasName("b"), hasType(type(equalsBoundNode("t"))))))
2878 matches the class X, as a and b have the same type.
2879
2880Note that when multiple matches are involved via forEach* matchers,
2881equalsBoundNodes acts as a filter.
2882For example:
2883compoundStmt(
2884 forEachDescendant(varDecl().bind("d")),
2885 forEachDescendant(declRefExpr(to(decl(equalsBoundNode("d"))))))
2886will trigger a match for each combination of variable declaration
2887and reference to that variable declaration within a compound statement.
2888</pre></td></tr>
2889
2890
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00002891<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('realFloatingPointType0')"><a name="realFloatingPointType0Anchor">realFloatingPointType</a></td><td></td></tr>
2892<tr><td colspan="4" class="doc" id="realFloatingPointType0"><pre>Matches any real floating-point type (float, double, long double).
2893
2894Given
2895 int i;
2896 float f;
2897realFloatingPointType()
2898 matches "float f" but not "int i"
2899</pre></td></tr>
2900
2901
Aaron Ballman672dde22016-01-22 23:15:00 +00002902<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002903<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
2904
2905Given
2906 struct S { void func(); };
2907functionDecl(returns(voidType()))
2908 matches "void func();"
2909</pre></td></tr>
2910
2911
Aaron Ballman672dde22016-01-22 23:15:00 +00002912<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002913<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
2914
2915Given
2916 int x;
2917 int s = sizeof(x) + alignof(x)
2918unaryExprOrTypeTraitExpr(ofKind(UETT_SizeOf))
2919 matches sizeof(x)
2920</pre></td></tr>
2921
2922
Aaron Ballman672dde22016-01-22 23:15:00 +00002923<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002924<tr><td colspan="4" class="doc" id="hasOperatorName1"><pre>Matches the operator Name of operator expressions (binary or
2925unary).
2926
2927Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
2928 !(a || b)
2929</pre></td></tr>
2930
2931
Aaron Ballman672dde22016-01-22 23:15:00 +00002932<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasAutomaticStorageDuration0')"><a name="hasAutomaticStorageDuration0Anchor">hasAutomaticStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002933<tr><td colspan="4" class="doc" id="hasAutomaticStorageDuration0"><pre>Matches a variable declaration that has automatic storage duration.
2934
2935Example matches x, but not y, z, or a.
2936(matcher = varDecl(hasAutomaticStorageDuration())
2937void f() {
2938 int x;
2939 static int y;
2940 thread_local int z;
2941}
2942int a;
2943</pre></td></tr>
2944
2945
Aaron Ballman672dde22016-01-22 23:15:00 +00002946<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002947<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
2948
2949Example matches y and z (matcher = varDecl(hasGlobalStorage())
2950void f() {
2951 int x;
2952 static int y;
2953}
2954int z;
2955</pre></td></tr>
2956
2957
Aaron Ballman672dde22016-01-22 23:15:00 +00002958<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002959<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
2960non-static local variable.
2961
2962Example matches x (matcher = varDecl(hasLocalStorage())
2963void f() {
2964 int x;
2965 static int y;
2966}
2967int z;
2968</pre></td></tr>
2969
2970
Aaron Ballman672dde22016-01-22 23:15:00 +00002971<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasStaticStorageDuration0')"><a name="hasStaticStorageDuration0Anchor">hasStaticStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002972<tr><td colspan="4" class="doc" id="hasStaticStorageDuration0"><pre>Matches a variable declaration that has static storage duration.
2973
2974Example matches y and a, but not x or z.
2975(matcher = varDecl(hasStaticStorageDuration())
2976void f() {
2977 int x;
2978 static int y;
2979 thread_local int z;
2980}
2981int a;
2982</pre></td></tr>
2983
2984
Aaron Ballman672dde22016-01-22 23:15:00 +00002985<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;</td><td class="name" onclick="toggle('hasThreadStorageDuration0')"><a name="hasThreadStorageDuration0Anchor">hasThreadStorageDuration</a></td><td></td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00002986<tr><td colspan="4" class="doc" id="hasThreadStorageDuration0"><pre>Matches a variable declaration that has thread storage duration.
2987
2988Example matches z, but not x, z, or a.
2989(matcher = varDecl(hasThreadStorageDuration())
2990void f() {
2991 int x;
2992 static int y;
2993 thread_local int z;
2994}
2995int a;
2996</pre></td></tr>
2997
2998
Aaron Ballman672dde22016-01-22 23:15:00 +00002999<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003000<tr><td colspan="4" class="doc" id="isConstexpr0"><pre>Matches constexpr variable and function declarations.
3001
3002Given:
3003 constexpr int foo = 42;
3004 constexpr int bar();
3005varDecl(isConstexpr())
3006 matches the declaration of foo.
3007functionDecl(isConstexpr())
3008 matches the declaration of bar.
3009</pre></td></tr>
3010
3011
Aaron Ballman672dde22016-01-22 23:15:00 +00003012<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003013<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
3014
3015Example matches A, va, fa
3016 class A {};
3017 class B; Doesn't match, as it has no body.
3018 int va;
3019 extern int vb; Doesn't match, as it doesn't define the variable.
3020 void fa() {}
3021 void fb(); Doesn't match, as it has no body.
3022
Aaron Ballman672dde22016-01-22 23:15:00 +00003023Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003024</pre></td></tr>
3025
3026
Aaron Ballman672dde22016-01-22 23:15:00 +00003027<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003028<tr><td colspan="4" class="doc" id="isExceptionVariable0"><pre>Matches a variable declaration that is an exception variable from
3029a C++ catch block, or an Objective-C statement.
3030
3031Example matches x (matcher = varDecl(isExceptionVariable())
3032void f(int y) {
3033 try {
3034 } catch (int x) {
3035 }
3036}
3037</pre></td></tr>
3038
3039
Aaron Ballman672dde22016-01-22 23:15:00 +00003040<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003041<tr><td colspan="4" class="doc" id="isExplicitTemplateSpecialization1"><pre>Matches explicit template specializations of function, class, or
3042static member variable template instantiations.
3043
3044Given
3045 template&lt;typename T&gt; void A(T t) { }
3046 template&lt;&gt; void A(int N) { }
3047functionDecl(isExplicitTemplateSpecialization())
3048 matches the specialization A&lt;int&gt;().
3049
Aaron Ballman672dde22016-01-22 23:15:00 +00003050Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003051</pre></td></tr>
3052
3053
Aaron Ballman672dde22016-01-22 23:15:00 +00003054<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003055<tr><td colspan="4" class="doc" id="isTemplateInstantiation1"><pre>Matches template instantiations of function, class, or static
3056member variable template instantiations.
3057
3058Given
3059 template &lt;typename T&gt; class X {}; class A {}; X&lt;A&gt; x;
3060or
3061 template &lt;typename T&gt; class X {}; class A {}; template class X&lt;A&gt;;
3062cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3063 matches the template instantiation of X&lt;A&gt;.
3064
3065But given
3066 template &lt;typename T&gt; class X {}; class A {};
3067 template &lt;&gt; class X&lt;A&gt; {}; X&lt;A&gt; x;
3068cxxRecordDecl(hasName("::X"), isTemplateInstantiation())
3069 does not match, as X&lt;A&gt; is an explicit template specialization.
3070
Aaron Ballman672dde22016-01-22 23:15:00 +00003071Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003072</pre></td></tr>
3073
3074
Aaron Ballman672dde22016-01-22 23:15:00 +00003075<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003076<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
3077template instantiations.
3078
3079Given
3080 template&lt;typename T&gt; void A(T t) { T i; }
3081 A(0);
3082 A(0U);
3083functionDecl(isInstantiated())
3084 matches 'A(int) {...};' and 'A(unsigned) {...}'.
3085</pre></td></tr>
3086
3087
Aaron Ballmaneb7e5d92016-02-18 16:36:01 +00003088<tr><td>Matcher&lt;internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;&gt;</td><td class="name" onclick="toggle('nullPointerConstant0')"><a name="nullPointerConstant0Anchor">nullPointerConstant</a></td><td></td></tr>
3089<tr><td colspan="4" class="doc" id="nullPointerConstant0"><pre>Matches expressions that resolve to a null pointer constant, such as
3090GNU's __null, C++11's nullptr, or C's NULL macro.
3091
3092Given:
3093 void *v1 = NULL;
3094 void *v2 = nullptr;
3095 void *v3 = __null; GNU extension
3096 char *cp = (char *)0;
3097 int *ip = 0;
3098 int i = 0;
3099expr(nullPointerConstant())
3100 matches the initializer for v1, v2, v3, cp, and ip. Does not match the
3101 initializer for i.
3102</pre></td></tr>
3103
3104
Aaron Ballman672dde22016-01-22 23:15:00 +00003105<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003106<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
3107
3108Given
3109 int j;
3110 template&lt;typename T&gt; void A(T t) { T i; j += 42;}
3111 A(0);
3112 A(0U);
3113declStmt(isInTemplateInstantiation())
3114 matches 'int i;' and 'unsigned i'.
3115unless(stmt(isInTemplateInstantiation()))
3116 will NOT match j += 42; as it's shared between the template definition and
3117 instantiation.
3118</pre></td></tr>
3119
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00003120<!--END_NARROWING_MATCHERS -->
3121</table>
3122
3123<!-- ======================================================================= -->
3124<h2 id="traversal-matchers">AST Traversal Matchers</h2>
3125<!-- ======================================================================= -->
3126
3127<p>Traversal matchers specify the relationship to other nodes that are
3128reachable from the current node.</p>
3129
3130<p>Note that there are special traversal matchers (has, hasDescendant, forEach and
3131forEachDescendant) which work on all nodes and allow users to write more generic
3132match expressions.</p>
3133
3134<table>
3135<tr style="text-align:left"><th>Return type</th><th>Name</th><th>Parameters</th></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003136<!-- START_TRAVERSAL_MATCHERS -->
3137
3138<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>
3139<tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
3140
3141Unlike anyOf, eachOf will generate a match result for each
3142matching submatcher.
3143
3144For example, in:
3145 class A { int a; int b; };
3146The matcher:
3147 cxxRecordDecl(eachOf(has(fieldDecl(hasName("a")).bind("v")),
3148 has(fieldDecl(hasName("b")).bind("v"))))
3149will generate two results binding "v", the first of which binds
3150the field declaration of a, the second the field declaration of
3151b.
3152
3153Usable as: Any Matcher
3154</pre></td></tr>
3155
3156
3157<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEachDescendant0')"><a name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3158<tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3159provided matcher.
3160
3161Example matches X, A, B, C
3162 (matcher = cxxRecordDecl(forEachDescendant(cxxRecordDecl(hasName("X")))))
3163 class X {}; Matches X, because X::X is a class of name X inside X.
3164 class A { class X {}; };
3165 class B { class C { class X {}; }; };
3166
3167DescendantT must be an AST base type.
3168
3169As opposed to 'hasDescendant', 'forEachDescendant' will cause a match for
3170each result that matches instead of only on the first one.
3171
3172Note: Recursively combined ForEachDescendant can cause many matches:
3173 cxxRecordDecl(forEachDescendant(cxxRecordDecl(
3174 forEachDescendant(cxxRecordDecl())
3175 )))
3176will match 10 times (plus injected class name matches) on:
3177 class A { class B { class C { class D { class E {}; }; }; }; };
3178
3179Usable as: Any Matcher
3180</pre></td></tr>
3181
3182
3183<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
3184<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have child AST nodes that match the
3185provided matcher.
3186
3187Example matches X, Y
3188 (matcher = cxxRecordDecl(forEach(cxxRecordDecl(hasName("X")))
3189 class X {}; Matches X, because X::X is a class of name X inside X.
3190 class Y { class X {}; };
3191 class Z { class Y { class X {}; }; }; Does not match Z.
3192
3193ChildT must be an AST base type.
3194
3195As opposed to 'has', 'forEach' will cause a match for each result that
3196matches instead of only on the first one.
3197
3198Usable as: Any Matcher
3199</pre></td></tr>
3200
3201
3202<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasAncestor0')"><a name="hasAncestor0Anchor">hasAncestor</a></td><td>Matcher&lt;*&gt;</td></tr>
3203<tr><td colspan="4" class="doc" id="hasAncestor0"><pre>Matches AST nodes that have an ancestor that matches the provided
3204matcher.
3205
3206Given
3207void f() { if (true) { int x = 42; } }
3208void g() { for (;;) { int x = 43; } }
3209expr(integerLiteral(hasAncestor(ifStmt()))) matches 42, but not 43.
3210
3211Usable as: Any Matcher
3212</pre></td></tr>
3213
3214
3215<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasDescendant0')"><a name="hasDescendant0Anchor">hasDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
3216<tr><td colspan="4" class="doc" id="hasDescendant0"><pre>Matches AST nodes that have descendant AST nodes that match the
3217provided matcher.
3218
3219Example matches X, Y, Z
3220 (matcher = cxxRecordDecl(hasDescendant(cxxRecordDecl(hasName("X")))))
3221 class X {}; Matches X, because X::X is a class of name X inside X.
3222 class Y { class X {}; };
3223 class Z { class Y { class X {}; }; };
3224
3225DescendantT must be an AST base type.
3226
3227Usable as: Any Matcher
3228</pre></td></tr>
3229
3230
3231<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
3232<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have child AST nodes that match the
3233provided matcher.
3234
3235Example matches X, Y
3236 (matcher = cxxRecordDecl(has(cxxRecordDecl(hasName("X")))
3237 class X {}; Matches X, because X::X is a class of name X inside X.
3238 class Y { class X {}; };
3239 class Z { class Y { class X {}; }; }; Does not match Z.
3240
3241ChildT must be an AST base type.
3242
3243Usable as: Any Matcher
3244</pre></td></tr>
3245
3246
3247<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('hasParent0')"><a name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
3248<tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that have a parent that matches the provided
3249matcher.
3250
3251Given
3252void f() { for (;;) { int x = 42; if (true) { int x = 43; } } }
3253compoundStmt(hasParent(ifStmt())) matches "{ int x = 43; }".
3254
3255Usable as: Any Matcher
3256</pre></td></tr>
3257
3258
Aaron Ballman672dde22016-01-22 23:15:00 +00003259<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003260<tr><td colspan="4" class="doc" id="hasBase0"><pre>Matches the base expression of an array subscript expression.
3261
3262Given
3263 int i[5];
3264 void f() { i[1] = 42; }
3265arraySubscriptExpression(hasBase(implicitCastExpr(
3266 hasSourceExpression(declRefExpr()))))
3267 matches i[1] with the declRefExpr() matching i
3268</pre></td></tr>
3269
3270
Aaron Ballman672dde22016-01-22 23:15:00 +00003271<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003272<tr><td colspan="4" class="doc" id="hasIndex0"><pre>Matches the index expression of an array subscript expression.
3273
3274Given
3275 int i[5];
3276 void f() { i[1] = 42; }
3277arraySubscriptExpression(hasIndex(integerLiteral()))
3278 matches i[1] with the integerLiteral() matching 1
3279</pre></td></tr>
3280
3281
Aaron Ballman672dde22016-01-22 23:15:00 +00003282<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasLHS1')"><a name="hasLHS1Anchor">hasLHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003283<tr><td colspan="4" class="doc" id="hasLHS1"><pre>Matches the left hand side of binary operator expressions.
3284
3285Example matches a (matcher = binaryOperator(hasLHS()))
3286 a || b
3287</pre></td></tr>
3288
3289
Aaron Ballman672dde22016-01-22 23:15:00 +00003290<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ArraySubscriptExpr.html">ArraySubscriptExpr</a>&gt;</td><td class="name" onclick="toggle('hasRHS1')"><a name="hasRHS1Anchor">hasRHS</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; InnerMatcher</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003291<tr><td colspan="4" class="doc" id="hasRHS1"><pre>Matches the right hand side of binary operator expressions.
3292
3293Example matches b (matcher = binaryOperator(hasRHS()))
3294 a || b
3295</pre></td></tr>
3296
3297
Aaron Ballman672dde22016-01-22 23:15:00 +00003298<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003299<tr><td colspan="4" class="doc" id="hasElementTypeLoc0"><pre>Matches arrays and C99 complex types that have a specific element
3300type.
3301
3302Given
3303 struct A {};
3304 A a[7];
3305 int b[7];
3306arrayType(hasElementType(builtinType()))
3307 matches "int b[7]"
3308
Aaron Ballman672dde22016-01-22 23:15:00 +00003309Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003310</pre></td></tr>
3311
3312
Aaron Ballman672dde22016-01-22 23:15:00 +00003313<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003314<tr><td colspan="4" class="doc" id="hasElementType0"><pre>Matches arrays and C99 complex types that have a specific element
3315type.
3316
3317Given
3318 struct A {};
3319 A a[7];
3320 int b[7];
3321arrayType(hasElementType(builtinType()))
3322 matches "int b[7]"
3323
Aaron Ballman672dde22016-01-22 23:15:00 +00003324Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003325</pre></td></tr>
3326
3327
Aaron Ballman672dde22016-01-22 23:15:00 +00003328<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003329<tr><td colspan="4" class="doc" id="hasValueTypeLoc0"><pre>Matches atomic types with a specific value type.
3330
3331Given
3332 _Atomic(int) i;
3333 _Atomic(float) f;
3334atomicType(hasValueType(isInteger()))
3335 matches "_Atomic(int) i"
3336
Aaron Ballman672dde22016-01-22 23:15:00 +00003337Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003338</pre></td></tr>
3339
3340
Aaron Ballman672dde22016-01-22 23:15:00 +00003341<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003342<tr><td colspan="4" class="doc" id="hasValueType0"><pre>Matches atomic types with a specific value type.
3343
3344Given
3345 _Atomic(int) i;
3346 _Atomic(float) f;
3347atomicType(hasValueType(isInteger()))
3348 matches "_Atomic(int) i"
3349
Aaron Ballman672dde22016-01-22 23:15:00 +00003350Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AtomicType.html">AtomicType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003351</pre></td></tr>
3352
3353
Aaron Ballman672dde22016-01-22 23:15:00 +00003354<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003355<tr><td colspan="4" class="doc" id="hasDeducedType0"><pre>Matches AutoType nodes where the deduced type is a specific type.
3356
3357Note: There is no TypeLoc for the deduced type and thus no
3358getDeducedLoc() matcher.
3359
3360Given
3361 auto a = 1;
3362 auto b = 2.0;
3363autoType(hasDeducedType(isInteger()))
3364 matches "auto a"
3365
Aaron Ballman672dde22016-01-22 23:15:00 +00003366Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1AutoType.html">AutoType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003367</pre></td></tr>
3368
3369
Aaron Ballman672dde22016-01-22 23:15:00 +00003370<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003371<tr><td colspan="4" class="doc" id="hasEitherOperand0"><pre>Matches if either the left hand side or the right hand side of a
3372binary operator matches.
3373</pre></td></tr>
3374
3375
Aaron Ballman672dde22016-01-22 23:15:00 +00003376<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003377<tr><td colspan="4" class="doc" id="hasLHS0"><pre>Matches the left hand side of binary operator expressions.
3378
3379Example matches a (matcher = binaryOperator(hasLHS()))
3380 a || b
3381</pre></td></tr>
3382
3383
Aaron Ballman672dde22016-01-22 23:15:00 +00003384<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003385<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
3386
3387Example matches b (matcher = binaryOperator(hasRHS()))
3388 a || b
3389</pre></td></tr>
3390
3391
Aaron Ballman672dde22016-01-22 23:15:00 +00003392<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003393<tr><td colspan="4" class="doc" id="pointeeLoc0"><pre>Narrows PointerType (and similar) matchers to those where the
3394pointee matches a given matcher.
3395
3396Given
3397 int *a;
3398 int const *b;
3399 float const *f;
3400pointerType(pointee(isConstQualified(), isInteger()))
3401 matches "int const *b"
3402
Aaron Ballman672dde22016-01-22 23:15:00 +00003403Usable 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;,
3404 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003405</pre></td></tr>
3406
3407
Aaron Ballman672dde22016-01-22 23:15:00 +00003408<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003409<tr><td colspan="4" class="doc" id="pointee0"><pre>Narrows PointerType (and similar) matchers to those where the
3410pointee matches a given matcher.
3411
3412Given
3413 int *a;
3414 int const *b;
3415 float const *f;
3416pointerType(pointee(isConstQualified(), isInteger()))
3417 matches "int const *b"
3418
Aaron Ballman672dde22016-01-22 23:15:00 +00003419Usable 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;,
3420 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003421</pre></td></tr>
3422
3423
Aaron Ballman672dde22016-01-22 23:15:00 +00003424<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam1')"><a name="forEachArgumentWithParam1Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
Aaron Ballmand7b18b92016-01-18 20:28:57 +00003425<tr><td colspan="4" class="doc" id="forEachArgumentWithParam1"><pre>Matches all arguments and their respective ParmVarDecl.
3426
3427Given
3428 void f(int i);
3429 int y;
3430 f(y);
3431callExpr(declRefExpr(to(varDecl(hasName("y")))),
3432parmVarDecl(hasType(isInteger())))
3433 matches f(y);
3434with declRefExpr(...)
3435 matching int y
3436and parmVarDecl(...)
3437 matching int i
3438</pre></td></tr>
3439
3440
Aaron Ballman672dde22016-01-22 23:15:00 +00003441<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003442<tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call
3443expression.
3444
3445Given
3446 void x(int, int, int) { int y; x(1, y, 42); }
3447callExpr(hasAnyArgument(declRefExpr()))
3448 matches x(1, y, 42)
3449with hasAnyArgument(...)
3450 matching y
3451
3452FIXME: Currently this will ignore parentheses and implicit casts on
3453the argument before applying the inner matcher. We'll want to remove
3454this to allow for greater control by the user once ignoreImplicit()
3455has been implemented.
3456</pre></td></tr>
3457
3458
Aaron Ballman672dde22016-01-22 23:15:00 +00003459<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003460<tr><td colspan="4" class="doc" id="hasArgument1"><pre>Matches the n'th argument of a call expression or a constructor
3461call expression.
3462
3463Example matches y in x(y)
3464 (matcher = callExpr(hasArgument(0, declRefExpr())))
3465 void x(int) { int y; x(y); }
3466</pre></td></tr>
3467
3468
Aaron Ballman672dde22016-01-22 23:15:00 +00003469<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003470<tr><td colspan="4" class="doc" id="hasDeclaration12"><pre>Matches a node if the declaration associated with that node
3471matches the given matcher.
3472
3473The associated declaration is:
3474- for type nodes, the declaration of the underlying type
3475- for CallExpr, the declaration of the callee
3476- for MemberExpr, the declaration of the referenced member
3477- for CXXConstructExpr, the declaration of the constructor
3478
3479Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3480function. e.g. various subtypes of clang::Type and various expressions.
3481
Aaron Ballman672dde22016-01-22 23:15:00 +00003482Usable 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;,
3483 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;,
3484 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;,
3485 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;,
3486 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;,
3487 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003488</pre></td></tr>
3489
3490
Aaron Ballman672dde22016-01-22 23:15:00 +00003491<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003492<tr><td colspan="4" class="doc" id="forEachConstructorInitializer0"><pre>Matches each constructor initializer in a constructor definition.
3493
3494Given
3495 class A { A() : i(42), j(42) {} int i; int j; };
3496cxxConstructorDecl(forEachConstructorInitializer(
3497 forField(decl().bind("x"))
3498))
3499 will trigger two matches, binding for 'i' and 'j' respectively.
3500</pre></td></tr>
3501
3502
Aaron Ballman672dde22016-01-22 23:15:00 +00003503<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003504<tr><td colspan="4" class="doc" id="hasAnyConstructorInitializer0"><pre>Matches a constructor initializer.
3505
3506Given
3507 struct Foo {
3508 Foo() : foo_(1) { }
3509 int foo_;
3510 };
3511cxxRecordDecl(has(cxxConstructorDecl(
3512 hasAnyConstructorInitializer(anything())
3513)))
3514 record matches Foo, hasAnyConstructorInitializer matches foo_(1)
3515</pre></td></tr>
3516
3517
Aaron Ballman672dde22016-01-22 23:15:00 +00003518<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003519<tr><td colspan="4" class="doc" id="forField0"><pre>Matches the field declaration of a constructor initializer.
3520
3521Given
3522 struct Foo {
3523 Foo() : foo_(1) { }
3524 int foo_;
3525 };
3526cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
3527 forField(hasName("foo_"))))))
3528 matches Foo
3529with forField matching foo_
3530</pre></td></tr>
3531
3532
Aaron Ballman672dde22016-01-22 23:15:00 +00003533<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003534<tr><td colspan="4" class="doc" id="withInitializer0"><pre>Matches the initializer expression of a constructor initializer.
3535
3536Given
3537 struct Foo {
3538 Foo() : foo_(1) { }
3539 int foo_;
3540 };
3541cxxRecordDecl(has(cxxConstructorDecl(hasAnyConstructorInitializer(
3542 withInitializer(integerLiteral(equals(1)))))))
3543 matches Foo
3544with withInitializer matching (1)
3545</pre></td></tr>
3546
3547
Aaron Ballman672dde22016-01-22 23:15:00 +00003548<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>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00003549<tr><td colspan="4" class="doc" id="hasBody3"><pre>Matches a 'for', 'while', 'do while' statement or a function
3550definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003551
3552Given
3553 for (;;) {}
3554hasBody(compoundStmt())
3555 matches 'for (;;) {}'
3556with compoundStmt()
3557 matching '{}'
3558</pre></td></tr>
3559
3560
Aaron Ballman672dde22016-01-22 23:15:00 +00003561<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003562<tr><td colspan="4" class="doc" id="hasLoopVariable0"><pre>Matches the initialization statement of a for loop.
3563
3564Example:
3565 forStmt(hasLoopVariable(anything()))
3566matches 'int x' in
3567 for (int x : a) { }
3568</pre></td></tr>
3569
3570
Aaron Ballman672dde22016-01-22 23:15:00 +00003571<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003572<tr><td colspan="4" class="doc" id="hasRangeInit0"><pre>Matches the range initialization statement of a for loop.
3573
3574Example:
3575 forStmt(hasRangeInit(anything()))
3576matches 'a' in
3577 for (int x : a) { }
3578</pre></td></tr>
3579
3580
Aaron Ballman672dde22016-01-22 23:15:00 +00003581<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003582<tr><td colspan="4" class="doc" id="onImplicitObjectArgument0"><pre></pre></td></tr>
3583
3584
Aaron Ballman672dde22016-01-22 23:15:00 +00003585<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003586<tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object argument of a member call expression.
3587
3588Example matches y.x()
3589 (matcher = cxxMemberCallExpr(on(hasType(cxxRecordDecl(hasName("Y"))))))
3590 class Y { public: void x(); };
3591 void z() { Y y; y.x(); }",
3592
3593FIXME: Overload to allow directly matching types?
3594</pre></td></tr>
3595
3596
Aaron Ballman672dde22016-01-22 23:15:00 +00003597<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003598<tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match the type's declaration.
3599</pre></td></tr>
3600
3601
Aaron Ballman672dde22016-01-22 23:15:00 +00003602<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003603<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the expression's type either matches the specified
3604matcher, or is a pointer to a type that matches the InnerMatcher.
3605</pre></td></tr>
3606
3607
Aaron Ballman672dde22016-01-22 23:15:00 +00003608<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003609<tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration
3610belongs to.
3611
3612FIXME: Generalize this for other kinds of declarations.
3613FIXME: What other kind of declarations would we need to generalize
3614this to?
3615
3616Example matches A() in the last line
3617 (matcher = cxxConstructExpr(hasDeclaration(cxxMethodDecl(
3618 ofClass(hasName("A"))))))
3619 class A {
3620 public:
3621 A();
3622 };
3623 A a = A();
3624</pre></td></tr>
3625
3626
Aaron Ballman672dde22016-01-22 23:15:00 +00003627<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003628<tr><td colspan="4" class="doc" id="hasMethod0"><pre>Matches the first method of a class or struct that satisfies InnerMatcher.
3629
3630Given:
3631 class A { void func(); };
3632 class B { void member(); };
3633
3634cxxRecordDecl(hasMethod(hasName("func"))) matches the declaration of
3635A but not B.
3636</pre></td></tr>
3637
3638
Aaron Ballman672dde22016-01-22 23:15:00 +00003639<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003640<tr><td colspan="4" class="doc" id="isDerivedFrom0"><pre>Matches C++ classes that are directly or indirectly derived from
3641a class matching Base.
3642
3643Note that a class is not considered to be derived from itself.
3644
3645Example matches Y, Z, C (Base == hasName("X"))
3646 class X;
3647 class Y : public X {}; directly derived
3648 class Z : public Y {}; indirectly derived
3649 typedef X A;
3650 typedef A B;
3651 class C : public B {}; derived from a typedef of X
3652
3653In the following example, Bar matches isDerivedFrom(hasName("X")):
3654 class Foo;
3655 typedef Foo X;
3656 class Bar : public Foo {}; derived from a type that X is a typedef of
3657</pre></td></tr>
3658
3659
Aaron Ballman672dde22016-01-22 23:15:00 +00003660<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003661<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom0"><pre>Similar to isDerivedFrom(), but also matches classes that directly
3662match Base.
3663</pre></td></tr>
3664
3665
Aaron Ballman672dde22016-01-22 23:15:00 +00003666<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003667<tr><td colspan="4" class="doc" id="callee1"><pre>Matches if the call expression's callee's declaration matches the
3668given matcher.
3669
3670Example matches y.x() (matcher = callExpr(callee(
3671 cxxMethodDecl(hasName("x")))))
3672 class Y { public: void x(); };
3673 void z() { Y y; y.x(); }
3674</pre></td></tr>
3675
3676
Aaron Ballman672dde22016-01-22 23:15:00 +00003677<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003678<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call expression's callee expression matches.
3679
3680Given
3681 class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
3682 void f() { f(); }
3683callExpr(callee(expr()))
3684 matches this-&gt;x(), x(), y.x(), f()
3685with callee(...)
3686 matching this-&gt;x, x, y.x, f respectively
3687
Aaron Ballman672dde22016-01-22 23:15:00 +00003688Note: Callee cannot take the more general internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003689because this introduces ambiguous overloads with calls to Callee taking a
Aaron Ballman672dde22016-01-22 23:15:00 +00003690internal::Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;, as the matcher hierarchy is purely
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003691implemented in terms of implicit casts.
3692</pre></td></tr>
3693
3694
Aaron Ballman672dde22016-01-22 23:15:00 +00003695<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>&gt;</td><td class="name" onclick="toggle('forEachArgumentWithParam0')"><a name="forEachArgumentWithParam0Anchor">forEachArgumentWithParam</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>&gt; ArgMatcher, Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParmVarDecl.html">ParmVarDecl</a>&gt; ParamMatcher</td></tr>
Aaron Ballmand7b18b92016-01-18 20:28:57 +00003696<tr><td colspan="4" class="doc" id="forEachArgumentWithParam0"><pre>Matches all arguments and their respective ParmVarDecl.
3697
3698Given
3699 void f(int i);
3700 int y;
3701 f(y);
3702callExpr(declRefExpr(to(varDecl(hasName("y")))),
3703parmVarDecl(hasType(isInteger())))
3704 matches f(y);
3705with declRefExpr(...)
3706 matching int y
3707and parmVarDecl(...)
3708 matching int i
3709</pre></td></tr>
3710
3711
Aaron Ballman672dde22016-01-22 23:15:00 +00003712<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003713<tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call
3714expression.
3715
3716Given
3717 void x(int, int, int) { int y; x(1, y, 42); }
3718callExpr(hasAnyArgument(declRefExpr()))
3719 matches x(1, y, 42)
3720with hasAnyArgument(...)
3721 matching y
3722
3723FIXME: Currently this will ignore parentheses and implicit casts on
3724the argument before applying the inner matcher. We'll want to remove
3725this to allow for greater control by the user once ignoreImplicit()
3726has been implemented.
3727</pre></td></tr>
3728
3729
Aaron Ballman672dde22016-01-22 23:15:00 +00003730<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003731<tr><td colspan="4" class="doc" id="hasArgument0"><pre>Matches the n'th argument of a call expression or a constructor
3732call expression.
3733
3734Example matches y in x(y)
3735 (matcher = callExpr(hasArgument(0, declRefExpr())))
3736 void x(int) { int y; x(y); }
3737</pre></td></tr>
3738
3739
Aaron Ballman672dde22016-01-22 23:15:00 +00003740<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003741<tr><td colspan="4" class="doc" id="hasDeclaration13"><pre>Matches a node if the declaration associated with that node
3742matches the given matcher.
3743
3744The associated declaration is:
3745- for type nodes, the declaration of the underlying type
3746- for CallExpr, the declaration of the callee
3747- for MemberExpr, the declaration of the referenced member
3748- for CXXConstructExpr, the declaration of the constructor
3749
3750Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3751function. e.g. various subtypes of clang::Type and various expressions.
3752
Aaron Ballman672dde22016-01-22 23:15:00 +00003753Usable 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;,
3754 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;,
3755 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;,
3756 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;,
3757 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;,
3758 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003759</pre></td></tr>
3760
3761
Aaron Ballman672dde22016-01-22 23:15:00 +00003762<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003763<tr><td colspan="4" class="doc" id="hasCaseConstant0"><pre>If the given case statement does not use the GNU case range
3764extension, matches the constant given in the statement.
3765
3766Given
3767 switch (1) { case 1: case 1+1: case 3 ... 4: ; }
3768caseStmt(hasCaseConstant(integerLiteral()))
3769 matches "case 1:"
3770</pre></td></tr>
3771
3772
Aaron Ballman672dde22016-01-22 23:15:00 +00003773<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003774<tr><td colspan="4" class="doc" id="hasSourceExpression0"><pre>Matches if the cast's source expression matches the given matcher.
3775
3776Example: matches "a string" (matcher =
3777 hasSourceExpression(cxxConstructExpr()))
3778class URL { URL(string); };
3779URL url = "a string";
3780</pre></td></tr>
3781
3782
Aaron Ballman672dde22016-01-22 23:15:00 +00003783<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003784<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument0"><pre>Matches classTemplateSpecializations that have at least one
3785TemplateArgument matching the given InnerMatcher.
3786
3787Given
3788 template&lt;typename T&gt; class A {};
3789 template&lt;&gt; class A&lt;double&gt; {};
3790 A&lt;int&gt; a;
3791classTemplateSpecializationDecl(hasAnyTemplateArgument(
3792 refersToType(asString("int"))))
3793 matches the specialization A&lt;int&gt;
3794</pre></td></tr>
3795
3796
Aaron Ballman672dde22016-01-22 23:15:00 +00003797<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003798<tr><td colspan="4" class="doc" id="hasTemplateArgument0"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
3799matches the given InnerMatcher.
3800
3801Given
3802 template&lt;typename T, typename U&gt; class A {};
3803 A&lt;bool, int&gt; b;
3804 A&lt;int, bool&gt; c;
3805classTemplateSpecializationDecl(hasTemplateArgument(
3806 1, refersToType(asString("int"))))
3807 matches the specialization A&lt;bool, int&gt;
3808</pre></td></tr>
3809
3810
Aaron Ballman672dde22016-01-22 23:15:00 +00003811<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003812<tr><td colspan="4" class="doc" id="hasElementTypeLoc1"><pre>Matches arrays and C99 complex types that have a specific element
3813type.
3814
3815Given
3816 struct A {};
3817 A a[7];
3818 int b[7];
3819arrayType(hasElementType(builtinType()))
3820 matches "int b[7]"
3821
Aaron Ballman672dde22016-01-22 23:15:00 +00003822Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003823</pre></td></tr>
3824
3825
Aaron Ballman672dde22016-01-22 23:15:00 +00003826<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003827<tr><td colspan="4" class="doc" id="hasElementType1"><pre>Matches arrays and C99 complex types that have a specific element
3828type.
3829
3830Given
3831 struct A {};
3832 A a[7];
3833 int b[7];
3834arrayType(hasElementType(builtinType()))
3835 matches "int b[7]"
3836
Aaron Ballman672dde22016-01-22 23:15:00 +00003837Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003838</pre></td></tr>
3839
3840
Aaron Ballman672dde22016-01-22 23:15:00 +00003841<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003842<tr><td colspan="4" class="doc" id="hasAnySubstatement0"><pre>Matches compound statements where at least one substatement matches
3843a given matcher.
3844
3845Given
3846 { {}; 1+2; }
3847hasAnySubstatement(compoundStmt())
3848 matches '{ {}; 1+2; }'
3849with compoundStmt()
3850 matching '{}'
3851</pre></td></tr>
3852
3853
Aaron Ballman672dde22016-01-22 23:15:00 +00003854<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003855<tr><td colspan="4" class="doc" id="hasCondition4"><pre>Matches the condition expression of an if statement, for loop,
3856or conditional operator.
3857
3858Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
3859 if (true) {}
3860</pre></td></tr>
3861
3862
Aaron Ballman672dde22016-01-22 23:15:00 +00003863<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003864<tr><td colspan="4" class="doc" id="hasFalseExpression0"><pre>Matches the false branch expression of a conditional operator.
3865
3866Example matches b
3867 condition ? a : b
3868</pre></td></tr>
3869
3870
Aaron Ballman672dde22016-01-22 23:15:00 +00003871<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003872<tr><td colspan="4" class="doc" id="hasTrueExpression0"><pre>Matches the true branch expression of a conditional operator.
3873
3874Example matches a
3875 condition ? a : b
3876</pre></td></tr>
3877
3878
Aaron Ballman672dde22016-01-22 23:15:00 +00003879<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1DecayedType.html">DecayedType</a>&gt;</td><td class="name" onclick="toggle('hasDecayedType0')"><a name="hasDecayedType0Anchor">hasDecayedType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>&gt; InnerType</td></tr>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003880<tr><td colspan="4" class="doc" id="hasDecayedType0"><pre>Matches the decayed type, whos decayed type matches InnerMatcher
3881</pre></td></tr>
3882
3883
Aaron Ballman672dde22016-01-22 23:15:00 +00003884<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003885<tr><td colspan="4" class="doc" id="hasDeclaration11"><pre>Matches a node if the declaration associated with that node
3886matches the given matcher.
3887
3888The associated declaration is:
3889- for type nodes, the declaration of the underlying type
3890- for CallExpr, the declaration of the callee
3891- for MemberExpr, the declaration of the referenced member
3892- for CXXConstructExpr, the declaration of the constructor
3893
3894Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
3895function. e.g. various subtypes of clang::Type and various expressions.
3896
Aaron Ballman672dde22016-01-22 23:15:00 +00003897Usable 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;,
3898 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;,
3899 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;,
3900 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;,
3901 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;,
3902 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003903</pre></td></tr>
3904
3905
Aaron Ballman672dde22016-01-22 23:15:00 +00003906<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003907<tr><td colspan="4" class="doc" id="throughUsingDecl0"><pre>Matches a DeclRefExpr that refers to a declaration through a
3908specific using shadow declaration.
3909
3910Given
3911 namespace a { void f() {} }
3912 using a::f;
3913 void g() {
3914 f(); Matches this ..
3915 a::f(); .. but not this.
3916 }
3917declRefExpr(throughUsingDecl(anything()))
3918 matches f()
3919</pre></td></tr>
3920
3921
Aaron Ballman672dde22016-01-22 23:15:00 +00003922<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003923<tr><td colspan="4" class="doc" id="to0"><pre>Matches a DeclRefExpr that refers to a declaration that matches the
3924specified matcher.
3925
3926Example matches x in if(x)
3927 (matcher = declRefExpr(to(varDecl(hasName("x")))))
3928 bool x;
3929 if (x) {}
3930</pre></td></tr>
3931
3932
Aaron Ballman672dde22016-01-22 23:15:00 +00003933<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003934<tr><td colspan="4" class="doc" id="containsDeclaration0"><pre>Matches the n'th declaration of a declaration statement.
3935
3936Note that this does not work for global declarations because the AST
3937breaks up multiple-declaration DeclStmt's into multiple single-declaration
3938DeclStmt's.
3939Example: Given non-global declarations
3940 int a, b = 0;
3941 int c;
3942 int d = 2, e;
3943declStmt(containsDeclaration(
3944 0, varDecl(hasInitializer(anything()))))
3945 matches only 'int d = 2, e;', and
3946declStmt(containsDeclaration(1, varDecl()))
3947 matches 'int a, b = 0' as well as 'int d = 2, e;'
3948 but 'int c;' is not matched.
3949</pre></td></tr>
3950
3951
Aaron Ballman672dde22016-01-22 23:15:00 +00003952<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003953<tr><td colspan="4" class="doc" id="hasSingleDecl0"><pre>Matches the Decl of a DeclStmt which has a single declaration.
3954
3955Given
3956 int a, b;
3957 int c;
3958declStmt(hasSingleDecl(anything()))
3959 matches 'int c;' but not 'int a, b;'.
3960</pre></td></tr>
3961
3962
Aaron Ballman672dde22016-01-22 23:15:00 +00003963<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003964<tr><td colspan="4" class="doc" id="hasTypeLoc0"><pre>Matches if the type location of the declarator decl's type matches
3965the inner matcher.
3966
3967Given
3968 int x;
3969declaratorDecl(hasTypeLoc(loc(asString("int"))))
3970 matches int x
3971</pre></td></tr>
3972
3973
Aaron Ballman672dde22016-01-22 23:15:00 +00003974<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003975<tr><td colspan="4" class="doc" id="hasDeclContext0"><pre>Matches declarations whose declaration context, interpreted as a
3976Decl, matches InnerMatcher.
3977
3978Given
3979 namespace N {
3980 namespace M {
3981 class D {};
3982 }
3983 }
3984
3985cxxRcordDecl(hasDeclContext(namedDecl(hasName("M")))) matches the
3986declaration of class D.
3987</pre></td></tr>
3988
3989
Aaron Ballman672dde22016-01-22 23:15:00 +00003990<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>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00003991<tr><td colspan="4" class="doc" id="hasBody0"><pre>Matches a 'for', 'while', 'do while' statement or a function
3992definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00003993
3994Given
3995 for (;;) {}
3996hasBody(compoundStmt())
3997 matches 'for (;;) {}'
3998with compoundStmt()
3999 matching '{}'
4000</pre></td></tr>
4001
4002
Aaron Ballman672dde22016-01-22 23:15:00 +00004003<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004004<tr><td colspan="4" class="doc" id="hasCondition3"><pre>Matches the condition expression of an if statement, for loop,
4005or conditional operator.
4006
4007Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4008 if (true) {}
4009</pre></td></tr>
4010
4011
Aaron Ballman672dde22016-01-22 23:15:00 +00004012<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004013<tr><td colspan="4" class="doc" id="hasQualifier0"><pre>Matches ElaboratedTypes whose qualifier, a NestedNameSpecifier,
4014matches InnerMatcher if the qualifier exists.
4015
4016Given
4017 namespace N {
4018 namespace M {
4019 class D {};
4020 }
4021 }
4022 N::M::D d;
4023
4024elaboratedType(hasQualifier(hasPrefix(specifiesNamespace(hasName("N"))))
4025matches the type of the variable declaration of d.
4026</pre></td></tr>
4027
4028
Aaron Ballman672dde22016-01-22 23:15:00 +00004029<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004030<tr><td colspan="4" class="doc" id="namesType0"><pre>Matches ElaboratedTypes whose named type matches InnerMatcher.
4031
4032Given
4033 namespace N {
4034 namespace M {
4035 class D {};
4036 }
4037 }
4038 N::M::D d;
4039
4040elaboratedType(namesType(recordType(
4041hasDeclaration(namedDecl(hasName("D")))))) matches the type of the variable
4042declaration of d.
4043</pre></td></tr>
4044
4045
Aaron Ballman672dde22016-01-22 23:15:00 +00004046<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004047<tr><td colspan="4" class="doc" id="hasDeclaration10"><pre>Matches a node if the declaration associated with that node
4048matches the given matcher.
4049
4050The associated declaration is:
4051- for type nodes, the declaration of the underlying type
4052- for CallExpr, the declaration of the callee
4053- for MemberExpr, the declaration of the referenced member
4054- for CXXConstructExpr, the declaration of the constructor
4055
4056Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4057function. e.g. various subtypes of clang::Type and various expressions.
4058
Aaron Ballman672dde22016-01-22 23:15:00 +00004059Usable 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;,
4060 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;,
4061 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;,
4062 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;,
4063 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;,
4064 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004065</pre></td></tr>
4066
4067
Aaron Ballman672dde22016-01-22 23:15:00 +00004068<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004069<tr><td colspan="4" class="doc" id="hasDestinationType0"><pre>Matches casts whose destination type matches a given matcher.
4070
4071(Note: Clang's AST refers to other conversions as "casts" too, and calls
4072actual casts "explicit" casts.)
4073</pre></td></tr>
4074
4075
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004076<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</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>
4077<tr><td colspan="4" class="doc" id="hasType3"><pre>Overloaded to match the declaration of the expression's or value
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004078declaration's type.
4079
4080In case of a value declaration (for example a variable declaration),
4081this resolves one layer of indirection. For example, in the value
4082declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4083X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4084declaration of x.
4085
4086Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4087 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4088 class X {};
4089 void y(X &amp;x) { x; X z; }
4090
Aaron Ballman672dde22016-01-22 23:15:00 +00004091Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004092</pre></td></tr>
4093
4094
Aaron Ballman672dde22016-01-22 23:15:00 +00004095<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004096<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's or declaration's type matches a type
4097matcher.
4098
4099Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4100 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004101 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004102 class X {};
4103 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004104 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004105</pre></td></tr>
4106
4107
Aaron Ballman672dde22016-01-22 23:15:00 +00004108<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004109<tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches expressions that match InnerMatcher after any implicit casts
4110are stripped off.
4111
4112Parentheses and explicit casts are not discarded.
4113Given
4114 int arr[5];
4115 int a = 0;
4116 char b = 0;
4117 const int c = a;
4118 int *d = arr;
4119 long e = (long) 0l;
4120The matchers
4121 varDecl(hasInitializer(ignoringImpCasts(integerLiteral())))
4122 varDecl(hasInitializer(ignoringImpCasts(declRefExpr())))
4123would match the declarations for a, b, c, and d, but not e.
4124While
4125 varDecl(hasInitializer(integerLiteral()))
4126 varDecl(hasInitializer(declRefExpr()))
4127only match the declarations for b, c, and d.
4128</pre></td></tr>
4129
4130
Aaron Ballman672dde22016-01-22 23:15:00 +00004131<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004132<tr><td colspan="4" class="doc" id="ignoringParenCasts0"><pre>Matches expressions that match InnerMatcher after parentheses and
4133casts are stripped off.
4134
4135Implicit and non-C Style casts are also discarded.
4136Given
4137 int a = 0;
4138 char b = (0);
4139 void* c = reinterpret_cast&lt;char*&gt;(0);
4140 char d = char(0);
4141The matcher
4142 varDecl(hasInitializer(ignoringParenCasts(integerLiteral())))
4143would match the declarations for a, b, c, and d.
4144while
4145 varDecl(hasInitializer(integerLiteral()))
4146only match the declaration for a.
4147</pre></td></tr>
4148
4149
Aaron Ballman672dde22016-01-22 23:15:00 +00004150<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004151<tr><td colspan="4" class="doc" id="ignoringParenImpCasts0"><pre>Matches expressions that match InnerMatcher after implicit casts and
4152parentheses are stripped off.
4153
4154Explicit casts are not discarded.
4155Given
4156 int arr[5];
4157 int a = 0;
4158 char b = (0);
4159 const int c = a;
4160 int *d = (arr);
4161 long e = ((long) 0l);
4162The matchers
4163 varDecl(hasInitializer(ignoringParenImpCasts(integerLiteral())))
4164 varDecl(hasInitializer(ignoringParenImpCasts(declRefExpr())))
4165would match the declarations for a, b, c, and d, but not e.
4166while
4167 varDecl(hasInitializer(integerLiteral()))
4168 varDecl(hasInitializer(declRefExpr()))
4169would only match the declaration for a.
4170</pre></td></tr>
4171
4172
Aaron Ballman672dde22016-01-22 23:15:00 +00004173<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>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00004174<tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function
4175definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004176
4177Given
4178 for (;;) {}
4179hasBody(compoundStmt())
4180 matches 'for (;;) {}'
4181with compoundStmt()
4182 matching '{}'
4183</pre></td></tr>
4184
4185
Aaron Ballman672dde22016-01-22 23:15:00 +00004186<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004187<tr><td colspan="4" class="doc" id="hasCondition1"><pre>Matches the condition expression of an if statement, for loop,
4188or conditional operator.
4189
4190Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4191 if (true) {}
4192</pre></td></tr>
4193
4194
Aaron Ballman672dde22016-01-22 23:15:00 +00004195<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004196<tr><td colspan="4" class="doc" id="hasIncrement0"><pre>Matches the increment statement of a for loop.
4197
4198Example:
4199 forStmt(hasIncrement(unaryOperator(hasOperatorName("++"))))
4200matches '++x' in
4201 for (x; x &lt; N; ++x) { }
4202</pre></td></tr>
4203
4204
Aaron Ballman672dde22016-01-22 23:15:00 +00004205<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004206<tr><td colspan="4" class="doc" id="hasLoopInit0"><pre>Matches the initialization statement of a for loop.
4207
4208Example:
4209 forStmt(hasLoopInit(declStmt()))
4210matches 'int x = 0' in
4211 for (int x = 0; x &lt; N; ++x) { }
4212</pre></td></tr>
4213
4214
Aaron Ballman672dde22016-01-22 23:15:00 +00004215<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004216<tr><td colspan="4" class="doc" id="hasAnyParameter0"><pre>Matches any parameter of a function declaration.
4217
4218Does not match the 'this' parameter of a method.
4219
4220Given
4221 class X { void f(int x, int y, int z) {} };
4222cxxMethodDecl(hasAnyParameter(hasName("y")))
4223 matches f(int x, int y, int z) {}
4224with hasAnyParameter(...)
4225 matching int y
4226</pre></td></tr>
4227
4228
Aaron Ballman672dde22016-01-22 23:15:00 +00004229<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;</td><td class="name" onclick="toggle('hasBody4')"><a name="hasBody4Anchor">hasBody</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt; InnerMatcher</td></tr>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00004230<tr><td colspan="4" class="doc" id="hasBody4"><pre>Matches a 'for', 'while', 'do while' statement or a function
4231definition that has a given body.
4232
4233Given
4234 for (;;) {}
4235hasBody(compoundStmt())
4236 matches 'for (;;) {}'
4237with compoundStmt()
4238 matching '{}'
4239</pre></td></tr>
4240
4241
Aaron Ballman672dde22016-01-22 23:15:00 +00004242<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004243<tr><td colspan="4" class="doc" id="hasParameter0"><pre>Matches the n'th parameter of a function declaration.
4244
4245Given
4246 class X { void f(int x) {} };
4247cxxMethodDecl(hasParameter(0, hasType(varDecl())))
4248 matches f(int x) {}
4249with hasParameter(...)
4250 matching int x
4251</pre></td></tr>
4252
4253
Aaron Ballman672dde22016-01-22 23:15:00 +00004254<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004255<tr><td colspan="4" class="doc" id="returns0"><pre>Matches the return type of a function declaration.
4256
4257Given:
4258 class X { int f() { return 1; } };
4259cxxMethodDecl(returns(asString("int")))
4260 matches int f() { return 1; }
4261</pre></td></tr>
4262
4263
Aaron Ballman672dde22016-01-22 23:15:00 +00004264<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004265<tr><td colspan="4" class="doc" id="hasCondition0"><pre>Matches the condition expression of an if statement, for loop,
4266or conditional operator.
4267
4268Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
4269 if (true) {}
4270</pre></td></tr>
4271
4272
Aaron Ballman672dde22016-01-22 23:15:00 +00004273<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004274<tr><td colspan="4" class="doc" id="hasConditionVariableStatement0"><pre>Matches the condition variable statement in an if statement.
4275
4276Given
4277 if (A* a = GetAPointer()) {}
4278hasConditionVariableStatement(...)
4279 matches 'A* a = GetAPointer()'.
4280</pre></td></tr>
4281
4282
Aaron Ballman672dde22016-01-22 23:15:00 +00004283<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004284<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement.
4285
4286Examples matches the if statement
4287 (matcher = ifStmt(hasElse(cxxBoolLiteral(equals(true)))))
4288 if (false) false; else true;
4289</pre></td></tr>
4290
4291
Aaron Ballman672dde22016-01-22 23:15:00 +00004292<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004293<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement.
4294
4295Examples matches the if statement
4296 (matcher = ifStmt(hasThen(cxxBoolLiteral(equals(true)))))
4297 if (false) true; else false;
4298</pre></td></tr>
4299
4300
Aaron Ballman672dde22016-01-22 23:15:00 +00004301<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004302<tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given
4303matcher.
4304
4305FIXME: Unit test this matcher
4306</pre></td></tr>
4307
4308
Aaron Ballman672dde22016-01-22 23:15:00 +00004309<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004310<tr><td colspan="4" class="doc" id="hasDeclaration9"><pre>Matches a node if the declaration associated with that node
4311matches the given matcher.
4312
4313The associated declaration is:
4314- for type nodes, the declaration of the underlying type
4315- for CallExpr, the declaration of the callee
4316- for MemberExpr, the declaration of the referenced member
4317- for CXXConstructExpr, the declaration of the constructor
4318
4319Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4320function. e.g. various subtypes of clang::Type and various expressions.
4321
Aaron Ballman672dde22016-01-22 23:15:00 +00004322Usable 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;,
4323 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;,
4324 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;,
4325 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;,
4326 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;,
4327 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004328</pre></td></tr>
4329
4330
Aaron Ballman672dde22016-01-22 23:15:00 +00004331<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004332<tr><td colspan="4" class="doc" id="hasDeclaration8"><pre>Matches a node if the declaration associated with that node
4333matches the given matcher.
4334
4335The associated declaration is:
4336- for type nodes, the declaration of the underlying type
4337- for CallExpr, the declaration of the callee
4338- for MemberExpr, the declaration of the referenced member
4339- for CXXConstructExpr, the declaration of the constructor
4340
4341Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4342function. e.g. various subtypes of clang::Type and various expressions.
4343
Aaron Ballman672dde22016-01-22 23:15:00 +00004344Usable 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;,
4345 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;,
4346 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;,
4347 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;,
4348 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;,
4349 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004350</pre></td></tr>
4351
4352
Aaron Ballman672dde22016-01-22 23:15:00 +00004353<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004354<tr><td colspan="4" class="doc" id="hasDeclaration7"><pre>Matches a node if the declaration associated with that node
4355matches the given matcher.
4356
4357The associated declaration is:
4358- for type nodes, the declaration of the underlying type
4359- for CallExpr, the declaration of the callee
4360- for MemberExpr, the declaration of the referenced member
4361- for CXXConstructExpr, the declaration of the constructor
4362
4363Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4364function. e.g. various subtypes of clang::Type and various expressions.
4365
Aaron Ballman672dde22016-01-22 23:15:00 +00004366Usable 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;,
4367 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;,
4368 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;,
4369 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;,
4370 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;,
4371 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004372</pre></td></tr>
4373
4374
Aaron Ballman672dde22016-01-22 23:15:00 +00004375<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004376<tr><td colspan="4" class="doc" id="hasObjectExpression0"><pre>Matches a member expression where the object expression is
4377matched by a given matcher.
4378
4379Given
4380 struct X { int m; };
4381 void f(X x) { x.m; m; }
4382memberExpr(hasObjectExpression(hasType(cxxRecordDecl(hasName("X")))))))
4383 matches "x.m" and "m"
4384with hasObjectExpression(...)
4385 matching "x" and the implicit object expression of "m" which has type X*.
4386</pre></td></tr>
4387
4388
Aaron Ballman672dde22016-01-22 23:15:00 +00004389<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004390<tr><td colspan="4" class="doc" id="member0"><pre>Matches a member expression where the member is matched by a
4391given matcher.
4392
4393Given
4394 struct { int first, second; } first, second;
4395 int i(second.first);
4396 int j(first.second);
4397memberExpr(member(hasName("first")))
4398 matches second.first
4399 but not first.second (because the member name there is "second").
4400</pre></td></tr>
4401
4402
Aaron Ballman672dde22016-01-22 23:15:00 +00004403<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004404<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
4405pointee matches a given matcher.
4406
4407Given
4408 int *a;
4409 int const *b;
4410 float const *f;
4411pointerType(pointee(isConstQualified(), isInteger()))
4412 matches "int const *b"
4413
Aaron Ballman672dde22016-01-22 23:15:00 +00004414Usable 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;,
4415 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004416</pre></td></tr>
4417
4418
Aaron Ballman672dde22016-01-22 23:15:00 +00004419<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004420<tr><td colspan="4" class="doc" id="pointee1"><pre>Narrows PointerType (and similar) matchers to those where the
4421pointee matches a given matcher.
4422
4423Given
4424 int *a;
4425 int const *b;
4426 float const *f;
4427pointerType(pointee(isConstQualified(), isInteger()))
4428 matches "int const *b"
4429
Aaron Ballman672dde22016-01-22 23:15:00 +00004430Usable 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;,
4431 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004432</pre></td></tr>
4433
4434
Aaron Ballman672dde22016-01-22 23:15:00 +00004435<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004436<tr><td colspan="4" class="doc" id="hasPrefix1"><pre>Matches on the prefix of a NestedNameSpecifierLoc.
4437
4438Given
4439 struct A { struct B { struct C {}; }; };
4440 A::B::C c;
4441nestedNameSpecifierLoc(hasPrefix(loc(specifiesType(asString("struct A")))))
4442 matches "A::"
4443</pre></td></tr>
4444
4445
Aaron Ballman672dde22016-01-22 23:15:00 +00004446<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004447<tr><td colspan="4" class="doc" id="specifiesTypeLoc0"><pre>Matches nested name specifier locs that specify a type matching the
4448given TypeLoc.
4449
4450Given
4451 struct A { struct B { struct C {}; }; };
4452 A::B::C c;
4453nestedNameSpecifierLoc(specifiesTypeLoc(loc(type(
4454 hasDeclaration(cxxRecordDecl(hasName("A")))))))
4455 matches "A::"
4456</pre></td></tr>
4457
4458
Aaron Ballman672dde22016-01-22 23:15:00 +00004459<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004460<tr><td colspan="4" class="doc" id="hasPrefix0"><pre>Matches on the prefix of a NestedNameSpecifier.
4461
4462Given
4463 struct A { struct B { struct C {}; }; };
4464 A::B::C c;
4465nestedNameSpecifier(hasPrefix(specifiesType(asString("struct A")))) and
4466 matches "A::"
4467</pre></td></tr>
4468
4469
Aaron Ballman672dde22016-01-22 23:15:00 +00004470<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004471<tr><td colspan="4" class="doc" id="specifiesNamespace0"><pre>Matches nested name specifiers that specify a namespace matching the
4472given namespace matcher.
4473
4474Given
4475 namespace ns { struct A {}; }
4476 ns::A a;
4477nestedNameSpecifier(specifiesNamespace(hasName("ns")))
4478 matches "ns::"
4479</pre></td></tr>
4480
4481
Aaron Ballman672dde22016-01-22 23:15:00 +00004482<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004483<tr><td colspan="4" class="doc" id="specifiesType0"><pre>Matches nested name specifiers that specify a type matching the
4484given QualType matcher without qualifiers.
4485
4486Given
4487 struct A { struct B { struct C {}; }; };
4488 A::B::C c;
4489nestedNameSpecifier(specifiesType(
4490 hasDeclaration(cxxRecordDecl(hasName("A")))
4491))
4492 matches "A::"
4493</pre></td></tr>
4494
4495
Aaron Ballman672dde22016-01-22 23:15:00 +00004496<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004497<tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor
4498call expression.
4499
4500Example matches y in x(y)
4501 (matcher = callExpr(hasArgument(0, declRefExpr())))
4502 void x(int) { int y; x(y); }
4503</pre></td></tr>
4504
4505
Aaron Ballman672dde22016-01-22 23:15:00 +00004506<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004507<tr><td colspan="4" class="doc" id="hasReceiverType0"><pre>Matches on the receiver of an ObjectiveC Message expression.
4508
4509Example
4510matcher = objCMessageExpr(hasRecieverType(asString("UIWebView *")));
4511matches the [webView ...] message invocation.
4512 NSString *webViewJavaScript = ...
4513 UIWebView *webView = ...
4514 [webView stringByEvaluatingJavaScriptFromString:webViewJavascript];
4515</pre></td></tr>
4516
4517
Aaron Ballman672dde22016-01-22 23:15:00 +00004518<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004519<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
4520
4521Given
4522 int (*ptr_to_array)[4];
4523 int (*ptr_to_func)(int);
4524
4525varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
4526ptr_to_func but not ptr_to_array.
4527
Aaron Ballman672dde22016-01-22 23:15:00 +00004528Usable as: Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>&gt;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004529</pre></td></tr>
4530
4531
Aaron Ballman672dde22016-01-22 23:15:00 +00004532<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004533<tr><td colspan="4" class="doc" id="pointeeLoc2"><pre>Narrows PointerType (and similar) matchers to those where the
4534pointee matches a given matcher.
4535
4536Given
4537 int *a;
4538 int const *b;
4539 float const *f;
4540pointerType(pointee(isConstQualified(), isInteger()))
4541 matches "int const *b"
4542
Aaron Ballman672dde22016-01-22 23:15:00 +00004543Usable 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;,
4544 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004545</pre></td></tr>
4546
4547
Aaron Ballman672dde22016-01-22 23:15:00 +00004548<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004549<tr><td colspan="4" class="doc" id="pointee2"><pre>Narrows PointerType (and similar) matchers to those where the
4550pointee matches a given matcher.
4551
4552Given
4553 int *a;
4554 int const *b;
4555 float const *f;
4556pointerType(pointee(isConstQualified(), isInteger()))
4557 matches "int const *b"
4558
Aaron Ballman672dde22016-01-22 23:15:00 +00004559Usable 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;,
4560 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004561</pre></td></tr>
4562
4563
Aaron Ballman672dde22016-01-22 23:15:00 +00004564<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004565<tr><td colspan="4" class="doc" id="hasCanonicalType0"><pre>Matches QualTypes whose canonical type matches InnerMatcher.
4566
4567Given:
4568 typedef int &amp;int_ref;
4569 int a;
4570 int_ref b = a;
4571
4572varDecl(hasType(qualType(referenceType()))))) will not match the
4573declaration of b but varDecl(hasType(qualType(hasCanonicalType(referenceType())))))) does.
4574</pre></td></tr>
4575
4576
Aaron Ballman672dde22016-01-22 23:15:00 +00004577<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004578<tr><td colspan="4" class="doc" id="hasDeclaration6"><pre>Matches a node if the declaration associated with that node
4579matches the given matcher.
4580
4581The associated declaration is:
4582- for type nodes, the declaration of the underlying type
4583- for CallExpr, the declaration of the callee
4584- for MemberExpr, the declaration of the referenced member
4585- for CXXConstructExpr, the declaration of the constructor
4586
4587Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4588function. e.g. various subtypes of clang::Type and various expressions.
4589
Aaron Ballman672dde22016-01-22 23:15:00 +00004590Usable 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;,
4591 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;,
4592 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;,
4593 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;,
4594 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;,
4595 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004596</pre></td></tr>
4597
4598
Aaron Ballman672dde22016-01-22 23:15:00 +00004599<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004600<tr><td colspan="4" class="doc" id="pointsTo1"><pre>Overloaded to match the pointee type's declaration.
4601</pre></td></tr>
4602
4603
Aaron Ballman672dde22016-01-22 23:15:00 +00004604<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004605<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched type is a pointer type and the pointee type
4606matches the specified matcher.
4607
4608Example matches y-&gt;x()
4609 (matcher = cxxMemberCallExpr(on(hasType(pointsTo
4610 cxxRecordDecl(hasName("Y")))))))
4611 class Y { public: void x(); };
4612 void z() { Y *y; y-&gt;x(); }
4613</pre></td></tr>
4614
4615
Aaron Ballman672dde22016-01-22 23:15:00 +00004616<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004617<tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the referenced type's declaration.
4618</pre></td></tr>
4619
4620
Aaron Ballman672dde22016-01-22 23:15:00 +00004621<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004622<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched type is a reference type and the referenced
4623type matches the specified matcher.
4624
4625Example matches X &amp;x and const X &amp;y
4626 (matcher = varDecl(hasType(references(cxxRecordDecl(hasName("X"))))))
4627 class X {
4628 void a(X b) {
4629 X &amp;x = b;
4630 const X &amp;y = b;
4631 }
4632 };
4633</pre></td></tr>
4634
4635
Aaron Ballman672dde22016-01-22 23:15:00 +00004636<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004637<tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if the declaration associated with that node
4638matches the given matcher.
4639
4640The associated declaration is:
4641- for type nodes, the declaration of the underlying type
4642- for CallExpr, the declaration of the callee
4643- for MemberExpr, the declaration of the referenced member
4644- for CXXConstructExpr, the declaration of the constructor
4645
4646Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4647function. e.g. various subtypes of clang::Type and various expressions.
4648
Aaron Ballman672dde22016-01-22 23:15:00 +00004649Usable 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;,
4650 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;,
4651 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;,
4652 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;,
4653 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;,
4654 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004655</pre></td></tr>
4656
4657
Aaron Ballman672dde22016-01-22 23:15:00 +00004658<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004659<tr><td colspan="4" class="doc" id="pointeeLoc3"><pre>Narrows PointerType (and similar) matchers to those where the
4660pointee matches a given matcher.
4661
4662Given
4663 int *a;
4664 int const *b;
4665 float const *f;
4666pointerType(pointee(isConstQualified(), isInteger()))
4667 matches "int const *b"
4668
Aaron Ballman672dde22016-01-22 23:15:00 +00004669Usable 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;,
4670 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004671</pre></td></tr>
4672
4673
Aaron Ballman672dde22016-01-22 23:15:00 +00004674<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004675<tr><td colspan="4" class="doc" id="pointee3"><pre>Narrows PointerType (and similar) matchers to those where the
4676pointee matches a given matcher.
4677
4678Given
4679 int *a;
4680 int const *b;
4681 float const *f;
4682pointerType(pointee(isConstQualified(), isInteger()))
4683 matches "int const *b"
4684
Aaron Ballman672dde22016-01-22 23:15:00 +00004685Usable 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;,
4686 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004687</pre></td></tr>
4688
4689
Aaron Ballman672dde22016-01-22 23:15:00 +00004690<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004691<tr><td colspan="4" class="doc" id="alignOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
4692alignof.
4693</pre></td></tr>
4694
4695
Aaron Ballman672dde22016-01-22 23:15:00 +00004696<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004697<tr><td colspan="4" class="doc" id="sizeOfExpr0"><pre>Same as unaryExprOrTypeTraitExpr, but only matching
4698sizeof.
4699</pre></td></tr>
4700
4701
Aaron Ballman672dde22016-01-22 23:15:00 +00004702<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004703<tr><td colspan="4" class="doc" id="forEachSwitchCase0"><pre>Matches each case or default statement belonging to the given switch
4704statement. This matcher may produce multiple matches.
4705
4706Given
4707 switch (1) { case 1: case 2: default: switch (2) { case 3: case 4: ; } }
4708switchStmt(forEachSwitchCase(caseStmt().bind("c"))).bind("s")
4709 matches four times, with "c" binding each of "case 1:", "case 2:",
4710"case 3:" and "case 4:", and "s" respectively binding "switch (1)",
4711"switch (1)", "switch (2)" and "switch (2)".
4712</pre></td></tr>
4713
4714
Aaron Ballman672dde22016-01-22 23:15:00 +00004715<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004716<tr><td colspan="4" class="doc" id="hasDeclaration4"><pre>Matches a node if the declaration associated with that node
4717matches the given matcher.
4718
4719The associated declaration is:
4720- for type nodes, the declaration of the underlying type
4721- for CallExpr, the declaration of the callee
4722- for MemberExpr, the declaration of the referenced member
4723- for CXXConstructExpr, the declaration of the constructor
4724
4725Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4726function. e.g. various subtypes of clang::Type and various expressions.
4727
Aaron Ballman672dde22016-01-22 23:15:00 +00004728Usable 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;,
4729 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;,
4730 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;,
4731 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;,
4732 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;,
4733 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004734</pre></td></tr>
4735
4736
Aaron Ballman672dde22016-01-22 23:15:00 +00004737<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004738<tr><td colspan="4" class="doc" id="isExpr0"><pre>Matches a sugar TemplateArgument that refers to a certain expression.
4739
4740Given
4741 template&lt;typename T&gt; struct A {};
4742 struct B { B* next; };
4743 A&lt;&amp;B::next&gt; a;
4744templateSpecializationType(hasAnyTemplateArgument(
4745 isExpr(hasDescendant(declRefExpr(to(fieldDecl(hasName("next"))))))))
4746 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
4747 B::next
4748</pre></td></tr>
4749
4750
Aaron Ballman672dde22016-01-22 23:15:00 +00004751<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004752<tr><td colspan="4" class="doc" id="refersToDeclaration0"><pre>Matches a canonical TemplateArgument that refers to a certain
4753declaration.
4754
4755Given
4756 template&lt;typename T&gt; struct A {};
4757 struct B { B* next; };
4758 A&lt;&amp;B::next&gt; a;
4759classTemplateSpecializationDecl(hasAnyTemplateArgument(
4760 refersToDeclaration(fieldDecl(hasName("next"))))
4761 matches the specialization A&lt;&amp;B::next&gt; with fieldDecl(...) matching
4762 B::next
4763</pre></td></tr>
4764
4765
Aaron Ballman672dde22016-01-22 23:15:00 +00004766<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004767<tr><td colspan="4" class="doc" id="refersToIntegralType0"><pre>Matches a TemplateArgument that referes to an integral type.
4768
4769Given
4770 template&lt;int T&gt; struct A {};
4771 C&lt;42&gt; c;
4772classTemplateSpecializationDecl(
4773 hasAnyTemplateArgument(refersToIntegralType(asString("int"))))
4774 matches the implicit instantiation of C in C&lt;42&gt;.
4775</pre></td></tr>
4776
4777
Aaron Ballman672dde22016-01-22 23:15:00 +00004778<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004779<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
4780
4781Given
4782 struct X {};
4783 template&lt;typename T&gt; struct A {};
4784 A&lt;X&gt; a;
4785classTemplateSpecializationDecl(hasAnyTemplateArgument(
4786 refersToType(class(hasName("X")))))
4787 matches the specialization A&lt;X&gt;
4788</pre></td></tr>
4789
4790
Aaron Ballman672dde22016-01-22 23:15:00 +00004791<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004792<tr><td colspan="4" class="doc" id="hasAnyTemplateArgument1"><pre>Matches classTemplateSpecializations that have at least one
4793TemplateArgument matching the given InnerMatcher.
4794
4795Given
4796 template&lt;typename T&gt; class A {};
4797 template&lt;&gt; class A&lt;double&gt; {};
4798 A&lt;int&gt; a;
4799classTemplateSpecializationDecl(hasAnyTemplateArgument(
4800 refersToType(asString("int"))))
4801 matches the specialization A&lt;int&gt;
4802</pre></td></tr>
4803
4804
Aaron Ballman672dde22016-01-22 23:15:00 +00004805<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004806<tr><td colspan="4" class="doc" id="hasDeclaration3"><pre>Matches a node if the declaration associated with that node
4807matches the given matcher.
4808
4809The associated declaration is:
4810- for type nodes, the declaration of the underlying type
4811- for CallExpr, the declaration of the callee
4812- for MemberExpr, the declaration of the referenced member
4813- for CXXConstructExpr, the declaration of the constructor
4814
4815Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4816function. e.g. various subtypes of clang::Type and various expressions.
4817
Aaron Ballman672dde22016-01-22 23:15:00 +00004818Usable 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;,
4819 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;,
4820 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;,
4821 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;,
4822 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;,
4823 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004824</pre></td></tr>
4825
4826
Aaron Ballman672dde22016-01-22 23:15:00 +00004827<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004828<tr><td colspan="4" class="doc" id="hasTemplateArgument1"><pre>Matches classTemplateSpecializations where the n'th TemplateArgument
4829matches the given InnerMatcher.
4830
4831Given
4832 template&lt;typename T, typename U&gt; class A {};
4833 A&lt;bool, int&gt; b;
4834 A&lt;int, bool&gt; c;
4835classTemplateSpecializationDecl(hasTemplateArgument(
4836 1, refersToType(asString("int"))))
4837 matches the specialization A&lt;bool, int&gt;
4838</pre></td></tr>
4839
4840
Aaron Ballman672dde22016-01-22 23:15:00 +00004841<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004842<tr><td colspan="4" class="doc" id="hasDeclaration2"><pre>Matches a node if the declaration associated with that node
4843matches the given matcher.
4844
4845The associated declaration is:
4846- for type nodes, the declaration of the underlying type
4847- for CallExpr, the declaration of the callee
4848- for MemberExpr, the declaration of the referenced member
4849- for CXXConstructExpr, the declaration of the constructor
4850
4851Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4852function. e.g. various subtypes of clang::Type and various expressions.
4853
Aaron Ballman672dde22016-01-22 23:15:00 +00004854Usable 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;,
4855 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;,
4856 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;,
4857 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;,
4858 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;,
4859 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004860</pre></td></tr>
4861
4862
4863<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>
4864<tr><td colspan="4" class="doc" id="findAll0"><pre>Matches if the node or any descendant matches.
4865
4866Generates results for each match.
4867
4868For example, in:
4869 class A { class B {}; class C {}; };
4870The matcher:
4871 cxxRecordDecl(hasName("::A"),
4872 findAll(cxxRecordDecl(isDefinition()).bind("m")))
4873will generate results for A, B and C.
4874
4875Usable as: Any Matcher
4876</pre></td></tr>
4877
4878
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004879<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</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>
4880<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's or declaration's type matches a type
4881matcher.
4882
4883Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4884 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4885 and U (matcher = typedefDecl(hasType(asString("int")))
4886 class X {};
4887 void y(X &amp;x) { x; X z; }
4888 typedef int U;
4889</pre></td></tr>
4890
4891
Aaron Ballman672dde22016-01-22 23:15:00 +00004892<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004893<tr><td colspan="4" class="doc" id="hasDeclaration1"><pre>Matches a node if the declaration associated with that node
4894matches the given matcher.
4895
4896The associated declaration is:
4897- for type nodes, the declaration of the underlying type
4898- for CallExpr, the declaration of the callee
4899- for MemberExpr, the declaration of the referenced member
4900- for CXXConstructExpr, the declaration of the constructor
4901
4902Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4903function. e.g. various subtypes of clang::Type and various expressions.
4904
Aaron Ballman672dde22016-01-22 23:15:00 +00004905Usable 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;,
4906 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;,
4907 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;,
4908 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;,
4909 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;,
4910 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004911</pre></td></tr>
4912
4913
Aaron Ballman672dde22016-01-22 23:15:00 +00004914<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004915<tr><td colspan="4" class="doc" id="hasArgumentOfType0"><pre>Matches unary expressions that have a specific type of argument.
4916
4917Given
4918 int a, c; float b; int s = sizeof(a) + sizeof(b) + alignof(c);
4919unaryExprOrTypeTraitExpr(hasArgumentOfType(asString("int"))
4920 matches sizeof(a) and alignof(c)
4921</pre></td></tr>
4922
4923
Aaron Ballman672dde22016-01-22 23:15:00 +00004924<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004925<tr><td colspan="4" class="doc" id="hasUnaryOperand0"><pre>Matches if the operand of a unary operator matches.
4926
4927Example matches true (matcher = hasUnaryOperand(
4928 cxxBoolLiteral(equals(true))))
4929 !true
4930</pre></td></tr>
4931
4932
Aaron Ballman672dde22016-01-22 23:15:00 +00004933<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004934<tr><td colspan="4" class="doc" id="hasDeclaration0"><pre>Matches a node if the declaration associated with that node
4935matches the given matcher.
4936
4937The associated declaration is:
4938- for type nodes, the declaration of the underlying type
4939- for CallExpr, the declaration of the callee
4940- for MemberExpr, the declaration of the referenced member
4941- for CXXConstructExpr, the declaration of the constructor
4942
4943Also usable as Matcher&lt;T&gt; for any T supporting the getDecl() member
4944function. e.g. various subtypes of clang::Type and various expressions.
4945
Aaron Ballman672dde22016-01-22 23:15:00 +00004946Usable 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;,
4947 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;,
4948 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;,
4949 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;,
4950 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;,
4951 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004952</pre></td></tr>
4953
4954
Aaron Ballman672dde22016-01-22 23:15:00 +00004955<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004956<tr><td colspan="4" class="doc" id="hasAnyUsingShadowDecl0"><pre>Matches any using shadow declaration.
4957
4958Given
4959 namespace X { void b(); }
4960 using X::b;
4961usingDecl(hasAnyUsingShadowDecl(hasName("b"))))
4962 matches using X::b </pre></td></tr>
4963
4964
Aaron Ballman672dde22016-01-22 23:15:00 +00004965<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004966<tr><td colspan="4" class="doc" id="hasTargetDecl0"><pre>Matches a using shadow declaration where the target declaration is
4967matched by the given matcher.
4968
4969Given
4970 namespace X { int a; void b(); }
4971 using X::a;
4972 using X::b;
4973usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(functionDecl())))
4974 matches using X::b but not using X::a </pre></td></tr>
4975
4976
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004977<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</a>&gt;</td><td class="name" onclick="toggle('hasType4')"><a name="hasType4Anchor">hasType</a></td><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt; InnerMatcher</td></tr>
4978<tr><td colspan="4" class="doc" id="hasType4"><pre>Overloaded to match the declaration of the expression's or value
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004979declaration's type.
4980
4981In case of a value declaration (for example a variable declaration),
4982this resolves one layer of indirection. For example, in the value
4983declaration "X x;", cxxRecordDecl(hasName("X")) matches the declaration of
4984X, while varDecl(hasType(cxxRecordDecl(hasName("X")))) matches the
4985declaration of x.
4986
4987Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
4988 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
4989 class X {};
4990 void y(X &amp;x) { x; X z; }
4991
Aaron Ballman672dde22016-01-22 23:15:00 +00004992Usable 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;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004993</pre></td></tr>
4994
4995
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00004996<tr><td>Matcher&lt;<a href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html">ValueDecl</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_1QualType.html">QualType</a>&gt; InnerMatcher</td></tr>
4997<tr><td colspan="4" class="doc" id="hasType2"><pre>Matches if the expression's or declaration's type matches a type
Benjamin Kramer611d33a2015-11-20 07:46:19 +00004998matcher.
4999
5000Example matches x (matcher = expr(hasType(cxxRecordDecl(hasName("X")))))
5001 and z (matcher = varDecl(hasType(cxxRecordDecl(hasName("X")))))
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005002 and U (matcher = typedefDecl(hasType(asString("int")))
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005003 class X {};
5004 void y(X &amp;x) { x; X z; }
Aaron Ballman7e7b7b22016-02-01 14:11:47 +00005005 typedef int U;
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005006</pre></td></tr>
5007
5008
Aaron Ballman672dde22016-01-22 23:15:00 +00005009<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005010<tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable declaration that has an initializer expression
5011that matches the given matcher.
5012
5013Example matches x (matcher = varDecl(hasInitializer(callExpr())))
5014 bool y() { return true; }
5015 bool x = y();
5016</pre></td></tr>
5017
5018
Aaron Ballman672dde22016-01-22 23:15:00 +00005019<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005020<tr><td colspan="4" class="doc" id="hasSizeExpr0"><pre>Matches VariableArrayType nodes that have a specific size
5021expression.
5022
5023Given
5024 void f(int b) {
5025 int a[b];
5026 }
5027variableArrayType(hasSizeExpr(ignoringImpCasts(declRefExpr(to(
5028 varDecl(hasName("b")))))))
5029 matches "int a[b]"
5030</pre></td></tr>
5031
5032
Aaron Ballman672dde22016-01-22 23:15:00 +00005033<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>
Aaron Ballman2b6963f2016-01-20 16:26:48 +00005034<tr><td colspan="4" class="doc" id="hasBody2"><pre>Matches a 'for', 'while', 'do while' statement or a function
5035definition that has a given body.
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005036
5037Given
5038 for (;;) {}
5039hasBody(compoundStmt())
5040 matches 'for (;;) {}'
5041with compoundStmt()
5042 matching '{}'
5043</pre></td></tr>
5044
5045
Aaron Ballman672dde22016-01-22 23:15:00 +00005046<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005047<tr><td colspan="4" class="doc" id="hasCondition2"><pre>Matches the condition expression of an if statement, for loop,
5048or conditional operator.
5049
5050Example matches true (matcher = hasCondition(cxxBoolLiteral(equals(true))))
5051 if (true) {}
5052</pre></td></tr>
5053
5054
Aaron Ballman672dde22016-01-22 23:15:00 +00005055<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005056<tr><td colspan="4" class="doc" id="loc1"><pre>Matches NestedNameSpecifierLocs for which the given inner
5057NestedNameSpecifier-matcher matches.
5058</pre></td></tr>
5059
5060
Aaron Ballman672dde22016-01-22 23:15:00 +00005061<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>
Benjamin Kramer611d33a2015-11-20 07:46:19 +00005062<tr><td colspan="4" class="doc" id="loc0"><pre>Matches TypeLocs for which the given inner
5063QualType-matcher matches.
5064</pre></td></tr>
5065
Benjamin Kramer7d0cc232015-11-20 07:57:46 +00005066<!--END_TRAVERSAL_MATCHERS -->
5067</table>
5068
5069</div>
5070</body>
5071</html>
5072
5073